update factory methods for original sources #1549
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelReferenceImport.java
index 421b2eda9f05dd2ade141082a4e121092317e73a..589a205e7e082bc5efbc4cd6a5ab25d729402ee9 100644 (file)
@@ -20,9 +20,6 @@ import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PART_OF
 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PRINT_SERIES;\r
 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_UNKNOWN;\r
 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_WEBSITE;\r
-import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.ALL;\r
-import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES;\r
-import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.NOMENCLATURAL;\r
 import static eu.etaxonomy.cdm.io.common.ImportHelper.NO_OVERWRITE;\r
 import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;\r
 import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;\r
@@ -58,6 +55,7 @@ import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;
 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.io.common.mapping.DbSingleAttributeImportMapperBase;\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
@@ -66,9 +64,7 @@ import eu.etaxonomy.cdm.model.common.IdentifiableSource;
 import eu.etaxonomy.cdm.model.common.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\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.IJournal;\r
 import eu.etaxonomy.cdm.model.reference.IPrintSeries;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
@@ -98,13 +94,14 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
 \r
        \r
        public BerlinModelReferenceImport(){\r
-               super();\r
+               super(dbTableName, pluralString);\r
        }\r
        \r
        protected void initializeMappers(BerlinModelImportState state){\r
                for (CdmAttributeMapperBase mapper: classMappers){\r
-                       if (mapper instanceof DbImportExtensionMapper){\r
-                               ((DbImportExtensionMapper)mapper).initialize(state, Reference.class);\r
+                       if (mapper instanceof DbSingleAttributeImportMapperBase){\r
+                               DbSingleAttributeImportMapperBase singleMapper = (DbSingleAttributeImportMapperBase)mapper;\r
+                               singleMapper.initialize(state, Reference.class);\r
                        }\r
                }\r
                return;\r
@@ -165,108 +162,6 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                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
@@ -289,23 +184,6 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                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
@@ -404,13 +282,13 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                \r
                                //save and store in map\r
                                logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");\r
-                               getReferenceService().save(nomRefToSave.values());\r
+                               getReferenceService().saveOrUpdate(nomRefToSave.values());\r
                                logger.info("Save bibliographical references (" + refCounter.referenceCount +")");\r
-                               getReferenceService().save(biblioRefToSave.values());\r
+                               getReferenceService().saveOrUpdate(biblioRefToSave.values());\r
 \r
 //                     }//end resultSetList    \r
 \r
-                       logger.info("end makeReferences ..." + getSuccessString(success));;\r
+//                     logger.info("end makeReferences ..." + getSuccessString(success));;\r
                        return success;\r
                } catch (SQLException e) {\r
                        logger.error("SQLException:" +  e);\r
@@ -448,6 +326,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                        Integer inRefFk = rs.getInt("inRefFk");\r
                                        \r
                                        if (inRefFk != null){\r
+                                               \r
                                                Reference<?> thisNomRef = getReferenceOnlyFromMaps(relatedNomReferences, relatedBiblioReferences, String.valueOf(refId));\r
                                                Reference<?> thisBiblioRef = getReferenceOnlyFromMaps(relatedBiblioReferences, relatedNomReferences, String.valueOf(refId));\r
                                                \r
@@ -456,34 +335,45 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                                                boolean inRefExists = false;\r
                                                if (thisNomRef != null){\r
                                                        Reference<?> inRef = (nomInReference != null)? nomInReference : biblioInReference;\r
+                                                       if (inRef == null){\r
+                                                               logger.warn("No InRef found for nomRef: " + thisNomRef.getTitleCache() + "; RefId: " +  refId + "; inRefFK: " +  inRefFk);\r
+                                                       }\r
                                                        thisNomRef.setInReference(inRef);\r
                                                        nomRefToSave.put(refId, thisNomRef);\r
                                                        //remember that an in reference exists\r
                                                        inRefExists |= (inRef != null);\r
+                                                       thisNomRef.setTitleCache(null);\r
+                                                       thisNomRef.getTitleCache();\r
                                                }\r
                                                if (thisBiblioRef != null){\r
-                                                       Reference<?> inRef = (biblioInReference != null)? biblioInReference : nomInReference;\r
+                                                       Reference<?> inRef = (biblioInReference != null)? biblioInReference : nomInReference ;\r
+                                                       if (inRef == null){\r
+                                                               logger.warn("No InRef found for biblioRef: " + thisBiblioRef.getTitleCache() + "; RefId: " +  refId + "; inRefFK: " +  inRefFk);\r
+                                                       }\r
                                                        thisBiblioRef.setInReference(inRef);\r
                                                        biblioRefToSave.put(refId, thisBiblioRef);\r
                                                        //remember that an in reference exists\r
                                                        inRefExists |= (inRef != null);\r
+                                                       thisBiblioRef.setTitleCache(null);\r
+                                                       thisBiblioRef.getTitleCache();\r
                                                }\r
                                                if (inRefExists == false){\r
                                                        logger.warn("No in reference was saved though an 'inRefFk' is available. RefId " + refId);\r
                                                }\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
+                               getReferenceService().saveOrUpdate(nomRefToSave.values());\r
                                logger.info("Save bibliographical references (" + refCounter.referenceCount +")");\r
-                               getReferenceService().save(biblioRefToSave.values());\r
+                               getReferenceService().saveOrUpdate(biblioRefToSave.values());\r
                                \r
 //                     }//end resultSetList    \r
 \r
-                       logger.info("end makeReferences ..." + getSuccessString(success));;\r
+//                     logger.info("end makeReferences ..." + getSuccessString(success));;\r
                        return success;\r
                } catch (SQLException e) {\r
                        logger.error("SQLException:" +  e);\r
@@ -616,8 +506,8 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        \r
                        //idInSource\r
                        String idInSource = (String)valueMap.get("IdInSource".toLowerCase());\r
-                       if (CdmUtils.isNotEmpty(idInSource)){\r
-                               IdentifiableSource source = IdentifiableSource.NewInstance(idInSource);\r
+                       if (isNotBlank(idInSource)){\r
+                               IdentifiableSource source = IdentifiableSource.NewDataImportInstance(idInSource);\r
                                source.setIdNamespace("import to Berlin Model");\r
                                referenceBase.addSource(source);\r
                        }\r
@@ -675,7 +565,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                \r
                boolean hasNomRef = false;\r
                boolean hasBiblioRef = false;\r
-               Reference sourceReference = state.getConfig().getSourceReference();\r
+               Reference sourceReference = state.getTransactionalSourceReference();\r
                \r
                //is Nomenclatural Reference\r
                if ( (CdmUtils.isNotEmpty(nomRefCache) && isPreliminary) || (CdmUtils.isNotEmpty(nomTitleAbbrev) && ! isPreliminary) ){\r
@@ -760,35 +650,12 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                Integer refId = (Integer)valueMap.get("refId".toLowerCase());\r
                \r
                if (inRefFk != null){\r
-                       if (inRefCategoryFk == REF_JOURNAL){\r
-                               int inRefFkInt = (Integer)inRefFk;\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 = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);\r
-                                               logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");\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 (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.getType() +\r
-                                                       " Inreference relation could not be set");\r
-                                       }\r
-                               }else{\r
-                                       logger.error("Journal (refId = " + inRefFkInt + " ) for Article (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");\r
-                                       //success = false;;\r
-                               }\r
-                       }else{\r
+                       if (inRefCategoryFk != REF_JOURNAL){\r
                                logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not (RefCategoryFk=" + inRefCategoryFk + "))." +\r
-                                       " InReference was not added to Article! ");\r
+                                       " InReference was added anyway! ");\r
                        }\r
