Some updates to Berlin MOdel import validation
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelCommonNamesImport.java
index 419ca027a4b8150ceff40b95af01148e348ffeb0..46451211fe387b269dff1adbf7e550695cd26739 100644 (file)
@@ -26,33 +26,35 @@ import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
 import org.springframework.stereotype.Component;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelCommonNamesImportValidator;\r
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
 import eu.etaxonomy.cdm.io.common.Source;\r
 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelCommonNamesImportValidator;\r
 import eu.etaxonomy.cdm.io.common.IOValidator;\r
 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
 import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.model.common.AnnotationType;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.DescriptionElementSource;\r
 import eu.etaxonomy.cdm.model.common.Extension;\r
 import eu.etaxonomy.cdm.model.common.ExtensionType;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.Extension;\r
 import eu.etaxonomy.cdm.model.common.ExtensionType;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.model.common.Representation;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
 import eu.etaxonomy.cdm.model.common.Representation;\r
 import eu.etaxonomy.cdm.model.description.CommonTaxonName;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementSource;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.Country;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
-import eu.etaxonomy.cdm.model.location.TdwgArea;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 \r
 /**\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 \r
 /**\r
- * FIXME TO BE IMPLEMENTED (Common names)\r
  * \r
  * @author a.mueller\r
  * @created 20.03.2008\r
  * \r
  * @author a.mueller\r
  * @created 20.03.2008\r
- * @version 1.0\r
  */\r
 @Component\r
 public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {\r
  */\r
 @Component\r
 public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {\r
@@ -65,7 +67,6 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
        public static final String NAMESPACE = "common name";\r
        \r
        \r
        public static final String NAMESPACE = "common name";\r
        \r
        \r
-       private static int modCount = 10000;\r
        private static final String pluralString = "common names";\r
        private static final String dbTableName = "emCommonName";\r
 \r
        private static final String pluralString = "common names";\r
        private static final String dbTableName = "emCommonName";\r
 \r
@@ -73,107 +74,96 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
        //map that stores the regions (named areas) and makes them accessible via the regionFk\r
        private Map<String, NamedArea> regionMap = new HashMap<String, NamedArea>();\r
 \r
        //map that stores the regions (named areas) and makes them accessible via the regionFk\r
        private Map<String, NamedArea> regionMap = new HashMap<String, NamedArea>();\r
 \r
-       \r
-\r
        public BerlinModelCommonNamesImport(){\r
        public BerlinModelCommonNamesImport(){\r
-               super();\r
+               super(dbTableName, pluralString);\r
        }\r
        \r
        }\r
        \r
-       \r
-\r
        @Override\r
        @Override\r
-       protected String getIdQuery() {\r
-               String result = " SELECT CommonNameId FROM emCommonName ";\r
+       protected String getIdQuery(BerlinModelImportState state) {\r
+               String result = " SELECT CommonNameId FROM emCommonName WHERE (1=1) ";\r
+               if (StringUtils.isNotBlank(state.getConfig().getCommonNameFilter())){\r
+                       result += " AND " + state.getConfig().getCommonNameFilter();\r
+               }\r
+               \r
                return result;\r
        }\r
 \r
                return result;\r
        }\r
 \r
-\r
-\r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)\r
-        */\r
        @Override\r
        protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
                String recordQuery = "";\r
                recordQuery = \r
        @Override\r
        protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
                String recordQuery = "";\r
                recordQuery = \r
-                       " SELECT emCommonName.CommonNameId, emCommonName.CommonName, PTaxon.RIdentifier AS taxonId, emCommonName.PTNameFk, emCommonName.RefFk AS refId, emCommonName.Status, " + \r
-                               " emCommonName.RegionFks, emCommonName.MisNameRefFk, emCommonName.NameInSourceFk , emCommonName.Created_When, emCommonName.Updated_When, emCommonName.Created_Who, emCommonName.Updated_Who, emCommonName.Note as Notes," + \r
-                       " regionLanguage.Language AS regionLanguage, languageCommonName.Language, languageCommonName.LanguageOriginal, languageCommonName.ISO639_1, languageCommonName.ISO639_2, " + \r
-                       " emLanguageRegion.Region, emLanguageReference.RefFk as languageRefRefFk, emLanguageReference.ReferenceShort, " + \r
-                       " emLanguageReference.ReferenceLong, emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, " +\r
-                       " languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2, regionLanguage.ISO639_2 AS regionLanguageIso, " +\r
-                       " misappliedTaxon.RIdentifier AS misappliedTaxonId " + \r
-               " FROM emLanguage as regionLanguage RIGHT OUTER JOIN " + \r
-                       " emLanguageRegion ON regionLanguage.LanguageId = emLanguageRegion.LanguageFk RIGHT OUTER JOIN " +\r
-                       " emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " +\r
-                       " emLanguageReference ON languageReferenceLanguage.LanguageId = emLanguageReference.LanguageFk RIGHT OUTER JOIN " +\r
-                       " emCommonName INNER JOIN " +\r
-                       " PTaxon ON emCommonName.PTNameFk = PTaxon.PTNameFk AND emCommonName.PTRefFk = PTaxon.PTRefFk ON " + \r
-                       " emLanguageReference.ReferenceId = emCommonName.LanguageRefFk LEFT OUTER JOIN " +\r
-                       " emLanguage AS languageCommonName ON emCommonName.LanguageFk = languageCommonName.LanguageId ON " + \r
-                       " emLanguageRegion.RegionId = emCommonName.RegionFks LEFT OUTER JOIN " +\r
-                       " PTaxon as misappliedTaxon ON emCommonName.PTNameFk = misappliedTaxon.PTNameFk AND emCommonName.MisNameRefFk = misappliedTaxon.PTRefFk " + \r
-                       " WHERE emCommonName.CommonNameId IN (" + ID_LIST_TOKEN + ")";\r
+                               " SELECT     cn.CommonNameId, cn.CommonName, PTaxon.RIdentifier AS taxonId, cn.PTNameFk, cn.RefFk AS refId, cn.Status, cn.RegionFks, cn.MisNameRefFk, " +\r
+                                              "               cn.NameInSourceFk, cn.Created_When, cn.Updated_When, cn.Created_Who, cn.Updated_Who, cn.Note AS Notes, languageCommonName.Language, " +\r
+                                              "               languageCommonName.LanguageOriginal, languageCommonName.ISO639_1, languageCommonName.ISO639_2,   " +\r
+                                              "               emLanguageReference.RefFk AS languageRefRefFk, emLanguageReference.ReferenceShort, emLanguageReference.ReferenceLong,  " +\r
+                                              "               emLanguageReference.LanguageFk, languageReferenceLanguage.Language AS refLanguage, languageReferenceLanguage.ISO639_2 AS refLanguageIso639_2,  "+ \r
+                                              "               misappliedTaxon.RIdentifier AS misappliedTaxonId " +\r
+                                       " FROM         PTaxon AS misappliedTaxon RIGHT OUTER JOIN " +\r
+                                           "                  emLanguage AS languageReferenceLanguage RIGHT OUTER JOIN " + \r
+                                                      "       emLanguageReference ON languageReferenceLanguage.LanguageId = emLanguageReference.LanguageFk RIGHT OUTER JOIN " +\r
+                                                      "       emCommonName AS cn INNER JOIN " +\r
+                                                      "       PTaxon ON cn.PTNameFk = PTaxon.PTNameFk AND cn.PTRefFk = PTaxon.PTRefFk ON  " +\r
+                                                      "       emLanguageReference.ReferenceId = cn.LanguageRefFk LEFT OUTER JOIN " +\r
+                                                       "      emLanguage AS languageCommonName ON cn.LanguageFk = languageCommonName.LanguageId ON misappliedTaxon.PTNameFk = cn.NameInSourceFk AND  " +\r
+                                                       "      misappliedTaxon.PTRefFk = cn.MisNameRefFk " +\r
+                       " WHERE cn.CommonNameId IN (" + ID_LIST_TOKEN + ")";\r
                return recordQuery;\r
        }\r
        \r
                return recordQuery;\r
        }\r
        \r
