latest changes for PESI description export and transformer
[cdmlib-apps.git] / cdm-pesi / src / main / java / eu / etaxonomy / cdm / io / pesi / out / PesiTransformer.java
index 463b70122cbd86af4b3e4a59c66b0ffdc017952a..144e62611b97310139f2b7ad6eb69ca1ee189fa7 100644 (file)
@@ -14,6 +14,9 @@ import java.util.UUID;
 import org.apache.log4j.Logger;\r
 \r
 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;\r
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.ExportTransformerBase;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.IExportTransformer;\r
 import eu.etaxonomy.cdm.io.pesi.erms.ErmsTransformer;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
@@ -25,15 +28,12 @@ import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
 import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.TdwgArea;\r
-import eu.etaxonomy.cdm.model.name.BacterialName;\r
-import eu.etaxonomy.cdm.model.name.BotanicalName;\r
+import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
 import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
-import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
 import eu.etaxonomy.cdm.model.occurrence.Fossil;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
@@ -49,7 +49,8 @@ import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
  * @date 16.02.2010\r
  *\r
  */\r
-public final class PesiTransformer {\r
+public final class PesiTransformer extends ExportTransformerBase implements IExportTransformer{\r
+       \r
        private static final Logger logger = Logger.getLogger(PesiTransformer.class);\r
 \r
        public static final String auctString = "auct.";\r
@@ -210,6 +211,7 @@ public final class PesiTransformer {
        public static int IS_POTENTIAL_COMBINATION_FOR = 303;\r
 \r
        public static String STR_IS_BASIONYM_FOR = "is basionym for";\r
+       public static String STR_IS_BASIONYM_FOR_ZOOL = "is original combination for";\r
        public static String STR_IS_LATER_HOMONYM_OF = "is later homonym of";\r
        public static String STR_IS_REPLACED_SYNONYM_FOR = "is replaced synonym for";\r
        public static String STR_IS_VALIDATION_OF = "is validation of";\r
@@ -235,7 +237,9 @@ public final class PesiTransformer {
        public static String STR_IS_PRO_PARTE_SYNONYM_OF = "is pro parte synonym of";\r
        public static String STR_IS_PARTIAL_SYNONYM_OF = "is partial synonym of";\r
        public static String STR_IS_HETEROTYPIC_SYNONYM_OF = "is heterotypic synonym of";\r
+       public static String STR_IS_HETEROTYPIC_SYNONYM_OF_ZOOL = "is subjective synonym of";\r
        public static String STR_IS_HOMOTYPIC_SYNONYM_OF = "is homotypic synonym of";\r
+       private static final String STR_IS_HOMOTYPIC_SYNONYM_OF_ZOOL = "is objective synonym of";\r
        public static String STR_IS_PRO_PARTE_AND_HOMOTYPIC_SYNONYM_OF = "is pro parte and homotypic synonym of";\r
        public static String STR_IS_PRO_PARTE_AND_HETEROTYPIC_SYNONYM_OF = "is pro parte and heterotypic synonym of";\r
        public static String STR_IS_PARTIAL_AND_HOMOTYPIC_SYNONYM_OF = "is partial and homotypic synonym of";\r
@@ -1007,6 +1011,7 @@ public final class PesiTransformer {
        public static int AREA_BALEAR_SEA = 196;\r
        public static int AREA_TURKISH_EXCLUSIVE_ECONOMIC_ZONE = 197;\r
        public static int AREA_DANISH_EXCLUSIVE_ECONOMIC_ZONE = 198;\r
+       public static int AREA_TRANSCAUCASUS = 199;\r
 \r
 \r
        public static String STR_AREA_EAST_AEGEAN_ISLANDS = "East Aegean Islands";\r
@@ -1207,6 +1212,7 @@ public final class PesiTransformer {
        public static String STR_AREA_BALEAR_SEA = "Balear Sea";\r
        public static String STR_AREA_TURKISH_EXCLUSIVE_ECONOMIC_ZONE = "Turkish Exclusive Economic Zone";\r
        public static String STR_AREA_DANISH_EXCLUSIVE_ECONOMIC_ZONE = "Danish Exclusive Economic Zone";\r
+       public static String STR_AREA_TRANSCAUCASUS = "Transcaucasus";\r
 \r
 \r
        \r
@@ -1252,7 +1258,9 @@ public final class PesiTransformer {
         */\r
        public static String presenceAbsenceTerm2OccurrenceStatusCache(PresenceAbsenceTermBase<?> term) {\r
                String result = null;\r
-               if (term.isInstanceOf(PresenceTerm.class)) {\r
+               if (term == null){\r
+                       return null;\r
+               }else if (term.isInstanceOf(PresenceTerm.class)) {\r
                        PresenceTerm presenceTerm = CdmBase.deproxy(term, PresenceTerm.class);\r
                        if (presenceTerm.equals(PresenceTerm.PRESENT())) {\r
                                result = STR_STATUS_PRESENT;\r
@@ -1290,7 +1298,9 @@ public final class PesiTransformer {
         */\r
        public static Integer presenceAbsenceTerm2OccurrenceStatusId(PresenceAbsenceTermBase<?> term) {\r
                Integer result = null;\r
-               if (term.isInstanceOf(PresenceTerm.class)) {\r
+               if (term == null){\r
+                       return null;\r
+               }else if (term.isInstanceOf(PresenceTerm.class)) {\r
                        PresenceTerm presenceTerm = CdmBase.deproxy(term, PresenceTerm.class);\r
                        if (presenceTerm.equals(PresenceTerm.PRESENT())) {\r
                                result = STATUS_PRESENT;\r
@@ -1326,11 +1336,11 @@ public final class PesiTransformer {
         * @return\r
         */\r
        public static String area2AreaCache(NamedArea area) {\r
+               NamedArea namedArea = CdmBase.deproxy(area, NamedArea.class);\r
                if (area == null) {\r
                        return null;\r
                } else if (area.isInstanceOf(TdwgArea.class)) {\r
-                       NamedArea namedArea = CdmBase.deproxy(area, NamedArea.class);\r
-\r
+                       \r
                        // TODO: Areas identified by the string "TODO" (for now) have to be identified correctly after additions have been made to the list of NamedArea's according to specific imports, i.e. euro+med\r
                        if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_EAST_AEGEAN_ISLANDS; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("EAI")) { return STR_AREA_GREEK_EAST_AEGEAN_ISLANDS; }\r
@@ -1425,10 +1435,8 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("BLT-LI")) { return STR_AREA_LITHUANIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("POR")) { return STR_AREA_PORTUGUESE_MAINLAND; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("POR-OO")) { return STR_AREA_PORTUGUESE_MAINLAND; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR")) { return STR_AREA_MADEIRA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR-OO")) { return STR_AREA_MADEIRA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_DESERTAS; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_PORTO_SANTO; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR")) { return STR_AREA_MADEIRA_ARCHIPELAGO; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR-OO")) { return STR_AREA_MADEIRA_ARCHIPELAGO; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("YUG-MA")) { return STR_AREA_THE_FORMER_JUGOSLAV_REPUBLIC_OF_MAKEDONIJA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("UKR-MO")) { return STR_AREA_MOLDOVA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NOR")) { return STR_AREA_NORWEGIAN_MAINLAND; }\r
@@ -1451,12 +1459,7 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUS-OO")) { return STR_AREA_SOUTH_EUROPEAN_RUSSIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ROM")) { return STR_AREA_ROMANIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ROM-OO")) { return STR_AREA_ROMANIA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_FORMER_USSR; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_RUSSIA_BALTIC; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUC")) { return STR_AREA_RUSSIA_CENTRAL; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_RUSSIA_SOUTHEAST; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUN")) { return STR_AREA_RUSSIA_NORTHERN; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_RUSSIA_SOUTHWEST; }\r
+                       \r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SAR")) { return STR_AREA_SARDEGNA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SAR-OO")) { return STR_AREA_SARDEGNA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SVA")) { return STR_AREA_SVALBARD_WITH_BJORNOYA_AND_JAN_MAYEN; }\r
@@ -1474,7 +1477,6 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SWE-OO")) { return STR_AREA_SWEDEN; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TUE")) { return STR_AREA_EUROPEAN_TURKEY; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TUE-OO")) { return STR_AREA_EUROPEAN_TURKEY; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return STR_AREA_UKRAINE_INCLUDING_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("KRY")) { return STR_AREA_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("KRY-OO")) { return STR_AREA_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("UKR-UK")) { return STR_AREA_UKRAINE; }\r
@@ -1521,6 +1523,8 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NEO")) { return STR_AREA_NEOTROPICAL_REGION; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NRE")) { return STR_AREA_NEAR_EAST; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ORR")) { return STR_AREA_ORIENTAL_REGION; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TCS")) { return STR_AREA_TRANSCAUCASUS; }\r
+                       \r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidEuropeanMarineWaters)) { return STR_AREA_EUROPEAN_MARINE_WATERS; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MES") ||\r
                                        (namedArea.getUuid().equals(ErmsTransformer.uuidMediterraneanSea))) { return STR_AREA_MEDITERRANEAN_SEA; } // abbreviated label missing\r
@@ -1575,26 +1579,65 @@ public final class PesiTransformer {
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidBalearSea)) { return STR_AREA_BALEAR_SEA; }\r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidTurkishExclusiveEconomicZone)) { return STR_AREA_TURKISH_EXCLUSIVE_ECONOMIC_ZONE; }\r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidDanishExclusiveEconomicZone)) { return STR_AREA_DANISH_EXCLUSIVE_ECONOMIC_ZONE; }\r
+                       else {\r
+                               logger.error("Unknown NamedArea Area: " + area.getTitleCache());\r
+                               return null; // Actually the export has to stop here because AreaFk's are not allowed to be NULL.\r
+                       }\r
+               }else {\r
+                       if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidMadeira))){ return STR_AREA_MADEIRA; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidDesertas))) { return STR_AREA_DESERTAS; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidPortoSanto))) { return STR_AREA_PORTO_SANTO; }\r
+                       else if ((namedArea.equals(WaterbodyOrCountry.UKRAINE()))) { return STR_AREA_UKRAINE_INCLUDING_CRIMEA; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaBaltic))) { return STR_AREA_RUSSIA_BALTIC; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaSouthEast))) { return STR_AREA_RUSSIA_SOUTHEAST; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaSouthWest))) { return STR_AREA_RUSSIA_SOUTHWEST; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidUssr))) { return STR_AREA_FORMER_USSR; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaCentral))) { return STR_AREA_RUSSIA_CENTRAL; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaNorthern))) { return STR_AREA_RUSSIA_NORTHERN; }\r
+                       \r
                        else {\r
                                logger.error("Unknown NamedArea Area: " + area.getTitleCache());\r
                                return null; // Actually the export has to stop here because AreaFk's are not allowed to be NULL.\r
                        }\r
                }\r
