Fix missing inRef data
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelReferenceImport.java
index b156eaf90f7abb7f742e78ec658fe2e4944ea7f3..d13b39a59f131e7822308ee6211d336ea82b1001 100644 (file)
@@ -27,13 +27,14 @@ import static eu.etaxonomy.cdm.io.common.ImportHelper.NO_OVERWRITE;
 import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;\r
 import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;\r
 \r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
-import java.util.Collection;\r
+import java.util.HashMap;\r
 import java.util.HashSet;\r
-import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
@@ -43,17 +44,20 @@ import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
-import eu.etaxonomy.cdm.io.berlinModel.CdmExtensionMapper;\r
 import eu.etaxonomy.cdm.io.berlinModel.CdmOneToManyMapper;\r
 import eu.etaxonomy.cdm.io.berlinModel.CdmStringMapper;\r
-import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;\r
-import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;\r
+import eu.etaxonomy.cdm.io.berlinModel.CdmUriMapper;\r
+import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelReferenceImportValidator;\r
 import eu.etaxonomy.cdm.io.common.ICdmIO;\r
 import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
 import eu.etaxonomy.cdm.io.common.ImportHelper;\r
-import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
 import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;\r
+import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;\r
 import eu.etaxonomy.cdm.io.common.mapping.CdmSingleAttributeMapperBase;\r
+import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;\r
+import eu.etaxonomy.cdm.io.common.mapping.DbImportMarkerMapper;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
@@ -61,26 +65,14 @@ import eu.etaxonomy.cdm.model.common.ExtensionType;
 import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
-/*import eu.etaxonomy.cdm.model.reference.Article;\r
-import eu.etaxonomy.cdm.model.reference.Book;\r
-import eu.etaxonomy.cdm.model.reference.BookSection;\r
-import eu.etaxonomy.cdm.model.reference.Database;\r
-import eu.etaxonomy.cdm.model.reference.Generic;*/\r
 import eu.etaxonomy.cdm.model.reference.IArticle;\r
 import eu.etaxonomy.cdm.model.reference.IBook;\r
 import eu.etaxonomy.cdm.model.reference.IBookSection;\r
-import eu.etaxonomy.cdm.model.reference.IGeneric;\r
 import eu.etaxonomy.cdm.model.reference.IJournal;\r
 import eu.etaxonomy.cdm.model.reference.IPrintSeries;\r
-import eu.etaxonomy.cdm.model.reference.IWebPage;\r
-/*import eu.etaxonomy.cdm.model.reference.Journal;\r
-import eu.etaxonomy.cdm.model.reference.PrintSeries;\r
-import eu.etaxonomy.cdm.model.reference.Proceedings;*/\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceType;\r
-/*import eu.etaxonomy.cdm.model.reference.Thesis;\r
-import eu.etaxonomy.cdm.model.reference.WebPage;*/\r
 \r
 /**\r
  * @author a.mueller\r
@@ -91,26 +83,31 @@ import eu.etaxonomy.cdm.model.reference.WebPage;*/
 public class BerlinModelReferenceImport extends BerlinModelImportBase {\r
        private static final Logger logger = Logger.getLogger(BerlinModelReferenceImport.class);\r
 \r
+       public static final String NOM_REFERENCE_NAMESPACE = "NomReference";\r
+       public static final String BIBLIO_REFERENCE_NAMESPACE = "BiblioReference";\r
+       \r
        public static final UUID REF_DEPOSITED_AT_UUID = UUID.fromString("23ca88c7-ce73-41b2-8ca3-2cb22f013beb");\r
-       public static final UUID REF_SOURCE = UUID.fromString("d6432582-2216-4b08-b0db-76f6c1013141");\r
+       public static final UUID REF_SOURCE_UUID = UUID.fromString("d6432582-2216-4b08-b0db-76f6c1013141");\r
        public static final UUID DATE_STRING_UUID = UUID.fromString("e4130eae-606e-4b0c-be4f-e93dc161be7d");\r
-       ReferenceFactory refFactory;\r
+       public static final UUID IS_PAPER_UUID = UUID.fromString("8a326129-d0d0-4f9d-bbdf-8d86b037c65e");\r
+       \r
+       \r
        private int modCount = 1000;\r
+       private static final String pluralString = "references";\r
+       private static final String dbTableName = "reference";\r
+\r
        \r
        public BerlinModelReferenceImport(){\r
                super();\r
-               refFactory = ReferenceFactory.newInstance();\r
        }\r
-\r
        \r
-       \r
-       protected boolean initializeMappers(BerlinModelImportState state, String tableName){\r
+       protected void initializeMappers(BerlinModelImportState state){\r
                for (CdmAttributeMapperBase mapper: classMappers){\r
-                       if (mapper instanceof CdmExtensionMapper){\r
-                               ((CdmExtensionMapper)mapper).initialize(getTermService(), state, tableName);\r
+                       if (mapper instanceof DbImportExtensionMapper){\r
+                               ((DbImportExtensionMapper)mapper).initialize(state, Reference.class);\r
                        }\r
                }\r
-               return true;\r
+               return;\r
        }\r
        \r
        protected static CdmAttributeMapperBase[] classMappers = new CdmAttributeMapperBase[]{\r
@@ -123,11 +120,12 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                new CdmStringMapper("pageString", "pages"),\r
                new CdmStringMapper("series", "series"),\r
                new CdmStringMapper("issn", "issn"),\r
-               new CdmStringMapper("url", "uri"),\r
-               new CdmExtensionMapper("NomStandard", ExtensionType.NOMENCLATURAL_STANDARD()),\r
-               new CdmExtensionMapper("DateString", DATE_STRING_UUID, "Date String", "Date String", "dates"),\r
-               new CdmExtensionMapper("RefDepositedAt", REF_DEPOSITED_AT_UUID, "RefDepositedAt", "reference is deposited at", "at"),\r
-               new CdmExtensionMapper("RefSource", REF_SOURCE, "RefSource", "reference source", "source")\r
+               new CdmUriMapper("url", "uri"),\r
+               DbImportExtensionMapper.NewInstance("NomStandard", ExtensionType.NOMENCLATURAL_STANDARD()),\r
+               DbImportExtensionMapper.NewInstance("DateString", DATE_STRING_UUID, "Date String", "Date String", "dates"),\r
+               DbImportExtensionMapper.NewInstance("RefDepositedAt", REF_DEPOSITED_AT_UUID, "RefDepositedAt", "reference is deposited at", "at"),\r
+               DbImportExtensionMapper.NewInstance("RefSource", REF_SOURCE_UUID, "RefSource", "reference source", "source"),\r
+               DbImportMarkerMapper.NewInstance("isPaper", IS_PAPER_UUID, "is paper", "is paper", "paper", false)\r
        };\r
 \r
        \r
@@ -142,7 +140,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
        };\r
        \r
        protected static String[] unclearMappers = new String[]{\r
-                       "isPaper", "exportDate", \r
+                       /*"isPaper",*/ "exportDate", \r
        };\r
        \r
        //TODO isPaper\r
@@ -157,190 +155,247 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                int referenceCount;\r
                public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(referenceCount);};\r
        }\r
-       \r
+\r
+\r
        /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)\r
         */\r
        @Override\r