-       \r
-\r
        @Override\r
        @Override\r
-       protected boolean doInvoke(BerlinModelImportState state) {\r
-               boolean result = true;\r
+       protected void doInvoke(BerlinModelImportState state) {\r
                try {\r
                try {\r
-                       result &= makeRegions(state);\r
+                       makeRegions(state);\r
                } catch (Exception e) {\r
                        logger.error("Error when creating common name regions:" + e.getMessage());\r
                } catch (Exception e) {\r
                        logger.error("Error when creating common name regions:" + e.getMessage());\r
-                       result = false;\r
+                       e.printStackTrace();\r
+                       state.setUnsuccessfull();\r
                }\r
                }\r
-               result &= super.doInvoke(state);\r
-               return result;\r
+               super.doInvoke(state);\r
+               return;\r
        }\r
        \r
        /**\r
         * @param state \r
         * \r
         */\r
        }\r
        \r
        /**\r
         * @param state \r
         * \r
         */\r
-       private boolean makeRegions(BerlinModelImportState state) {\r
-               boolean result = true;\r
+       private void makeRegions(BerlinModelImportState state) {\r
                try {\r
                        SortedSet<Integer> regionFks = new TreeSet<Integer>();\r
                        Source source = state.getConfig().getSource();\r
                        \r
                try {\r
                        SortedSet<Integer> regionFks = new TreeSet<Integer>();\r
                        Source source = state.getConfig().getSource();\r
                        \r
-                       result = getRegionFks(result, regionFks, source);\r
+                       //fill set with all regionFk from emCommonName.regionFks\r
+                       getRegionFks(state, regionFks, source);\r
                        //concat filter string\r
                        String sqlWhere = getSqlWhere(regionFks);\r
                        \r
                        //get E+M - TDWG Mapping\r
                        Map<String, String> emTdwgMap = getEmTdwgMap(source);\r
                        //fill regionMap\r
                        //concat filter string\r
                        String sqlWhere = getSqlWhere(regionFks);\r
                        \r
                        //get E+M - TDWG Mapping\r
                        Map<String, String> emTdwgMap = getEmTdwgMap(source);\r
                        //fill regionMap\r
-                       fillRegionMap(source, sqlWhere, emTdwgMap);\r
+                       fillRegionMap(state, sqlWhere, emTdwgMap);\r
                        \r
                        \r
-                       return result;\r
+                       return;\r
                } catch (NumberFormatException e) {\r
                        e.printStackTrace();\r
                } catch (NumberFormatException e) {\r
                        e.printStackTrace();\r
-                       return false;\r
+                       state.setUnsuccessfull();\r
+                       return;\r
                } catch (SQLException e) {\r
                        e.printStackTrace();\r
                } catch (SQLException e) {\r
                        e.printStackTrace();\r
-                       return false;\r
+                       state.setUnsuccessfull();\r
+                       return;\r
                }\r
        }\r
 \r
 \r
                }\r
        }\r
 \r
 \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)\r
-        */\r
+       @Override\r
        public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state)  {\r
                boolean success = true ;\r
        public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state)  {\r
                boolean success = true ;\r
-               BerlinModelImportConfigurator config = state.getConfig();\r
+               \r
                Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
                Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);\r
                Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);\r
                \r
                Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();\r
                Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);\r
                Map<String, TaxonNameBase> taxonNameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);\r
                \r
-               Map<String, Reference> biblioRefMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);\r
-               Map<String, Reference> nomRefMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);\r
+               Map<String, Reference> refMap = (Map<String, Reference>) partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);\r
                \r
                Map<String, Language> iso6392Map = new HashMap<String, Language>();\r
                \r
                \r
                Map<String, Language> iso6392Map = new HashMap<String, Language>();\r
                \r