-               return null; // Actually the export has to stop here because AreaFk's are not allowed to be NULL.\r
-               \r
+       }\r
+\r
+       @Override\r
+       public String getCacheByPresenceAbsenceTerm(PresenceAbsenceTermBase status) throws UndefinedTransformerMethodException {\r
+               return presenceAbsenceTerm2OccurrenceStatusCache(status);\r
+       }\r
+       \r
+       @Override\r
+       public Object getKeyByPresenceAbsenceTerm(PresenceAbsenceTermBase status) throws UndefinedTransformerMethodException {\r
+               return presenceAbsenceTerm2OccurrenceStatusId(status);\r
+       }\r
+       \r
+       \r
+       \r
+       @Override\r
+       public String getCacheByNamedArea(NamedArea area) throws UndefinedTransformerMethodException {\r
+               return area2AreaCache(area);\r
+       }\r
+       \r
+       \r
+       @Override\r
+       public Object getKeyByNamedArea(NamedArea area) throws UndefinedTransformerMethodException {\r
+               return area2AreaId(area);\r
        }\r
        \r
+       \r
        /**\r
         * Returns the AreaId for a given Area.\r
         * @param area\r
         * @return\r
         */\r
        public static Integer area2AreaId(NamedArea area) {\r
+               NamedArea namedArea = CdmBase.deproxy(area, NamedArea.class);\r
+\r
                if (area == null) {\r
                        return null;\r
                } else if (area.isInstanceOf(TdwgArea.class)) {\r
-                       NamedArea namedArea = CdmBase.deproxy(area, NamedArea.class);\r
-\r
+                       \r
                        // TODO: Areas identified by the string "TODO" (for now) have to be identified correctly after additions have been made to the list of NamedArea's according to specific imports, i.e. euro+med\r
                        if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_EAST_AEGEAN_ISLANDS; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("EAI")) { return AREA_GREEK_EAST_AEGEAN_ISLANDS; }\r
@@ -1689,10 +1732,8 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("BLT-LI")) { return AREA_LITHUANIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("POR")) { return AREA_PORTUGUESE_MAINLAND; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("POR-OO")) { return AREA_PORTUGUESE_MAINLAND; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR")) { return AREA_MADEIRA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR-OO")) { return AREA_MADEIRA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_DESERTAS; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_PORTO_SANTO; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR")) { return AREA_MADEIRA_ARCHIPELAGO; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MDR-OO")) { return AREA_MADEIRA_ARCHIPELAGO; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("YUG-MA")) { return AREA_THE_FORMER_JUGOSLAV_REPUBLIC_OF_MAKEDONIJA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("UKR-MO")) { return AREA_MOLDOVA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NOR")) { return AREA_NORWEGIAN_MAINLAND; }\r
@@ -1715,12 +1756,7 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUS-OO")) { return AREA_SOUTH_EUROPEAN_RUSSIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ROM")) { return AREA_ROMANIA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ROM-OO")) { return AREA_ROMANIA; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_FORMER_USSR; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_RUSSIA_BALTIC; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUC")) { return AREA_RUSSIA_CENTRAL; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_RUSSIA_SOUTHEAST; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("RUN")) { return AREA_RUSSIA_NORTHERN; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_RUSSIA_SOUTHWEST; }\r
+                       \r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SAR")) { return AREA_SARDEGNA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SAR-OO")) { return AREA_SARDEGNA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SVA")) { return AREA_SVALBARD_WITH_BJORNOYA_AND_JAN_MAYEN; }\r
@@ -1738,7 +1774,6 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("SWE-OO")) { return AREA_SWEDEN; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TUE")) { return AREA_EUROPEAN_TURKEY; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TUE-OO")) { return AREA_EUROPEAN_TURKEY; }\r
-                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TODO")) { return AREA_UKRAINE_INCLUDING_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("KRY")) { return AREA_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("KRY-OO")) { return AREA_CRIMEA; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("UKR-UK")) { return AREA_UKRAINE; }\r
@@ -1785,6 +1820,8 @@ public final class PesiTransformer {
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NEO")) { return AREA_NEOTROPICAL_REGION; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("NRE")) { return AREA_NEAR_EAST; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("ORR")) { return AREA_ORIENTAL_REGION; }\r
+                       else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("TCS")) { return AREA_TRANSCAUCASUS; }\r
+                       \r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidEuropeanMarineWaters)) { return AREA_EUROPEAN_MARINE_WATERS; }\r
                        else if ((namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel()).equals("MES") ||\r
                                        (namedArea.getUuid().equals(ErmsTransformer.uuidMediterraneanSea))) { return AREA_MEDITERRANEAN_SEA; } // abbreviated label missing\r