-       protected boolean doCheck(BerlinModelImportState state){\r
-               boolean result = true;\r
-               BerlinModelImportConfigurator bmiConfig = state.getConfig();\r
-               result &= checkArticlesWithoutJournal(bmiConfig);\r
-               result &= checkPartOfJournal(bmiConfig);\r
-               result &= checkPartOfUnresolved(bmiConfig);\r
-               result &= checkPartOfPartOf(bmiConfig);\r
-               result &= checkPartOfArticle(bmiConfig);\r
-               result &= checkJournalsWithSeries(bmiConfig);\r
-               result &= checkObligatoryAttributes(bmiConfig);\r
-               result &= checkPartOfWithVolume(bmiConfig);\r
-               result &= checkArticleWithEdition(bmiConfig);\r
-               \r
-               if (result == false ){System.out.println("========================================================");}\r
+       protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
+               return null;  //not needed\r
+       }\r
+\r
+\r
+//     @Override\r
+//     protected void doInvoke_old(BerlinModelImportState state){\r
+//             logger.info("start make " + getPluralString() + " ...");\r
+//\r
+//             boolean success = true;\r
+//             initializeMappers(state);\r
+//             BerlinModelImportConfigurator config = state.getConfig();\r
+//             Source source = config.getSource();\r
+//\r
+//             String strSelectId = " SELECT Reference.RefId as refId ";\r
+//             String strSelectFull = \r
+//                     " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk,  " +\r
+//                     " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +\r
+//                     " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk, RefSource.RefSource " ;\r
+//             String strFrom =  " FROM Reference AS InInReference " +\r
+//                     " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " + \r
+//                     " RIGHT OUTER JOIN %s ON InReference.RefId = Reference.InRefFk " + \r
+//                     " LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +\r
+//                     " WHERE (1=1) ";\r
+//             String strWherePartitioned = " AND (Reference.refId IN ("+ ID_LIST_TOKEN + ") ) "; \r
+//             \r
+//             String referenceTable = CdmUtils.Nz(state.getConfig().getReferenceIdTable());\r
+//             referenceTable = referenceTable.isEmpty() ? " Reference"  : referenceTable + " as Reference ";\r
+//             String strIdFrom = String.format(strFrom, referenceTable );\r
+//             \r
+//             \r
+//             //test max number of recursions\r
+//             String strQueryTestMaxRecursion = strSelectId + strIdFrom +  \r
+//                     " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";\r
+//             ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTestMaxRecursion);\r
+//             try {\r
+//                     if (testMaxRecursionResultSet.next() == true){\r
+//                             logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");\r
+//                             state.setUnsuccessfull();\r
+//                             return;\r
+//                     }\r
+//             } catch (SQLException e1) {\r
+//                     e1.printStackTrace();\r
+//                     logger.error("There are references with more then 2 in-reference recursion. Maximum number of allowed recursions is 2. Records will not be stored.");\r
+//                     success = false;\r
+//             }\r
+//\r
+//             String strSelectIdBase = strSelectId + strIdFrom;\r
+//             \r
+//             String referenceFilter = CdmUtils.Nz(state.getConfig().getReferenceIdTable());\r
+//             if (! referenceFilter.isEmpty()){\r
+//                     referenceFilter = " AND " + referenceFilter + " ";\r
+//             }\r
+//             referenceFilter = "";  //don't use it for now\r
+//             \r
+//             String strIdQueryNoInRef = strSelectIdBase + \r
+//                     " AND (Reference.InRefFk is NULL) " +  referenceFilter;\r
+//             String strIdQuery1InRef = strSelectIdBase + \r
+//                     " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) "  +  referenceFilter;\r
+//             String strIdQuery2InRefs = strSelectIdBase + \r
+//                     " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) "  +  referenceFilter;\r
+//\r
+//             if (config.getDoReferences() == CONCEPT_REFERENCES){\r
+//                     strIdQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) " + referenceFilter;\r
+//             }\r
+//\r
+//             String strRecordQuery = strSelectFull + String.format(strFrom, " Reference ") + strWherePartitioned;\r
+//             \r
+//             int recordsPerTransaction = config.getRecordsPerTransaction();\r
+//             try{\r
+//                     //NoInRefs\r
+//                     ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQueryNoInRef, strRecordQuery, recordsPerTransaction);\r
+//                     while (partitioner.nextPartition()){\r
+//                             partitioner.doPartition(this, state);\r
+//                     }\r
+//                     logger.info("end make references with no in-references ... " + getSuccessString(success));\r
+//\r
+//                     if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){\r
+//\r
+//                             //1InRef\r
+//                             partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery1InRef, strRecordQuery, recordsPerTransaction);\r
+//                             while (partitioner.nextPartition()){\r
+//                                     partitioner.doPartition(this, state);\r
+//                             }\r
+//                             logger.info("end make references with no 1 in-reference ... " + getSuccessString(success));\r
+//     \r
+//                             //2InRefs\r
+//                             partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery2InRefs, strRecordQuery, recordsPerTransaction);\r
+//                             while (partitioner.nextPartition()){\r
+//                                     partitioner.doPartition(this, state);\r
+//                             }\r
+//                             logger.info("end make references with no 2 in-reference ... " + getSuccessString(success));\r
+//                     }\r
+//\r
+//             } catch (SQLException e) {\r
+//                     logger.error("SQLException:" +  e);\r
+//                     state.setUnsuccessfull();\r
+//                     return;\r
+//             }\r
+//             logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));\r
+//             if (! success){\r
+//                     state.setUnsuccessfull();\r
+//             }\r
+//             return;\r
+//     }\r
+\r
+       @Override\r
+       protected void doInvoke(BerlinModelImportState state){\r
+               logger.info("start make " + getPluralString() + " ...");\r
+\r
+               boolean success = true;\r
+               initializeMappers(state);\r
+               BerlinModelImportConfigurator config = state.getConfig();\r
+               Source source = config.getSource();\r
+\r
+               String strSelectId = " SELECT Reference.RefId as refId ";\r
+               String strSelectFull = \r
+                       " SELECT Reference.* ,InReference.RefCategoryFk as InRefCategoryFk, RefSource.RefSource " ;\r
+               String strFrom =  " FROM %s  " + \r
+                       " LEFT OUTER JOIN Reference as InReference ON InReference.refId = Reference.inRefFk " +\r
+                               " LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +\r
+                       " WHERE (1=1) ";\r
+               String strWherePartitioned = " AND (Reference.refId IN ("+ ID_LIST_TOKEN + ") ) "; \r
                \r
+               String referenceTable = CdmUtils.Nz(state.getConfig().getReferenceIdTable());\r
+               referenceTable = referenceTable.isEmpty() ? " Reference"  : referenceTable + " as Reference ";\r
+               String strIdFrom = String.format(strFrom, referenceTable );\r
                \r
-               return result;\r
-       }\r
                \r
+               //test max number of recursions\r
+//             String strQueryTestMaxRecursion = strSelectId + strIdFrom +  \r
+//                     " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";\r
+//             ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTestMaxRecursion);\r
+//             try {\r
+//                     if (testMaxRecursionResultSet.next() == true){\r
+//                             logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");\r
+//                             state.setUnsuccessfull();\r
+//                             return;\r
+//                     }\r
+//             } catch (SQLException e1) {\r
+//                     e1.printStackTrace();\r
+//                     logger.error("There are references with more then 2 in-reference recursion. Maximum number of allowed recursions is 2. Records will not be stored.");\r
+//                     success = false;\r
+//             }\r
 \r
-       \r
-       private boolean doPreliminaryRefDetails(BerlinModelImportState state, Map<String, MapWrapper<? extends CdmBase>> stores){\r
+               String strSelectIdBase = strSelectId + strIdFrom;\r
                \r
-               IImportConfigurator config = state.getConfig(); \r
-               MapWrapper<TeamOrPersonBase> teamMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.TEAM_STORE);\r
-               MapWrapper<ReferenceBase> refDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REF_DETAIL_STORE);\r
-               MapWrapper<ReferenceBase> nomRefDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_DETAIL_STORE);\r
+               String referenceFilter = CdmUtils.Nz(state.getConfig().getReferenceIdTable());\r
+               if (! referenceFilter.isEmpty()){\r
+                       referenceFilter = " AND " + referenceFilter + " ";\r
+               }\r
+               referenceFilter = "";  //don't use it for now\r
                \r
-               BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;\r
-               Source source = bmiConfig.getSource();\r
-               boolean success = true;\r
-               logger.info("start makeRefDetails ...");\r
+               String strIdQueryFirstPath = strSelectId + strIdFrom ;\r
+               String strIdQuerySecondPath = strSelectId + strIdFrom + " AND (Reference.InRefFk is NOT NULL) ";\r
                \r
-               try {\r
-                       //get data from database\r
-                       String strQuery = \r
-                                       " SELECT RefDetail.*, Reference.RefYear " +\r
-                    " FROM RefDetail " +\r
-                       " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +\r
-                    " WHERE (1=1) AND (RefDetail.PreliminaryFlag = 1)";\r
-                       \r
-                       ResultSet rs = source.getResultSet(strQuery);\r
-                       String namespace = "RefDetail";\r
-                       \r
-                       int i = 0;\r
-                       RefCounter refCounter  = new RefCounter();\r
-                       while (rs.next()){\r
-                               \r
-                               if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RefDetails handled: " + (i-1) );}\r
-                               int refDetailId = rs.getInt("refDetailId"); \r
-                               String refYear = rs.getString("RefYear"); \r
-                               \r
-                               //nomRef\r
-                               String fullNomRefCache = rs.getString("fullNomRefCache"); \r
-                               if (! CdmUtils.Nz(fullNomRefCache).trim().equals("") ){\r
-                                       ReferenceBase genericReference = refFactory.newGeneric();\r
-                                       genericReference.setTitleCache(fullNomRefCache);\r
-                                       nomRefDetailMap.put(refDetailId, genericReference);\r
-                                       //refId, created, notes\r
-                                       doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, namespace );                                          \r
-                                       //year\r
-                                       genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); \r
-                                       refCounter.nomRefCount++;\r
-                               }       \r
-                               \r
-                               //biblioRef\r
-                               String fullRefCache = rs.getString("fullRefCache"); \r
-                               if (! CdmUtils.Nz(fullRefCache).trim().equals("") && \r
-                                               fullRefCache.equals(fullNomRefCache)){\r
-                                       ReferenceBase genericReference = refFactory.newGeneric();\r
-                                       genericReference.setTitleCache(fullRefCache);\r
-                                       refDetailMap.put(refDetailId, genericReference);\r
-                                       \r
-                                       //refId, created, notes\r
-                                       doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, namespace );                                          \r
-                                       //year\r
-                                       genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); \r
-                                       refCounter.referenceCount++;\r
-                               }\r
+//             if (config.getDoReferences() == CONCEPT_REFERENCES){\r
+//                     strIdQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) " + referenceFilter;\r
+//             }\r
+\r
+               String strRecordQuery = strSelectFull + String.format(strFrom, " Reference ") + strWherePartitioned;\r
+               \r
+               int recordsPerTransaction = config.getRecordsPerTransaction();\r
+               try{\r
+                       //firstPath \r
+                       ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQueryFirstPath, strRecordQuery, recordsPerTransaction);\r
+                       while (partitioner.nextPartition()){\r
+                               partitioner.doPartition(this, state);\r
                        }\r
-                       //save and store in map\r
-                       logger.info("Save nomenclatural preliminary references (" + refCounter.nomRefCount + ")");\r
-                       Collection<ReferenceBase> col = nomRefDetailMap.objects();\r
-                       getReferenceService().save(col);\r
-                       logger.info("Save bibliographical preliminary references (" + refCounter.referenceCount +")");\r
-                       getReferenceService().save(refDetailMap.objects());\r
+                       logger.info("end make references without in-references ... " + getSuccessString(success));\r
+                       state.setReferenceSecondPath(true);\r
+\r
+//                     if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){\r
+\r
+                       //secondPath\r
+                       partitioner = ResultSetPartitioner.NewInstance(source, strIdQuerySecondPath, strRecordQuery, recordsPerTransaction);\r
+                       while (partitioner.nextPartition()){\r
+                               partitioner.doPartition(this, state);\r
+                       }\r
+                       logger.info("end make references with no 1 in-reference ... " + getSuccessString(success));\r
+                       state.setReferenceSecondPath(false);\r
                        \r