@@ -202,12 +192,11 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                Object misappliedTaxonId = rs.getObject("misappliedTaxonId");\r
                                \r
                                //regions\r
                                Object misappliedTaxonId = rs.getObject("misappliedTaxonId");\r
                                \r
                                //regions\r
-                               String region = rs.getString("Region");\r
                                String regionFks  = rs.getString("RegionFks");\r
                                String[] regionFkSplit = regionFks.split(",");\r
                                \r
                                //commonNameString\r
                                String regionFks  = rs.getString("RegionFks");\r
                                String[] regionFkSplit = regionFks.split(",");\r
                                \r
                                //commonNameString\r
-                               if (CdmUtils.isEmpty(commonNameString)){\r
+                               if (isBlank(commonNameString)){\r
                                        String message = "CommonName is empty or null. Do not import record for taxon " + taxonId;\r
                                        logger.warn(message);\r
                                        continue;\r
                                        String message = "CommonName is empty or null. Do not import record for taxon " + taxonId;\r
                                        logger.warn(message);\r
                                        continue;\r
@@ -215,10 +204,9 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                \r
                                //taxon\r
                                Taxon taxon = null;\r
                                \r
                                //taxon\r
                                Taxon taxon = null;\r
-                               TaxonBase taxonBase = null;\r
-                               taxonBase  = taxonMap.get(String.valueOf(taxonId));\r
+                               TaxonBase<?> taxonBase  = taxonMap.get(String.valueOf(taxonId));\r
                                if (taxonBase == null){\r
                                if (taxonBase == null){\r
-                                       logger.warn("Taxon (" + taxonId + ") could not be found. Common name " + commonNameString + " not imported");\r
+                                       logger.warn("Taxon (" + taxonId + ") could not be found. Common name " + commonNameString + "(" + commonNameId + ") not imported");\r
                                        continue;\r
                                }else if (! taxonBase.isInstanceOf(Taxon.class)){\r
                                        logger.warn("taxon (" + taxonId + ") is not accepted. Can't import common name " +  commonNameId);\r
                                        continue;\r
                                }else if (! taxonBase.isInstanceOf(Taxon.class)){\r
                                        logger.warn("taxon (" + taxonId + ") is not accepted. Can't import common name " +  commonNameId);\r
@@ -228,11 +216,11 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                }\r
                                \r
                                //Language\r
                                }\r
                                \r
                                //Language\r
-                               Language language = getAndHandleLanguage(iso6392Map, iso639_2, iso639_1, languageString, originalLanguageString);\r
+                               Language language = getAndHandleLanguage(iso6392Map, iso639_2, iso639_1, languageString, originalLanguageString, state);\r
                                \r
                                //CommonTaxonName\r
                                List<CommonTaxonName> commonTaxonNames = new ArrayList<CommonTaxonName>();\r
                                \r
                                //CommonTaxonName\r
                                List<CommonTaxonName> commonTaxonNames = new ArrayList<CommonTaxonName>();\r
-                               for (String regionFk : regionFkSplit){ \r
+                               for (String regionFk : regionFkSplit){ //\r
                                        CommonTaxonName commonTaxonName;\r
                                        if (commonTaxonNames.size() == 0){\r
                                                commonTaxonName = CommonTaxonName.NewInstance(commonNameString, language);\r
                                        CommonTaxonName commonTaxonName;\r
                                        if (commonTaxonNames.size() == 0){\r
                                                commonTaxonName = CommonTaxonName.NewInstance(commonNameString, language);\r
@@ -243,7 +231,11 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                        regionFk = regionFk.trim();\r
                                        NamedArea area = regionMap.get(regionFk);\r
                                        if (area == null){\r
                                        regionFk = regionFk.trim();\r
                                        NamedArea area = regionMap.get(regionFk);\r
                                        if (area == null){\r
-                                               logger.warn("Area for " + regionFk + " not defined.");\r
+                                               if (regionFkSplit.length > 1 && StringUtils.isNotBlank(regionFk)){\r
+                                                       logger.warn("Area for " + regionFk + " not defined in regionMap.");\r
+                                               }else{\r
+                                                       //no region is defined\r
+                                               }\r
                                        }else{\r
                                                commonTaxonName.setArea(area);\r
                                                TaxonDescription description = getDescription(taxon);\r
                                        }else{\r
                                                commonTaxonName.setArea(area);\r
                                                TaxonDescription description = getDescription(taxon);\r
@@ -255,41 +247,64 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                String strRefId = String.valueOf(refId);\r
                                String languageRefFk = String.valueOf(languageRefRefFk);\r
                                if (! CdmUtils.nullSafeEqual(strRefId, languageRefFk)){\r
                                String strRefId = String.valueOf(refId);\r
                                String languageRefFk = String.valueOf(languageRefRefFk);\r
                                if (! CdmUtils.nullSafeEqual(strRefId, languageRefFk)){\r
-                                       logger.warn("CommonName.RefFk (" + CdmUtils.Nz(strRefId) + ") and LanguageReference.RefFk " + CdmUtils.Nz(languageRefFk) + " are not equal. I will import only languageRefFk");\r
+                                       //use strRefId if languageRefFk is null\r
+                                       if (languageRefRefFk == null){\r
+                                               languageRefFk = strRefId;\r
+                                       }else{\r
+                                               logger.warn("CommonName.RefFk (" + CdmUtils.Nz(strRefId) + ") and LanguageReference.RefFk " + CdmUtils.Nz(languageRefFk) + " are not equal. I will import only languageReference.RefFk");\r
+                                       }\r
                                }\r
                                }\r
-                                               \r
-                               Reference reference = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(languageRefRefFk));\r
+                               \r
+                               Reference<?> reference = refMap.get(String.valueOf(languageRefRefFk));\r
                                String microCitation = null;\r
                                String originalNameString = null;\r
                                \r
                                String microCitation = null;\r
                                String originalNameString = null;\r
                                \r
-                               TaxonNameBase nameUsedInSource = taxonNameMap.get(String.valueOf(nameInSourceFk));\r
+                               TaxonNameBase<?,?> nameUsedInSource = taxonNameMap.get(String.valueOf(nameInSourceFk));\r
                                if (nameInSourceFk != null && nameUsedInSource == null){\r
                                if (nameInSourceFk != null && nameUsedInSource == null){\r
-                                       logger.warn("Name used in source (" + nameInSourceFk + ") was not found");\r
+                                       logger.warn("Name used in source (" + nameInSourceFk + ") was not found for common name " + commonNameId);\r
                                }\r
                                }\r
-                               DescriptionElementSource source = DescriptionElementSource.NewInstance(reference, microCitation, nameUsedInSource, originalNameString);\r
+                               DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(reference, microCitation, nameUsedInSource, originalNameString);\r
                                for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
                                        commonTaxonName.addSource(source);\r
                                }\r
                                \r
                                for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
                                        commonTaxonName.addSource(source);\r
                                }\r
                                \r
+                               \r
                                //MisNameRef\r
                                if (misNameRefFk != null){\r
                                        //Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);\r
                                //MisNameRef\r
                                if (misNameRefFk != null){\r
                                        //Taxon misappliedName = getMisappliedName(biblioRefMap, nomRefMap, misNameRefFk, taxon);\r
-                                       Taxon misappliedName = null;\r
+                                       Taxon misappliedNameTaxon = null;\r
                                        if (misappliedTaxonId != null){\r
                                        if (misappliedTaxonId != null){\r
-                                               misappliedName = taxonMap.get(String.valueOf(misappliedTaxonId));\r
+                                               TaxonBase<?> misTaxonBase =  taxonMap.get(String.valueOf(misappliedTaxonId));\r
+                                               if (misTaxonBase == null){\r
+                                                       logger.warn("MisappliedName not found for misappliedTaxonId " + misappliedTaxonId + "; commonNameId: " + commonNameId);\r
+                                               }else if (misTaxonBase.isInstanceOf(Taxon.class)){\r
+                                                       misappliedNameTaxon = CdmBase.deproxy(misTaxonBase, Taxon.class);\r
+                                               }else{\r
+                                                       logger.warn("Misapplied name taxon is not of type Taxon but " + misTaxonBase.getClass().getSimpleName());\r
+                                               }\r
                                        }else{\r
                                        }else{\r
-                                               TaxonNameBase taxonName = taxonNameMap.get(String.valueOf(ptNameFk));\r
-                                               Reference sec = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));\r
-                                               if (taxonName == null || sec == null){\r
-                                                       logger.info("Taxon name or misapplied name reference is null for common name " + commonNameId);\r
+                                               \r
+                                               Reference<?> sec = refMap.get(String.valueOf(misNameRefFk));\r
+                                               if (nameUsedInSource == null || sec == null){\r
+                                                       logger.warn("Taxon name or misapplied name reference is null for common name " + commonNameId);\r
                                                }else{\r
                                                }else{\r
-                                                       misappliedName = Taxon.NewInstance(taxonName, sec);\r
-                                                       taxaToSave.add(misappliedName);\r
+                                                       misappliedNameTaxon = Taxon.NewInstance(nameUsedInSource, sec);\r
+                                                       MarkerType misCommonNameMarker = getMarkerType(state, BerlinModelTransformer.uuidMisappliedCommonName,"Misapplied Common Name in Berlin Model", "Misapplied taxon was automatically created by Berlin Model import for a common name with a misapplied name reference", "MCN");\r
+                                                       Marker marker = Marker.NewInstance(misCommonNameMarker, true);\r
+                                                       misappliedNameTaxon.addMarker(marker);\r
+                                                       taxaToSave.add(misappliedNameTaxon);\r
+                                                       logger.warn("Misapplied name taxon could not be found in database but misapplied name reference exists for common name. " +\r
+                                                                       "New misapplied name for misapplied reference common name was added. CommonNameId: " + commonNameId);\r
                                                }\r
                                        }\r
                                                }\r
                                        }\r
-                                       if (misappliedName != null){\r
-                                               taxon.addMisappliedName(misappliedName, config.getSourceReference(), null);\r
-                                               TaxonDescription misappliedNameDescription = getDescription(misappliedName);\r
+                                       if (misappliedNameTaxon != null){\r
+                                               \r
+                                               if (! taxon.getMisappliedNames().contains(misappliedNameTaxon)){\r
+                                                       taxon.addMisappliedName(misappliedNameTaxon,state.getTransactionalSourceReference(), null);\r
+                                                       logger.warn("Misapplied name for common name was not found related to the accepted taxon. Created new relationship. CommonNameId: " + commonNameId);\r
+                                               }\r
+                                               \r
+                                               TaxonDescription misappliedNameDescription = getDescription(misappliedNameTaxon);\r
                                                for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
                                                        CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone();\r
                                                        misappliedNameDescription.addElement(commonNameClone);\r
                                                for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
                                                        CommonTaxonName commonNameClone = (CommonTaxonName)commonTaxonName.clone();\r
                                                        misappliedNameDescription.addElement(commonNameClone);\r
@@ -303,27 +318,26 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                \r
                                //reference extensions\r
                                if (reference != null){\r
                                \r
                                //reference extensions\r
                                if (reference != null){\r
-                                       if (CdmUtils.isNotEmpty(refLanguage)){\r
+                                       if (StringUtils.isNotBlank(refLanguage)){\r
                                                ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang.");\r
                                                Extension.NewInstance(reference, refLanguage, refLanguageExtensionType);\r
                                        }\r
                                        \r
                                                ExtensionType refLanguageExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_STRING_UUID, "reference language","The language of the reference","ref. lang.");\r
                                                Extension.NewInstance(reference, refLanguage, refLanguageExtensionType);\r
                                        }\r
                                        \r
-                                       if (CdmUtils.isNotEmpty(refLanguageIso639_2)){\r
+                                       if (StringUtils.isNotBlank(refLanguageIso639_2)){\r
                                                ExtensionType refLanguageIsoExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_ISO639_2_UUID, "reference language iso 639-2","The iso 639-2 code of the references language","ref. lang. 639-2");\r
                                                Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType);\r
                                        }\r
                                                ExtensionType refLanguageIsoExtensionType = getExtensionType( state, REFERENCE_LANGUAGE_ISO639_2_UUID, "reference language iso 639-2","The iso 639-2 code of the references language","ref. lang. 639-2");\r
                                                Extension.NewInstance(reference, refLanguageIso639_2, refLanguageIsoExtensionType);\r
                                        }\r
-                               }else if (CdmUtils.isNotEmpty(refLanguage) || CdmUtils.isNotEmpty(refLanguageIso639_2)){\r
-                                       logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null");\r
+                               }else if (isNotBlank(refLanguage) || isNotBlank(refLanguageIso639_2)){\r
+                                       logger.warn("Reference is null (" + languageRefRefFk + ") but refLanguage (" + CdmUtils.Nz(refLanguage) + ") or iso639_2 (" + CdmUtils.Nz(refLanguageIso639_2) + ") was not null for common name ("+ commonNameId +")");\r
                                }\r
                                \r
                                //status\r
                                }\r
                                \r
                                //status\r
-                               if (CdmUtils.isNotEmpty(status)){\r
-                                       AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status");\r
-                                       Annotation annotation = Annotation.NewInstance(status, statusAnnotationType, Language.DEFAULT());\r
+                               if (isNotBlank(status)){\r
+                                       AnnotationType statusAnnotationType = getAnnotationType( state, STATUS_ANNOTATION_UUID, "status","The status of this object","status", null);\r
                                        for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
                                        for (CommonTaxonName commonTaxonName : commonTaxonNames){\r
+                                               Annotation annotation = Annotation.NewInstance(status, statusAnnotationType, Language.DEFAULT());\r
                                                commonTaxonName.addAnnotation(annotation);\r
                                        }\r
                                                commonTaxonName.addAnnotation(annotation);\r
                                        }\r
-                                       \r
                                }\r
                                \r
                                //Notes\r
                                }\r
                                \r
                                //Notes\r
@@ -347,51 +361,17 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
 \r
        }\r
 \r
 \r
        }\r
 \r
-\r
-\r
-       /**\r
-        * Not used anymore. Use MisappliedName RIdentifier instead\r
-        * @param biblioRefMap\r
-        * @param nomRefMap\r
-        * @param misNameRefFk\r
-        * @param taxon\r
-        */\r
-       private boolean isFirstMisappliedName = true;\r
-       private Taxon getMisappliedName(Map<String, Reference> biblioRefMap, Map<String, Reference> nomRefMap, \r
-                       Object misNameRefFk, Taxon taxon) {\r
-               Taxon misappliedTaxon = null;\r
-               Reference misNameRef = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, String.valueOf(misNameRefFk));\r
-               misappliedTaxon = Taxon.NewInstance(taxon.getName(), misNameRef);\r
-               Set<String> includeProperty = new HashSet<String>();\r
-               try {\r
-//                     //IMatchStrategy matchStrategy = DefaultMatchStrategy.NewInstance(TaxonBase.class);\r
-//                     //List<TaxonBase> misappliedList1 = getCommonService().findMatching(misappliedTaxon, matchStrategy);\r
-                       List<TaxonBase> misappliedList = getTaxonService().list(misappliedTaxon, includeProperty, null, null, null, null);\r
-                       if (misappliedList.size() > 0){\r
-                               misappliedTaxon = CdmBase.deproxy(misappliedList.get(0), Taxon.class);\r
-                       }\r
-               } catch (ClassCastException e) {\r
-                       logger.error(e.getMessage());\r
-                       if (isFirstMisappliedName){\r
-                               e.printStackTrace();\r
-                               isFirstMisappliedName = false;\r
-                       }\r
-               }\r
-               return misappliedTaxon;\r
-       }\r
-\r
-\r
-\r
        /**\r
         * @param iso6392Map\r
         * @param iso639_2\r
         * @param languageString\r
         * @param originalLanguageString\r
        /**\r
         * @param iso6392Map\r
         * @param iso639_2\r
         * @param languageString\r
         * @param originalLanguageString\r
+        * @param state \r
         * @return\r
         */\r
         * @return\r
         */\r