@@ -1839,9 +1876,25 @@ public final class PesiTransformer {
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidBalearSea)) { return AREA_BALEAR_SEA; }\r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidTurkishExclusiveEconomicZone)) { return AREA_TURKISH_EXCLUSIVE_ECONOMIC_ZONE; }\r
                        else if (namedArea.getUuid().equals(ErmsTransformer.uuidDanishExclusiveEconomicZone)) { return AREA_DANISH_EXCLUSIVE_ECONOMIC_ZONE; }\r
+                       else {\r
+                               logger.error("Unknown TDWGArea: " + area.getTitleCache());\r
+                       }\r
+               }else{  //Non TDWG\r
+                       if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidMadeira))){ return AREA_MADEIRA; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidDesertas))) { return AREA_DESERTAS; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidPortoSanto))) { return AREA_PORTO_SANTO; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaBaltic))) { return AREA_RUSSIA_BALTIC; }\r
+                       else if ((namedArea.equals(WaterbodyOrCountry.UKRAINE()))) { return AREA_UKRAINE_INCLUDING_CRIMEA; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaSouthEast))) { return AREA_RUSSIA_SOUTHEAST; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaSouthWest))) { return AREA_RUSSIA_SOUTHWEST; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidUssr))) { return AREA_FORMER_USSR; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaCentral))) { return AREA_RUSSIA_CENTRAL; }\r
+                       else if ((namedArea.getUuid().equals(BerlinModelTransformer.uuidRussiaNorthern))) { return AREA_RUSSIA_NORTHERN; }\r
+                       \r
                        else {\r
                                logger.error("Unknown NamedArea Area: " + area.getTitleCache());\r
                        }\r