-                       //TODO\r
-                       //SecondarySources\r
-                       //IdInSource\r
+//                     }\r
 \r
                } catch (SQLException e) {\r
                        logger.error("SQLException:" +  e);\r
-                       return false;\r
+                       state.setUnsuccessfull();\r
+                       return;\r
                }\r
-               return success;\r
+               logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));\r
+               if (! success){\r
+                       state.setUnsuccessfull();\r
+               }\r
+               return;\r
        }\r
+\r
        \r
        \r
 \r
-       @Override\r
-       protected boolean doInvoke(BerlinModelImportState state){\r
-               String teamStore = ICdmIO.TEAM_STORE;\r
-               MapWrapper<? extends CdmBase> store = state.getStore(teamStore);\r
-               MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);\r
-               MapWrapper<ReferenceBase> nomRefStore= new MapWrapper<ReferenceBase>(null);\r
-               \r
-               BerlinModelImportConfigurator config = state.getConfig();\r
-               Source source = config.getSource();\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
+       public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
+               if (state.isReferenceSecondPath()){\r
+                       return doPartitionSecondPath(partitioner, state);\r
+               }\r
                boolean success = true;\r
+\r
+               Map<Integer, Reference> nomRefToSave = new HashMap<Integer, Reference>();\r
+               Map<Integer, Reference> biblioRefToSave = new HashMap<Integer, Reference>();\r
                \r
-               //preliminary RefDetails  //TODO -> move to own class ?\r
-               doPreliminaryRefDetails(state, state.getStores());\r
-               \r
-               success &= initializeMappers(state, "Reference");\r
+               Map<String, Reference> relatedNomReferences = partitioner.getObjectMap(NOM_REFERENCE_NAMESPACE);\r
+               Map<String, Reference> relatedBiblioReferences = partitioner.getObjectMap(BIBLIO_REFERENCE_NAMESPACE);\r
                \r
-               logger.info("start makeReferences ...");\r
+               BerlinModelImportConfigurator config = state.getConfig();\r
                \r
                try {\r
-                       //get data from database\r
-                       String strQueryBase = \r
-                                       " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk,  " +\r
-                                               " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +\r
-                                               " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk, RefSource.RefSource " +\r
-                    " FROM Reference AS InInReference " +\r
-                       " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " + \r
-                       " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " + \r
-                       " LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +\r
-                                       " WHERE (1=1)  "; \r
-                               //strQueryBase += " AND Reference.refId = 1933 " ; //7000000\r
-                       String strQueryNoInRef = strQueryBase + \r
-                               " AND (Reference.InRefFk is NULL) ";\r
-                       \r
-                       String strQuery1InRef = strQueryBase + \r
-                               " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";\r
-\r
-                       String strQuery2InRef = strQueryBase + \r
-                               " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";\r
-\r
-                       String strQueryTesMaxRecursion = strQueryBase + \r
-                               " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";\r
-\r
-                       ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);\r
-                       if (testMaxRecursionResultSet.next() == true){\r
-                               logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");\r
-                               return false;\r
-                       }\r
 \r
-                       if (config.getDoReferences() == CONCEPT_REFERENCES){\r
-                               strQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) ";\r
-                       }\r
-                       \r
-                       List<ResultSet> resultSetList = new ArrayList<ResultSet>();\r
-                       resultSetList.add(source.getResultSet(strQueryNoInRef));\r
-                       if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){\r
-                               resultSetList.add(source.getResultSet(strQuery1InRef));\r
-                               resultSetList.add(source.getResultSet(strQuery2InRef));\r
-                       }\r
-                       \r
-                       int j = 0;\r
-                       Iterator<ResultSet> resultSetListIterator =  resultSetList.listIterator();\r
-                       //for each resultsetlist\r
-                       while (resultSetListIterator.hasNext()){\r
                                int i = 0;\r
                                RefCounter refCounter  = new RefCounter();\r
                                \r
-                               ResultSet rs = resultSetListIterator.next();\r
+                               ResultSet rs = partitioner.getResultSet();\r
+\r
                                //for each resultset\r
                                while (rs.next()){\r
-                                       if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round " + j);}\r
+                                       if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round -" );}\r
                                \r
-                                       success &= makeSingleReferenceRecord(rs, state, referenceStore, nomRefStore, refCounter);\r
+                                       success &= makeSingleReferenceRecord(rs, state, partitioner, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences, refCounter);\r
                                } // end resultSet\r
                                                                \r
                                //for the concept reference a fixed uuid may be needed -> change uuid\r
-                               ReferenceBase<?> sec = referenceStore.get(config.getSourceSecId());\r
+                               Integer sourceSecId = (Integer)config.getSourceSecId();\r
+                               Reference<?> sec = biblioRefToSave.get(sourceSecId);\r
                                if (sec == null){\r
-                                       sec = nomRefStore.get(config.getSourceSecId()); \r
+                                       sec = nomRefToSave.get(sourceSecId);    \r
                                }\r
                                if (sec != null){\r
                                        sec.setUuid(config.getSecUuid());\r
@@ -349,11 +404,84 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                \r
                                //save and store in map\r
                                logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");\r
-                               getReferenceService().save(nomRefStore.objects());\r
+                               getReferenceService().save(nomRefToSave.values());\r
+                               logger.info("Save bibliographical references (" + refCounter.referenceCount +")");\r
+                               getReferenceService().save(biblioRefToSave.values());\r
+\r
+//                     }//end resultSetList    \r
+\r
+                       logger.info("end makeReferences ..." + getSuccessString(success));;\r
+                       return success;\r
+               } catch (SQLException e) {\r
+                       logger.error("SQLException:" +  e);\r
+                       return false;\r
+               }\r
+       }\r
+\r
+\r
+\r
+       /**\r
+        * Adds the inReference to the according references.\r
+        * @param partitioner\r
+        * @param state\r
+        * @return\r
+        */\r
+       private boolean doPartitionSecondPath(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
+               boolean success = true;\r
+\r
+               Map<Integer, Reference> nomRefToSave = new HashMap<Integer, Reference>();\r
+               Map<Integer, Reference> biblioRefToSave = new HashMap<Integer, Reference>();\r
+               \r
+               Map<String, Reference> relatedNomReferences = partitioner.getObjectMap(NOM_REFERENCE_NAMESPACE);\r
+               Map<String, Reference> relatedBiblioReferences = partitioner.getObjectMap(BIBLIO_REFERENCE_NAMESPACE);\r
+               \r
+               try {\r
+                               int i = 0;\r
+                               RefCounter refCounter  = new RefCounter();\r
+                       \r
+                               ResultSet rs = partitioner.getResultSet();\r
+                               //for each resultset\r
+                               while (rs.next()){\r
+                                       if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round -" );}\r
+                               \r
+                                       Integer refId = rs.getInt("refId");\r
+                                       Integer inRefFk = rs.getInt("inRefFk");\r
+                                       \r
+                                       if (inRefFk != null){\r
+                                               Reference<?> thisNomRef = getReferenceOnlyFromMaps(relatedNomReferences, relatedBiblioReferences, String.valueOf(refId));\r
+                                               Reference<?> thisBiblioRef = getReferenceOnlyFromMaps(relatedNomReferences, relatedBiblioReferences, String.valueOf(refId));\r
+                                               \r
+                                               Reference<?> nomInReference = relatedNomReferences.get("inRefFk");\r
+                                               Reference<?> biblioInReference = relatedBiblioReferences.get("inRefFk");\r
+                                               boolean inRefExists = false;\r
+                                               if (thisNomRef != null){\r
+                                                       Reference<?> inRef = (nomInReference != null)? nomInReference : biblioInReference;\r
+                                                       thisNomRef.setInReference(inRef);\r
+                                                       nomRefToSave.put(refId, thisNomRef);\r
+                                                       //remember that an in reference exists\r
+                                                       inRefExists |= (inRef != null);\r
+                                               }\r
+                                               if (thisBiblioRef != null){\r
+                                                       Reference<?> inRef = (biblioInReference != null)? biblioInReference : nomInReference;\r
+                                                       thisBiblioRef.setInReference(inRef);\r
+                                                       biblioRefToSave.put(refId, thisBiblioRef);\r
+                                                       //remember that an in reference exists\r
+                                                       inRefExists |= (inRef != null);\r
+                                               }\r
+                                               if (inRefExists == false){\r
+                                                       logger.warn("No in reference was saved though an 'inRefFk' is available. RefId " + refId);\r
+                                               }\r
+                                       }\r
+                                       \r
+                               } // end resultSet\r
+\r
+                               //save and store in map\r
+                               logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");\r
+                               getReferenceService().save(nomRefToSave.values());\r
                                logger.info("Save bibliographical references (" + refCounter.referenceCount +")");\r
-                               getReferenceService().save(referenceStore.objects());\r
-                               j++;\r
-                       }//end resultSetList    \r
+                               getReferenceService().save(biblioRefToSave.values());\r
+                               \r
+//                     }//end resultSetList    \r
 \r
                        logger.info("end makeReferences ..." + getSuccessString(success));;\r
                        return success;\r
@@ -362,15 +490,81 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        return false;\r
                }\r
        }\r
