*/\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
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
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
\r
}\r
\r
+ \r
}\r