X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/1ffd1c27c6450a0b119518d464566b0343170f13..b0f33c74dc700b1d772380e8a737406689fa9c6e:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java index 47e2d1db67..8162c1fbf3 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java @@ -67,6 +67,8 @@ import eu.etaxonomy.cdm.api.service.search.SearchResult; import eu.etaxonomy.cdm.api.service.search.SearchResultBuilder; import eu.etaxonomy.cdm.api.service.util.TaxonRelationshipEdge; import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; +import eu.etaxonomy.cdm.compare.taxon.HomotypicGroupTaxonComparator; +import eu.etaxonomy.cdm.compare.taxon.TaxonComparator; import eu.etaxonomy.cdm.exception.UnpublishedException; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.hibernate.search.AcceptedTaxonBridge; @@ -95,6 +97,7 @@ import eu.etaxonomy.cdm.model.description.TaxonInteraction; import eu.etaxonomy.cdm.model.description.TaxonNameDescription; import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.media.Media; +import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum; import eu.etaxonomy.cdm.model.name.HomotypicalGroup; import eu.etaxonomy.cdm.model.name.IZoologicalName; import eu.etaxonomy.cdm.model.name.Rank; @@ -106,13 +109,11 @@ import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.reference.OriginalSourceType; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.model.taxon.Classification; -import eu.etaxonomy.cdm.model.taxon.HomotypicGroupTaxonComparator; import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode; import eu.etaxonomy.cdm.model.taxon.Synonym; import eu.etaxonomy.cdm.model.taxon.SynonymType; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.model.taxon.TaxonBase; -import eu.etaxonomy.cdm.model.taxon.TaxonComparator; import eu.etaxonomy.cdm.model.taxon.TaxonNode; import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType; @@ -167,6 +168,9 @@ public class TaxonServiceImpl @Autowired private IDescriptionService descriptionService; + + @Autowired + private IReferenceService referenceService; // // @Autowired // private IOrderedTermVocabularyDao orderedVocabularyDao; @@ -206,11 +210,12 @@ public class TaxonServiceImpl UpdateResult result = new UpdateResult(); acceptedTaxon.removeSynonym(synonym); TaxonName synonymName = synonym.getName(); - boolean sameHomotypicGroup = synonymName.getHomotypicalGroup().equals(acceptedTaxon.getName().getHomotypicalGroup()); + TaxonName taxonName = HibernateProxyHelper.deproxy(acceptedTaxon.getName()); + + boolean sameHomotypicGroup = synonymName.getHomotypicalGroup().equals(taxonName.getHomotypicalGroup()); synonymName.removeTaxonBase(synonym); - TaxonName taxonName = HibernateProxyHelper.deproxy(acceptedTaxon.getName(), TaxonName.class); //taxonName.removeTaxonBase(acceptedTaxon); List synonyms = new ArrayList<>(); @@ -222,8 +227,17 @@ public class TaxonServiceImpl acceptedTaxon.removeSynonym(syn); } Taxon newTaxon = acceptedTaxon.clone(); + newTaxon.getDescriptions().clear(); + Set descriptionsToCopy = new HashSet<>(); + for (TaxonDescription desc: acceptedTaxon.getDescriptions()){ + descriptionsToCopy.add(desc); + } + for (TaxonDescription description: descriptionsToCopy){ + newTaxon.addDescription(description); + } newTaxon.setName(synonymName); newTaxon.setSec(synonym.getSec()); + newTaxon.setPublish(synonym.isPublish()); for (Synonym syn: synonyms){ if (!syn.getName().equals(newTaxon.getName())){ newTaxon.addSynonym(syn, syn.getType()); @@ -291,6 +305,7 @@ public class TaxonServiceImpl Synonym newSynonym = synonym.clone(); newSynonym.setName(taxonName); newSynonym.setSec(acceptedTaxon.getSec()); + newSynonym.setPublish(acceptedTaxon.isPublish()); if (sameHomotypicGroup){ newTaxon.addSynonym(newSynonym, SynonymType.HOMOTYPIC_SYNONYM_OF()); }else{ @@ -315,7 +330,7 @@ public class TaxonServiceImpl @Override @Transactional(readOnly = false) - public UpdateResult changeSynonymToAcceptedTaxon(Synonym synonym, Taxon acceptedTaxon, boolean deleteSynonym) { + public UpdateResult changeSynonymToAcceptedTaxon(Synonym synonym, Taxon acceptedTaxon, Reference newSecRef, String microRef, boolean deleteSynonym) { UpdateResult result = new UpdateResult(); TaxonName acceptedName = acceptedTaxon.getName(); TaxonName synonymName = synonym.getName(); @@ -328,8 +343,8 @@ public class TaxonServiceImpl result.setAbort(); return result; } - - Taxon newAcceptedTaxon = Taxon.NewInstance(synonymName, null); + Taxon newAcceptedTaxon = Taxon.NewInstance(synonymName, newSecRef, microRef); + newAcceptedTaxon.setPublish(synonym.isPublish()); dao.save(newAcceptedTaxon); result.setCdmEntity(newAcceptedTaxon); SynonymType relTypeForGroup = SynonymType.HOMOTYPIC_SYNONYM_OF(); @@ -366,19 +381,51 @@ public class TaxonServiceImpl public UpdateResult changeSynonymToAcceptedTaxon(UUID synonymUuid, UUID acceptedTaxonUuid, UUID newParentNodeUuid, + UUID newSec, + String microReference, + SecReferenceHandlingEnum secHandling, boolean deleteSynonym) { UpdateResult result = new UpdateResult(); Synonym synonym = CdmBase.deproxy(dao.load(synonymUuid), Synonym.class); Taxon acceptedTaxon = CdmBase.deproxy(dao.load(acceptedTaxonUuid), Taxon.class); - result = changeSynonymToAcceptedTaxon(synonym, acceptedTaxon, deleteSynonym); - Taxon newTaxon = (Taxon)result.getCdmEntity(); TaxonNode newParentNode = taxonNodeDao.load(newParentNodeUuid); + Reference newSecRef = null; + switch (secHandling){ + case AlwaysDelete: + newSecRef = null; + break; + case KeepAlways: + newSecRef = synonym.getSec(); + break; + case UseNewParentSec: + newSecRef = newParentNode.getTaxon() != null? newParentNode.getTaxon().getSec(): null; + break; + case KeepWhenSame: + Reference parentSec = newParentNode.getTaxon() != null? newParentNode.getTaxon().getSec(): null; + Reference synSec = synonym.getSec(); + if (parentSec != null && synSec != null && parentSec.equals(synSec)){ + newSecRef = synonym.getSec(); + }else{ + newSecRef = CdmBase.deproxy(referenceService.load(newSec)); + } + case WarningSelect: + newSecRef = CdmBase.deproxy(referenceService.load(newSec)); + + default: + break; + } + + + result = changeSynonymToAcceptedTaxon(synonym, acceptedTaxon, newSecRef, microReference, deleteSynonym); + Taxon newTaxon = (Taxon)result.getCdmEntity(); + TaxonNode newNode = newParentNode.addChildTaxon(newTaxon, null, null); taxonNodeDao.save(newNode); result.addUpdatedObject(newTaxon); result.addUpdatedObject(acceptedTaxon); result.setCdmEntity(newNode); return result; + } @Override @@ -417,6 +464,7 @@ public class TaxonServiceImpl */ // Create a taxon with synonym name Taxon fromTaxon = Taxon.NewInstance(synonymName, null); + fromTaxon.setPublish(synonym.isPublish()); save(fromTaxon); fromTaxon.setAppendedPhrase(synonym.getAppendedPhrase()); @@ -2984,10 +3032,27 @@ public class TaxonServiceImpl Taxon taxon = (Taxon)load(taxonBaseUuid, propertyPaths); result = isDeletableForTaxon(references, taxonConfig ); + + if (taxonConfig.isDeleteNameIfPossible()){ + if (taxonBase.getName() != null){ + DeleteResult nameResult = nameService.isDeletable(taxonBase.getName().getUuid(), taxonConfig.getNameDeletionConfig(), taxon.getUuid()); + if (!nameResult.isOk()){ + result.addExceptions(nameResult.getExceptions()); + } + } + + } }else{ SynonymDeletionConfigurator synonymConfig = (SynonymDeletionConfigurator) config; result = isDeletableForSynonym(references, synonymConfig); + if (synonymConfig.isDeleteNameIfPossible()){ + DeleteResult nameResult = nameService.isDeletable(taxonBase.getName().getUuid(), synonymConfig.getNameDeletionConfig(), taxonBase.getUuid()); + if (!nameResult.isOk()){ + result.addExceptions(nameResult.getExceptions()); + } + } } + return result; } @@ -3001,6 +3066,7 @@ public class TaxonServiceImpl result.addRelatedObject(ref); result.setAbort(); } + } return result; @@ -3277,7 +3343,7 @@ public class TaxonServiceImpl return result; } - @Override + @Override public UpdateResult moveFactualDateToAnotherTaxon(UUID fromTaxonUuid, UUID toTaxonUuid){ UpdateResult result = new UpdateResult();