+\r
+\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
+        */\r
+       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
+               String nameSpace;\r
+               Class cdmClass;\r
+               Set<String> idSet;\r
+               \r
+               Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
+               \r
+               try{\r
+                       Set<String> teamIdSet = new HashSet<String>();\r
+                       Set<String> referenceIdSet = new HashSet<String>();\r
+                       \r
+                       while (rs.next()){\r
+                               handleForeignKey(rs, teamIdSet, "NomAuthorTeamFk");\r
+                               handleForeignKey(rs, referenceIdSet, "InRefFk");\r
+                               //TODO only needed in second path but state not available here to check if state is second path\r
+                               handleForeignKey(rs, referenceIdSet, "refId");\r
+                       }\r
+                       \r
+                       //team map\r
+                       nameSpace = BerlinModelAuthorTeamImport.NAMESPACE;\r
+                       cdmClass = Team.class;\r
+                       idSet = teamIdSet;\r
+                       Map<String, Team> teamMap = (Map<String, Team>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, teamMap);\r
+\r
+                       \r
+                       //nom reference map\r
+                       nameSpace = NOM_REFERENCE_NAMESPACE;\r
+                       cdmClass = Reference.class;\r
+                       idSet = referenceIdSet;\r
+                       Map<String, Reference> nomRefMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, nomRefMap);\r
+\r
+                       //biblio reference map\r
+                       nameSpace = BIBLIO_REFERENCE_NAMESPACE;\r
+                       cdmClass = Reference.class;\r
+                       idSet = referenceIdSet;\r
+                       Map<String, Reference> biblioRefMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, biblioRefMap);\r
+                       \r
+               } catch (SQLException e) {\r
+                       throw new RuntimeException(e);\r
+               }\r
+               return result;\r
+       }\r
        \r
        \r
-       private boolean makeSingleReferenceRecord(ResultSet rs, BerlinModelImportState state, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore, RefCounter refCounter){\r
+       /**\r
+        * Handles a single reference record\r
+        * @param rs\r
+        * @param state\r
+        * @param biblioRefToSave\r
+        * @param nomRefToSave\r
+        * @param relatedBiblioReferences\r
+        * @param relatedNomReferences\r
+        * @param refCounter\r
+        * @return\r
+        */\r
+       private boolean makeSingleReferenceRecord(\r
+                               ResultSet rs, \r
+                               BerlinModelImportState state,\r
+                               ResultSetPartitioner<BerlinModelImportState> partitioner,\r
+                               Map<Integer, Reference> biblioRefToSave, \r
+                               Map<Integer, Reference> nomRefToSave, \r
+                               Map<String, Reference> relatedBiblioReferences, \r
+                               Map<String, Reference> relatedNomReferences, \r
+                               RefCounter refCounter){\r
                boolean success = true;\r
-               String namespace = "Reference";\r
-               String teamStore = ICdmIO.TEAM_STORE;\r
-               MapWrapper<? extends CdmBase> store = state.getStore(teamStore);\r
-               MapWrapper<TeamOrPersonBase> teamMap = (MapWrapper<TeamOrPersonBase>)store;\r
-               \r
+\r
                Integer refId = null;\r
                try {\r
                        Map<String, Object> valueMap = getValueMap(rs);\r
@@ -380,7 +574,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        Boolean thesisFlag = (Boolean)valueMap.get("thesisFlag".toLowerCase());\r
                        \r
                        \r
-                       ReferenceBase<?> referenceBase;\r
+                       Reference<?> referenceBase;\r
                        logger.debug("RefCategoryFk: " + categoryFk);\r
                        \r
                        if (thesisFlag){\r
@@ -388,7 +582,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        }else if (categoryFk == REF_JOURNAL){\r
                                referenceBase = makeJournal(valueMap);\r
                        }else if(categoryFk == REF_BOOK){\r
-                               referenceBase = makeBook(valueMap, referenceStore, nomRefStore);\r
+                               referenceBase = makeBook(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);\r
                        }else if(categoryFk == REF_DATABASE){\r
                                referenceBase = makeDatabase(valueMap);\r
                        }else if(categoryFk == REF_INFORMAL){\r
@@ -402,26 +596,23 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        }else if(categoryFk == REF_CONFERENCE_PROCEEDINGS){\r
                                referenceBase = makeProceedings(valueMap);\r
                        }else if(categoryFk == REF_ARTICLE){\r
-                               referenceBase = makeArticle(valueMap, referenceStore, nomRefStore);\r
+                               referenceBase = makeArticle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);\r
                        }else if(categoryFk == REF_JOURNAL_VOLUME){\r
                                referenceBase = makeJournalVolume(valueMap);\r
                        }else if(categoryFk == REF_PART_OF_OTHER_TITLE){\r
-                               referenceBase = makePartOfOtherTitle(valueMap, referenceStore, nomRefStore);\r
+                               referenceBase = makePartOfOtherTitle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);\r
                        }else{\r
                                logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");\r
-                               referenceBase = refFactory.newGeneric();\r
+                               referenceBase = ReferenceFactory.newGeneric();\r
                                success = false;\r
                        }\r
                                                        \r
-                       //refId, created, notes\r
-                       doIdCreatedUpdatedNotes(state, referenceBase, rs, refId, namespace );                                           \r
                        //refYear\r
                        String refYear = (String)valueMap.get("refYear".toLowerCase());\r
                        referenceBase.setDatePublished(ImportHelper.getDatePublished(refYear)); \r
                        \r
-                       //nom&BiblioReference\r
-                       success &= makeNomAndBiblioReference(rs, refId, referenceBase, refCounter, \r
-                                       referenceStore, nomRefStore, teamMap, state.getStores() );\r
+                       //created, updated, notes\r
+                       doCreatedUpdatedNotes(state, referenceBase, rs);                                                \r
                        \r
                        //idInSource\r
                        String idInSource = (String)valueMap.get("IdInSource".toLowerCase());\r
@@ -431,10 +622,10 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                referenceBase.addSource(source);\r
                        }\r
                        \r
-                       //isPaper\r
-                       if ((Boolean)valueMap.get("isPaper".toLowerCase())){\r
-                               logger.warn("IsPaper is not yet implemented, but reference " +  refId + " is paper");\r
-                       }\r
+                       //nom&BiblioReference  - must be last because a clone is created\r
+                       success &= makeNomAndBiblioReference(rs, state, partitioner, refId, referenceBase, refCounter, \r
+                                       biblioRefToSave, nomRefToSave );\r
+\r
 \r
                } catch (Exception e) {\r
                        logger.warn("Reference with BM refId '" + CdmUtils.Nz(refId) +  "' threw Exception and could not be saved");\r
@@ -445,19 +636,31 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
        }\r
 \r
        \r
