(no commit message)
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelTaxonIO.java
index 684b62ebdf066e9d5887d5722aae2974df82a045..d668c000f88bbed489e5914cfcf5f8d64bd46d55 100644 (file)
@@ -3,9 +3,13 @@
  */\r
 package eu.etaxonomy.cdm.io.berlinModel;\r
 \r
+import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.*;\r
+\r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
+import java.util.HashSet;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -18,8 +22,11 @@ import eu.etaxonomy.cdm.io.source.Source;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
+\r
 \r
 /**\r
  * @author a.mueller\r
@@ -28,117 +35,197 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 public class BerlinModelTaxonIO {\r
        private static final Logger logger = Logger.getLogger(BerlinModelTaxonIO.class);\r
 \r
-       private static int modCount = 1000;\r
+       private static int modCount = 30000;\r
 \r
-       public static boolean invoke(\r
-                       Source source, \r
-                       CdmApplicationController cdmApp, \r
-                       boolean deleteAll, \r
-                       Map<Integer, UUID> taxonMap,\r
-                       Map<Integer, UUID> taxonNameMap,\r
-                       Map<Integer, UUID> referenceMap){\r
+       public static boolean invoke(BerlinModelImportConfigurator bmiConfig, CdmApplicationController cdmApp, \r
+                       MapWrapper<TaxonBase> taxonMap, MapWrapper<TaxonNameBase> taxonNameMap, MapWrapper<ReferenceBase> referenceMap){\r
+               Source source = bmiConfig.getSource();\r
                String dbAttrName;\r
                String cdmAttrName;\r
                \r
                logger.info("start makeTaxa ...");\r
                \r
                ITaxonService taxonService = cdmApp.getTaxonService();\r
-               INameService nameService = cdmApp.getNameService();\r
-               IReferenceService referenceService = cdmApp.getReferenceService();\r
-               boolean delete = deleteAll;\r
-               \r
-//             if (delete){\r
-//                     List<TaxonBase> listAllTaxa =  taxonService.getAllTaxa(0, 1000);\r
-//                     while(listAllTaxa.size() > 0 ){\r
-//                             for (TaxonBase taxon : listAllTaxa ){\r
-//                                     //FIXME\r
-//                                     //nameService.remove(name);\r
-//                             }\r
-//                             listAllTaxa =  taxonService.getAllTaxa(0, 1000);\r
-//                     }                       \r
-//             }\r
+               boolean delete = bmiConfig.isDeleteAll();\r
+\r
                try {\r
                        //get data from database\r
                        String strQuery = \r
-                                       " SELECT *  " +\r
-                    " FROM PTaxon " ;\r
-                       ResultSet rs = source.getResultSet(strQuery) ;\r
+                                       " SELECT * " + \r
+                                       " FROM PTaxon " +\r
+                                       " WHERE (1=1)";\r
                        \r
+                       ResultSet rs = source.getResultSet(strQuery) ;\r
                        \r
                        int i = 0;\r
                        //for each reference\r
                        while (rs.next()){\r
                                \r
-                               if ((i++ % modCount) == 0){ logger.info("Names handled: " + (i-1));}\r
+                               if ((i++ % modCount) == 0){ logger.info("PTaxa handled: " + (i-1));}\r
                                \r
                                //create TaxonName element\r
-                               int taxonId = rs.getInt("taxonId");\r
+                               int taxonId = rs.getInt("RIdentifier");\r
                                int statusFk = rs.getInt("statusFk");\r
                                \r
-                               int nameFk = rs.getInt("nameFk");\r
-                               int refFk = rs.getInt("refFk");\r
+                               int nameFk = rs.getInt("PTNameFk");\r
+                               int refFk = rs.getInt("PTRefFk");\r
+                               String doubtful = rs.getString("DoubtfulFlag");\r
                                \r
-                               TaxonNameBase taxonName;\r
-                               UUID nameUuid = taxonNameMap.get(nameFk);\r
-                               if (nameUuid == null){\r
-                                       taxonName = null;\r
-                               }else{\r
-                                       taxonName  = nameService.getTaxonNameByUuid(nameUuid);\r
+                               TaxonNameBase taxonName = null;\r
+                               if (taxonNameMap != null){\r
+                                       taxonName  = taxonNameMap.get(nameFk);\r
+                               }\r
+                                                               \r
+                               ReferenceBase reference = null;\r
+                               if (referenceMap != null){\r
+                                       reference = referenceMap.get(refFk);\r
                                }\r
                                \r
-                               \r
-                               ReferenceBase reference;\r
-                               UUID refUuid = referenceMap.get(refFk);\r
-                               if (refUuid == null){\r
-                                       reference = null;\r
+                               if (taxonName == null ){\r
+                                       logger.warn("TaxonName belonging to taxon (RIdentifier = " + taxonId + ") could not be found in store. Taxon will not be transported");\r
+                                       continue;\r
+                               }else if (reference == null ){\r
+                                       logger.warn("Reference belonging to taxon could not be found in store. Taxon will not be imported");\r
+                                       continue;\r
                                }else{\r
-                                       reference  = referenceService.getReferenceByUuid(refUuid);\r
+                                       TaxonBase taxonBase;\r
+                                       Synonym synonym;\r
+                                       Taxon taxon;\r
+                                       try {\r
+                                               logger.debug(statusFk);\r
+                                               if (statusFk == T_STATUS_ACCEPTED){\r
+                                                       taxon = Taxon.NewInstance(taxonName, reference);\r
+                                                       taxonBase = taxon;\r
+                                               }else if (statusFk == T_STATUS_SYNONYM){\r
+                                                       synonym = Synonym.NewInstance(taxonName, reference);\r
+                                                       taxonBase = synonym;\r
+                                               }else{\r
+                                                       logger.warn("TaxonStatus " + statusFk + " not yet implemented. Taxon (RIdentifier = " + taxonId + ") left out.");\r
+                                                       continue;\r
+                                               }\r
+                                               \r
+                                               //TODO\r
+//                                             dbAttrName = "Detail";\r
+//                                             cdmAttrName = "Micro";\r
+//                                             ImportHelper.addStringValue(rs, taxonBase, dbAttrName, cdmAttrName);\r
+                                               \r
+                                               if (doubtful.equals("a")){\r
+                                                       taxonBase.setDoubtful(false);\r
+                                               }else if(doubtful.equals("d")){\r
+                                                       taxonBase.setDoubtful(true);\r
+                                               }else if(doubtful.equals("i")){\r
+                                                       //TODO\r
+                                                       logger.warn("Doubtful = i (inactivated) not yet implemented. Doubtful set to false");\r
+                                               }\r
+                                               \r
+                                               //nameId\r
+                                               ImportHelper.setOriginalSource(taxonBase, bmiConfig.getSourceReference(), taxonId);\r
+\r
+                                               \r
+                                               //TODO\r
+                                               //\r
+                                               //Created\r
+                                               //Note\r
+                                               //ALL\r
+                                               \r
+                                               taxonMap.put(taxonId, taxonBase);\r
+                                       } catch (Exception e) {\r
+                                               logger.warn("An exception occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");\r
+                                       }\r
                                }\r
+                       }\r
+                       //invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);\r
+                       logger.info("saving taxa ...");\r
+                       taxonService.saveTaxonAll(taxonMap.objects());\r
+                       \r
+                       logger.info("end makeTaxa ...");\r
+                       \r
+                       return true;\r
+               } catch (SQLException e) {\r
+                       logger.error("SQLException:" +  e);\r
+                       return false;\r
+               }\r
+\r
+       }\r
+       \r
+\r
+       public static boolean invokeRelations(BerlinModelImportConfigurator bmiConfig, CdmApplicationController cdmApp, \r
+                       MapWrapper<TaxonBase> taxonMap, MapWrapper<ReferenceBase> referenceMap){\r
+\r
+               Set<TaxonBase> taxonStore = new HashSet<TaxonBase>();\r
+               Source source = bmiConfig.getSource();\r
+               String dbAttrName;\r
+               String cdmAttrName;\r
+               \r
+               logger.info("start makeTaxonRelationships ...");\r
+               \r
+               ITaxonService taxonService = cdmApp.getTaxonService();\r
+               boolean delete = bmiConfig.isDeleteAll();\r
+\r
+               try {\r
+                       //get data from database\r
+                       String strQuery = \r
+                                       " SELECT RelPTaxon.*, FromTaxon.RIdentifier as taxon1Id, ToTaxon.RIdentifier as taxon2Id " + \r
+                                       " FROM PTaxon as FromTaxon INNER JOIN " +\r
+                       " RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 INNER JOIN " +\r
+                       " PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk "+\r
+                    " WHERE (1=1)";\r
+                       ResultSet rs = source.getResultSet(strQuery) ;\r
+                       \r
+                       int i = 0;\r
+                       //for each reference\r
+                       while (rs.next()){\r
+                               \r
+                               if ((i++ % modCount) == 0){ logger.info("RelPTaxa handled: " + (i-1));}\r
+                               \r
+                               int relPTaxonId = rs.getInt("RelPTaxonId");\r
+                               int taxon1Id = rs.getInt("taxon1Id");\r
+                               int taxon2Id = rs.getInt("taxon2Id");\r
+                               int relRefFk = rs.getInt("relRefFk");\r
+                               int relQualifierFk = rs.getInt("relQualifierFk");\r
                                \r
-                               TaxonBase taxonBase;\r
-                               Synonym synonym;\r
-                               Taxon taxon;\r
-                               try {\r
-                                       logger.info(statusFk);\r
-                                       if (statusFk == 1){\r
-                                               taxon = Taxon.NewInstance(taxonName, reference);\r
-                                               taxonBase = taxon;\r
-                                       }else if (statusFk == 2){\r
-                                               synonym = Synonym.NewInstance(taxonName, reference);\r
-                                               taxonBase = synonym;\r
-                                       }else{\r
-                                               synonym = Synonym.NewInstance(taxonName, reference);\r
-                                               taxonBase = synonym;\r
+                               TaxonBase taxon1 = taxonMap.get(taxon1Id);\r
+                               TaxonBase taxon2 = taxonMap.get(taxon2Id);\r
+                               \r
+                               //TODO\r
+                               ReferenceBase citation = null;\r
+                               String microcitation = null;\r
+\r
+                               if (taxon2 != null && taxon1 != null){\r
+                                       if (relQualifierFk == TAX_REL_IS_INCLUDED_IN){\r
+                                               ((Taxon)taxon2).addTaxonomicChild((Taxon)taxon1, citation, microcitation);\r
+                                       }else if (relQualifierFk == TAX_REL_IS_SYNONYM_OF){\r
+                                               ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.SYNONYM_OF());\r
+                                       }else if (relQualifierFk == TAX_REL_IS_HOMOTYPIC_SYNONYM_OF){\r
+                                               //TODO castexceptioin\r
+                                               ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF());\r
+                                       }else if (relQualifierFk == TAX_REL_IS_HETEROTYPIC_SYNONYM_OF){\r
+                                               if (Synonym.class.isAssignableFrom(taxon1.getClass())){\r
+                                                       ((Taxon)taxon2).addSynonym((Synonym)taxon1, SynonymRelationshipType.HETEROTYPIC_SYNONYM_OF());\r
+                                               }else{\r
+                                                       logger.warn("Taxon (RIdentifier = " + taxon1Id + ") can not be casted to Synonym");\r
+                                               }\r
+                                       }else if (relQualifierFk == TAX_REL_IS_MISAPPLIED_NAME_OF){\r
+                                               ((Taxon)taxon2).addMisappliedName((Taxon)taxon1, citation, microcitation);\r
+                                       }else {\r
+                                               //TODO\r
+                                               logger.warn("TaxonRelationShipType " + relQualifierFk + " not yet implemented");\r
                                        }\r
+                                       taxonStore.add(taxon2);\r
                                        \r
-                                       dbAttrName = "xxx";\r
-                                       cdmAttrName = "yyy";\r
-                                       ImportHelper.addStringValue(rs, taxonBase, dbAttrName, cdmAttrName);\r
-                                       \r
-                                       dbAttrName = "genusSubdivisionEpi";\r
-                                       cdmAttrName = "infraGenericEpithet";\r
-                                       ImportHelper.addStringValue(rs, taxonBase, dbAttrName, cdmAttrName);\r
-                                       \r
-                                       dbAttrName = "isDoubtful";\r
-                                       cdmAttrName = "isDoubtful";\r
-                                       ImportHelper.addBooleanValue(rs, taxonBase, dbAttrName, cdmAttrName);\r
-\r
-\r
                                        //TODO\r
-                                       //Created\r
-                                       //Note\r
-                                       //ALL\r
-                                       \r
-                                       UUID taxonUuid = taxonService.saveTaxon(taxonBase);\r
-                                       taxonMap.put(taxonId, taxonUuid);\r
-                                       \r
-                               } catch (Exception e) {\r
-                                       logger.warn("An exception occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");\r
+                                       //Reference\r
+                                       //ID\r
+                                       //etc.\r
+                               }else{\r
+                                       //TODO\r
+                                       logger.warn("Taxa for RelPTaxon " + relPTaxonId + " do not exist in store");\r
                                }\r
-                               \r
-                       }       \r
+                       }\r
+                       logger.info("Taxa to save: " + taxonStore.size());\r
+                       taxonService.saveTaxonAll(taxonStore);\r
                        \r
-                       logger.info("end makeTaxa ...");\r
+                       logger.info("end makeRelTaxa ...");\r
                        return true;\r
                } catch (SQLException e) {\r
                        logger.error("SQLException:" +  e);\r
@@ -147,4 +234,5 @@ public class BerlinModelTaxonIO {
 \r
        }\r
        \r
+       \r
 }\r