-       private Language getAndHandleLanguage(Map<String, Language> iso639Map,  String iso639_2, String iso639_1, String languageString, String originalLanguageString) {\r
+       private Language getAndHandleLanguage(Map<String, Language> iso639Map,  String iso639_2, String iso639_1, String languageString, String originalLanguageString, BerlinModelImportState state) {\r
                Language language;\r
                Language language;\r
-               if (CdmUtils.isNotEmpty(iso639_2)|| CdmUtils.isNotEmpty(iso639_1)  ){\r
+               if (isNotBlank(iso639_2)|| isNotBlank(iso639_1)  ){\r
                        //TODO test performance, implement in state\r
                        language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1);\r
                        \r
                        //TODO test performance, implement in state\r
                        language = getLanguageFromIsoMap(iso639Map, iso639_2, iso639_1);\r
                        \r
@@ -399,13 +379,23 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                                language = getTermService().getLanguageByIso(iso639_2);\r
                                iso639Map.put(iso639_2, language);\r
                                if (language == null){\r
                                language = getTermService().getLanguageByIso(iso639_2);\r
                                iso639Map.put(iso639_2, language);\r
                                if (language == null){\r
-                                       language = getTermService().getLanguageByIso(iso639_1);\r
+                                       try {\r
+                                               language = getTermService().getLanguageByIso(iso639_1);\r
+                                       } catch (Exception e) {\r
+                                               // TODO Auto-generated catch block\r
+                                               // TODO remove if problem with duplicate DescElement_Annot id is solved\r
+                                               e.printStackTrace();\r
+                                       }\r
                                        iso639Map.put(iso639_1, language);\r
                                }\r
                                if (language == null){\r
                                        logger.warn("Language for code ISO693-2 '" + iso639_2 + "' and ISO693-1 '" + iso639_1 + "' was not found");\r
                                }\r
                        }\r
                                        iso639Map.put(iso639_1, language);\r
                                }\r
                                if (language == null){\r
                                        logger.warn("Language for code ISO693-2 '" + iso639_2 + "' and ISO693-1 '" + iso639_1 + "' was not found");\r
                                }\r
                        }\r
+               } else if ("unknown".equals(languageString)){\r
+                       language = Language.UNKNOWN_LANGUAGE();\r
+               } else if ("Majorcan".equalsIgnoreCase(languageString)){\r
+                       language = getLanguage(state, BerlinModelTransformer.uuidLangMajorcan, "Majorcan", "Majorcan (original 'mallorqu\u00EDn')", null);\r
                }else{\r
                        logger.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString);\r
                        language = null;\r
                }else{\r
                        logger.warn("language ISO 639_1 and ISO 639_2 were empty for " + languageString);\r
                        language = null;\r
@@ -421,8 +411,7 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
         * @param iso639_1\r
         * @return\r
         */\r
         * @param iso639_1\r
         * @return\r
         */\r
-       private Language getLanguageFromIsoMap(Map<String, Language> iso639Map,\r
-                       String iso639_2, String iso639_1) {\r
+       private Language getLanguageFromIsoMap(Map<String, Language> iso639Map, String iso639_2, String iso639_1) {\r
                Language language;\r
                language = iso639Map.get(iso639_2);\r
                if (language == null){\r
                Language language;\r
                language = iso639Map.get(iso639_2);\r
                if (language == null){\r
@@ -436,7 +425,7 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
         * @param originalLanguageString\r
         */\r
        private void addOriginalLanguage(Language language,     String originalLanguageString) {\r
         * @param originalLanguageString\r
         */\r
        private void addOriginalLanguage(Language language,     String originalLanguageString) {\r
-               if (CdmUtils.isEmpty(originalLanguageString)){\r
+               if (isBlank(originalLanguageString)){\r
                        return;\r
                }else if (language == null){\r
                        logger.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString);\r
                        return;\r
                }else if (language == null){\r
                        logger.warn("Language could not be defined, but originalLanguageString exists: " + originalLanguageString);\r
@@ -453,42 +442,54 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
 \r
 \r
        /**\r
 \r
 \r
        /**\r
-        * @param result\r
+        * Fills the regionFks with all regionFks from emCommonName. Comma separated regionFks will be split.\r
+        * @param state\r
         * @param regionFks\r
         * @param source\r
         * @return\r
         * @throws SQLException\r
         * @param regionFks\r
         * @param source\r
         * @return\r
         * @throws SQLException\r
+        * \r
         */\r
         */\r
-       private boolean getRegionFks(boolean result, SortedSet<Integer> regionFks,\r
-                       Source source) throws SQLException {\r
+       private void getRegionFks(BerlinModelImportState state, SortedSet<Integer> regionFks, Source source) throws SQLException {\r
                String sql = " SELECT DISTINCT RegionFks FROM emCommonName";\r
                String sql = " SELECT DISTINCT RegionFks FROM emCommonName";\r
+               if (state.getConfig().getCommonNameFilter() != null){\r
+                       sql += " WHERE " + state.getConfig().getCommonNameFilter(); \r
+               }\r
+               \r
                ResultSet rs = source.getResultSet(sql);\r
                while (rs.next()){\r
                        String strRegionFks = rs.getString("RegionFks"); \r
                ResultSet rs = source.getResultSet(sql);\r
                while (rs.next()){\r
                        String strRegionFks = rs.getString("RegionFks"); \r
+                       if (isBlank(strRegionFks)){\r
+                               continue;\r
+                       }\r
+                       \r
                        String[] regionFkArray = strRegionFks.split(",");\r
                        for (String regionFk: regionFkArray){\r
                                regionFk = regionFk.trim();\r
                        String[] regionFkArray = strRegionFks.split(",");\r
                        for (String regionFk: regionFkArray){\r
                                regionFk = regionFk.trim();\r
-                               if (! StringUtils.isNumeric(regionFk)){\r
-                                       result = false;\r
-                                       logger.warn("RegionFk is not numeric: " + regionFk);\r
+                               if (! StringUtils.isNumeric(regionFk) || "".equals(regionFk)  ){\r
+                                       state.setUnsuccessfull();\r
+                                       logger.warn("RegionFk is not numeric: " + regionFk +  " ( part of " + strRegionFks + ")");\r
                                }else{\r
                                        regionFks.add(Integer.valueOf(regionFk));\r
                                }\r
                        }\r
                }\r
                                }else{\r
                                        regionFks.add(Integer.valueOf(regionFk));\r
                                }\r
                        }\r
                }\r
-               return result;\r
+               return;\r
        }\r
 \r
 \r
 \r
        /**\r
        }\r
 \r
 \r
 \r
        /**\r
-        * @param source\r
+        * Fills the {@link #regionMap} by all emLanguageRegion regions defined in the sql filter.\r
+        * {@link #regionMap} maps emLanguageRegion.RegionId to named areas.\r
+        * @param state\r
         * @param sqlWhere\r
         * @param emTdwgMap\r
         * @throws SQLException\r
         */\r
         * @param sqlWhere\r
         * @param emTdwgMap\r
         * @throws SQLException\r
         */\r
-       private void fillRegionMap(Source source, String sqlWhere,\r
+       private void fillRegionMap(BerlinModelImportState state, String sqlWhere,\r
                        Map<String, String> emTdwgMap) throws SQLException {\r
                        Map<String, String> emTdwgMap) throws SQLException {\r
+               Source source = state.getConfig().getSource();\r
                String sql;\r
                ResultSet rs;\r
                sql = " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere+ ") ";\r
                String sql;\r
                ResultSet rs;\r
                sql = " SELECT RegionId, Region FROM emLanguageRegion WHERE RegionId IN ("+ sqlWhere+ ") ";\r
@@ -498,18 +499,23 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                        String region = rs.getString("Region");\r
                        String[] splitRegion = region.split("-");\r
                        if (splitRegion.length <= 1){\r
                        String region = rs.getString("Region");\r
                        String[] splitRegion = region.split("-");\r
                        if (splitRegion.length <= 1){\r
-                               NamedArea newArea = NamedArea.NewInstance(region, region, null);\r
-                               getTermService().save(newArea);\r
+                               NamedArea newArea = getNamedArea(state, null, region, "Language region '" + region + "'", null, null, null);\r
+//                             getTermService().save(newArea);\r
                                regionMap.put(String.valueOf(regionId), newArea);\r
                                logger.warn("Found new area: " +  region);\r
                        }else if (splitRegion.length == 2){\r
                                String emCode = splitRegion[1].trim();\r
                                String tdwgCode = emTdwgMap.get(emCode);\r
                                if (StringUtils.isNotBlank(tdwgCode) ){\r
                                regionMap.put(String.valueOf(regionId), newArea);\r
                                logger.warn("Found new area: " +  region);\r
                        }else if (splitRegion.length == 2){\r
                                String emCode = splitRegion[1].trim();\r
                                String tdwgCode = emTdwgMap.get(emCode);\r
                                if (StringUtils.isNotBlank(tdwgCode) ){\r
-                                       NamedArea tdwgArea = getNamedArea(tdwgCode);\r
+                                       NamedArea tdwgArea = getNamedArea(state, tdwgCode);\r
                                        regionMap.put(String.valueOf(regionId), tdwgArea);\r
                                        regionMap.put(String.valueOf(regionId), tdwgArea);\r
-                               }else{\r
-                                       logger.warn("emCode did not map to valid tdwgCode: " +  CdmUtils.Nz(emCode) + "->" + CdmUtils.Nz(tdwgCode));\r
+                               }else {\r
+                                       NamedArea area = getOtherAreas(state, emCode, tdwgCode);\r
+                                       if (area != null){\r
+                                               regionMap.put(String.valueOf(regionId), area);\r
+                                       }else{\r
+                                               logger.warn("emCode did not map to valid tdwgCode: " +  CdmUtils.Nz(emCode) + "->" + CdmUtils.Nz(tdwgCode));\r
+                                       }\r
                                }\r
                        }\r
                }\r
                                }\r
                        }\r
                }\r
@@ -517,27 +523,32 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
 \r
 \r
        /**\r
 \r
 \r
        /**\r
+        * Returns the are for a given TDWG code. See {@link #getEmTdwgMap(Source)} for exceptions from\r
+        * the TDWG code\r
+        * @param state \r
         * @param tdwgCode\r
         */\r
         * @param tdwgCode\r
         */\r
-       private NamedArea getNamedArea(String tdwgCode) {\r
+       private NamedArea getNamedArea(BerlinModelImportState state, String tdwgCode) {\r
                NamedArea area;\r
                if (tdwgCode.equalsIgnoreCase("Ab")){\r
                NamedArea area;\r
                if (tdwgCode.equalsIgnoreCase("Ab")){\r
-                       area = NamedArea.NewInstance("Azerbaijan (including Nakhichevan)", "Azerbaijan & Nakhichevan", "Ab");\r
-                       getTermService().save(area);\r
-               }else if (tdwgCode.equalsIgnoreCase("Rf")){\r
-                       area = NamedArea.NewInstance("The Russian Federation", "The Russian Federation", "Rf");\r
-                       getTermService().save(area);\r
+                       area = getNamedArea(state, BerlinModelTransformer.uuidAzerbaijanNakhichevan, "Azerbaijan & Nakhichevan", "Azerbaijan (including Nakhichevan)",  "Ab", null, null);\r
+                       getTermService().saveOrUpdate(area);\r
                }else if (tdwgCode.equalsIgnoreCase("Uk")){\r
                }else if (tdwgCode.equalsIgnoreCase("Uk")){\r
-                       area = NamedArea.NewInstance("Ukraine (including Crimea)", "Ukraine & Crimea", "Uk");\r
-                       getTermService().save(area);\r
+                       area = getNamedArea(state, BerlinModelTransformer.uuidUkraineAndCrimea , "Ukraine & Crimea", "Ukraine (including Crimea)", "Uk", null, null);\r
+                       getTermService().saveOrUpdate(area);\r
+               }else if (tdwgCode.equalsIgnoreCase("Rf")){\r
+                       area = Country.RUSSIANFEDERATION();\r
+               }else if (tdwgCode.equalsIgnoreCase("Gg")){\r
+                       area = Country.GEORGIA();\r
                }else{\r
                }else{\r
-                       area = TdwgArea.getAreaByTdwgAbbreviation(tdwgCode);\r
+                       area = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwgCode);\r
+               }\r
+               if (area == null){\r
+                       logger.warn("Area is null for " + tdwgCode);\r
                }\r
                return area;\r
        }\r
 \r
                }\r
                return area;\r
        }\r
 \r
-\r
-\r
        /**\r
         * @param regionFks\r
         * @return\r
        /**\r
         * @param regionFks\r
         * @return\r
@@ -551,9 +562,10 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                return sqlWhere;\r
        }\r
 \r
                return sqlWhere;\r
        }\r
 \r
-\r
-\r
        /**\r
        /**\r
+        * Returns a map which is filled by the emCode->TdwgCode mapping defined in emArea.\r
+        * Some exceptions are defined for emCode 'Ab','Rf','Uk' and some additional mapping is added \r
+        * for 'Ab / Ab(A)', 'Ga / Ga(F)', 'It / It(I)', 'Ar / Ar(A)','Hs / Hs(S)'\r
         * @param source\r
         * @throws SQLException\r
         */\r
         * @param source\r
         * @throws SQLException\r
         */\r
@@ -568,19 +580,25 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                        String TDWGCode = rs.getString("TDWGCode");\r
                        if (StringUtils.isNotBlank(emCode) ){\r
                                emCode = emCode.trim();\r
                        String TDWGCode = rs.getString("TDWGCode");\r
                        if (StringUtils.isNotBlank(emCode) ){\r
                                emCode = emCode.trim();\r
-                               if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| emCode.equalsIgnoreCase("Uk") ){\r
+                               if (emCode.equalsIgnoreCase("Ab") || emCode.equalsIgnoreCase("Rf")|| \r
+                                               emCode.equalsIgnoreCase("Uk") || emCode.equalsIgnoreCase("Gg")){\r
                                        emTdwgMap.put(emCode, emCode);\r
                                }else if (StringUtils.isNotBlank(TDWGCode)){\r
                                        emTdwgMap.put(emCode, TDWGCode.trim());\r
                                }\r
                        }\r
                }\r
                                        emTdwgMap.put(emCode, emCode);\r
                                }else if (StringUtils.isNotBlank(TDWGCode)){\r
                                        emTdwgMap.put(emCode, TDWGCode.trim());\r
                                }\r
                        }\r
                }\r
+               emTdwgMap.put("Ab / Ab(A)", "Ab");\r
+               emTdwgMap.put("Ga / Ga(F)", "FRA-FR");\r
+               emTdwgMap.put("It / It(I)", "ITA");\r
+               emTdwgMap.put("Uk / Uk(U)", "Uk");\r
+               emTdwgMap.put("Ar / Ar(A)", "TCS-AR");\r
+               emTdwgMap.put("Hs / Hs(S)", "SPA-SP");\r
+               \r
                return emTdwgMap;\r
        }\r
 \r
 \r
                return emTdwgMap;\r
        }\r
 \r
 \r
-\r
-\r
        /**\r
         * Returns the first non-image gallery description. Creates a new one if no description exists.\r
         * @param taxon\r
        /**\r
         * Returns the first non-image gallery description. Creates a new one if no description exists.\r
         * @param taxon\r
@@ -599,15 +617,14 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                return result;\r
        }\r
 \r
                return result;\r
        }\r
 \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
-        */\r
+       @Override\r
        public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
                String nameSpace;\r
        public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
                String nameSpace;\r
-               Class cdmClass;\r
+               Class<?> cdmClass;\r
                Set<String> idSet;\r
                Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
                \r
                Set<String> idSet;\r
                Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
                \r
+               String pos = "0";\r
                try{\r
                        Set<String> taxonIdSet = new HashSet<String>();\r
                        Set<String> nameIdSet = new HashSet<String>();\r
                try{\r
                        Set<String> taxonIdSet = new HashSet<String>();\r
                        Set<String> nameIdSet = new HashSet<String>();\r
@@ -626,32 +643,25 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                        nameSpace = BerlinModelTaxonNameImport.NAMESPACE;\r
                        cdmClass = TaxonNameBase.class;\r
                        idSet = nameIdSet;\r
                        nameSpace = BerlinModelTaxonNameImport.NAMESPACE;\r
                        cdmClass = TaxonNameBase.class;\r
                        idSet = nameIdSet;\r
-                       Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       Map<String, TaxonNameBase<?,?>> nameMap = (Map<String, TaxonNameBase<?,?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
                        result.put(nameSpace, nameMap);\r
                        result.put(nameSpace, nameMap);\r
-\r
-                       //name map\r
+                       \r
+                       //taxon map\r
                        nameSpace = BerlinModelTaxonImport.NAMESPACE;\r
                        nameSpace = BerlinModelTaxonImport.NAMESPACE;\r
-                       cdmClass = Taxon.class;\r
+                       cdmClass = TaxonBase.class;\r
                        idSet = taxonIdSet;\r
                        idSet = taxonIdSet;\r
-                       Map<String, TaxonNameBase> taxonMap = (Map<String, TaxonNameBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       Map<String, TaxonBase<?>> taxonMap = (Map<String, TaxonBase<?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
                        result.put(nameSpace, taxonMap);\r
                        result.put(nameSpace, taxonMap);\r
-\r
-                       //nom reference map\r
-                       nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;\r
-                       cdmClass = Reference.class;\r
-                       idSet = referenceIdSet;\r
-                       Map<String, Reference> nomReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
-                       result.put(nameSpace, nomReferenceMap);\r
-\r
-                       //biblio reference map\r
-                       nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;\r
+                       \r
+                       //reference map\r
+                       nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;\r
                        cdmClass = Reference.class;\r
                        idSet = referenceIdSet;\r
                        cdmClass = Reference.class;\r
                        idSet = referenceIdSet;\r
-                       Map<String, Reference> biblioReferenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
-                       result.put(nameSpace, biblioReferenceMap);\r
-\r
+                       Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, referenceMap);\r
+                       // TODO remove if problem with duplicate DescElement_Annot id is solved\r
                } catch (SQLException e) {\r
                } catch (SQLException e) {\r
-                       throw new RuntimeException(e);\r
+                       throw new RuntimeException("pos: " +pos, e);\r
                } catch (NullPointerException nep){\r
                        logger.error("NullPointerException in getRelatedObjectsForPartition()");\r
                }\r
                } catch (NullPointerException nep){\r
                        logger.error("NullPointerException in getRelatedObjectsForPartition()");\r
                }\r
@@ -668,23 +678,6 @@ public class BerlinModelCommonNamesImport  extends BerlinModelImportBase {
                IOValidator<BerlinModelImportState> validator = new BerlinModelCommonNamesImportValidator();\r
                return validator.validate(state);\r
        }\r
                IOValidator<BerlinModelImportState> validator = new BerlinModelCommonNamesImportValidator();\r
                return validator.validate(state);\r
        }\r
-                                               \r
-                                               \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()\r
-        */\r
-       @Override\r
-       protected String getTableName() {\r
-               return dbTableName;\r
-       }\r
-                                                       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()\r
-        */\r
-       @Override\r
-       public String getPluralString() {\r
-               return pluralString;\r
-       }\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r