remove imports
[cdmlib-apps.git] / cdm-pesi / src / main / java / eu / etaxonomy / cdm / io / pesi / out / PesiRelTaxonExport.java
index 39104ba9a5486c0284241529b2af66a681af0c68..1ad2ab0f0a7bb0e1e73a53c8b06766392a27c064 100644 (file)
@@ -21,22 +21,22 @@ import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;\r
 import org.springframework.transaction.TransactionStatus;\r
 \r
-import eu.etaxonomy.cdm.io.berlinModel.out.mapper.MethodMapper;\r
-import eu.etaxonomy.cdm.io.common.DbExportStateBase;\r
 import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.MethodMapper;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
 import eu.etaxonomy.cdm.model.name.NameRelationship;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Classification;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.Classification;\r
 \r
 /**\r
  * The export class for relations between {@link eu.etaxonomy.cdm.model.taxon.TaxonBase TaxonBases}.<p>\r
@@ -46,7 +46,6 @@ import eu.etaxonomy.cdm.model.taxon.Classification;
  *\r
  */\r
 @Component\r
-@SuppressWarnings("unchecked")\r
 public class PesiRelTaxonExport extends PesiExportBase {\r
        private static final Logger logger = Logger.getLogger(PesiRelTaxonExport.class);\r
        private static final Class<? extends CdmBase> standardMethodParameter = RelationshipBase.class;\r
@@ -55,12 +54,11 @@ public class PesiRelTaxonExport extends PesiExportBase {
        private static final String dbTableName = "RelTaxon";\r
        private static final String pluralString = "Relationships";\r
        private static PreparedStatement synonymsStmt;\r
-       private HashMap<Rank, Rank> rankMap = new HashMap<Rank, Rank>();\r
+       private HashMap<Rank, Rank> rank2endRankMap = new HashMap<Rank, Rank>();\r
        private List<Rank> rankList = new ArrayList<Rank>();\r
        private PesiExportMapping mapping;\r
        private int count = 0;\r
-       private boolean success = true;\r
-       private static NomenclaturalCode nomenclaturalCode;\r
+       private static NomenclaturalCode nomenclaturalCode2;\r
        \r
        public PesiRelTaxonExport() {\r
                super();\r
@@ -89,17 +87,11 @@ public class PesiRelTaxonExport extends PesiExportBase {
        @Override\r
        protected void doInvoke(PesiExportState state) {\r
                try {\r
-                       logger.error("*** Started Making " + pluralString + " ...");\r
+                       logger.info("*** Started Making " + pluralString + " ...");\r
        \r
                        Connection connection = state.getConfig().getDestination().getConnection();\r
                        String synonymsSql = "UPDATE Taxon SET KingdomFk = ?, RankFk = ?, RankCache = ? WHERE TaxonId = ?"; \r
                        synonymsStmt = connection.prepareStatement(synonymsSql);\r
-                       \r
-                       // Get the limit for objects to save within a single transaction.\r
-                       int pageSize = 1000;\r
-\r
-                       // Get the limit for objects to save within a single transaction.\r
-                       int limit = state.getConfig().getLimitSave();\r
 \r
                        // Stores whether this invoke was successful or not.\r
                        boolean success = true;\r
@@ -121,53 +113,58 @@ public class PesiRelTaxonExport extends PesiExportBase {
                        rankList.add(Rank.GENUS());\r
 \r
                        // Specify where to stop traversing (value) when starting at a specific Rank (key)\r
-                       rankMap.put(Rank.GENUS(), null); // Since NULL does not match an existing Rank, traverse all the way down to the leaves\r
-                       rankMap.put(Rank.KINGDOM(), Rank.GENUS()); // excludes rank genus\r
+                       rank2endRankMap.put(Rank.GENUS(), null); // Since NULL does not match an existing Rank, traverse all the way down to the leaves\r
+                       rank2endRankMap.put(Rank.KINGDOM(), Rank.GENUS()); // excludes rank genus\r
                        \r
                        // Retrieve list of classifications\r
                        txStatus = startTransaction(true);\r
-                       logger.error("Started transaction. Fetching all classifications...");\r
+                       logger.info("Started transaction. Fetching all classifications...");\r
                        classificationList = getClassificationService().listClassifications(null, 0, null, null);\r
                        commitTransaction(txStatus);\r
-                       logger.error("Committed transaction.");\r
+                       logger.debug("Committed transaction.");\r
 \r
-                       logger.error("Fetched " + classificationList.size() + " classification(s).");\r
+                       logger.info("Fetched " + classificationList.size() + " classification(s).");\r
 \r
                        for (Classification classification : classificationList) {\r
                                for (Rank rank : rankList) {\r
                                        \r
                                        txStatus = startTransaction(true);\r
-                                       logger.error("Started transaction to fetch all rootNodes specific to Rank " + rank.getLabel() + " ...");\r
+                                       logger.info("Started transaction to fetch all rootNodes specific to Rank " + rank.getLabel() + " ...");\r
 \r
                                        List<TaxonNode> rankSpecificRootNodes = getClassificationService().loadRankSpecificRootNodes(classification, rank, null);\r
-                                       logger.error("Fetched " + rankSpecificRootNodes.size() + " RootNodes for Rank " + rank.getLabel());\r
+                                       logger.info("Fetched " + rankSpecificRootNodes.size() + " RootNodes for Rank " + rank.getLabel());\r
 \r
                                        commitTransaction(txStatus);\r
-                                       logger.error("Committed transaction.");\r
+                                       logger.debug("Committed transaction.");\r
 \r
                                        for (TaxonNode rootNode : rankSpecificRootNodes) {\r
                                                txStatus = startTransaction(false);\r
-                                               Rank endRank = rankMap.get(rank);\r
+                                               Rank endRank = rank2endRankMap.get(rank);\r
                                                if (endRank != null) {\r
-                                                       logger.error("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.error("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
 \r
-                                               TaxonNode parentNode = newNode.getParent();\r
-\r
-                                               traverseTree(newNode, parentNode, rankMap.get(rank), state);\r
-\r
-                                               commitTransaction(txStatus);\r
-                                               logger.error("Committed transaction.");\r
+                                               if (isPesiTaxon(newNode.getTaxon())){\r
+                                                       \r
+                                                       TaxonNode parentNode = newNode.getParent();\r
+       \r
+                                                       success &=traverseTree(newNode, parentNode, endRank, state);\r
+       \r
+                                                       commitTransaction(txStatus);\r
+                                                       logger.debug("Committed transaction.");\r
+                                               }else{\r
+                                                       logger.debug("Taxon is not in PESI");\r
+                                               }\r
 \r
                                        }\r
                                }\r
                        }\r
 \r
-                       logger.error("*** Finished Making " + pluralString + " ..." + getSuccessString(success));\r
+                       logger.warn("*** Finished Making " + pluralString + " ..." + getSuccessString(success));\r
 \r
                        if (!success){\r
                                state.setUnsuccessfull();\r
@@ -189,35 +186,41 @@ public class PesiRelTaxonExport extends PesiExportBase {
         * @param fetchLevel\r
         * @param state\r
         */\r
-       private void traverseTree(TaxonNode childNode, TaxonNode parentNode, Rank fetchLevel, PesiExportState state) {\r
+       private boolean  traverseTree(TaxonNode childNode, TaxonNode parentNode, Rank fetchLevel, PesiExportState state) {\r
+               boolean success = true;\r
                // Traverse all branches from this childNode until specified fetchLevel is reached.\r
-               if (childNode.getTaxon() != null) {\r
-                       TaxonNameBase taxonName = childNode.getTaxon().getName();\r
-                       if (taxonName != null) {\r
-                               Rank childTaxonNameRank = taxonName.getRank();\r
-                               if (childTaxonNameRank != null) {\r
-                                       if (! childTaxonNameRank.equals(fetchLevel)) {\r
-\r
-                                               saveData(childNode, parentNode, state);\r
-\r
-                                               for (TaxonNode newNode : childNode.getChildNodes()) {\r
-                                                       traverseTree(newNode, childNode, fetchLevel, state);\r
+               TaxonBase<?> childTaxon = childNode.getTaxon();\r
+               if (childTaxon != null) {\r
+                       if (isPesiTaxon(childTaxon)){\r
+                               if (childTaxon.getName() != null) {\r
+                                       Rank childTaxonNameRank = childTaxon.getName().getRank();\r
+                                       if (childTaxonNameRank != null) {\r
+                                               if (! childTaxonNameRank.equals(fetchLevel)) {\r
+       \r
+                                                       success &= saveData(childNode, parentNode, state);\r
+       \r
+                                                       for (TaxonNode newNode : childNode.getChildNodes()) {\r
+                                                               success &= traverseTree(newNode, childNode, fetchLevel, state);\r
+                                                       }\r
+                                                       \r
+                                               } else {\r
+       //                                              logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
+                                                       return success;\r
                                                }\r
-                                               \r
                                        } else {\r
-//                                             logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
-                                               return;\r
+                                               logger.warn("Rank is NULL. FetchLevel can not be checked: " + childTaxon.getUuid() + " (" + childTaxon.getTitleCache() + ")");\r
                                        }\r
                                } else {\r
-                                       logger.error("Rank is NULL. FetchLevel can not be checked: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+                                       logger.error("TaxonName is NULL for taxon: " + childTaxon.getUuid());\r
                                }\r
-                       } else {\r
-                               logger.error("TaxonName is NULL for this node: " + childNode.getUuid());\r
+                       }else{\r
+                               logger.debug("Taxon is not a PESI taxon: " + childTaxon.getUuid());\r
                        }\r
 \r
                } else {\r
                        logger.error("Taxon is NULL for TaxonNode: " + childNode.getUuid());\r
                }\r
+               return success;\r
        }\r
 \r
        /**\r
@@ -228,86 +231,124 @@ public class PesiRelTaxonExport extends PesiExportBase {
         * @param state\r
         * @param currentTaxonFk\r
         */\r
-       private void saveData(TaxonNode childNode, TaxonNode parentNode, PesiExportState state) {\r
+       private boolean saveData(TaxonNode childNode, TaxonNode parentNode, PesiExportState state) {\r
+               boolean success = true;\r
                Taxon childNodeTaxon = childNode.getTaxon();\r
                if (childNodeTaxon != null) {\r
-                       TaxonNameBase childNodeTaxonName = childNodeTaxon.getName();\r
-                       nomenclaturalCode = PesiTransformer.getNomenclaturalCode(childNodeTaxonName);\r
-\r
-                       if (childNodeTaxonName != null) {\r
-\r
-                               // TaxonRelationships\r
-                               Set<Taxon> taxa = childNodeTaxonName.getTaxa(); // accepted taxa\r
-                               if (taxa.size() == 1) {\r
-                                       Taxon taxon = CdmBase.deproxy(taxa.iterator().next(), Taxon.class);\r
-                                       Set<TaxonRelationship> taxonRelations = taxon.getRelationsToThisTaxon();\r
-                                       for (TaxonRelationship taxonRelationship : taxonRelations) {\r
-                                               try {\r
-                                                       if (neededValuesNotNull(taxonRelationship, state)) {\r
-                                                               doCount(count++, modCount, pluralString);\r
-                                                               success &= mapping.invoke(taxonRelationship);\r
-                                                       }\r
-                                               } catch (SQLException e) {\r
-                                                       logger.error("TaxonRelationship could not be created for this TaxonRelation (" + taxonRelationship.getUuid() + "): " + e.getMessage());\r
-                                               }\r
-                                       }\r
-                               } else if (taxa.size() > 1) {\r
-                                       logger.error("TaxonRelationship could not be created. This TaxonNode has " + taxa.size() + " Taxa: " + childNodeTaxon.getUuid() + " (" + childNodeTaxon.getTitleCache() + ")");\r
-                               }\r
-                               \r
-                               // TaxonNameRelationships\r
-                               Set<NameRelationship> nameRelations = childNodeTaxonName.getRelationsFromThisName();\r
-                               for (NameRelationship nameRelation : nameRelations) {\r
-                                       try {\r
-                                               if (neededValuesNotNull(nameRelation, state)) {\r
-                                                       doCount(count++, modCount, pluralString);\r
-                                                       success &= mapping.invoke(nameRelation);\r
-                                               }\r
-                                       } catch (SQLException e) {\r
-                                               logger.error("NameRelationship could not be created: " + e.getMessage());\r
-                                       }\r
-                               }\r
+                       // TaxonRelationships\r
+                       success &= saveTaxonRelationships(state, childNodeTaxon);\r
+                       // TaxonNameRelationships\r
+                       success &= saveNameRelationships(state, childNodeTaxon);\r
+                       // SynonymRelationships\r
+                       success &= saveSynonymAndSynNameRelationships(state, childNodeTaxon);\r
+               }\r
+               return success;\r
+               \r
+       }\r
 \r
+       private boolean saveSynonymAndSynNameRelationships(PesiExportState state, Taxon childNodeTaxon) {\r
+               boolean success = true;\r
+               for (SynonymRelationship synRel : childNodeTaxon.getSynonymRelations()) { // synonyms of accepted taxon\r
+                       Synonym synonym = synRel.getSynonym();\r
+                       TaxonNameBase<?,?> synonymTaxonName = synonym.getName();\r
+                       if (! isPesiTaxon(synonym)){\r
+                               logger.warn("Synonym " + synonym.getId() + " of synonym relation " + synRel.getId() + " is not a PESI taxon. Can't export relationship");\r
+                               continue;\r
                        }\r
                        \r
-                       // SynonymRelationships\r
-                       Set<Synonym> synonyms = childNodeTaxon.getSynonyms(); // synonyms of accepted taxon\r
-                       for (Synonym synonym : synonyms) {\r
-                               TaxonNameBase synonymTaxonName = synonym.getName();\r
-                               \r
-                               // Store synonym data in Taxon table\r
-                               invokeSynonyms(state, synonymTaxonName);\r
-\r
-                               Set<SynonymRelationship> synonymRelations = synonym.getSynonymRelations();\r
-                               for (SynonymRelationship synonymRelationship : synonymRelations) {\r
-                                       try {\r
-                                               if (neededValuesNotNull(synonymRelationship, state)) {\r
-                                                       doCount(count++, modCount, pluralString);\r
-                                                       success &= mapping.invoke(synonymRelationship);\r
-                                                       \r
-                                               }\r
-                                       } catch (SQLException e) {\r
-                                               logger.error("SynonymRelationship could not be created for this SynonymRelation (" + synonymRelationship.getUuid() + "): " + e.getMessage());\r
+                       // Store synonym data in Taxon table\r
+                       invokeSynonyms(state, synonymTaxonName);\r
+\r
+                       \r
+                       \r
+                       Set<SynonymRelationship> synonymRelations = synonym.getSynonymRelations();\r
+                       state.setCurrentFromObject(synonym);\r
+                       for (SynonymRelationship synonymRelationship : synonymRelations) {  //needed? Maybe to make sure that there are no partial synonym relations missed ??\r
+                               try {\r
+                                       if (neededValuesNotNull(synonymRelationship, state)) {\r
+                                               doCount(count++, modCount, pluralString);\r
+                                               success &= mapping.invoke(synonymRelationship);\r
+                                               \r
                                        }\r
+                               } catch (SQLException e) {\r
+                                       logger.error("SynonymRelationship (" + synonymRelationship.getUuid() + ") could not be stored : " + e.getMessage());\r
                                }\r
+                       }\r
 \r
-                               // SynonymNameRelationship\r
-                               Set<NameRelationship> nameRelations = synonymTaxonName.getRelationsFromThisName();\r
-                               for (NameRelationship nameRelation : nameRelations) {\r
-                                       try {\r
-                                               if (neededValuesNotNull(nameRelation, state)) {\r
-                                                       doCount(count++, modCount, pluralString);\r
-                                                       success &= mapping.invoke(nameRelation);\r
-                                               }\r
-                                       } catch (SQLException e) {\r
-                                               logger.error("NameRelationship could not be created for this NameRelation (" + nameRelation.getUuid() + "): " + e.getMessage());\r
+                       // SynonymNameRelationship\r
+                       success &= saveNameRelationships(state, synonym);\r
+               }\r
+               return success;\r
+       }\r
+\r
+       private boolean saveNameRelationships(PesiExportState state, TaxonBase taxonBase) {\r
+               boolean success = true;\r
+               TaxonNameBase<?,?> childNodeTaxonName = taxonBase.getName();\r
+\r
+               //from relations\r
+               Set<NameRelationship> nameRelations = childNodeTaxonName.getRelationsFromThisName();\r
+               state.setCurrentFromObject(taxonBase);\r
+               boolean isFrom = true;\r
+               success &= saveOneSideNameRelation(state, isFrom, nameRelations);\r
+               \r
+               //toRelations\r
+               nameRelations = childNodeTaxonName.getRelationsToThisName();\r
+               state.setCurrentToObject(taxonBase);\r
+               isFrom = false;\r
+               success &= saveOneSideNameRelation(state, isFrom, nameRelations);\r
+               \r
+               return success;\r
+       }\r
+\r
+       private boolean saveOneSideNameRelation(PesiExportState state, boolean isFrom, Set<NameRelationship> nameRelations) {\r
+               boolean success = true;\r
+               for (NameRelationship nameRelation : nameRelations) {\r
+                       try {\r
+                               TaxonNameBase<?,?> relatedName = isFrom ? nameRelation.getToName(): nameRelation.getFromName();\r
+                               if ( isPurePesiName(relatedName)){\r
+                                       success &= checkAndInvokeNameRelation(state, nameRelation, relatedName, isFrom);\r
+                               }else{\r
+                                       for (TaxonBase<?> relatedTaxon : getPesiTaxa(relatedName)){\r
+                                               success &= checkAndInvokeNameRelation(state, nameRelation, relatedTaxon, isFrom);\r
                                        }\r
                                }\r
+                       } catch (SQLException e) {\r
+                               logger.error("NameRelationship " + nameRelation.getUuid() + " for " + nameRelation.getFromName().getTitleCache() + " and " + nameRelation.getToName().getTitleCache() + " could not be created: " + e.getMessage());\r
+                               success = false;\r
+                       }\r
+               }\r
+               return success;\r
+       }\r
+\r
+       private boolean checkAndInvokeNameRelation(PesiExportState state, NameRelationship nameRelation, IdentifiableEntity<?> relatedObject, boolean isFrom) throws SQLException {\r
+               boolean success = true;\r
+               if (isFrom){\r
+                       state.setCurrentToObject(relatedObject);\r
+               }else{\r
+                       state.setCurrentFromObject(relatedObject);\r
+               }\r
+               if (neededValuesNotNull(nameRelation, state)) {\r
+                       doCount(count++, modCount, pluralString);\r
+                       success &= mapping.invoke(nameRelation);\r
+               }\r
+               return success;\r
+       }\r
 \r
+       private boolean saveTaxonRelationships(PesiExportState state, Taxon childNodeTaxon) {\r
+               boolean success = true;\r
+               Taxon taxon = childNodeTaxon;\r
+               Set<TaxonRelationship> taxonRelations = taxon.getRelationsToThisTaxon();\r
+               for (TaxonRelationship taxonRelationship : taxonRelations) {\r
+                       try {\r
+                               if (neededValuesNotNull(taxonRelationship, state)) {\r
+                                       doCount(count++, modCount, pluralString);\r
+                                       success &= mapping.invoke(taxonRelationship);\r
+                               }\r
+                       } catch (SQLException e) {\r
+                               logger.error("TaxonRelationship could not be created for this TaxonRelation (" + taxonRelationship.getUuid() + "): " + e.getMessage());\r
                        }\r
-                       \r
                }\r
-               \r
+               return success;\r
        }\r
 \r
        /**\r
@@ -317,10 +358,10 @@ public class PesiRelTaxonExport extends PesiExportBase {
         */\r
        private static void invokeSynonyms(PesiExportState state, TaxonNameBase synonymTaxonName) {\r
                // Store KingdomFk and Rank information in Taxon table\r
-               Integer kingdomFk = PesiTransformer.nomenClaturalCode2Kingdom(nomenclaturalCode);\r
+               Integer kingdomFk = PesiTransformer.nomenClaturalCode2Kingdom(synonymTaxonName.getNomenclaturalCode());\r
                Integer synonymFk = state.getDbId(synonymTaxonName);\r
 \r
-               saveSynonymData(synonymTaxonName, nomenclaturalCode, kingdomFk, synonymFk);\r
+               saveSynonymData(synonymTaxonName, synonymTaxonName.getNomenclaturalCode(), kingdomFk, synonymFk);\r
        }\r
 \r
        /**\r
@@ -370,11 +411,11 @@ public class PesiRelTaxonExport extends PesiExportBase {
        private boolean neededValuesNotNull(RelationshipBase<?, ?, ?> relationship, PesiExportState state) {\r
                boolean result = true;\r
                if (getTaxonFk1(relationship, state) == null) {\r
-                       logger.error("TaxonFk1 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
+                       logger.warn("TaxonFk1 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
                        result = false;\r
                }\r
                if (getTaxonFk2(relationship, state) == null) {\r
-                       logger.error("TaxonFk2 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
+                       logger.warn("TaxonFk2 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
                        result = false;\r
                }\r
                return result;\r
@@ -448,12 +489,16 @@ public class PesiRelTaxonExport extends PesiExportBase {
        @SuppressWarnings("unused")\r
        private static String getRelQualifierCache(RelationshipBase<?, ?, ?> relationship) {\r
                String result = null;\r
-               if (nomenclaturalCode != null) {\r
-                       if (nomenclaturalCode.equals(NomenclaturalCode.ICZN)) {\r
-                               result = PesiTransformer.zoologicalTaxonRelation2RelTaxonQualifierCache(relationship);\r
-                       } else {\r
-                               result = PesiTransformer.taxonRelation2RelTaxonQualifierCache(relationship);\r
-                       }\r
+               NomenclaturalCode code = null;\r
+               if (relationship.isInstanceOf(TaxonRelationship.class)){\r
+                       code = CdmBase.deproxy(relationship, TaxonRelationship.class).getToTaxon().getName().getNomenclaturalCode();\r
+               }else if (relationship.isInstanceOf(SynonymRelationship.class)){\r
+                       code = CdmBase.deproxy(relationship, SynonymRelationship.class).getAcceptedTaxon().getName().getNomenclaturalCode();\r
+               }else if (relationship.isInstanceOf(NameRelationship.class)){\r
+                       code = CdmBase.deproxy(relationship,  NameRelationship.class).getFromName().getNomenclaturalCode();\r
+               }\r
+               if (code != null) {\r
+                       result = PesiTransformer.taxonRelation2RelTaxonQualifierCache(relationship, code);\r
                } else {\r
                        logger.error("NomenclaturalCode is NULL while creating the following relationship: " + relationship.getUuid());\r
                }\r
@@ -480,20 +525,28 @@ public class PesiRelTaxonExport extends PesiExportBase {
         * @return The database key of an object in the given relationship.\r
         */\r
        private static Integer getObjectFk(RelationshipBase<?, ?, ?> relationship, PesiExportState state, boolean isFrom) {\r
-               TaxonBase<?> taxon = null;\r
+               TaxonBase<?> taxonBase = null;\r
                if (relationship.isInstanceOf(TaxonRelationship.class)) {\r
                        TaxonRelationship tr = (TaxonRelationship)relationship;\r
-                       taxon = (isFrom) ? tr.getFromTaxon():  tr.getToTaxon();\r
+                       taxonBase = (isFrom) ? tr.getFromTaxon():  tr.getToTaxon();\r
                } else if (relationship.isInstanceOf(SynonymRelationship.class)) {\r
                        SynonymRelationship sr = (SynonymRelationship)relationship;\r
-                       taxon = (isFrom) ? sr.getSynonym() : sr.getAcceptedTaxon();\r
+                       taxonBase = (isFrom) ? sr.getSynonym() : sr.getAcceptedTaxon();\r
                } else if (relationship.isInstanceOf(NameRelationship.class)) {\r
-                       NameRelationship nr = (NameRelationship)relationship;\r
-                       TaxonNameBase taxonName = (isFrom) ? nr.getFromName() : nr.getToName();\r
-                       return state.getDbId(taxonName);\r
+                       if (isFrom){\r
+                               return state.getDbId(state.getCurrentFromObject());\r
+                       }else{\r
+                               return state.getDbId(state.getCurrentToObject());\r
+                       }\r
                }\r
-               if (taxon != null) {\r
-                       return state.getDbId(taxon.getName());\r
+               if (taxonBase != null) {\r
+                       if (! isPesiTaxon(taxonBase)){\r
+                               logger.warn("Related taxonBase is not a PESI taxon. Taxon: " + taxonBase.getId() + "/" + taxonBase.getUuid() + "; TaxonRel: " +  relationship.getId() + "(" + relationship.getType().getTitleCache() + ")");\r
+                               return null;\r
+                       }else{\r
+                               return state.getDbId(taxonBase);        \r
+                       }\r
+                       \r
                }\r
                logger.warn("No taxon found in state for relationship: " + relationship.toString());\r
                return null;\r