-       private boolean makeNomAndBiblioReference(ResultSet rs, \r
+       /**\r
+        * Creates and saves a nom. reference and a biblio. reference after checking necessity\r
+        * @param rs\r
+        * @param refId\r
+        * @param referenceBase\r
+        * @param refCounter\r
+        * @param biblioRefToSave\r
+        * @param nomRefToSave\r
+        * @param teamMap\r
+        * @param stores\r
+        * @return\r
+        * @throws SQLException\r
+        */\r
+       private boolean makeNomAndBiblioReference(\r
+                               ResultSet rs, \r
+                               BerlinModelImportState state,\r
+                               ResultSetPartitioner partitioner,\r
                                int refId, \r
-                               ReferenceBase<?> referenceBase,  \r
+                               Reference<?> referenceBase,  \r
                                RefCounter refCounter, \r
-                               MapWrapper<ReferenceBase> referenceStore, \r
-                               MapWrapper<ReferenceBase> nomRefStore, \r
-                               MapWrapper<TeamOrPersonBase> teamMap,\r
-                               Map<String, MapWrapper<? extends CdmBase>> stores                               \r
+                               Map<Integer, Reference> biblioRefToSave, \r
+                               Map<Integer, Reference> nomRefToSave\r
                                ) throws SQLException{\r
                \r
-               MapWrapper<ReferenceBase<?>> referenceMap = (MapWrapper<ReferenceBase<?>>)stores.get(ICdmIO.REFERENCE_STORE);\r
-               MapWrapper<ReferenceBase<?>> nomRefMap = (MapWrapper<ReferenceBase<?>>)stores.get(ICdmIO.NOMREF_STORE);\r
-               \r
+               Map<String, Team> teamMap = partitioner.getObjectMap(BerlinModelAuthorTeamImport.NAMESPACE);\r
                \r
                String refCache = rs.getString("refCache");\r
                String nomRefCache = rs.getString("nomRefCache");\r
@@ -465,10 +668,15 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                String nomTitleAbbrev = rs.getString("nomTitleAbbrev");\r
                boolean isPreliminary = rs.getBoolean("PreliminaryFlag");\r
                String refAuthorString = rs.getString("refAuthorString");\r
-               int nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");\r
-               TeamOrPersonBase<?> nomAuthor = teamMap.get(nomAuthorTeamFk);\r
+               Integer nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");\r
+               String strNomAuthorTeamFk = String.valueOf(nomAuthorTeamFk);\r
+               TeamOrPersonBase<?> nomAuthor = teamMap.get(strNomAuthorTeamFk);\r
+               Reference nomReference = null;\r
                \r
                boolean hasNomRef = false;\r
+               boolean hasBiblioRef = false;\r
+               Reference sourceReference = state.getConfig().getSourceReference();\r
+               \r
                //is Nomenclatural Reference\r
                if ( (CdmUtils.isNotEmpty(nomRefCache) && isPreliminary) || (CdmUtils.isNotEmpty(nomTitleAbbrev) && ! isPreliminary) ){\r
                        referenceBase.setTitle(nomTitleAbbrev);\r
@@ -476,18 +684,21 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        referenceBase.setAuthorTeam(author);\r
                        //referenceBase.setNomenclaturallyRelevant(true);\r
                        if (isPreliminary){\r
-                               referenceBase.setTitleCache(nomRefCache);\r
+                               referenceBase.setTitleCache(nomRefCache, true);\r
                        }\r
-                       if (! nomRefStore.containsId(refId)){\r
+                       if (! nomRefToSave.containsKey(refId)){\r
                                if (referenceBase == null){\r
                                        logger.warn("refBase is null");\r
                                }\r
-                               nomRefStore.put(refId, referenceBase);\r
+                               nomRefToSave.put(refId, referenceBase);\r
                        }else{\r
                                logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");\r
                        }\r
-                       nomRefMap.put(refId, referenceBase);\r
+                       \r
+//                     ???\r
+//                     nomRefToSave.put(refId, referenceBase);\r
                        hasNomRef = true;\r
+                       nomReference = referenceBase;\r
                        refCounter.nomRefCount++;\r
                }\r
                //is bibliographical Reference\r
@@ -495,30 +706,55 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                || (CdmUtils.isNotEmpty(title) && ! isPreliminary && ! title.equalsIgnoreCase(nomTitleAbbrev)) \r
                                || hasNomRef == false){\r
                        if (hasNomRef){\r
-                               referenceBase = (ReferenceBase)referenceBase.clone();\r
+                               referenceBase = (Reference)referenceBase.clone();\r
+                               copyCreatedUpdated(referenceBase, nomReference);\r
                        }\r
                        referenceBase.setTitle(title);\r
                        TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, false);\r
                        referenceBase.setAuthorTeam(author);\r
                        referenceBase.setNomenclaturallyRelevant(false);\r
                        if (isPreliminary){\r
-                               referenceBase.setTitleCache(refCache);\r
+                               referenceBase.setTitleCache(refCache, true);\r
                        }\r
-                       if (! referenceStore.containsId(refId)){\r
-                               referenceStore.put(refId, referenceBase);\r
+                       if (! biblioRefToSave.containsKey(refId)){\r
+                               biblioRefToSave.put(refId, referenceBase);\r
                        }else{\r
                                logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");\r
                        }\r
-                       referenceMap.put(refId, referenceBase);\r
+                       hasBiblioRef = true;\r
+                       \r
+                       //??\r
+                       //biblioRefToSave.put(refId, referenceBase);\r
                        refCounter.referenceCount++;\r
                }\r
+               //refId\r
+               if (hasNomRef){\r
+                       ImportHelper.setOriginalSource(nomReference, sourceReference, refId, NOM_REFERENCE_NAMESPACE);\r
+               }\r
+               if (hasBiblioRef){\r
+                       ImportHelper.setOriginalSource(referenceBase, sourceReference, refId, BIBLIO_REFERENCE_NAMESPACE);\r
+               }\r
+               \r
                return true;\r
                \r
        }\r
        \r
-       private ReferenceBase<?> makeArticle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){\r
+       /**\r
+        * Copies the created and updated information from the nomReference to the cloned bibliographic reference\r
+        * @param referenceBase\r
+        * @param nomReference\r
+        */\r
+       private void copyCreatedUpdated(Reference<?> biblioReference, Reference nomReference) {\r
+               biblioReference.setCreatedBy(nomReference.getCreatedBy());\r
+               biblioReference.setCreated(nomReference.getCreated());\r
+               biblioReference.setUpdatedBy(nomReference.getUpdatedBy());\r
+               biblioReference.setUpdated(nomReference.getUpdated());\r
                \r
-               IArticle article = refFactory.newArticle();\r
+       }\r
+\r
+       private Reference<?> makeArticle (Map<String, Object> valueMap, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences){\r
+               \r
+               IArticle article = ReferenceFactory.newArticle();\r
                Object inRefFk = valueMap.get("inRefFk".toLowerCase());\r
                Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());\r
                Integer refId = (Integer)valueMap.get("refId".toLowerCase());\r
@@ -526,21 +762,23 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                if (inRefFk != null){\r
                        if (inRefCategoryFk == REF_JOURNAL){\r
                                int inRefFkInt = (Integer)inRefFk;\r
-                               if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){\r
-                                       ReferenceBase<?> inJournal = nomRefStore.get(inRefFkInt);\r
+                               if (true){\r
+                                       //changed for first/second path implementation, if this is successful the following code can be deleted\r
+                               }else if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){\r
+                                       Reference<?> inJournal = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);\r
                                        if (inJournal == null){\r
-                                               inJournal = referenceStore.get(inRefFkInt);\r
+                                               inJournal = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);\r
                                                logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");\r
-                                               nomRefStore.put(inRefFkInt, inJournal);\r
+                                               nomRefToSave.put(inRefFkInt, inJournal);\r
                                        }\r
                                        if (inJournal == null){\r
                                                logger.warn("inJournal for " + inRefFkInt + " is null. "+\r
-                                               " InReference relation could not be set");\r
-                                       //}else if (ReferenceBase.class.isAssignableFrom(inJournal.getClass())){\r
+                                                       " InReference relation could not be set");\r
+                                       //}else if (Reference.class.isAssignableFrom(inJournal.getClass())){\r
                                        }else if (inJournal.getType().equals(ReferenceType.Journal)){\r
                                                article.setInJournal((IJournal)inJournal);\r
                                        }else{\r
-                                               logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +\r
+                                               logger.warn("InJournal is not of type journal but of type " + inJournal.getType() +\r
                                                        " Inreference relation could not be set");\r
                                        }\r
                                }else{\r
@@ -552,28 +790,32 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                        " InReference was not added to Article! ");\r
                        }\r
                }\r
-               makeStandardMapper(valueMap, (ReferenceBase)article); //url, pages, series, volume\r
-               return (ReferenceBase)article;\r
+               makeStandardMapper(valueMap, (Reference)article); //url, pages, series, volume\r
+               return (Reference)article;\r
        }\r
        \r
-       private ReferenceBase<?> makePartOfOtherTitle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){\r
-               ReferenceBase<?> result;\r
+       private Reference<?> makePartOfOtherTitle (Map<String, Object> valueMap, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences){\r
+               Reference<?> result;\r
                Object inRefFk = valueMap.get("inRefFk".toLowerCase());\r
                Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());\r
                Integer refId = (Integer)valueMap.get("refId".toLowerCase());\r
                \r
-               if (inRefCategoryFk == REF_BOOK){\r
+               if (inRefCategoryFk == null){\r
+                       //null -> error\r
+                       logger.warn("Part-Of-Other-Title has no inRefCategoryFk! RefId = " + refId + ". ReferenceType set to Generic.");\r
+                       result = makeUnknown(valueMap);\r
+               }else if (inRefCategoryFk == REF_BOOK){\r
                        //BookSection\r
-                       IBookSection bookSection = refFactory.newBookSection();\r
-                       result = (ReferenceBase)bookSection;\r
-                       if (inRefFk != null){\r
-                               int inRefFkInt = (Integer)inRefFk;\r
-                               if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){\r
-                                       ReferenceBase<?> inBook = nomRefStore.get(inRefFkInt);\r
+                       IBookSection bookSection = ReferenceFactory.newBookSection();\r
+                       result = (Reference<?>)bookSection;\r
+                       if (inRefFk != null && false){   //&& false added for first/second path implementation, following code can be deleted or moved if this is successful\r
+                               int inRefFkInt = (Integer) inRefFk;\r
+                               if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){\r
+                                       Reference<?> inBook = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);\r
                                        if (inBook == null){\r
-                                               inBook = referenceStore.get(inRefFkInt);\r
+                                               inBook = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);\r
                                                logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");\r
-                                               nomRefStore.put(inRefFkInt, inBook);\r
+                                               nomRefToSave.put(inRefFkInt, inBook);\r
                                        }\r
                                        if (inBook == null){\r
                                                logger.warn("inBook for " + inRefFkInt + " is null. "+\r
@@ -596,40 +838,61 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        //TODO \r
                        logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +\r
                                        " This type is not implemented yet. Generic reference created instead") ;\r
-                       result = refFactory.newGeneric();\r
+                       result = ReferenceFactory.newGeneric();\r
                }else if (inRefCategoryFk == REF_JOURNAL){\r
                        //TODO \r
                        logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' has inReference of type 'journal'." +\r
                                        " This is not allowed! Generic reference created instead") ;\r
-                       result = refFactory.newGeneric();\r
+                       result = ReferenceFactory.newGeneric();\r
                        result.addMarker(Marker.NewInstance(MarkerType.TO_BE_CHECKED(), true));\r
                }else{\r
                        logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +\r
                                " Create 'Generic' reference instead");\r
-                       result = refFactory.newGeneric();\r
+                       result = ReferenceFactory.newGeneric();\r
                }\r
                makeStandardMapper(valueMap, result); //url, pages\r
                return result;\r
        }\r
        \r
-       private ReferenceBase<?> makeWebSite(Map<String, Object> valueMap){\r
+\r
+       /**\r
+        * @param inRefFkInt\r
+        * @param biblioRefToSave\r
+        * @param nomRefToSave\r
+        * @param relatedBiblioReferences\r
+        * @param relatedNomReferences\r
+        * @return\r
+        */\r
+       private boolean existsInMapOrToSave(Integer inRefFkInt, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences) {\r
+               boolean result = false;\r
+               if (inRefFkInt == null){\r
+                       return false;\r
+               }\r
+               result |= nomRefToSave.containsKey(inRefFkInt);\r
+               result |= biblioRefToSave.containsKey(inRefFkInt);\r
+               result |= relatedBiblioReferences.containsKey(String.valueOf(inRefFkInt));\r
+               result |= relatedNomReferences.containsKey(String.valueOf(inRefFkInt));\r
+               return result;\r
+       }\r
+\r
+       private Reference<?> makeWebSite(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}\r
-               ReferenceBase webPage = refFactory.newWebPage();\r
+               Reference<?> webPage = ReferenceFactory.newWebPage();\r
                makeStandardMapper(valueMap, webPage); //placePublished, publisher\r
                return webPage;\r
        }\r
        \r
