import org.springframework.stereotype.Component;\r
import org.springframework.transaction.TransactionStatus;\r
\r
-import eu.etaxonomy.cdm.io.berlinModel.out.mapper.MethodMapper;\r
-import eu.etaxonomy.cdm.io.common.DbExportStateBase;\r
import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.io.common.mapping.out.MethodMapper;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
import eu.etaxonomy.cdm.model.name.NameRelationship;\r
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
import eu.etaxonomy.cdm.model.name.Rank;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Classification;\r
import eu.etaxonomy.cdm.model.taxon.Synonym;\r
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
-import eu.etaxonomy.cdm.model.taxon.Classification;\r
\r
/**\r
* The export class for relations between {@link eu.etaxonomy.cdm.model.taxon.TaxonBase TaxonBases}.<p>\r
*\r
*/\r
@Component\r
-@SuppressWarnings("unchecked")\r
public class PesiRelTaxonExport extends PesiExportBase {\r
private static final Logger logger = Logger.getLogger(PesiRelTaxonExport.class);\r
private static final Class<? extends CdmBase> standardMethodParameter = RelationshipBase.class;\r
private static final String dbTableName = "RelTaxon";\r
private static final String pluralString = "Relationships";\r
private static PreparedStatement synonymsStmt;\r
- private HashMap<Rank, Rank> rankMap = new HashMap<Rank, Rank>();\r
+ private HashMap<Rank, Rank> rank2endRankMap = new HashMap<Rank, Rank>();\r
private List<Rank> rankList = new ArrayList<Rank>();\r
private PesiExportMapping mapping;\r
private int count = 0;\r
- private boolean success = true;\r
- private static NomenclaturalCode nomenclaturalCode;\r
+ private static NomenclaturalCode nomenclaturalCode2;\r
\r
public PesiRelTaxonExport() {\r
super();\r
@Override\r
protected void doInvoke(PesiExportState state) {\r
try {\r
- logger.error("*** Started Making " + pluralString + " ...");\r
+ logger.info("*** Started Making " + pluralString + " ...");\r
\r
Connection connection = state.getConfig().getDestination().getConnection();\r
String synonymsSql = "UPDATE Taxon SET KingdomFk = ?, RankFk = ?, RankCache = ? WHERE TaxonId = ?"; \r
synonymsStmt = connection.prepareStatement(synonymsSql);\r
- \r
- // Get the limit for objects to save within a single transaction.\r
- int pageSize = 1000;\r
-\r
- // Get the limit for objects to save within a single transaction.\r
- int limit = state.getConfig().getLimitSave();\r
\r
// Stores whether this invoke was successful or not.\r
boolean success = true;\r
rankList.add(Rank.GENUS());\r
\r
// Specify where to stop traversing (value) when starting at a specific Rank (key)\r
- rankMap.put(Rank.GENUS(), null); // Since NULL does not match an existing Rank, traverse all the way down to the leaves\r
- rankMap.put(Rank.KINGDOM(), Rank.GENUS()); // excludes rank genus\r
+ rank2endRankMap.put(Rank.GENUS(), null); // Since NULL does not match an existing Rank, traverse all the way down to the leaves\r
+ rank2endRankMap.put(Rank.KINGDOM(), Rank.GENUS()); // excludes rank genus\r
\r
// Retrieve list of classifications\r
txStatus = startTransaction(true);\r
- logger.error("Started transaction. Fetching all classifications...");\r
+ logger.info("Started transaction. Fetching all classifications...");\r
classificationList = getClassificationService().listClassifications(null, 0, null, null);\r
commitTransaction(txStatus);\r
- logger.error("Committed transaction.");\r
+ logger.debug("Committed transaction.");\r
\r
- logger.error("Fetched " + classificationList.size() + " classification(s).");\r
+ logger.info("Fetched " + classificationList.size() + " classification(s).");\r
\r
for (Classification classification : classificationList) {\r
for (Rank rank : rankList) {\r
\r
txStatus = startTransaction(true);\r
- logger.error("Started transaction to fetch all rootNodes specific to Rank " + rank.getLabel() + " ...");\r
+ logger.info("Started transaction to fetch all rootNodes specific to Rank " + rank.getLabel() + " ...");\r
\r
List<TaxonNode> rankSpecificRootNodes = getClassificationService().loadRankSpecificRootNodes(classification, rank, null);\r
- logger.error("Fetched " + rankSpecificRootNodes.size() + " RootNodes for Rank " + rank.getLabel());\r
+ logger.info("Fetched " + rankSpecificRootNodes.size() + " RootNodes for Rank " + rank.getLabel());\r
\r
commitTransaction(txStatus);\r
- logger.error("Committed transaction.");\r
+ logger.debug("Committed transaction.");\r
\r
for (TaxonNode rootNode : rankSpecificRootNodes) {\r
txStatus = startTransaction(false);\r
- Rank endRank = rankMap.get(rank);\r
+ Rank endRank = rank2endRankMap.get(rank);\r
if (endRank != null) {\r
- logger.error("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till Rank " + endRank.getLabel() + " ...");\r
+ logger.info("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till Rank " + endRank.getLabel() + " ...");\r
} else {\r
- logger.error("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till leaves are reached ...");\r
+ logger.info("Started transaction to traverse childNodes of rootNode (" + rootNode.getUuid() + ") till leaves are reached ...");\r
}\r
\r
TaxonNode newNode = getTaxonNodeService().load(rootNode.getUuid());\r
\r
- TaxonNode parentNode = newNode.getParent();\r
-\r
- traverseTree(newNode, parentNode, rankMap.get(rank), state);\r
-\r
- commitTransaction(txStatus);\r
- logger.error("Committed transaction.");\r
+ if (isPesiTaxon(newNode.getTaxon())){\r
+ \r
+ TaxonNode parentNode = newNode.getParent();\r
+ \r
+ success &=traverseTree(newNode, parentNode, endRank, state);\r
+ \r
+ commitTransaction(txStatus);\r
+ logger.debug("Committed transaction.");\r
+ }else{\r
+ logger.debug("Taxon is not in PESI");\r
+ }\r
\r
}\r
}\r
}\r
\r
- logger.error("*** Finished Making " + pluralString + " ..." + getSuccessString(success));\r
+ logger.warn("*** Finished Making " + pluralString + " ..." + getSuccessString(success));\r
\r
if (!success){\r
state.setUnsuccessfull();\r
* @param fetchLevel\r
* @param state\r
*/\r
- private void traverseTree(TaxonNode childNode, TaxonNode parentNode, Rank fetchLevel, PesiExportState state) {\r
+ private boolean traverseTree(TaxonNode childNode, TaxonNode parentNode, Rank fetchLevel, PesiExportState state) {\r
+ boolean success = true;\r
// Traverse all branches from this childNode until specified fetchLevel is reached.\r
- if (childNode.getTaxon() != null) {\r
- TaxonNameBase taxonName = childNode.getTaxon().getName();\r
- if (taxonName != null) {\r
- Rank childTaxonNameRank = taxonName.getRank();\r
- if (childTaxonNameRank != null) {\r
- if (! childTaxonNameRank.equals(fetchLevel)) {\r
-\r
- saveData(childNode, parentNode, state);\r
-\r
- for (TaxonNode newNode : childNode.getChildNodes()) {\r
- traverseTree(newNode, childNode, fetchLevel, state);\r
+ TaxonBase<?> childTaxon = childNode.getTaxon();\r
+ if (childTaxon != null) {\r
+ if (isPesiTaxon(childTaxon)){\r
+ if (childTaxon.getName() != null) {\r
+ Rank childTaxonNameRank = childTaxon.getName().getRank();\r
+ if (childTaxonNameRank != null) {\r
+ if (! childTaxonNameRank.equals(fetchLevel)) {\r
+ \r
+ success &= saveData(childNode, parentNode, state);\r
+ \r
+ for (TaxonNode newNode : childNode.getChildNodes()) {\r
+ success &= traverseTree(newNode, childNode, fetchLevel, state);\r
+ }\r
+ \r
+ } else {\r
+ // logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
+ return success;\r
}\r
- \r
} else {\r
-// logger.error("Target Rank " + fetchLevel.getLabel() + " reached");\r
- return;\r
+ logger.warn("Rank is NULL. FetchLevel can not be checked: " + childTaxon.getUuid() + " (" + childTaxon.getTitleCache() + ")");\r
}\r
} else {\r
- logger.error("Rank is NULL. FetchLevel can not be checked: " + taxonName.getUuid() + " (" + taxonName.getTitleCache() + ")");\r
+ logger.error("TaxonName is NULL for taxon: " + childTaxon.getUuid());\r
}\r
- } else {\r
- logger.error("TaxonName is NULL for this node: " + childNode.getUuid());\r
+ }else{\r
+ logger.debug("Taxon is not a PESI taxon: " + childTaxon.getUuid());\r
}\r
\r
} else {\r
logger.error("Taxon is NULL for TaxonNode: " + childNode.getUuid());\r
}\r
+ return success;\r
}\r
\r
/**\r
* @param state\r
* @param currentTaxonFk\r
*/\r
- private void saveData(TaxonNode childNode, TaxonNode parentNode, PesiExportState state) {\r
+ private boolean saveData(TaxonNode childNode, TaxonNode parentNode, PesiExportState state) {\r
+ boolean success = true;\r
Taxon childNodeTaxon = childNode.getTaxon();\r
if (childNodeTaxon != null) {\r
- TaxonNameBase childNodeTaxonName = childNodeTaxon.getName();\r
- nomenclaturalCode = PesiTransformer.getNomenclaturalCode(childNodeTaxonName);\r
-\r
- if (childNodeTaxonName != null) {\r
-\r
- // TaxonRelationships\r
- Set<Taxon> taxa = childNodeTaxonName.getTaxa(); // accepted taxa\r
- if (taxa.size() == 1) {\r
- Taxon taxon = CdmBase.deproxy(taxa.iterator().next(), Taxon.class);\r
- Set<TaxonRelationship> taxonRelations = taxon.getRelationsToThisTaxon();\r
- for (TaxonRelationship taxonRelationship : taxonRelations) {\r
- try {\r
- if (neededValuesNotNull(taxonRelationship, state)) {\r
- doCount(count++, modCount, pluralString);\r
- success &= mapping.invoke(taxonRelationship);\r
- }\r
- } catch (SQLException e) {\r
- logger.error("TaxonRelationship could not be created for this TaxonRelation (" + taxonRelationship.getUuid() + "): " + e.getMessage());\r
- }\r
- }\r
- } else if (taxa.size() > 1) {\r
- logger.error("TaxonRelationship could not be created. This TaxonNode has " + taxa.size() + " Taxa: " + childNodeTaxon.getUuid() + " (" + childNodeTaxon.getTitleCache() + ")");\r
- }\r
- \r
- // TaxonNameRelationships\r
- Set<NameRelationship> nameRelations = childNodeTaxonName.getRelationsFromThisName();\r
- for (NameRelationship nameRelation : nameRelations) {\r
- try {\r
- if (neededValuesNotNull(nameRelation, state)) {\r
- doCount(count++, modCount, pluralString);\r
- success &= mapping.invoke(nameRelation);\r
- }\r
- } catch (SQLException e) {\r
- logger.error("NameRelationship could not be created: " + e.getMessage());\r
- }\r
- }\r
+ // TaxonRelationships\r
+ success &= saveTaxonRelationships(state, childNodeTaxon);\r
+ // TaxonNameRelationships\r
+ success &= saveNameRelationships(state, childNodeTaxon);\r
+ // SynonymRelationships\r
+ success &= saveSynonymAndSynNameRelationships(state, childNodeTaxon);\r
+ }\r
+ return success;\r
+ \r
+ }\r
\r
+ private boolean saveSynonymAndSynNameRelationships(PesiExportState state, Taxon childNodeTaxon) {\r
+ boolean success = true;\r
+ for (SynonymRelationship synRel : childNodeTaxon.getSynonymRelations()) { // synonyms of accepted taxon\r
+ Synonym synonym = synRel.getSynonym();\r
+ TaxonNameBase<?,?> synonymTaxonName = synonym.getName();\r
+ if (! isPesiTaxon(synonym)){\r
+ logger.warn("Synonym " + synonym.getId() + " of synonym relation " + synRel.getId() + " is not a PESI taxon. Can't export relationship");\r
+ continue;\r
}\r
\r
- // SynonymRelationships\r
- Set<Synonym> synonyms = childNodeTaxon.getSynonyms(); // synonyms of accepted taxon\r
- for (Synonym synonym : synonyms) {\r
- TaxonNameBase synonymTaxonName = synonym.getName();\r
- \r
- // Store synonym data in Taxon table\r
- invokeSynonyms(state, synonymTaxonName);\r
-\r
- Set<SynonymRelationship> synonymRelations = synonym.getSynonymRelations();\r
- for (SynonymRelationship synonymRelationship : synonymRelations) {\r
- try {\r
- if (neededValuesNotNull(synonymRelationship, state)) {\r
- doCount(count++, modCount, pluralString);\r
- success &= mapping.invoke(synonymRelationship);\r
- \r
- }\r
- } catch (SQLException e) {\r
- logger.error("SynonymRelationship could not be created for this SynonymRelation (" + synonymRelationship.getUuid() + "): " + e.getMessage());\r
+ // Store synonym data in Taxon table\r
+ invokeSynonyms(state, synonymTaxonName);\r
+\r
+ \r
+ \r
+ Set<SynonymRelationship> synonymRelations = synonym.getSynonymRelations();\r
+ state.setCurrentFromObject(synonym);\r
+ for (SynonymRelationship synonymRelationship : synonymRelations) { //needed? Maybe to make sure that there are no partial synonym relations missed ??\r
+ try {\r
+ if (neededValuesNotNull(synonymRelationship, state)) {\r
+ doCount(count++, modCount, pluralString);\r
+ success &= mapping.invoke(synonymRelationship);\r
+ \r
}\r
+ } catch (SQLException e) {\r
+ logger.error("SynonymRelationship (" + synonymRelationship.getUuid() + ") could not be stored : " + e.getMessage());\r
}\r
+ }\r
\r
- // SynonymNameRelationship\r
- Set<NameRelationship> nameRelations = synonymTaxonName.getRelationsFromThisName();\r
- for (NameRelationship nameRelation : nameRelations) {\r
- try {\r
- if (neededValuesNotNull(nameRelation, state)) {\r
- doCount(count++, modCount, pluralString);\r
- success &= mapping.invoke(nameRelation);\r
- }\r
- } catch (SQLException e) {\r
- logger.error("NameRelationship could not be created for this NameRelation (" + nameRelation.getUuid() + "): " + e.getMessage());\r
+ // SynonymNameRelationship\r
+ success &= saveNameRelationships(state, synonym);\r
+ }\r
+ return success;\r
+ }\r
+\r
+ private boolean saveNameRelationships(PesiExportState state, TaxonBase taxonBase) {\r
+ boolean success = true;\r
+ TaxonNameBase<?,?> childNodeTaxonName = taxonBase.getName();\r
+\r
+ //from relations\r
+ Set<NameRelationship> nameRelations = childNodeTaxonName.getRelationsFromThisName();\r
+ state.setCurrentFromObject(taxonBase);\r
+ boolean isFrom = true;\r
+ success &= saveOneSideNameRelation(state, isFrom, nameRelations);\r
+ \r
+ //toRelations\r
+ nameRelations = childNodeTaxonName.getRelationsToThisName();\r
+ state.setCurrentToObject(taxonBase);\r
+ isFrom = false;\r
+ success &= saveOneSideNameRelation(state, isFrom, nameRelations);\r
+ \r
+ return success;\r
+ }\r
+\r
+ private boolean saveOneSideNameRelation(PesiExportState state, boolean isFrom, Set<NameRelationship> nameRelations) {\r
+ boolean success = true;\r
+ for (NameRelationship nameRelation : nameRelations) {\r
+ try {\r
+ TaxonNameBase<?,?> relatedName = isFrom ? nameRelation.getToName(): nameRelation.getFromName();\r
+ if ( isPurePesiName(relatedName)){\r
+ success &= checkAndInvokeNameRelation(state, nameRelation, relatedName, isFrom);\r
+ }else{\r
+ for (TaxonBase<?> relatedTaxon : getPesiTaxa(relatedName)){\r
+ success &= checkAndInvokeNameRelation(state, nameRelation, relatedTaxon, isFrom);\r
}\r
}\r
+ } catch (SQLException e) {\r
+ logger.error("NameRelationship " + nameRelation.getUuid() + " for " + nameRelation.getFromName().getTitleCache() + " and " + nameRelation.getToName().getTitleCache() + " could not be created: " + e.getMessage());\r
+ success = false;\r
+ }\r
+ }\r
+ return success;\r
+ }\r
+\r
+ private boolean checkAndInvokeNameRelation(PesiExportState state, NameRelationship nameRelation, IdentifiableEntity<?> relatedObject, boolean isFrom) throws SQLException {\r
+ boolean success = true;\r
+ if (isFrom){\r
+ state.setCurrentToObject(relatedObject);\r
+ }else{\r
+ state.setCurrentFromObject(relatedObject);\r
+ }\r
+ if (neededValuesNotNull(nameRelation, state)) {\r
+ doCount(count++, modCount, pluralString);\r
+ success &= mapping.invoke(nameRelation);\r
+ }\r
+ return success;\r
+ }\r
\r
+ private boolean saveTaxonRelationships(PesiExportState state, Taxon childNodeTaxon) {\r
+ boolean success = true;\r
+ Taxon taxon = childNodeTaxon;\r
+ Set<TaxonRelationship> taxonRelations = taxon.getRelationsToThisTaxon();\r
+ for (TaxonRelationship taxonRelationship : taxonRelations) {\r
+ try {\r
+ if (neededValuesNotNull(taxonRelationship, state)) {\r
+ doCount(count++, modCount, pluralString);\r
+ success &= mapping.invoke(taxonRelationship);\r
+ }\r
+ } catch (SQLException e) {\r
+ logger.error("TaxonRelationship could not be created for this TaxonRelation (" + taxonRelationship.getUuid() + "): " + e.getMessage());\r
}\r
- \r
}\r
- \r
+ return success;\r
}\r
\r
/**\r
*/\r
private static void invokeSynonyms(PesiExportState state, TaxonNameBase synonymTaxonName) {\r
// Store KingdomFk and Rank information in Taxon table\r
- Integer kingdomFk = PesiTransformer.nomenClaturalCode2Kingdom(nomenclaturalCode);\r
+ Integer kingdomFk = PesiTransformer.nomenClaturalCode2Kingdom(synonymTaxonName.getNomenclaturalCode());\r
Integer synonymFk = state.getDbId(synonymTaxonName);\r
\r
- saveSynonymData(synonymTaxonName, nomenclaturalCode, kingdomFk, synonymFk);\r
+ saveSynonymData(synonymTaxonName, synonymTaxonName.getNomenclaturalCode(), kingdomFk, synonymFk);\r
}\r
\r
/**\r
private boolean neededValuesNotNull(RelationshipBase<?, ?, ?> relationship, PesiExportState state) {\r
boolean result = true;\r
if (getTaxonFk1(relationship, state) == null) {\r
- logger.error("TaxonFk1 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
+ logger.warn("TaxonFk1 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
result = false;\r
}\r
if (getTaxonFk2(relationship, state) == null) {\r
- logger.error("TaxonFk2 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
+ logger.warn("TaxonFk2 is NULL, but is not allowed to be. Therefore no record was written to export database for this relationship: " + relationship.getUuid());\r
result = false;\r
}\r
return result;\r
@SuppressWarnings("unused")\r
private static String getRelQualifierCache(RelationshipBase<?, ?, ?> relationship) {\r
String result = null;\r
- if (nomenclaturalCode != null) {\r
- if (nomenclaturalCode.equals(NomenclaturalCode.ICZN)) {\r
- result = PesiTransformer.zoologicalTaxonRelation2RelTaxonQualifierCache(relationship);\r
- } else {\r
- result = PesiTransformer.taxonRelation2RelTaxonQualifierCache(relationship);\r
- }\r
+ NomenclaturalCode code = null;\r
+ if (relationship.isInstanceOf(TaxonRelationship.class)){\r
+ code = CdmBase.deproxy(relationship, TaxonRelationship.class).getToTaxon().getName().getNomenclaturalCode();\r
+ }else if (relationship.isInstanceOf(SynonymRelationship.class)){\r
+ code = CdmBase.deproxy(relationship, SynonymRelationship.class).getAcceptedTaxon().getName().getNomenclaturalCode();\r
+ }else if (relationship.isInstanceOf(NameRelationship.class)){\r
+ code = CdmBase.deproxy(relationship, NameRelationship.class).getFromName().getNomenclaturalCode();\r
+ }\r
+ if (code != null) {\r
+ result = PesiTransformer.taxonRelation2RelTaxonQualifierCache(relationship, code);\r
} else {\r
logger.error("NomenclaturalCode is NULL while creating the following relationship: " + relationship.getUuid());\r
}\r
* @return The database key of an object in the given relationship.\r
*/\r
private static Integer getObjectFk(RelationshipBase<?, ?, ?> relationship, PesiExportState state, boolean isFrom) {\r
- TaxonBase<?> taxon = null;\r
+ TaxonBase<?> taxonBase = null;\r
if (relationship.isInstanceOf(TaxonRelationship.class)) {\r
TaxonRelationship tr = (TaxonRelationship)relationship;\r
- taxon = (isFrom) ? tr.getFromTaxon(): tr.getToTaxon();\r
+ taxonBase = (isFrom) ? tr.getFromTaxon(): tr.getToTaxon();\r
} else if (relationship.isInstanceOf(SynonymRelationship.class)) {\r
SynonymRelationship sr = (SynonymRelationship)relationship;\r
- taxon = (isFrom) ? sr.getSynonym() : sr.getAcceptedTaxon();\r
+ taxonBase = (isFrom) ? sr.getSynonym() : sr.getAcceptedTaxon();\r
} else if (relationship.isInstanceOf(NameRelationship.class)) {\r
- NameRelationship nr = (NameRelationship)relationship;\r
- TaxonNameBase taxonName = (isFrom) ? nr.getFromName() : nr.getToName();\r
- return state.getDbId(taxonName);\r
+ if (isFrom){\r
+ return state.getDbId(state.getCurrentFromObject());\r
+ }else{\r
+ return state.getDbId(state.getCurrentToObject());\r
+ }\r
}\r
- if (taxon != null) {\r
- return state.getDbId(taxon.getName());\r
+ if (taxonBase != null) {\r
+ if (! isPesiTaxon(taxonBase)){\r
+ logger.warn("Related taxonBase is not a PESI taxon. Taxon: " + taxonBase.getId() + "/" + taxonBase.getUuid() + "; TaxonRel: " + relationship.getId() + "(" + relationship.getType().getTitleCache() + ")");\r
+ return null;\r
+ }else{\r
+ return state.getDbId(taxonBase); \r
+ }\r
+ \r
}\r
logger.warn("No taxon found in state for relationship: " + relationship.toString());\r
return null;\r