import java.util.Set;\r
import java.util.UUID;\r
\r
+import javax.persistence.EntityNotFoundException;\r
+\r
import org.apache.log4j.Logger;\r
import org.apache.lucene.index.CorruptIndexException;\r
import org.apache.lucene.queryParser.ParseException;\r
import org.springframework.stereotype.Service;\r
import org.springframework.transaction.annotation.Transactional;\r
\r
+import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;\r
import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;\r
import eu.etaxonomy.cdm.api.service.config.MatchingTaxonConfigurator;\r
import eu.etaxonomy.cdm.api.service.config.SynonymDeletionConfigurator;\r
import eu.etaxonomy.cdm.hibernate.search.MultilanguageTextFieldBridge;\r
import eu.etaxonomy.cdm.model.CdmBaseType;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.common.ITreeNode;\r
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
import eu.etaxonomy.cdm.model.common.Language;\r
import eu.etaxonomy.cdm.model.molecular.Sequence;\r
import eu.etaxonomy.cdm.model.molecular.SingleRead;\r
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
import eu.etaxonomy.cdm.model.name.Rank;\r
import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
+import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
import eu.etaxonomy.cdm.model.reference.Reference;\r
import eu.etaxonomy.cdm.model.taxon.Classification;\r
import eu.etaxonomy.cdm.persistence.dao.initializer.AbstractBeanInitializer;\r
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;\r
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
+import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;\r
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
@Autowired\r
private ITaxonNodeService nodeService;\r
\r
-\r
@Autowired\r
private ICdmGenericDao genericDao;\r
\r
@Autowired\r
private IOccurrenceDao occurrenceDao;\r
\r
+ @Autowired\r
+ private IClassificationDao classificationDao;\r
+\r
@Autowired\r
private AbstractBeanInitializer beanInitializer;\r
\r
return dao.getTaxaByName(name, sec);\r
}\r
\r
- /**\r
- * FIXME Candidate for harmonization\r
- * list(Synonym.class, ...)\r
- * (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllSynonyms(int, int)\r
- */\r
- @Override\r
- public List<Synonym> getAllSynonyms(int limit, int start) {\r
- return dao.getAllSynonyms(limit, start);\r
- }\r
-\r
- /**\r
- * FIXME Candidate for harmonization\r
- * list(Taxon.class, ...)\r
- * (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllTaxa(int, int)\r
- */\r
- @Override\r
- public List<Taxon> getAllTaxa(int limit, int start) {\r
- return dao.getAllTaxa(limit, start);\r
- }\r
-\r
/**\r
* FIXME Candidate for harmonization\r
* merge with getRootTaxa(Reference sec, ..., ...)\r
return dao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
}\r
\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getRootTaxa(eu.etaxonomy.cdm.model.name.Rank, eu.etaxonomy.cdm.model.reference.Reference, boolean, boolean)\r
- */\r
@Override\r
public List<Taxon> getRootTaxa(Rank rank, Reference sec, boolean onlyWithChildren,boolean withMisapplications, List<String> propertyPaths) {\r
return dao.getRootTaxa(rank, sec, null, onlyWithChildren, withMisapplications, propertyPaths);\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.api.service.ITaxonService#getAllRelationships(int, int)\r
- */\r
@Override\r
public List<RelationshipBase> getAllRelationships(int limit, int start){\r
return dao.getAllRelationships(limit, start);\r
\r
SynonymRelationshipType relTypeForGroup = SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF();\r
List<Synonym> heteroSynonyms = acceptedTaxon.getSynonymsInGroup(synonymHomotypicGroup);\r
+ Set<NameRelationship> basionymsAndReplacedSynonyms = synonymHomotypicGroup.getBasionymAndReplacedSynonymRelations();\r
\r
for (Synonym heteroSynonym : heteroSynonyms){\r
if (synonym.equals(heteroSynonym)){\r
acceptedTaxon.removeSynonym(heteroSynonym, false);\r
+\r
}else{\r
//move synonyms in same homotypic group to new accepted taxon\r
heteroSynonym.replaceAcceptedTaxon(newAcceptedTaxon, relTypeForGroup, copyCitationInfo, citation, microCitation);\r
// deleteSynonym(synonym, taxon, false);\r
try {\r
this.dao.flush();\r
- this.deleteSynonym(synonym, acceptedTaxon, new SynonymDeletionConfigurator());\r
+ SynonymDeletionConfigurator config = new SynonymDeletionConfigurator();\r
+ config.setDeleteNameIfPossible(false);\r
+ this.deleteSynonym(synonym, acceptedTaxon, config);\r
\r
} catch (Exception e) {\r
logger.info("Can't delete old synonym from database");\r
// Get name from synonym\r
TaxonNameBase<?, ?> synonymName = synonym.getName();\r
\r
- // remove synonym from taxon\r
+ /* // remove synonym from taxon\r
toTaxon.removeSynonym(synonym);\r
-\r
+*/\r
// Create a taxon with synonym name\r
Taxon fromTaxon = Taxon.NewInstance(synonymName, null);\r
\r
\r
// since we are swapping names, we have to detach the name from the synonym completely.\r
// Otherwise the synonym will still be in the list of typified names.\r
- synonym.getName().removeTaxonBase(synonym);\r
+ // synonym.getName().removeTaxonBase(synonym);\r
+ this.deleteSynonym(synonym, null);\r
\r
return fromTaxon;\r
}\r
return new DefaultPagerImpl<TaxonRelationship>(pageNumber, numberOfResults, pageSize, results);\r
}\r
\r
+ @Override\r
+ public List<Taxon> listAcceptedTaxaFor(UUID synonymUuid, UUID classificationUuid, Integer pageSize, Integer pageNumber,\r
+ List<OrderHint> orderHints, List<String> propertyPaths){\r
+ return pageAcceptedTaxaFor(synonymUuid, classificationUuid, pageSize, pageNumber, orderHints, propertyPaths).getRecords();\r
+ }\r
+\r
+ @Override\r
+ public Pager<Taxon> pageAcceptedTaxaFor(UUID synonymUuid, UUID classificationUuid, Integer pageSize, Integer pageNumber,\r
+ List<OrderHint> orderHints, List<String> propertyPaths){\r
+\r
+ List<Taxon> list = new ArrayList<Taxon>();\r
+ Long count = 0l;\r
+\r
+ Synonym synonym = null;\r
+\r
+ try {\r
+ synonym = (Synonym) dao.load(synonymUuid);\r
+ } catch (ClassCastException e){\r
+ throw new EntityNotFoundException("The TaxonBase entity referenced by " + synonymUuid + " is not a Synonmy");\r
+ } catch (NullPointerException e){\r
+ throw new EntityNotFoundException("No TaxonBase entity found for " + synonymUuid);\r
+ }\r
+\r
+ Classification classificationFilter = null;\r
+ if(classificationUuid != null){\r
+ try {\r
+ classificationFilter = classificationDao.load(classificationUuid);\r
+ } catch (NullPointerException e){\r
+ throw new EntityNotFoundException("No Classification entity found for " + classificationUuid);\r
+ }\r
+ if(classificationFilter == null){\r
+\r
+ }\r
+ }\r
+\r
+ count = dao.countAcceptedTaxaFor(synonym, classificationFilter) ;\r
+ if(count > (pageSize * pageNumber)){\r
+ list = dao.listAcceptedTaxaFor(synonym, classificationFilter, pageSize, pageNumber, orderHints, propertyPaths);\r
+ }\r
+\r
+ return new DefaultPagerImpl<Taxon>(pageNumber, count.intValue(), pageSize, list);\r
+ }\r
+\r
+\r
/**\r
* @param taxon\r
* @param includeRelationships\r
taxa.add(taxon);\r
}\r
\r
+ if(includeRelationships.isEmpty()){\r
+ return taxa;\r
+ }\r
+\r
if(maxDepth != null) {\r
maxDepth--;\r
}\r
*/\r
@Override\r
public List<List<Synonym>> getSynonymsByHomotypicGroup(Taxon taxon, List<String> propertyPaths){\r
- List<List<Synonym>> result = new ArrayList<List<Synonym>>();\r
- Taxon t = (Taxon)dao.load(taxon.getUuid(), propertyPaths);\r
- \r
- //homotypic\r
- result.add(t.getHomotypicSynonymsByHomotypicGroup());\r
- \r
- //heterotypic\r
+ List<List<Synonym>> result = new ArrayList<List<Synonym>>();\r
+ Taxon t = (Taxon)dao.load(taxon.getUuid(), propertyPaths);\r
+\r
+ //homotypic\r
+ result.add(t.getHomotypicSynonymsByHomotypicGroup());\r
+\r
+ //heterotypic\r
List<HomotypicalGroup> homotypicalGroups = t.getHeterotypicSynonymyGroups();\r
for(HomotypicalGroup homotypicalGroup : homotypicalGroups){\r
result.add(t.getSynonymsInGroup(homotypicalGroup));\r
}\r
- \r
- return result;\r
- \r
+\r
+ return result;\r
+\r
}\r
- \r
+\r
/* (non-Javadoc)\r
* @see eu.etaxonomy.cdm.api.service.ITaxonService#getHomotypicSynonymsByHomotypicGroup(eu.etaxonomy.cdm.model.taxon.Taxon, java.util.List)\r
*/\r
Boolean limitToGalleries, Boolean includeTaxonDescriptions, Boolean includeOccurrences,\r
Boolean includeTaxonNameDescriptions, List<String> propertyPath) {\r
\r
+ logger.trace("listMedia() - START");\r
+\r
Set<Taxon> taxa = new HashSet<Taxon>();\r
List<Media> taxonMedia = new ArrayList<Media>();\r
\r
}\r
\r
// --- resolve related taxa\r
- if (includeRelationships != null) {\r
+ if (includeRelationships != null && ! includeRelationships.isEmpty()) {\r
+ logger.trace("listMedia() - resolve related taxa");\r
taxa = listRelatedTaxa(taxon, includeRelationships, null, null, null, null);\r
}\r
\r
taxa.add((Taxon) dao.load(taxon.getUuid()));\r
\r
if(includeTaxonDescriptions != null && includeTaxonDescriptions){\r
+ logger.trace("listMedia() - includeTaxonDescriptions");\r
List<TaxonDescription> taxonDescriptions = new ArrayList<TaxonDescription>();\r
// --- TaxonDescriptions\r
for (Taxon t : taxa) {\r
}\r
}\r
\r
+\r
if(includeOccurrences != null && includeOccurrences) {\r
+ logger.trace("listMedia() - includeOccurrences");\r
Set<SpecimenOrObservationBase> specimensOrObservations = new HashSet<SpecimenOrObservationBase>();\r
// --- Specimens\r
for (Taxon t : taxa) {\r
}\r
\r
if(includeTaxonNameDescriptions != null && includeTaxonNameDescriptions) {\r
+ logger.trace("listMedia() - includeTaxonNameDescriptions");\r
// --- TaxonNameDescription\r
Set<TaxonNameDescription> nameDescriptions = new HashSet<TaxonNameDescription>();\r
for (Taxon t : taxa) {\r
}\r
}\r
\r
+\r
+ logger.trace("listMedia() - initialize");\r
beanInitializer.initializeAll(taxonMedia, propertyPath);\r
+\r
+ logger.trace("listMedia() - END");\r
+\r
return taxonMedia;\r
}\r
\r
* @see eu.etaxonomy.cdm.api.service.ITaxonService#deleteTaxon(eu.etaxonomy.cdm.model.taxon.Taxon, eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator)\r
*/\r
@Override\r
- public UUID deleteTaxon(Taxon taxon, TaxonDeletionConfigurator config, Classification classification) throws DataChangeNoRollbackException {\r
+ public String deleteTaxon(Taxon taxon, TaxonDeletionConfigurator config, Classification classification) {\r
if (config == null){\r
config = new TaxonDeletionConfigurator();\r
}\r
-\r
+ \r
+ List<String> referencedObjects = isDeletable(taxon, config);\r
+ \r
+ if (referencedObjects.isEmpty()){\r
// --- DeleteSynonymRelations\r
if (config.isDeleteSynonymRelations()){\r
boolean removeSynonymNameFromHomotypicalGroup = false;\r
if (taxon.getTaxonRelations().size() > 0){\r
String message = "Taxon can't be deleted as it is related to another taxon. " +\r
"Remove taxon from all relations to other taxa prior to deletion.";\r
- throw new ReferencedObjectUndeletableException(message);\r
+ // throw new ReferencedObjectUndeletableException(message);\r
}\r
} else{\r
for (TaxonRelationship taxRel: taxon.getTaxonRelations()){\r
if (desc.getDescribedSpecimenOrObservation() != null){\r
String message = "Taxon can't be deleted as it is used in a TaxonDescription" +\r
" which also describes specimens or abservations";\r
- throw new ReferencedObjectUndeletableException(message);\r
+ //throw new ReferencedObjectUndeletableException(message);\r
}\r
removeDescriptions.add(desc);\r
descriptionService.delete(desc);\r
- \r
+\r
}\r
for (TaxonDescription desc: removeDescriptions){\r
- taxon.removeDescription(desc);\r
+ taxon.removeDescription(desc);\r
}\r
}\r
\r
\r
- //check references with only reverse mapping\r
+ /* //check references with only reverse mapping\r
String message = checkForReferences(taxon);\r
if (message != null){\r
- throw new ReferencedObjectUndeletableException(message.toString());\r
- }\r
+ //throw new ReferencedObjectUndeletableException(message.toString());\r
+ }*/\r
\r
if (! config.isDeleteTaxonNodes() || (!config.isDeleteInAllClassifications() && classification == null )){\r
- if (taxon.getTaxonNodes().size() > 0){\r
- message = "Taxon can't be deleted as it is used in a classification node. Remove taxon from all classifications prior to deletion or define a classification where it should be deleted or adapt the taxon deletion configurator.";\r
- throw new ReferencedObjectUndeletableException(message);\r
- }\r
+ //if (taxon.getTaxonNodes().size() > 0){\r
+ // message = "Taxon can't be deleted as it is used in a classification node. Remove taxon from all classifications prior to deletion or define a classification where it should be deleted or adapt the taxon deletion configurator.";\r
+ // throw new ReferencedObjectUndeletableException(message);\r
+ //}\r
}else{\r
if (taxon.getTaxonNodes().size() != 0){\r
Set<TaxonNode> nodes = taxon.getTaxonNodes();\r
success =taxon.removeTaxonNode(node, deleteChildren);\r
nodeService.delete(node);\r
} else {\r
- message = "Taxon is not used in defined classification";\r
- throw new DataChangeNoRollbackException(message);\r
+ // message = "Taxon is not used in defined classification";\r
+ // throw new DataChangeNoRollbackException(message);\r
}\r
} else if (config.isDeleteInAllClassifications()){\r
Set<ITaxonTreeNode> nodesList = new HashSet<ITaxonTreeNode>();\r
nodeService.deleteTaxonNodes(nodesList, config);\r
}\r
if (!success){\r
- message = "The taxon node could not be deleted.";\r
- throw new DataChangeNoRollbackException(message);\r
+ // message = "The taxon node could not be deleted.";\r
+ //throw new DataChangeNoRollbackException(message);\r
}\r
}\r
}\r
+\r
+\r
+ //PolytomousKey TODO\r
+\r
+ boolean usedInPolytomousKey = checkForPolytomousKeys(taxon);\r
//TaxonNameBase\r
if (config.isDeleteNameIfPossible()){\r
- try {\r
+ \r
\r
//TaxonNameBase name = nameService.find(taxon.getName().getUuid());\r
TaxonNameBase name = (TaxonNameBase)HibernateProxyHelper.deproxy(taxon.getName());\r
//check whether taxon will be deleted or not\r
- if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) && name != null){\r
+ if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) && name != null ){\r
taxon = (Taxon) HibernateProxyHelper.deproxy(taxon);\r
name.removeTaxonBase(taxon);\r
nameService.save(name);\r
- nameService.delete(name, config.getNameDeletionConfig());\r
+ String uuidString = nameService.delete(name, config.getNameDeletionConfig());\r
+ logger.debug(uuidString);\r
}\r
- } catch (ReferencedObjectUndeletableException e) {\r
- //do nothing\r
- if (logger.isDebugEnabled()){logger.debug("Name could not be deleted");}\r
-\r
- }\r
+ \r
}\r
\r
// TaxonDescription\r
}\r
}\r
}*/\r
-\r
- if (taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0){\r
- dao.delete(taxon);\r
- return taxon.getUuid();\r
- } else{\r
- message = "Taxon can't be deleted as it is used in another Taxonnode";\r
- if (!config.isDeleteInAllClassifications() && classification != null) {\r
- message += "The Taxonnode in " + classification.getTitleCache() + " was deleted.";\r
- }\r
- throw new ReferencedObjectUndeletableException(message);\r
+ \r
+ if ((taxon.getTaxonNodes() == null || taxon.getTaxonNodes().size()== 0) ){\r
+ UUID uuid = dao.delete(taxon);\r
+ return uuid.toString();\r
+ } else {\r
+ return "The Taxon can't be deleted.";\r
}\r
+ }else {\r
+ return referencedObjects.toString();\r
+ }\r
\r
\r
}\r
}\r
\r
\r
- //PolytomousKeyNode\r
+ /* //PolytomousKeyNode\r
if (referencingObject.isInstanceOf(PolytomousKeyNode.class)){\r
String message = "Taxon" + taxon.getTitleCache() + " can't be deleted as it is used in polytomous key node";\r
return message;\r
- }\r
+ }*/\r
\r
//TaxonInteraction\r
if (referencingObject.isInstanceOf(TaxonInteraction.class)){\r
String message = "Taxon can't be deleted as it is used in taxonInteraction#taxon2";\r
return message;\r
}\r
+\r
+ //TaxonInteraction\r
+ if (referencingObject.isInstanceOf(DeterminationEvent.class)){\r
+ String message = "Taxon can't be deleted as it is used in a determination event";\r
+ return message;\r
+ }\r
+\r
}\r
- \r
+\r
referencingObjects = null;\r
return null;\r
}\r
\r
+ private boolean checkForPolytomousKeys(Taxon taxon){\r
+ boolean result = false;\r
+ List<CdmBase> list = genericDao.getCdmBasesByFieldAndClass(PolytomousKeyNode.class, "taxon", taxon);\r
+ if (!list.isEmpty()) {\r
+ result = true;\r
+ }\r
+ return result;\r
+ }\r
+\r
@Transactional(readOnly = false)\r
public UUID delete(Synonym syn){\r
UUID result = syn.getUuid();\r
*/\r
@Transactional(readOnly = false)\r
@Override\r
- public void deleteSynonym(Synonym synonym, SynonymDeletionConfigurator config) {\r
- deleteSynonym(synonym, null, config);\r
+ public String deleteSynonym(Synonym synonym, SynonymDeletionConfigurator config) {\r
+ return deleteSynonym(synonym, null, config);\r
\r
}\r
\r
*/\r
@Transactional(readOnly = false)\r
@Override\r
- public void deleteSynonym(Synonym synonym, Taxon taxon, SynonymDeletionConfigurator config) {\r
+ public String deleteSynonym(Synonym synonym, Taxon taxon, SynonymDeletionConfigurator config) {\r
if (synonym == null){\r
- return;\r
+ return null;\r
}\r
+ \r
if (config == null){\r
config = new SynonymDeletionConfigurator();\r
}\r
- synonym = CdmBase.deproxy(dao.merge(synonym), Synonym.class);\r
-\r
- //remove synonymRelationship\r
- Set<Taxon> taxonSet = new HashSet<Taxon>();\r
- if (taxon != null){\r
- taxonSet.add(taxon);\r
+ List<String> messages = isDeletable(synonym, config);\r
+ if (messages.isEmpty()){\r
+ synonym = CdmBase.deproxy(dao.merge(synonym), Synonym.class);\r
+ \r
+ //remove synonymRelationship\r
+ Set<Taxon> taxonSet = new HashSet<Taxon>();\r
+ if (taxon != null){\r
+ taxonSet.add(taxon);\r
+ }else{\r
+ taxonSet.addAll(synonym.getAcceptedTaxa());\r
+ }\r
+ for (Taxon relatedTaxon : taxonSet){\r
+ // dao.deleteSynonymRelationships(synonym, relatedTaxon);\r
+ relatedTaxon.removeSynonym(synonym, config.isNewHomotypicGroupIfNeeded());\r
+ }\r
+ this.saveOrUpdate(synonym);\r
+ \r
+ //TODO remove name from homotypical group?\r
+ \r
+ //remove synonym (if necessary)\r
+ \r
+ UUID uuid = null;\r
+ if (synonym.getSynonymRelations().isEmpty()){\r
+ TaxonNameBase<?,?> name = synonym.getName();\r
+ synonym.setName(null);\r
+ uuid = dao.delete(synonym);\r
+ \r
+ //remove name if possible (and required)\r
+ if (name != null && config.isDeleteNameIfPossible()){\r
+ \r
+ nameService.delete(name, config.getNameDeletionConfig());\r
+ \r
+ }\r
+ \r
+ }else {\r
+ return null;\r
+ }\r
+ return uuid.toString();\r
}else{\r
- taxonSet.addAll(synonym.getAcceptedTaxa());\r
- }\r
- for (Taxon relatedTaxon : taxonSet){\r
-// dao.deleteSynonymRelationships(synonym, relatedTaxon);\r
- relatedTaxon.removeSynonym(synonym, config.isNewHomotypicGroupIfNeeded());\r
- }\r
- this.saveOrUpdate(synonym);\r
-\r
- //TODO remove name from homotypical group?\r
-\r
- //remove synonym (if necessary)\r
-\r
-\r
- if (synonym.getSynonymRelations().isEmpty()){\r
- TaxonNameBase<?,?> name = synonym.getName();\r
- synonym.setName(null);\r
- dao.delete(synonym);\r
-\r
- //remove name if possible (and required)\r
- if (name != null && config.isDeleteNameIfPossible()){\r
- try{\r
- nameService.delete(name, config.getNameDeletionConfig());\r
- }catch (ReferencedObjectUndeletableException ex){\r
- if (logger.isDebugEnabled()) {\r
- logger.debug("Name wasn't deleted as it is referenced");\r
- }\r
- }\r
- }\r
+ return messages.toString();\r
}\r
+ \r
+ \r
}\r
\r
\r
}\r
String genusOfTaxon = taxonName.getGenusOrUninomial();\r
Set<TaxonNode> nodes = taxon.getTaxonNodes();\r
- List<String> taxonNames = new ArrayList<String>();\r
+ List<String> taxonNames = new ArrayList<String>();\r
\r
for (TaxonNode node: nodes){\r
// HashMap<String, String> synonymsGenus = new HashMap<String, String>(); // Changed this to be able to store the idInSource to a genusName\r
return list;\r
}\r
\r
+ @Override\r
+ public Synonym changeRelatedTaxonToSynonym(Taxon fromTaxon, Taxon toTaxon, TaxonRelationshipType oldRelationshipType,\r
+ SynonymRelationshipType synonymRelationshipType) throws DataChangeNoRollbackException {\r
+ // Create new synonym using concept name\r
+ TaxonNameBase<?, ?> synonymName = fromTaxon.getName();\r
+ Synonym synonym = Synonym.NewInstance(synonymName, fromTaxon.getSec());\r
+\r
+ // Remove concept relation from taxon\r
+ toTaxon.removeTaxon(fromTaxon, oldRelationshipType);\r
+\r
+\r
+\r
+\r
+ // Create a new synonym for the taxon\r
+ SynonymRelationship synonymRelationship;\r
+ if (synonymRelationshipType != null\r
+ && synonymRelationshipType.equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())){\r
+ synonymRelationship = toTaxon.addHomotypicSynonym(synonym, null, null);\r
+ } else{\r
+ synonymRelationship = toTaxon.addHeterotypicSynonymName(synonymName);\r
+ }\r
+\r
+ this.saveOrUpdate(toTaxon);\r
+ //TODO: configurator and classification\r
+ this.deleteTaxon(fromTaxon, null, null);\r
+ return synonymRelationship.getSynonym();\r
+\r
+ }\r
+ @Override\r
+ public List<String> isDeletable(TaxonBase taxonBase, DeleteConfiguratorBase config){\r
+ List<String> result = new ArrayList<String>();\r
+ Set<CdmBase> references = commonService.getReferencingObjects(taxonBase);\r
+ if (taxonBase instanceof Taxon){\r
+ TaxonDeletionConfigurator taxonConfig = (TaxonDeletionConfigurator) config;\r
+ result = isDeletableForTaxon(references, taxonConfig);\r
+ }else{\r
+ SynonymDeletionConfigurator synonymConfig = (SynonymDeletionConfigurator) config;\r
+ result = isDeletableForSynonym(references, synonymConfig);\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ private List<String> isDeletableForSynonym(Set<CdmBase> references, SynonymDeletionConfigurator config){\r
+ String message;\r
+ List<String> result = new ArrayList<String>();\r
+ for (CdmBase ref: references){\r
+ if (!(ref instanceof SynonymRelationship || ref instanceof Taxon || ref instanceof TaxonNameBase)){\r
+ message = "The Synonym can't be deleted as long as it is referenced by " + ref.getClass().getSimpleName() + " with id "+ ref.getId();\r
+ result.add(message);\r
+ }\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ private List<String> isDeletableForTaxon(Set<CdmBase> references, TaxonDeletionConfigurator config){\r
+ String message;\r
+ List<String> result = new ArrayList<String>();\r
+ for (CdmBase ref: references){\r
+ if (!(ref instanceof TaxonNameBase)){\r
+ if (!config.isDeleteSynonymRelations() && (ref instanceof SynonymRelationship)){\r
+ message = "The Taxon can't be deleted as long as it has synonyms.";\r
+ result.add(message);\r
+ }\r
+ if (!config.isDeleteDescriptions() && (ref instanceof DescriptionBase)){\r
+ message = "The Taxon can't be deleted as long as it has factual data.";\r
+ result.add(message);\r
+ }\r
+ \r
+ if (!config.isDeleteTaxonNodes() && (ref instanceof TaxonNode)){\r
+ message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
+ result.add(message);\r
+ }\r
+ if (!config.isDeleteTaxonRelationships() && (ref instanceof TaxonNode)){\r
+ if (!config.isDeleteMisappliedNamesAndInvalidDesignations() && (((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())|| ((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.INVALID_DESIGNATION_FOR()))){\r
+ message = "The Taxon can't be deleted as long as it has misapplied names or invalid designations.";\r
+ result.add(message);\r
+ } else{\r
+ message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
+ result.add(message);\r
+ }\r
+ }\r
+ if (ref instanceof PolytomousKeyNode){\r
+ message = "The Taxon can't be deleted as long as it is referenced by a polytomous key node.";\r
+ result.add(message);\r
+ }\r
+ \r
+ if (HibernateProxyHelper.isInstanceOf(ref, IIdentificationKey.class)){\r
+ message = "Taxon can't be deleted as it is used in an identification key. Remove from identification key prior to deleting this name";\r
+ result.add(message);\r
+ \r
+ }\r
+\r
+\r
+ /* //PolytomousKeyNode\r
+ if (referencingObject.isInstanceOf(PolytomousKeyNode.class)){\r
+ String message = "Taxon" + taxon.getTitleCache() + " can't be deleted as it is used in polytomous key node";\r
+ return message;\r
+ }*/\r
+\r
+ //TaxonInteraction\r
+ if (ref.isInstanceOf(TaxonInteraction.class)){\r
+ message = "Taxon can't be deleted as it is used in taxonInteraction#taxon2";\r
+ result.add(message);\r
+ }\r
+\r
+ //TaxonInteraction\r
+ if (ref.isInstanceOf(DeterminationEvent.class)){\r
+ message = "Taxon can't be deleted as it is used in a determination event";\r
+ result.add(message);\r
+ }\r
\r
+ }\r
+\r
+ }\r
+ \r
+ return result;\r
+ }\r
\r
\r
\r
\r
-}\r
+\r
+ }\r