-       private ReferenceBase<?> makeUnknown(Map<String, Object> valueMap){\r
+       private Reference<?> makeUnknown(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}\r
-               ReferenceBase generic = refFactory.newGeneric();\r
+               Reference<?> generic = ReferenceFactory.newGeneric();\r
 //             generic.setSeries(series);\r
                makeStandardMapper(valueMap, generic); //pages, placePublished, publisher, series, volume\r
                return generic;\r
        }\r
 \r
-       private ReferenceBase<?> makeInformal(Map<String, Object> valueMap){\r
+       private Reference<?> makeInformal(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}\r
-               ReferenceBase generic = refFactory.newGeneric();\r
+               Reference<?> generic = ReferenceFactory.newGeneric();\r
 //             informal.setSeries(series);\r
                makeStandardMapper(valueMap, generic);//editor, pages, placePublished, publisher, series, volume\r
                String informal = (String)valueMap.get("InformalRefCategory".toLowerCase());\r
@@ -639,16 +902,16 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                return generic;\r
        }\r
        \r
-       private ReferenceBase<?> makeDatabase(Map<String, Object> valueMap){\r
+       private Reference<?> makeDatabase(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Database'");}\r
-               ReferenceBase database =  refFactory.newDatabase();\r
+               Reference database =  ReferenceFactory.newDatabase();\r
                makeStandardMapper(valueMap, database); //?\r
                return database;\r
        }\r
        \r
-       private ReferenceBase<?> makeJournal(Map<String, Object> valueMap){\r
+       private Reference<?> makeJournal(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Journal'");}\r
-               ReferenceBase journal = refFactory.newJournal();\r
+               Reference journal = ReferenceFactory.newJournal();\r
                \r
                Set<String> omitAttributes = new HashSet<String>();\r
                String series = "series";\r
@@ -661,9 +924,14 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                return journal;\r
        }\r
        \r
-       private ReferenceBase<?> makeBook(Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){\r
+       private Reference<?> makeBook(\r
+                               Map<String, Object> valueMap, \r
+                               Map<Integer, Reference> biblioRefToSave, \r
+                               Map<Integer, Reference> nomRefToSave, \r
+                               Map<String, Reference> relatedBiblioReferences, \r
+                               Map<String, Reference> relatedNomReferences){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Book'");}\r
-               ReferenceBase book = refFactory.newBook();\r
+               Reference<?> book = ReferenceFactory.newBook();\r
                Integer refId = (Integer)valueMap.get("refId".toLowerCase());\r
                \r
                //Set bookAttributes = new String[]{"edition", "isbn", "pages","publicationTown","publisher","volume"};\r
@@ -682,20 +950,19 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                String nomTitle = (String)valueMap.get("nomTitleAbbrev".toLowerCase());\r
                                series = nomTitle;\r
                        }\r
-                       printSeries = refFactory.newPrintSeries(series);\r
-                       //TODO only one for ref and nomRef\r
-                       logger.warn("Implementation of printSeries is preliminary");\r
+                       printSeries = ReferenceFactory.newPrintSeries(series);\r
+                       logger.info("Implementation of printSeries is preliminary");\r
                }\r
                Object inRefFk = valueMap.get("inRefFk".toLowerCase());\r
                //Series (as Reference)\r
-               if (inRefFk != null){\r
+               if (inRefFk != null && false){  //&&false added for first/second path implementation, following code may be removed if this is successful\r
                        int inRefFkInt = (Integer)inRefFk;\r
-                       if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){\r
-                               ReferenceBase<?> inSeries = nomRefStore.get(inRefFkInt);\r
+                       if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){\r
+                               Reference<?> inSeries = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);\r
                                if (inSeries == null){\r
-                                       inSeries = referenceStore.get(inRefFkInt);\r
+                                       inSeries = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);\r
                                        logger.info("inSeries (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");\r
-                                       nomRefStore.put(inRefFkInt, inSeries);\r
+                                       nomRefToSave.put(inRefFkInt, inSeries);\r
                                }\r
                                if (inSeries == null){\r
                                        logger.warn("inSeries for " + inRefFkInt + " is null. "+\r
@@ -705,8 +972,8 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                        book.setInSeries((IPrintSeries)inSeries);\r
                                        //TODO\r
                                }else{\r
-                                       logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getClass().getSimpleName() +\r
-                                                       " Inreference relation could not be set");\r
+                                       logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getType().getMessage() +\r
+                                                       ". In-reference relation could not be set for refId " + refId + " and inRefFk " + inRefFk);\r
                                }\r
                        }else{\r
                                logger.error("PrintSeries (refId = " + inRefFkInt + ") for book (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");\r
@@ -723,38 +990,57 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                \r
        }\r
        \r