+               }else{\r
+                       logger.warn ("Article has no inreference: " + refId);\r
                }\r
                makeStandardMapper(valueMap, (Reference)article); //url, pages, series, volume\r
                return (Reference)article;\r
@@ -804,40 +671,18 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                        //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 (inRefFk == null){\r
+                       logger.warn("Part-Of-Other-Title has in in reference: " + refId);\r
+                       result = makeUnknown(valueMap);\r
                }else if (inRefCategoryFk == REF_BOOK){\r
                        //BookSection\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 = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);\r
-                                               logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");\r
-                                               nomRefToSave.put(inRefFkInt, inBook);\r
-                                       }\r
-                                       if (inBook == null){\r
-                                               logger.warn("inBook for " + inRefFkInt + " is null. "+\r
-                                               " InReference relation could not be set");;\r
-                                       //}else if (Book.class.isAssignableFrom(inBook.getClass())){\r
-                                       }else if (inBook.getType().equals(ReferenceType.Book)){\r
-                                               bookSection.setInBook((IBook)inBook);\r
-                                               //TODO\r
-                                       }else{\r
-                                               logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +\r
-                                                               " Inreference relation could not be set");\r
-                                       }\r
-                               }else{\r
-                                       logger.error("Book (refId = " + inRefFkInt + ") for part_of_other_title (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");\r
-                                       //success = false;\r
-                               }\r
-                       }\r
                }else if (inRefCategoryFk == REF_ARTICLE){\r
                        //Article\r
                        //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
+                       logger.info("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +\r
+                                       " There is no specific reference type for such in references yet. Generic reference created instead") ;\r
                        result = ReferenceFactory.newGeneric();\r
                }else if (inRefCategoryFk == REF_JOURNAL){\r
                        //TODO \r
@@ -1183,23 +1028,7 @@ public class BerlinModelReferenceImport extends BerlinModelImportBase {
                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