+\r
                }\r
                return null;\r
 \r
@@ -2278,7 +2331,7 @@ public final class PesiTransformer {
         * @param feature\r
         * @return\r
         */\r
-       public static Integer textData2NodeCategoryFk(Feature feature) {\r
+       public static Integer feature2NodeCategoryFk(Feature feature) {\r
                if (feature == null) {\r
                        return null;\r
                }\r
@@ -2345,8 +2398,8 @@ public final class PesiTransformer {
                        return NoteCategory_Identification;\r
                } else if (feature.getUuid().equals(ErmsTransformer.uuidSynonymy)) {\r
                        return NoteCategory_Synonymy;\r
-//             } else if (feature.equals(Feature.CITATION())) {\r
-//                     return;\r
+               } else if (feature.equals(Feature.CITATION())) {\r
+                       return null;  //citations are handled differently\r
                        \r
                        // TODO: Unknown NodeCategories\r
 //                     NoteCategory_general_distribution_euromed = 10;\r
@@ -2370,7 +2423,7 @@ public final class PesiTransformer {
 //                     NoteCategory_Host = 283;\r
 \r
                }else{\r
-                       logger.warn("Unknown Feature: " + feature.getTitleCache());\r
+                       logger.warn("Unhandled Feature: " + feature.getTitleCache());\r
                        return null;\r
                }\r
        }\r
@@ -2693,28 +2746,6 @@ public final class PesiTransformer {
                }\r
                return result;\r
        }\r
-\r
-       /**\r
-        * Returns the NomenclaturalCode for a given TaxonNameBase.\r
-        * @param taxonName\r
-        * @return\r
-        */\r
-       public static NomenclaturalCode getNomenclaturalCode(TaxonNameBase taxonName) {\r
-               NomenclaturalCode code = null;\r
-               if (taxonName.isInstanceOf(ZoologicalName.class)) {\r
-                       code = NomenclaturalCode.ICZN;\r
-               } else if (taxonName.isInstanceOf(BotanicalName.class)) {\r
-                       code = NomenclaturalCode.ICBN;\r
-               } else if (taxonName.isInstanceOf(BacterialName.class)) {\r
-                       code = NomenclaturalCode.ICNB;\r
-//             } else if (taxonName.isInstanceOf(NonViralName.class)) { // Biota\r
-//                     code = NomenclaturalCode.\r
-               } else {\r
-                       logger.error("NomenclaturalCode could not be determined for this TaxonName: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
-                       logger.error("");\r
-               }\r
-               return code;\r
-       }\r
        \r
        /**\r
         * Returns the RankId for a Rank.\r
@@ -3183,75 +3214,7 @@ public final class PesiTransformer {
         * @param relation\r
         * @return\r
         */\r
-       public static String taxonRelation2RelTaxonQualifierCache(RelationshipBase<?,?,?> relation){\r
-               if (relation == null) {\r
-                       return null;\r
-               }\r
-               RelationshipTermBase<?> type = relation.getType();\r
-               if (type.equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())) {\r
-                       return STR_IS_MISAPPLIED_NAME_FOR;\r
-               } else if (type.equals(SynonymRelationshipType.SYNONYM_OF())) {\r
-                       return STR_IS_SYNONYM_OF;\r
-               } else if (type.equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())) {\r
-                       return STR_IS_HOMOTYPIC_SYNONYM_OF;\r
-               } else if (type.equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())) {\r
-                       return STR_IS_HETEROTYPIC_SYNONYM_OF;\r
-               } else if (type.equals(SynonymRelationshipType.INFERRED_EPITHET_OF())) {\r
-                       return STR_IS_INFERRED_EPITHET_FOR;\r
-               } else if (type.equals(SynonymRelationshipType.INFERRED_GENUS_OF())) {\r
-                       return STR_IS_INFERRED_GENUS_FOR;\r
-               } else if (type.equals(SynonymRelationshipType.POTENTIAL_COMBINATION_OF())) {\r
-                       return STR_IS_POTENTIAL_COMBINATION_FOR;\r
-               } else if (type.equals(NameRelationshipType.BASIONYM())) {\r
-                       return STR_IS_BASIONYM_FOR;\r
-               } else if (type.equals(NameRelationshipType.LATER_HOMONYM())) {\r
-                       return STR_IS_LATER_HOMONYM_OF;\r
-               } else if (type.equals(NameRelationshipType.REPLACED_SYNONYM())) {\r
-                       return STR_IS_REPLACED_SYNONYM_FOR;\r
-               } else if (type.equals(NameRelationshipType.VALIDATED_BY_NAME())) {\r
-                       return STR_IS_VALIDATION_OF;\r
-               } else if (type.equals(NameRelationshipType.LATER_VALIDATED_BY_NAME())) {\r
-                       return STR_IS_LATER_VALIDATION_OF;\r
-               } else if (type.equals(NameRelationshipType.CONSERVED_AGAINST())) {\r
-                       return STR_IS_CONSERVED_AGAINST;\r
-               } else if (type.equals(NameRelationshipType.TREATED_AS_LATER_HOMONYM())) {\r
-                       return STR_IS_TREATED_AS_LATER_HOMONYM_OF;\r
-               } else if (type.equals(NameRelationshipType.ORTHOGRAPHIC_VARIANT())) {\r
-                       return STR_IS_ORTHOGRAPHIC_VARIANT_OF;\r
-               } else if (type.equals(NameRelationshipType.ALTERNATIVE_NAME())) {\r
-                       return STR_IS_ALTERNATIVE_NAME_FOR;\r
-               } else {\r
-                       logger.warn("No equivalent RelationshipType found in datawarehouse for: " + type.getTitleCache());\r
-               }\r
-                       \r
-               // The following have no equivalent attribute in CDM\r
-//             IS_TYPE_OF\r
-//             IS_CONSERVED_TYPE_OF\r
-//             IS_REJECTED_TYPE_OF\r
-//             IS_FIRST_PARENT_OF\r
-//             IS_SECOND_PARENT_OF\r
-//             IS_FEMALE_PARENT_OF\r
-//             IS_MALE_PARENT_OF\r
-//             IS_REJECTED_IN_FAVOUR_OF\r
-//             HAS_SAME_TYPE_AS\r
-//             IS_LECTOTYPE_OF\r
-//             TYPE_NOT_DESIGNATED\r
-//             IS_PRO_PARTE_SYNONYM_OF\r
-//             IS_PARTIAL_SYNONYM_OF\r
-//             IS_PRO_PARTE_AND_HOMOTYPIC_SYNONYM_OF\r
-//             IS_PRO_PARTE_AND_HETEROTYPIC_SYNONYM_OF\r
-//             IS_PARTIAL_AND_HOMOTYPIC_SYNONYM_OF\r
-//             IS_PARTIAL_AND_HETEROTYPIC_SYNONYM_OF\r
-\r
-               return null;\r
-       }\r
-       \r
-       /**\r
-        * Returns the RelTaxonQualifierCache for a given zoological taxonRelation.\r
-        * @param relation\r
-        * @return\r
-        */\r
-       public static String zoologicalTaxonRelation2RelTaxonQualifierCache(RelationshipBase<?,?,?> relation){\r
+       public static String taxonRelation2RelTaxonQualifierCache(RelationshipBase<?,?,?> relation, NomenclaturalCode code){\r
                if (relation == null) {\r
                        return null;\r
                }\r
@@ -3261,9 +3224,17 @@ public final class PesiTransformer {
                } else if (type.equals(SynonymRelationshipType.SYNONYM_OF())) {\r
                        return STR_IS_SYNONYM_OF;\r
                } else if (type.equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())) {\r
-                       return "is objective synonym of";\r
+                       if (code.equals(NomenclaturalCode.ICZN)){\r
+                               return STR_IS_HOMOTYPIC_SYNONYM_OF_ZOOL;\r
+                       }else{\r
+                               return STR_IS_HOMOTYPIC_SYNONYM_OF;\r
+                       }\r
                } else if (type.equals(SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF())) {\r
-                       return "is subjective synonym of";\r
+                       if (code.equals(NomenclaturalCode.ICZN)){\r
+                               return STR_IS_HETEROTYPIC_SYNONYM_OF_ZOOL;\r
+                       }else{\r
+                               return STR_IS_HETEROTYPIC_SYNONYM_OF;\r
+                       }\r
                } else if (type.equals(SynonymRelationshipType.INFERRED_EPITHET_OF())) {\r
                        return STR_IS_INFERRED_EPITHET_FOR;\r
                } else if (type.equals(SynonymRelationshipType.INFERRED_GENUS_OF())) {\r
@@ -3271,7 +3242,11 @@ public final class PesiTransformer {
                } else if (type.equals(SynonymRelationshipType.POTENTIAL_COMBINATION_OF())) {\r
                        return STR_IS_POTENTIAL_COMBINATION_FOR;\r
                } else if (type.equals(NameRelationshipType.BASIONYM())) {\r
-                       return "is original combination for";\r
+                       if (code.equals(NomenclaturalCode.ICZN)){\r
+                               return STR_IS_BASIONYM_FOR_ZOOL;\r
+                       }else{\r
+                               return STR_IS_BASIONYM_FOR;\r
+                       }\r
                } else if (type.equals(NameRelationshipType.LATER_HOMONYM())) {\r
                        return STR_IS_LATER_HOMONYM_OF;\r
                } else if (type.equals(NameRelationshipType.REPLACED_SYNONYM())) {\r