improvements and bugfixes to PESI taxon export
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 18 Jan 2012 16:09:20 +0000 (16:09 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 18 Jan 2012 16:09:20 +0000 (16:09 +0000)
cdm-pesi/src/main/java/eu/etaxonomy/cdm/io/pesi/out/PesiExportBase.java
cdm-pesi/src/main/java/eu/etaxonomy/cdm/io/pesi/out/PesiTaxonExport.java

index 9ac1b953c7b9ca44f18e206af8d78ce3ae81c45f..7e917bdb1537b85863ec5668180fee4586ae809c 100644 (file)
@@ -9,9 +9,16 @@
 */\r
 package eu.etaxonomy.cdm.io.pesi.out;\r
 \r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
 import org.apache.log4j.Logger;\r
 \r
 import eu.etaxonomy.cdm.io.common.DbExportBase;\r
+import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 \r
 /**\r
  * @author e.-m.lee\r
@@ -25,4 +32,28 @@ public abstract class PesiExportBase extends DbExportBase<PesiExportConfigurator
        public PesiExportBase() {\r
                super();\r
        }\r
+       \r
+\r
+       protected List<TaxonBase> getNextTaxonPartition(Class<? extends TaxonBase> clazz,int limit, int partitionCount) {\r
+               List<TaxonBase> list = getTaxonService().list(clazz, limit, partitionCount * limit, null, null);\r
+               \r
+               Iterator<TaxonBase> it = list.iterator();\r
+               while (it.hasNext()){\r
+                       TaxonBase<?> taxonBase = it.next();\r
+                       if (! isPesiTaxon(taxonBase)){\r
+                               it.remove();\r
+                       }\r
+               }\r
+               return list;\r
+       }\r
+       \r
+\r
+       protected boolean isPesiTaxon(TaxonBase taxonBase) {\r
+               for (Marker marker : taxonBase.getMarkers()){\r
+                       if (marker.getValue() == false && marker.getMarkerType().equals(MarkerType.PUBLISH())){\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
 }\r
index 6d961e049a932374344ee4dd8c954ac0cdb34e64..c305e8a560a9d68f279be3d4206330672aef44eb 100644 (file)
@@ -31,6 +31,7 @@ import eu.etaxonomy.cdm.common.CdmUtils;
 import eu.etaxonomy.cdm.io.common.Source;\r
 import eu.etaxonomy.cdm.io.common.mapping.out.DbExtensionMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.out.DbObjectMapper;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.DbStringMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.out.IdMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.out.MethodMapper;\r
 import eu.etaxonomy.cdm.io.common.mapping.out.ObjectChangeMapper;\r
@@ -46,7 +47,6 @@ import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
-import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
@@ -181,14 +181,14 @@ public class PesiTaxonExport extends PesiExportBase {
                \r
                \r
                mapping.addMapper(ObjectChangeMapper.NewInstance(TaxonBase.class, TaxonNameBase.class, "Name"));\r
-               mapping.addMapper(MethodMapper.NewInstance("GenusOrUninomial", this, TaxonNameBase.class ));\r
-               mapping.addMapper(MethodMapper.NewInstance("InfraGenericEpithet", this, TaxonNameBase.class));\r
-               mapping.addMapper(MethodMapper.NewInstance("SpecificEpithet", this, TaxonNameBase.class));\r
-               mapping.addMapper(MethodMapper.NewInstance("InfraSpecificEpithet", this, TaxonNameBase.class));\r
-               mapping.addMapper(MethodMapper.NewInstance("WebSearchName", this, TaxonNameBase.class));\r
+               mapping.addMapper(DbStringMapper.NewInstance("GenusOrUninomial", "GenusOrUninomial"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("InfraGenericEpithet", "InfraGenericEpithet"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("SpecificEpithet", "SpecificEpithet"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("InfraSpecificEpithet", "InfraSpecificEpithet"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("NameCache", "WebSearchName"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("TitleCache", "FullName"));\r
+               mapping.addMapper(DbStringMapper.NewInstance("NomenclaturalMicroReference", "NomRefString"));\r
                mapping.addMapper(MethodMapper.NewInstance("WebShowName", this, TaxonNameBase.class));\r
-               mapping.addMapper(MethodMapper.NewInstance("FullName", this, TaxonNameBase.class));\r
-               mapping.addMapper(MethodMapper.NewInstance("NomRefString", this, TaxonNameBase.class));\r
                \r
                // DisplayName\r
                extensionType = (ExtensionType)getTermService().find(ErmsTransformer.uuidDisplayName);          \r
@@ -200,8 +200,7 @@ public class PesiTaxonExport extends PesiExportBase {
 \r
                mapping.addMapper(MethodMapper.NewInstance("NameStatusFk", this, TaxonNameBase.class));\r
                mapping.addMapper(MethodMapper.NewInstance("NameStatusCache", this, TaxonNameBase.class));\r
-                       mapping.addMapper(MethodMapper.NewInstance("TypeFullnameCache", this, TaxonNameBase.class));\r
-\r
+               mapping.addMapper(MethodMapper.NewInstance("TypeFullnameCache", this, TaxonNameBase.class));\r
 \r
                mapping.addMapper(MethodMapper.NewInstance("TypeDesignationStatusFk", this, TaxonNameBase.class));\r
                mapping.addMapper(MethodMapper.NewInstance("TypeDesignationStatusCache", this, TaxonNameBase.class));\r
@@ -250,16 +249,16 @@ public class PesiTaxonExport extends PesiExportBase {
                        speciesExpertUserIdExtensionType = (ExtensionType)getTermService().find(PesiTransformer.speciesExpertUserIdUuid);\r
 \r
                        //Export Taxa..\r
-                       success &= doPhaseOne(state, mapping);\r
+                       success &= doPhase01(state, mapping);\r
 \r
                        // 2nd Round: Add ParentTaxonFk, TreeIndex to each Taxon\r
-                       success &= doPhaseTwo(state);\r
+                       success &= doPhase02(state);\r
 \r
                        //PHASE 3: Add Rank data, KingdomFk, TypeNameFk, expertFk and speciesExpertFk...\r
-                       success &= doPhaseThree(state);\r
+                       success &= doPhase03(state);\r
                        \r
                        //"PHASE 4: Creating Inferred Synonyms...\r
-                       success &= doPhaseFour(state, mapping);\r
+                       success &= doPhase04(state, mapping);\r
 \r
                        logger.info("*** Finished Making " + pluralString + " ..." + getSuccessString(success));\r
 \r
@@ -305,7 +304,7 @@ public class PesiTaxonExport extends PesiExportBase {
                rankTypeExpertsUpdateStmt = connection.prepareStatement(sql);\r
        }\r
 \r
-       private boolean doPhaseOne(PesiExportState state, PesiExportMapping mapping) throws SQLException {\r
+       private boolean doPhase01(PesiExportState state, PesiExportMapping mapping) throws SQLException {\r
                int count = 0;\r
                int pastCount = 0;\r
                List<TaxonBase> list;\r
@@ -318,7 +317,10 @@ public class PesiTaxonExport extends PesiExportBase {
                // Start transaction\r
                TransactionStatus txStatus = startTransaction(true);\r
                logger.info("Started new transaction. Fetching some " + pluralString + " (max: " + limit + ") ...");\r
-               while ((list = getTaxonService().list(null, limit, count, null, null)).size() > 0) {\r
+               \r
+               \r
+               int partitionCount = 0;\r
+               while ((list = getNextTaxonPartition(null, limit, partitionCount++)).size() > 0   ) {\r
 \r
                        logger.info("Fetched " + list.size() + " " + pluralString + ". Exporting...");\r
                        for (TaxonBase<?> taxon : list) {\r
@@ -327,62 +329,7 @@ public class PesiTaxonExport extends PesiExportBase {
                                \r
                                TaxonNameBase<?,?> taxonName = taxon.getName();\r
 \r
-                               // Check whether some rules are violated\r
-                               nomenclaturalCode = PesiTransformer.getNomenclaturalCode(taxonName);\r
-                               String genusOrUninomial = getGenusOrUninomial(taxonName);\r
-                               String specificEpithet = getSpecificEpithet(taxonName);\r
-                               String infraSpecificEpithet = getInfraSpecificEpithet(taxonName);\r
-                               String infraGenericEpithet = getInfraGenericEpithet(taxonName);\r
-                               Integer rank = getRankFk(taxonName, nomenclaturalCode);\r
-                               \r
-                               if (rank == null) {\r
-                                       logger.error("Rank was not determined: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                               } else {\r
-                                       \r
-                                       // Check whether infraGenericEpithet is set correctly\r
-                                       // 1. Childs of an accepted taxon of rank subgenus that are accepted taxa of rank species have to have an infraGenericEpithet\r
-                                       // 2. Grandchilds of an accepted taxon of rank subgenus that are accepted taxa of rank subspecies have to have an infraGenericEpithet\r
-                                       \r
-                                       int ancestorLevel = 0;\r
-                                       if (taxonName.getRank().equals(Rank.SUBSPECIES())) {\r
-                                               // The accepted taxon two rank levels above should be of rank subgenus\r
-                                               ancestorLevel  = 2;\r
-                                       }\r
-                                       if (taxonName.getRank().equals(Rank.SPECIES())) {\r
-                                               // The accepted taxon one rank level above should be of rank subgenus\r
-                                               ancestorLevel = 1;\r
-                                       }\r
-                                       if (ancestorLevel > 0) {\r
-                                               if (ancestorOfSpecificRank(taxon, ancestorLevel, Rank.SUBGENUS())) {\r
-                                                       // The child (species or subspecies) of this parent (subgenus) has to have an infraGenericEpithet\r
-                                                       if (infraGenericEpithet == null) {\r
-                                                               logger.warn("InfraGenericEpithet does not exist even though it should for: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                                                               // maybe the taxon could be named here\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       \r
-                                       if (infraGenericEpithet == null && rank.intValue() == 190) {\r
-                                               logger.warn("InfraGenericEpithet was not determined although it should exist for rank 190: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                                       }\r
-                                       if (specificEpithet != null && rank.intValue() < 220) {\r
-                                               logger.warn("SpecificEpithet was determined for rank " + rank + " although it should only exist for ranks higher or equal to 220: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                                       }\r
-                                       if (infraSpecificEpithet != null && rank.intValue() < 230) {\r
-                                               String message = "InfraSpecificEpithet '" +infraSpecificEpithet + "' was determined for rank " + rank + " although it should only exist for ranks higher or equal to 230: "  + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")"; \r
-                                               if (StringUtils.isNotBlank(infraSpecificEpithet)){\r
-                                                       logger.warn(message);\r
-                                               }else{\r
-                                                       logger.warn(message);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               if (infraSpecificEpithet != null && specificEpithet == null) {\r
-                                       logger.error("An infraSpecificEpithet was determined, but a specificEpithet was not determined: "  + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                               }\r
-                               if (genusOrUninomial == null) {\r
-                                       logger.error("GenusOrUninomial was not determined: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                               }\r
+                               validatePhaseOne(taxon, taxonName);\r
                                \r
                        }\r
 \r
@@ -405,8 +352,72 @@ public class PesiTaxonExport extends PesiExportBase {
                return success;\r
        }\r
 \r
+\r
+       private void validatePhaseOne(TaxonBase<?> taxon, TaxonNameBase<?, ?> taxonName) {\r
+               // Check whether some rules are violated\r
+               nomenclaturalCode = PesiTransformer.getNomenclaturalCode(taxonName);\r
+               if (! taxonName.isInstanceOf(NonViralName.class)){\r
+                       logger.warn("Viral names can't be validated");\r
+               }\r
+               NonViralName<?> nvn = CdmBase.deproxy(taxonName, NonViralName.class);\r
+               String genusOrUninomial = nvn.getGenusOrUninomial();\r
+               String specificEpithet = nvn.getSpecificEpithet();\r
+               String infraSpecificEpithet = nvn.getInfraSpecificEpithet();\r
+               String infraGenericEpithet = nvn.getInfraGenericEpithet();\r
+               Integer rank = getRankFk(taxonName, nomenclaturalCode);\r
+               \r
+               if (rank == null) {\r
+                       logger.error("Rank was not determined: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+               } else {\r
+                       \r
+                       // Check whether infraGenericEpithet is set correctly\r
+                       // 1. Childs of an accepted taxon of rank subgenus that are accepted taxa of rank species have to have an infraGenericEpithet\r
+                       // 2. Grandchilds of an accepted taxon of rank subgenus that are accepted taxa of rank subspecies have to have an infraGenericEpithet\r
+                       \r
+                       int ancestorLevel = 0;\r
+                       if (taxonName.getRank().equals(Rank.SUBSPECIES())) {\r
+                               // The accepted taxon two rank levels above should be of rank subgenus\r
+                               ancestorLevel  = 2;\r
+                       }\r
+                       if (taxonName.getRank().equals(Rank.SPECIES())) {\r
+                               // The accepted taxon one rank level above should be of rank subgenus\r
+                               ancestorLevel = 1;\r
+                       }\r
+                       if (ancestorLevel > 0) {\r
+                               if (ancestorOfSpecificRank(taxon, ancestorLevel, Rank.SUBGENUS())) {\r
+                                       // The child (species or subspecies) of this parent (subgenus) has to have an infraGenericEpithet\r
+                                       if (infraGenericEpithet == null) {\r
+                                               logger.warn("InfraGenericEpithet does not exist even though it should for: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                                               // maybe the taxon could be named here\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       if (infraGenericEpithet == null && rank.intValue() == 190) {\r
+                               logger.warn("InfraGenericEpithet was not determined although it should exist for rank 190: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                       }\r
+                       if (specificEpithet != null && rank.intValue() < 220) {\r
+                               logger.warn("SpecificEpithet was determined for rank " + rank + " although it should only exist for ranks higher or equal to 220: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                       }\r
+                       if (infraSpecificEpithet != null && rank.intValue() < 230) {\r
+                               String message = "InfraSpecificEpithet '" +infraSpecificEpithet + "' was determined for rank " + rank + " although it should only exist for ranks higher or equal to 230: "  + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")"; \r
+                               if (StringUtils.isNotBlank(infraSpecificEpithet)){\r
+                                       logger.warn(message);\r
+                               }else{\r
+                                       logger.warn(message);\r
+                               }\r
+                       }\r
+               }\r
+               if (infraSpecificEpithet != null && specificEpithet == null) {\r
+                       logger.error("An infraSpecificEpithet was determined, but a specificEpithet was not determined: "  + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+               }\r
+               if (genusOrUninomial == null) {\r
+                       logger.error("GenusOrUninomial was not determined: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+               }\r
+       }\r
+\r
        // 2nd Round: Add ParentTaxonFk, TreeIndex to each Taxon\r
-       private boolean doPhaseTwo(PesiExportState state) {\r
+       private boolean doPhase02(PesiExportState state) {\r
                boolean success = true;\r
                List<Classification> classificationList = null;\r
                logger.info("PHASE 2: Add ParenTaxonFk and TreeIndex...");\r
@@ -448,9 +459,9 @@ public class PesiTaxonExport extends PesiExportBase {
                                        txStatus = startTransaction(false);\r
                                        Rank endRank = rankMap.get(rank);\r
                                        if (endRank != null) {\r
-                                               logger.debug("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till Rank " + endRank.getLabel() + " ...");\r
+                                               logger.info("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till Rank " + endRank.getLabel() + " ...");\r
                                        } else {\r
-                                               logger.debug("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till leaves are reached ...");\r
+                                               logger.info("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till leaves are reached ...");\r
                                        }\r
 \r
                                        TaxonNode newNode = getTaxonNodeService().load(rootNode.getUuid());\r
@@ -501,25 +512,26 @@ public class PesiTaxonExport extends PesiExportBase {
        }       \r
 \r
        //PHASE 3: Add Rank data, KingdomFk, TypeNameFk, expertFk and speciesExpertFk...\r
-       private boolean doPhaseThree(PesiExportState state) {\r
+       private boolean doPhase03(PesiExportState state) {\r
                int count = 0;\r
                int pastCount = 0;\r
                boolean success = true;\r
                // Get the limit for objects to save within a single transaction.\r
                int limit = state.getConfig().getLimitSave();\r
 \r
-               List<TaxonNameBase> list;\r
+               List<TaxonBase> list;\r
                logger.info("PHASE 3: Add Rank data, KingdomFk, TypeNameFk, expertFk and speciesExpertFk...");\r
                // Be sure to add rank information, KingdomFk, TypeNameFk, expertFk and speciesExpertFk to every taxonName\r
                \r
                // Start transaction\r
                TransactionStatus txStatus = startTransaction(true);\r
                logger.info("Started new transaction. Fetching some " + pluralString + " (max: " + limit + ") ...");\r
-               while ((list = getNameService().list(null, limit, count, null, null)).size() > 0) {\r
+               int partitionCount = 0;\r
+               while ((list = getNextTaxonPartition(null, limit, partitionCount++)).size() > 0) {\r
 \r
                        logger.info("Fetched " + list.size() + " " + pluralString + ". Exporting...");\r
-                       for (TaxonNameBase<?,?> taxonName : list) {\r
-\r
+                       for (TaxonBase<?> taxon : list) {\r
+                               TaxonNameBase<?,?> taxonName = taxon.getName();\r
                                // Determine expertFk\r
                                Integer expertFk = makeExpertFk(state, taxonName);\r
 \r
@@ -598,7 +610,8 @@ public class PesiTaxonExport extends PesiExportBase {
                return expertFk;\r
        }\r
        \r
-       private boolean doPhaseFour(PesiExportState state, PesiExportMapping mapping) throws SQLException {\r
+       //      "PHASE 4: Creating Inferred Synonyms..."\r
+       private boolean doPhase04(PesiExportState state, PesiExportMapping mapping) throws SQLException {\r
                int count;\r
                int pastCount;\r
                boolean success = true;\r
@@ -857,36 +870,44 @@ public class PesiTaxonExport extends PesiExportBase {
        private void traverseTree(TaxonNode childNode, TaxonNode parentNode, StringBuffer treeIndex, Rank fetchLevel, PesiExportState state) {\r
                // Traverse all branches from this childNode until specified fetchLevel is reached.\r
                StringBuffer localTreeIndex = new StringBuffer(treeIndex);\r
-               if (childNode.getTaxon() != null) {\r
-                       TaxonNameBase<?,?> taxonName = childNode.getTaxon().getName();\r
-                       Integer taxonNameId = state.getDbId(taxonName);\r
-                       if (taxonNameId != null) {\r
-                               Rank childTaxonNameRank = taxonName.getRank();\r
-                               if (childTaxonNameRank != null) {\r
-                                       if (! childTaxonNameRank.equals(fetchLevel)) {\r
-\r
-                                               localTreeIndex.append(taxonNameId);\r
-                                               localTreeIndex.append("#");\r
-\r
-                                               saveData(childNode, parentNode, localTreeIndex, state, taxonNameId);\r
-\r
-                                               // Store treeIndex as annotation for further use\r
-                                               Annotation annotation = Annotation.NewInstance(localTreeIndex.toString(), getTreeIndexAnnotationType(), Language.DEFAULT());\r
-                                               childNode.addAnnotation(annotation);\r
-\r
-                                               for (TaxonNode newNode : childNode.getChildNodes()) {\r
-                                                       traverseTree(newNode, childNode, localTreeIndex, fetchLevel, state);\r
+               Taxon childTaxon = childNode.getTaxon();\r
+               if (childTaxon != null) {\r
+                       if (isPesiTaxon(childTaxon)){\r
+                               TaxonNameBase<?,?> childName = childTaxon.getName();\r
+                               Integer taxonId = state.getDbId(childName);\r
+                               if (taxonId != null) {\r
+                                       Rank childRank = childName.getRank();\r
+                                       if (childRank != null) {\r
+                                               if (! childRank.equals(fetchLevel)) {\r
+       \r
+                                                       localTreeIndex.append(taxonId + "#");\r
+                                                       \r
+                                                       saveData(childNode, parentNode, localTreeIndex, state, taxonId);\r
+       \r
+                                                       // Store treeIndex as annotation for further use\r
+                                                       Annotation annotation = Annotation.NewInstance(localTreeIndex.toString(), getTreeIndexAnnotationType(), Language.DEFAULT());\r
+                                                       childNode.addAnnotation(annotation);\r
+       \r
+                                                       for (TaxonNode newNode : childNode.getChildNodes()) {\r
+                                                               if (newNode.getTaxon() != null && isPesiTaxon(newNode.getTaxon())){\r
+                                                                       traverseTree(newNode, childNode, localTreeIndex, fetchLevel, state);\r
+                                                               }\r
+                                                       }\r
+                                                       \r
+                                               } else {\r
+       //                                              logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
+                                                       return;\r
                                                }\r
-                                               \r
                                        } else {\r
-//                                             logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
-                                               return;\r
+                                               logger.error("Rank is NULL. FetchLevel can not be checked: " + childName.getUuid() + " (" + childName.getTitleCache() + ")");\r
                                        }\r
                                } else {\r
-                                       logger.error("Rank is NULL. FetchLevel can not be checked: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                                       logger.error("TaxonName can not be found in State: " + childName.getUuid() + " (" + childName.getTitleCache() + ")");\r
+                               }\r
+                       }else{\r
+                               if (logger.isDebugEnabled()){ \r
+                                       logger.debug("Taxon is not a PESI taxon: " + childTaxon.getUuid());\r
                                }\r
-                       } else {\r
-                               logger.error("TaxonName can not be found in State: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
                        }\r
 \r
                } else {\r
@@ -905,21 +926,17 @@ public class PesiTaxonExport extends PesiExportBase {
        private void saveData(TaxonNode childNode, TaxonNode parentNode, StringBuffer treeIndex, PesiExportState state, Integer currentTaxonFk) {\r
                // We are differentiating kingdoms by the nomenclatural code for now.\r
                // This needs to be handled in a better way as soon as we know how to differentiate between more kingdoms.\r
-               Taxon childNodeTaxon = childNode.getTaxon();\r
-               TaxonNameBase<?,?> childNodeTaxonName = childNode.getTaxon().getName();\r
-               if (childNodeTaxon != null && childNodeTaxonName != null) {\r
-                       TaxonNameBase<?,?> parentNodeTaxonName = null;\r
+               Taxon childTaxon = childNode.getTaxon();\r
+               if (isPesiTaxon(childTaxon)) {\r
+                       TaxonNameBase<?,?> parentName = null;\r
                        if (parentNode != null) {\r
-                               Taxon parentNodeTaxon = parentNode.getTaxon();\r
-                               if (parentNodeTaxon != null) {\r
-                                       parentNodeTaxonName  = parentNodeTaxon.getName();\r
+                               Taxon parentTaxon = parentNode.getTaxon();\r
+                               if (parentTaxon != null) {\r
+                                       parentName  = parentTaxon.getName();\r
                                }\r
                        }\r
 \r
-                       invokeParentTaxonFkAndTreeIndex(\r
-                                       state.getDbId(parentNodeTaxonName), \r
-                                       currentTaxonFk, \r
-                                       treeIndex);\r
+                       invokeParentTaxonFkAndTreeIndex(state.getDbId(parentName), currentTaxonFk,      treeIndex);\r
                }\r
                \r
        }\r
@@ -954,7 +971,7 @@ public class PesiTaxonExport extends PesiExportBase {
                        parentTaxonFk_TreeIndex_KingdomFkStmt.executeUpdate();\r
                        return true;\r
                } catch (SQLException e) {\r
-                       logger.error("ParentTaxonFk and TreeIndex could not be inserted into database: " + e.getMessage());\r
+                       logger.error("ParentTaxonFk (" + parentTaxonFk ==null? "-":parentTaxonFk + ") and TreeIndex could not be inserted into database for taxon "+ (currentTaxonFk == null? "-" :currentTaxonFk) + ": " + e.getMessage());\r
                        e.printStackTrace();\r
                        return false;\r
                }\r
@@ -1148,101 +1165,6 @@ public class PesiTaxonExport extends PesiExportBase {
                return result;\r
        }\r
 \r
-       /**\r
-        * Returns the <code>GenusOrUninomial</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>GenusOrUninomial</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       private static String getGenusOrUninomial(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-                       if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                               NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                               result = nonViralName.getGenusOrUninomial();\r
-                       }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
-\r
-       /**\r
-        * Returns the <code>InfraGenericEpithet</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>InfraGenericEpithet</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       private static String getInfraGenericEpithet(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-               if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                       NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                       result = nonViralName.getInfraGenericEpithet();\r
-               }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
-\r
-       /**\r
-        * Returns the <code>SpecificEpithet</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>SpecificEpithet</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       private static String getSpecificEpithet(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-                       if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                               NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                               result = nonViralName.getSpecificEpithet();\r
-                       }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
-\r
-       /**\r
-        * Returns the <code>InfraSpecificEpithet</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>InfraSpecificEpithet</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       private static String getInfraSpecificEpithet(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-               if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                       NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                       result = nonViralName.getInfraSpecificEpithet();\r
-               }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
-\r
-       /**\r
-        * Returns the <code>WebSearchName</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>WebSearchName</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       @SuppressWarnings("unused")\r
-       private static String getWebSearchName(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-               if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                       NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                       result = nonViralName.getNameCache();\r
-               }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
        \r
        /**\r
         * Returns the <code>WebShowName</code> attribute.\r
@@ -1432,30 +1354,6 @@ public class PesiTaxonExport extends PesiExportBase {
                        return null;\r
                }\r
        }\r
-\r
-       /**\r
-        * Returns the <code>NomRefString</code> attribute.\r
-        * @param taxonName The {@link TaxonNameBase TaxonName}.\r
-        * @return The <code>NomRefString</code> attribute.\r
-        * @see MethodMapper\r
-        */\r
-       @SuppressWarnings("unused")\r
-       private static String getNomRefString(TaxonNameBase<?,?> taxonName) {\r
-               String result = null;\r
-               try {\r
-               if (taxonName != null) {\r
-                       try {\r
-                               result = taxonName.getNomenclaturalMicroReference();\r
-                       } catch (Exception e) {\r
-                               logger.error("While getting NomRefString");\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
-               }\r
-               return result;\r
-       }\r
        \r
        /**\r
         * Returns the <code>DisplayName</code> attribute.\r
@@ -1482,27 +1380,10 @@ public class PesiTaxonExport extends PesiExportBase {
        @SuppressWarnings("unused")\r
        private static Integer getNameStatusFk(TaxonNameBase<?,?> taxonName) {\r
                Integer result = null;\r
-               \r
-               try {\r
-               if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                       NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                       Set<NomenclaturalStatus> states = nonViralName.getStatus();\r
-                       if (states.size() == 1) {\r
-                               NomenclaturalStatus state = states.iterator().next();\r
-                               NomenclaturalStatusType statusType = null;\r
-                               if (state != null) {\r
-                                       statusType = state.getType();\r
-                               }\r
-                               if (statusType != null) {\r
-                                       result = PesiTransformer.nomStatus2nomStatusFk(statusType);\r
-                               }\r
-                       } else if (states.size() > 1) {\r
-                               logger.error("This TaxonName has more than one Nomenclatural Status: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                       }\r
-               }\r
-               \r
-               } catch (Exception e) {\r
-                       e.printStackTrace();\r
+\r
+               NomenclaturalStatus state = getNameStatus(taxonName);\r
+               if (state != null) {\r
+                       result = PesiTransformer.nomStatus2nomStatusFk(state.getType());\r
                }\r
                return result;\r
        }\r
@@ -1516,27 +1397,33 @@ public class PesiTaxonExport extends PesiExportBase {
        @SuppressWarnings("unused")\r
        private static String getNameStatusCache(TaxonNameBase<?,?> taxonName) {\r
                String result = null;\r
+               NomenclaturalStatus state = getNameStatus(taxonName);\r
+               if (state != null) {\r
+                       result = PesiTransformer.nomStatus2NomStatusCache(state.getType());\r
+               }\r
+               return result;\r
+       }\r
+       \r
+       \r
+       private static NomenclaturalStatus getNameStatus(TaxonNameBase<?,?> taxonName) {\r
                \r
                try {\r
-               if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
-                       NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
-                       Set<NomenclaturalStatus> states = nonViralName.getStatus();\r
-                       if (states.size() == 1) {\r
-                               NomenclaturalStatus state = states.iterator().next();\r
-                               if (state != null) {\r
-                                       result = PesiTransformer.nomStatus2NomStatusCache(state.getType());\r
+                       if (taxonName != null && (taxonName.isInstanceOf(NonViralName.class))) {\r
+                               NonViralName<?> nonViralName = CdmBase.deproxy(taxonName, NonViralName.class);\r
+                               Set<NomenclaturalStatus> states = nonViralName.getStatus();\r
+                               if (states.size() == 1) {\r
+                                       NomenclaturalStatus state = states.iterator().next();\r
+                                       return state;\r
+                               } else if (states.size() > 1) {\r
+                                       logger.error("This TaxonName has more than one Nomenclatural Status: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
                                }\r
-                       } else if (states.size() > 1) {\r
-                               logger.error("This TaxonName has more than one Nomenclatural Status: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
                        }\r
-               }\r
                \r
                } catch (Exception e) {\r
                        e.printStackTrace();\r
                }\r
-               return result;\r
+               return null;\r
        }\r
-       \r
        /**\r
         * Returns the <code>TaxonStatusFk</code> attribute.\r
         * @param taxonName The {@link TaxonNameBase TaxonName}.\r