-       private ReferenceBase<?> makePrintSeries(Map<String, Object> valueMap){\r
+       /**\r
+        * Returns the requested object if it exists in one of both maps. Prefers the refToSaveMap in ambigious cases.\r
+        * @param inRefFkInt\r
+        * @param nomRefToSave\r
+        * @param relatedNomReferences\r
+        * @return\r
+        */\r
+       private Reference<?> getReferenceFromMaps(\r
+                       int inRefFkInt,\r
+                       Map<Integer, Reference> refToSaveMap,\r
+                       Map<String, Reference> relatedRefMap) {\r
+               Reference<?> result = null;\r
+               result = refToSaveMap.get(inRefFkInt);\r
+               if (result == null){\r
+                       result = relatedRefMap.get(String.valueOf(inRefFkInt));\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private Reference<?> makePrintSeries(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}\r
-               ReferenceBase printSeries = refFactory.newPrintSeries();\r
+               Reference<?> printSeries = ReferenceFactory.newPrintSeries();\r
                makeStandardMapper(valueMap, printSeries, null);\r
                return printSeries;\r
        }\r
        \r
-       private ReferenceBase<?> makeProceedings(Map<String, Object> valueMap){\r
+       private Reference<?> makeProceedings(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}\r
-               ReferenceBase proceedings = refFactory.newProceedings();\r
+               Reference<?> proceedings = ReferenceFactory.newProceedings();\r
                makeStandardMapper(valueMap, proceedings, null);        \r
                return proceedings;\r
        }\r
 \r
-       private ReferenceBase<?> makeThesis(Map<String, Object> valueMap){\r
+       private Reference<?> makeThesis(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'Thesis'");}\r
-               ReferenceBase thesis = refFactory.newThesis();\r
+               Reference<?> thesis = ReferenceFactory.newThesis();\r
                makeStandardMapper(valueMap, thesis, null);     \r
                return thesis;\r
        }\r
 \r
        \r
-       private ReferenceBase<?> makeJournalVolume(Map<String, Object> valueMap){\r
+       private Reference<?> makeJournalVolume(Map<String, Object> valueMap){\r
                if (logger.isDebugEnabled()){logger.debug("RefType 'JournalVolume'");}\r
                //Proceedings proceedings = Proceedings.NewInstance();\r
-               ReferenceBase journalVolume = refFactory.newGeneric();\r
+               Reference<?> journalVolume = ReferenceFactory.newGeneric();\r
                makeStandardMapper(valueMap, journalVolume, null);      \r
                logger.warn("Journal volumes not yet implemented. Generic created instead but with errors");\r
                return journalVolume;\r
        }\r
        \r
-       private boolean makeStandardMapper(Map<String, Object> valueMap, ReferenceBase<?> ref){\r
+       private boolean makeStandardMapper(Map<String, Object> valueMap, Reference<?> ref){\r
                return makeStandardMapper(valueMap, ref, null);\r
        }\r
 \r
@@ -779,11 +1065,21 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                if (omitAttributes == null){\r
                        omitAttributes = new HashSet<String>();\r
                }\r
-               if (mapper instanceof CdmExtensionMapper){\r
-                       result &= ((CdmExtensionMapper)mapper).invoke(valueMap, cdmBase);\r
+               if (mapper instanceof DbImportExtensionMapper){\r
+                       result &= ((DbImportExtensionMapper)mapper).invoke(valueMap, cdmBase);\r
+               }else if (mapper instanceof DbImportMarkerMapper){\r
+                       result &= ((DbImportMarkerMapper)mapper).invoke(valueMap, cdmBase);\r
                }else{\r
                        String sourceAttribute = mapper.getSourceAttributeList().get(0).toLowerCase();\r
                        Object value = valueMap.get(sourceAttribute);\r
+                       if (mapper instanceof CdmUriMapper && value != null){\r
+                               try {\r
+                                       value = new URI (value.toString());\r
+                               } catch (URISyntaxException e) {\r
+                                       logger.error("URI syntax exception: " + value.toString());\r
+                                       value = null;\r
+                               }\r
+                       }\r
                        if (value != null){\r
                                String destinationAttribute = mapper.getDestinationAttribute();\r
                                if (! omitAttributes.contains(destinationAttribute)){\r
@@ -827,22 +1123,22 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        if (nomAuthor != null){\r
                                result = nomAuthor;\r
                        }else{\r
-                               if (CdmUtils.Nz(authorString).equals("")){\r
+                               if (CdmUtils.isEmpty(authorString)){\r
                                        result = null;\r
                                }else{\r
                                        TeamOrPersonBase<?> team = Team.NewInstance();\r
                                        //TODO which one to use??\r
                                        team.setNomenclaturalTitle(authorString);\r
-                                       team.setTitleCache(authorString);\r
+                                       team.setTitleCache(authorString, true);\r
                                        result = team;\r
                                }\r
                        }\r
                }else{ //prefer bibliographic\r
-                       if (! CdmUtils.Nz(authorString).equals("")){\r
+                       if (CdmUtils.isNotEmpty(authorString)){\r
                                TeamOrPersonBase<?> team = Team.NewInstance();\r
                                //TODO which one to use??\r
                                team.setNomenclaturalTitle(authorString);\r
-                               team.setTitleCache(authorString);\r
+                               team.setTitleCache(authorString, true);\r
                                result = team;\r
                        }else{\r
                                result = nomAuthor;\r
@@ -850,419 +1146,17 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                }\r
                return result;\r
        }\r
-\r
-\r
-       \r
-       /* (non-Javadoc)\r
-        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
-        */\r
-       protected boolean isIgnore(BerlinModelImportState state){\r
-               return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);\r
-       }\r
-\r
-       \r
-       \r
-//******************************** CHECK *************************************************\r
-       \r
-       private static boolean checkArticlesWithoutJournal(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryArticlesWithoutJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + \r
-                                               " FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +\r
-                                               " WHERE (Reference.RefCategoryFk = 1) AND (InRef.RefCategoryFk <> 9) ";\r
-                       ResultSet resulSetarticlesWithoutJournal = source.getResultSet(strQueryArticlesWithoutJournal);\r
-                       boolean firstRow = true;\r
-                       while (resulSetarticlesWithoutJournal.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are Articles with wrong inRef type!");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = resulSetarticlesWithoutJournal.getInt("RefId");\r
-                               //int categoryFk = resulSetarticlesWithoutJournal.getInt("RefCategoryFk");\r
-                               String cat = resulSetarticlesWithoutJournal.getString("RefCategoryAbbrev");\r
-                               int inRefFk = resulSetarticlesWithoutJournal.getInt("InRefId");\r
-                               //int inRefCategoryFk = resulSetarticlesWithoutJournal.getInt("InRefCatFk");\r
-                               String inRefCat = resulSetarticlesWithoutJournal.getString("InRefCat");\r
-                               String refCache = resulSetarticlesWithoutJournal.getString("RefCache");\r
-                               String nomRefCache = resulSetarticlesWithoutJournal.getString("nomRefCache");\r
-                               String title = resulSetarticlesWithoutJournal.getString("title");\r
-                               String inRefTitle = resulSetarticlesWithoutJournal.getString("InRefTitle");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + \r
-                                               "\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + \r
-                                               "\n  inRefTitle: " + inRefTitle );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       private static boolean checkPartOfJournal(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + \r
-                       " FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +\r
-                                               " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 9) ";\r
-                       ResultSet rs = source.getResultSet(strQueryPartOfJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are part-of-references that have a Journal as in-reference!");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("RefId");\r
-                               //int categoryFk = rs.getInt("RefCategoryFk");\r
-                               String cat = rs.getString("RefCategoryAbbrev");\r
-                               int inRefFk = rs.getInt("InRefId");\r
-                               //int inRefCategoryFk = rs.getInt("InRefCatFk");\r
-                               String inRefCat = rs.getString("InRefCat");\r
-                               String refCache = rs.getString("RefCache");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String title = rs.getString("title");\r
-                               String inRefTitle = rs.getString("InRefTitle");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + \r
-                                               "\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + \r
-                                               "\n  inRefTitle: " + inRefTitle );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       \r
-       private static boolean checkPartOfUnresolved(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + \r
-                       " FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +\r
-                                               " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 10) ";\r
-                       ResultSet rs = source.getResultSet(strQueryPartOfJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are part-of-references that have an 'unresolved' in-reference!");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("RefId");\r
-                               //int categoryFk = rs.getInt("RefCategoryFk");\r
-                               String cat = rs.getString("RefCategoryAbbrev");\r
-                               int inRefFk = rs.getInt("InRefId");\r
-                               //int inRefCategoryFk = rs.getInt("InRefCatFk");\r
-                               String inRefCat = rs.getString("InRefCat");\r
-                               String refCache = rs.getString("RefCache");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String title = rs.getString("title");\r
-                               String inRefTitle = rs.getString("InRefTitle");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + \r
-                                               "\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + \r
-                                               "\n  inRefTitle: " + inRefTitle );\r
-                               result = firstRow = false;\r
-                       }\r
-                       if (result == false){\r
-                               System.out.println("\nChoose a specific type from the following reference types: \n" +\r
-                                               "  1) Article \n  2) Book \n  3) BookSection \n  4) CdDvd \n  5) ConferenceProceeding \n  6) Database\n" + \r
-                                               "  7) Generic \n  7) InProceedings \n  8) Journal \n  9) Map \n 10) Patent \n 11) PersonalCommunication\n" +\r
-                                               " 12) PrintSeries \n 13) Proceedings \n 14) Report \n 15) Thesis \n 16) WebPage");\r
-                       }\r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
        \r
-       private static boolean checkPartOfPartOf(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle, InRef.InRefFk as InInRefId, InInRef.Title as inInRefTitle, InInRef.RefCategoryFk as inInRefCategory " + \r
-                                               " FROM Reference " +\r
-                                                       " INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId " + \r
-                                                       " INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId " + \r
-                                                       " INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +\r
-                                                       " INNER JOIN Reference AS InInRef ON InRef.InRefFk = InInRef.RefId " + \r
-                                               " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 2) ";\r
-                       ResultSet rs = source.getResultSet(strQueryPartOfJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are part-of-references that are part of an other 'part-of' reference!\n" + \r
-                                                       "         This is invalid or ambigous. Please try to determine the reference types more detailed ");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("RefId");\r
-                               //int categoryFk = rs.getInt("RefCategoryFk");\r
-                               String cat = rs.getString("RefCategoryAbbrev");\r
-                               int inRefFk = rs.getInt("InRefId");\r
-                               //int inRefCategoryFk = rs.getInt("InRefCatFk");\r
-                               String inRefCat = rs.getString("InRefCat");\r
-                               String refCache = rs.getString("RefCache");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String title = rs.getString("title");\r
-                               String inRefTitle = rs.getString("InRefTitle");\r
-                               int inInRefId = rs.getInt("InInRefId");\r
-                               String inInRefTitle = rs.getString("inInRefTitle");\r
-                               int inInRefCategory = rs.getInt("inInRefCategory");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + \r
-                                               "\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + \r
-                                               "\n  inRefTitle: " + inRefTitle + "\n  inInRefId: " + inInRefId + "\n  inInRefTitle: " + inInRefTitle +\r
-                                               "\n  inInRefCategory: " + inInRefCategory );\r
-                               result = firstRow = false;\r
-                       }\r
-                       if (result == false){\r
-                               System.out.println("\nChoose a specific type from the following reference types: \n" +\r
-                                               "  1) BookSection - Book - PrintSeries \n" +\r
-                                               "  2) InProceedings - pProceedings  - PrintSeries");\r
-                       }\r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-\r
        \r
-       private static boolean checkPartOfArticle(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, Reference.NomTitleAbbrev as nomTitleAbbrev, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle, InRef.nomTitleAbbrev AS inRefnomTitleAbbrev, InRef.refCache AS inRefCache, InRef.nomRefCache AS inRefnomRefCache " + \r
-                       " FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +\r
-                                               " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 1) ";\r
-                       ResultSet rs = source.getResultSet(strQueryPartOfJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are part-of-references that have an article as in-reference!");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("RefId");\r
-                               //int categoryFk = rs.getInt("RefCategoryFk");\r
-                               String cat = rs.getString("RefCategoryAbbrev");\r
-                               int inRefFk = rs.getInt("InRefId");\r
-                               //int inRefCategoryFk = rs.getInt("InRefCatFk");\r
-                               String inRefCat = rs.getString("InRefCat");\r
-                               String refCache = rs.getString("RefCache");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String title = rs.getString("title");\r
-                               String nomTitleAbbrev = rs.getString("nomTitleAbbrev");\r
-                               String inRefTitle = rs.getString("InRefTitle");\r
-                               String inRefnomTitleAbbrev = rs.getString("inRefnomTitleAbbrev");\r
-                               String inRefnomRefCache = rs.getString("inRefnomRefCache");\r
-                               String inRefCache = rs.getString("inRefCache");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + "\n  titleAbbrev: " + nomTitleAbbrev + \r
-                                               "\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + \r
-                                               "\n  inRefTitle: " + inRefTitle + "\n  inRefTitleAbbrev: " + inRefnomTitleAbbrev +\r
-                                               "\n  inRefnomRefCache: " + inRefnomRefCache + "\n  inRefCache: " + inRefCache \r
-                                               );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       private static boolean checkJournalsWithSeries(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryArticlesWithoutJournal = "SELECT Reference.RefId, Reference.RefCategoryFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, Reference.NomTitleAbbrev, RefCategory.RefCategoryAbbrev  " + \r
-                                               " FROM Reference INNER JOIN " +\r
-                                                               " RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId  " +\r
-                                               " WHERE (Reference.RefCategoryFk = 9)  AND ( Reference.series is not null OR Reference.series <>'') ";\r
-                       ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are Journals with series!");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("RefId");\r
-                               //int categoryFk = rs.getInt("RefCategoryFk");\r
-                               String cat = rs.getString("RefCategoryAbbrev");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String refCache = rs.getString("refCache");\r
-                               String title = rs.getString("title");\r
-                               String nomTitleAbbrev = rs.getString("nomTitleAbbrev");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + \r
-                                               "\n  title: " + title +  "\n  nomTitleAbbrev: " + nomTitleAbbrev +\r
-                                               "" );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       private static boolean checkPartOfWithVolume(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryArticlesWithoutJournal = "SELECT Ref.RefId as refId, RefCategory.RefCategoryAbbrev as refCategoryAbbrev, Ref.nomRefCache as nomRefCache, Ref.refCache as refCache,Ref.volume as volume, Ref.Series as series, Ref.Edition as edition, Ref.title as title, Ref.nomTitleAbbrev as nomTitleAbbrev,InRef.RefCache as inRefRefCache, InRef.NomRefCache  as inRefNomRefCache, InRef.RefId as inRefId, InRef.Volume as inRefVol, InRef.Series as inRefSeries, InRef.Edition as inRefEdition" +\r
-                                       " FROM Reference AS Ref " + \r
-                                               " INNER JOIN RefCategory ON Ref.RefCategoryFk = RefCategory.RefCategoryId " +\r
-                                               "  LEFT OUTER JOIN Reference AS InRef ON Ref.InRefFk = InRef.RefId " +\r
-                                       " WHERE (Ref.RefCategoryFk = 2) AND ((Ref.Volume IS NOT NULL) OR (Ref.Series IS NOT NULL) OR (Ref.Edition IS NOT NULL)) " ; \r
-                       ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are PartOfOtherTitles with volumes, editions or series !");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("refId");\r
-                               String cat = rs.getString("refCategoryAbbrev");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String refCache = rs.getString("refCache");\r
-                               String title = rs.getString("title");\r
-                               String nomTitleAbbrev = rs.getString("nomTitleAbbrev");\r
-                               String volume = rs.getString("volume");\r
-                               String edition = rs.getString("edition");\r
-                               String series = rs.getString("series");\r
-                               String inRefRefCache = rs.getString("inRefRefCache");\r
-                               String inRefNomRefCache = rs.getString("inRefNomRefCache");\r
-                               int inRefId = rs.getInt("inRefId");\r
-                               String inRefVolume = rs.getString("inRefVol");\r
-                               String inRefSeries = rs.getString("inRefSeries");\r
-                               String inRefEdition = rs.getString("inRefEdition");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + \r
-                                               "\n  title: " + title +  "\n  nomTitleAbbrev: " + nomTitleAbbrev + "\n  volume: " + volume + "\n  series: " + series +"\n  edition: " + edition +\r
-                                               "\n  inRef-ID:" + inRefId + "\n  inRef-cache: " + inRefRefCache +  \r
-                                               "\n  inRef-nomCache: " + inRefNomRefCache + "\n  inRef-volume: " + inRefVolume +"\n  inRef-series: " + inRefSeries +"\n  inRef-edition: " + inRefEdition +\r
-                                               "" );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       private static boolean checkArticleWithEdition(BerlinModelImportConfigurator bmiConfig){\r
-               try {\r
-                       boolean result = true;\r
-                       Source source = bmiConfig.getSource();\r
-                       String strQueryArticlesWithoutJournal = "SELECT Ref.RefId as refId, RefCategory.RefCategoryAbbrev as refCategoryAbbrev, Ref.nomRefCache as nomRefCache, Ref.refCache as refCache,Ref.edition as edition, Ref.title as title, Ref.nomTitleAbbrev as nomTitleAbbrev,InRef.RefCache as inRefRefCache, InRef.NomRefCache  as inRefNomRefCache, InRef.RefId as inRefId, InRef.Edition as inRefEdition" +\r
-                                       " FROM Reference AS Ref " + \r
-                                               " INNER JOIN RefCategory ON Ref.RefCategoryFk = RefCategory.RefCategoryId " +\r
-                                               "  LEFT OUTER JOIN Reference AS InRef ON Ref.InRefFk = InRef.RefId " +\r
-                                       " WHERE (Ref.RefCategoryFk = 1) AND (NOT (Ref.Edition IS NULL))  " +\r
-                                       " ORDER BY InRef.RefId "; \r
-                       ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);\r
-                       boolean firstRow = true;\r
-                       while (rs.next()){\r
-                               if (firstRow){\r
-                                       System.out.println("========================================================");\r
-                                       logger.warn("There are Articles with editions !");\r
-                                       System.out.println("========================================================");\r
-                               }\r
-                               int refId = rs.getInt("refId");\r
-                               String cat = rs.getString("refCategoryAbbrev");\r
-                               String nomRefCache = rs.getString("nomRefCache");\r
-                               String refCache = rs.getString("refCache");\r
-                               String title = rs.getString("title");\r
-                               String nomTitleAbbrev = rs.getString("nomTitleAbbrev");\r
-                               String edition = rs.getString("edition");\r
-                               String inRefRefCache = rs.getString("inRefRefCache");\r
-                               String inRefNomRefCache = rs.getString("inRefNomRefCache");\r
-                               int inRefId = rs.getInt("inRefId");\r
-                               String inRefEdition = rs.getString("inRefEdition");\r
-                               \r
-                               System.out.println("RefID:" + refId + "\n  cat: " + cat + \r
-                                               "\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + \r
-                                               "\n  title: " + title +  "\n  nomTitleAbbrev: " + nomTitleAbbrev + "\n  edition: " + edition + \r
-                                               "\n  inRef-ID:" + inRefId + "\n  inRef-cache: " + inRefRefCache +  \r
-                                               "\n  inRef-nomCache: " + inRefNomRefCache + "\n  inRef-edition: " + inRefEdition +\r
-                                               "" );\r
-                               result = firstRow = false;\r
-                       }\r
-                       \r
-                       return result;\r
-               } catch (SQLException e) {\r
-                       e.printStackTrace();\r
-                       return false;\r
-               }\r
-       }\r
-       \r
-       protected boolean checkObligatoryAttributes(IImportConfigurator config){\r
-               boolean result = true;\r
-               \r
-               try {\r
-                       String strQuery = " SELECT Reference.* " +\r
-                           " FROM Reference " +\r
-//             " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +\r
-                           " WHERE (1=0) ";\r
-                       BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;\r
-                       Source source = bmiConfig.getSource();\r
-                       ResultSet rs = source.getResultSet(strQuery);\r
-                       int colCount = rs.getMetaData().getColumnCount();\r
-                       Set<String> existingAttributes = new HashSet<String>();\r
-                       for (int c = 0; c < colCount ; c++){\r
-                               existingAttributes.add(rs.getMetaData().getColumnLabel(c+1).toLowerCase());\r
-                       }\r
-                       Set<String> obligatoryAttributes = getObligatoryAttributes(true);\r
-                       \r
-                       obligatoryAttributes.removeAll(existingAttributes);\r
-                       for (String attr : obligatoryAttributes){\r
-                               logger.warn("Missing attribute: " + attr);\r
-                       }\r
-                       \r
-                       //additional Attributes\r
-                       obligatoryAttributes = getObligatoryAttributes(true);\r
-                       \r
-                       existingAttributes.removeAll(obligatoryAttributes);\r
-                       for (String attr : existingAttributes){\r
-                               logger.warn("Additional attribute: " + attr);\r
-                       }\r
-               } catch (SQLException e) {\r
-                       logger.error(e);\r
-                       e.printStackTrace();\r
-                       result = false;\r
-               }\r
-               return result;\r
-       }\r
-       \r
-       protected Set<String> getObligatoryAttributes(boolean lowerCase){\r
+       /**\r
+        * @param lowerCase\r
+        * @param config\r
+        * @return\r
+        */\r
+       public Set<String> getObligatoryAttributes(boolean lowerCase, BerlinModelImportConfigurator config){\r
                Set<String> result = new HashSet<String>();\r
+               Class<ICdmIO>[] ioClassList = config.getIoClassList();\r
+               logger.warn("getObligatoryAttributes has been commented because it still needs to be adapted to the new package structure");\r
                result.addAll(Arrays.asList(unclearMappers));\r
                result.addAll(Arrays.asList(createdAndNotesAttributes));\r
                result.addAll(Arrays.asList(operationalAttributes));\r
@@ -1281,47 +1175,40 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                return result;\r
        }\r
 \r
-       protected boolean checkRefDetailUnimplementedAttributes(IImportConfigurator config){\r
-               boolean result = true;\r
-               \r
-               try {\r
-                       String strQuery = " SELECT Count(*) as n" +\r
-                           " FROM RefDetail " +\r
-//             " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +\r
-                           " WHERE SecondarySources is not NULL AND SecondarySources <> '' ";\r
-                       BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;\r
-                       Source source = bmiConfig.getSource();\r
-                       ResultSet rs = source.getResultSet(strQuery);\r
-                       \r
-                       rs.next();\r
-                       int count = rs.getInt("n");\r
-                       if (count > 0){\r
-                               System.out.println("========================================================");\r
-                               logger.warn("There are "+ count + " RefDetails with SecondarySources <> NULL ! Secondary sources are not yet implemented for Berlin Model Import");\r
-                               System.out.println("========================================================");\r
-                               \r
-                       }\r
-                       strQuery = " SELECT Count(*) as n" +\r
-                           " FROM RefDetail " +\r
-//                     " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +\r
-                           " WHERE IdInSource is not NULL AND IdInSource <> '' ";\r
-                       rs = source.getResultSet(strQuery);\r
-                       \r
-                       rs.next();\r
-                       count = rs.getInt("n");\r
-                       if (count > 0){\r
-                               System.out.println("========================================================");\r
-                               logger.warn("There are "+ count + " RefDetails with IdInSource <> NULL ! IdInSource are not yet implemented for Berlin Model Import");\r
-                               System.out.println("========================================================");\r
-                               \r
-                       }\r
-                       \r
-               } catch (SQLException e) {\r
-                       logger.error(e);\r
-                       e.printStackTrace();\r
-                       result = false;\r
-               }\r
-               return result;\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
+        */\r
+       @Override\r
+       protected boolean doCheck(BerlinModelImportState state){\r
+               BerlinModelReferenceImportValidator validator = new BerlinModelReferenceImportValidator();\r
+               return validator.validate(state, this);\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
+       protected boolean isIgnore(BerlinModelImportState state){\r
+               return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);\r
+       }\r
+\r
+       \r
+\r
 \r
 }\r