X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/c91811330972dc2e2ecb698644f3388a40e6b57a..b3efd136d482e66d851a80d9cce57583bf7cb1f6:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java index 73df05b25d..9de05cfb17 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ClassificationServiceImpl.java @@ -1,4 +1,3 @@ -// $Id$ /** * Copyright (C) 2007 EDIT * European Distributed Institute of Taxonomy @@ -16,6 +15,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -43,19 +43,21 @@ import eu.etaxonomy.cdm.api.service.pager.PagerUtils; import eu.etaxonomy.cdm.api.service.pager.impl.AbstractPagerImpl; import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl; import eu.etaxonomy.cdm.common.monitor.IProgressMonitor; +import eu.etaxonomy.cdm.hibernate.HHH_9751_Util; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.DefinedTermBase; import eu.etaxonomy.cdm.model.common.ITreeNode; import eu.etaxonomy.cdm.model.common.MarkerType; +import eu.etaxonomy.cdm.model.common.TreeIndex; import eu.etaxonomy.cdm.model.description.DescriptionElementBase; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.media.Media; import eu.etaxonomy.cdm.model.media.MediaRepresentation; import eu.etaxonomy.cdm.model.media.MediaUtils; -import eu.etaxonomy.cdm.model.name.NonViralName; +import eu.etaxonomy.cdm.model.name.INonViralName; import eu.etaxonomy.cdm.model.name.Rank; -import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.cdm.model.name.TaxonName; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.ITaxonNodeComparator; @@ -154,13 +156,17 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase originalChildNodes = originalParentNode.getChildNodes(); + HHH_9751_Util.removeAllNull(originalChildNodes); //add relation between taxa - cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), relationshipType, reference, microReference); + if (relationshipType != null){ + cloneTaxon.addTaxonRelation(originalParentNode.getTaxon(), relationshipType, reference, microReference); + } TaxonNode cloneChildNode = null; //add taxon node to either parent node or classification (no parent node) @@ -235,6 +241,9 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase loadTreeBranch(TaxonNode taxonNode, Rank baseRank, List propertyPaths){ TaxonNode thisNode = taxonNodeDao.load(taxonNode.getUuid(), propertyPaths); + if(baseRank != null){ + baseRank = (Rank) termDao.load(baseRank.getUuid()); + } List pathToRoot = new ArrayList(); pathToRoot.add(thisNode); @@ -473,12 +482,6 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase> getAllMediaForChildNodes(Taxon taxon, Classification taxTree, List propertyPaths, int size, int height, int widthOrDuration, String[] mimeTypes){ - TaxonNode node = taxTree.getNode(taxon); - - return getAllMediaForChildNodes(node, propertyPaths, size, height, widthOrDuration, mimeTypes); - } @Override @Transactional(readOnly = false) @@ -500,11 +503,11 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase> sortedGenusMap = new HashMap>(); + Map> sortedGenusMap = new HashMap<>(); for(TaxonNode node:allNodesOfClassification){ final TaxonNode tn = node; Taxon taxon = node.getTaxon(); - NonViralName name = CdmBase.deproxy(taxon.getName(), NonViralName.class); + INonViralName name = taxon.getName(); String genusOrUninomial = name.getGenusOrUninomial(); //if rank unknown split string and take first word if(genusOrUninomial == null){ @@ -542,7 +545,7 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase> map = getSortedGenusList(classification.getAllNodes()); final String APPENDIX = "repaired"; - String titleCache = org.apache.commons.lang.StringUtils.isBlank(classification.getTitleCache()) ? " " : classification.getTitleCache() ; + String titleCache = StringUtils.isBlank(classification.getTitleCache()) ? " " : classification.getTitleCache() ; //TODO classification clone??? Classification newClassification = Classification.NewInstance(titleCache +" "+ APPENDIX); newClassification.setReference(classification.getReference()); @@ -564,9 +567,8 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase result = new ArrayList<>(); //get treeindex for each taxonUUID - Map taxonIdTreeIndexMap = dao.treeIndexForTaxonUuids(classificationUuid, originalTaxonUuids); + Map taxonIdTreeIndexMap = dao.treeIndexForTaxonUuids(classificationUuid, originalTaxonUuids); //build treeindex list (or tree) - List treeIndexClosure = new ArrayList<>(); - for (String treeIndex : taxonIdTreeIndexMap.values()){ - String[] splits = treeIndex.substring(1).split(ITreeNode.separator); + //TODO make it work with TreeIndex or move there + List treeIndexClosureStr = new ArrayList<>(); + for (TreeIndex treeIndex : taxonIdTreeIndexMap.values()){ + String[] splits = treeIndex.toString().substring(1).split(ITreeNode.separator); String currentIndex = ITreeNode.separator; for (String split : splits){ if (split.equals("")){ continue; } currentIndex += split + ITreeNode.separator; - if (!treeIndexClosure.contains(currentIndex) && !split.startsWith(ITreeNode.treePrefix)){ - treeIndexClosure.add(currentIndex); + if (!treeIndexClosureStr.contains(currentIndex) && !split.startsWith(ITreeNode.treePrefix)){ + treeIndexClosureStr.add(currentIndex); } } } @@ -719,15 +726,17 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase= maxRank (if available) Integer minRankOrderIndex = minRank == null ? null : minRank.getOrderIndex(); Integer maxRankOrderIndex = maxRank == null ? null : maxRank.getOrderIndex(); - Map treeIndexSortIndexMapTmp = taxonNodeDao.rankOrderIndexForTreeIndex(treeIndexClosure, minRankOrderIndex, maxRankOrderIndex); + List treeIndexClosure = TreeIndex.NewListInstance(treeIndexClosureStr); + + Map treeIndexSortIndexMapTmp = taxonNodeDao.rankOrderIndexForTreeIndex(treeIndexClosure, minRankOrderIndex, maxRankOrderIndex); //remove all treeindex with "exists child in above map(and child.sortindex > xxx) - List treeIndexList = new ArrayList<>(treeIndexSortIndexMapTmp.keySet()); - Collections.sort(treeIndexList, new TreeIndexComparator()); - Map treeIndexSortIndexMap = new HashMap<>(); - String lastTreeIndex = null; - for (String treeIndex : treeIndexList){ - if (lastTreeIndex != null && treeIndex.startsWith(lastTreeIndex)){ + List treeIndexList = TreeIndex.sort(treeIndexSortIndexMapTmp.keySet()); + + Map treeIndexSortIndexMap = new HashMap<>(); + TreeIndex lastTreeIndex = null; + for (TreeIndex treeIndex : treeIndexList){ + if (lastTreeIndex != null && lastTreeIndex.hasChild(treeIndex)){ treeIndexSortIndexMap.remove(lastTreeIndex); } treeIndexSortIndexMap.put(treeIndex, treeIndexSortIndexMapTmp.get(treeIndex)); @@ -735,23 +744,25 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase> treeIndexTaxonIdMap = taxonNodeDao.taxonUuidsForTreeIndexes(treeIndexSortIndexMap.keySet()); + Map> treeIndexTaxonIdMap = taxonNodeDao.taxonUuidsForTreeIndexes(treeIndexSortIndexMap.keySet()); //fill result list for (UUID originalTaxonUuid : originalTaxonUuids){ GroupedTaxonDTO item = new GroupedTaxonDTO(); result.add(item); item.setTaxonUuid(originalTaxonUuid); - String groupIndex = taxonIdTreeIndexMap.get(originalTaxonUuid); - while (groupIndex != null){ - if (treeIndexTaxonIdMap.get(groupIndex) != null){ - UuidAndTitleCache uuidAndLabel = treeIndexTaxonIdMap.get(groupIndex); + TreeIndex groupTreeIndex = taxonIdTreeIndexMap.get(originalTaxonUuid); + String groupIndexX = TreeIndex.toString(groupTreeIndex); + while (groupTreeIndex != null){ + if (treeIndexTaxonIdMap.get(groupTreeIndex) != null){ + UuidAndTitleCache uuidAndLabel = treeIndexTaxonIdMap.get(groupTreeIndex); item.setGroupTaxonUuid(uuidAndLabel.getUuid()); item.setGroupTaxonName(uuidAndLabel.getTitleCache()); break; }else{ - int index = groupIndex.substring(0, groupIndex.length()-1).lastIndexOf(ITreeNode.separator); - groupIndex = index<0 ? null : groupIndex.substring(0, index+1); + groupTreeIndex = groupTreeIndex.parent(); +// int index = groupIndex.substring(0, groupIndex.length()-1).lastIndexOf(ITreeNode.separator); +// groupIndex = index < 0 ? null : groupIndex.substring(0, index+1); } } } @@ -759,6 +770,47 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase groupTaxaByMarkedParents(List originalTaxonUuids, UUID classificationUuid, + MarkerType markerType, Boolean flag) { + + List result = new ArrayList<>(); + + //get treeindex for each taxonUUID + Map taxonIdTreeIndexMap = dao.treeIndexForTaxonUuids(classificationUuid, originalTaxonUuids); + + //get all marked tree indexes + Set markedTreeIndexes = dao.getMarkedTreeIndexes(markerType, flag); + + + Map groupedMap = TreeIndex.group(markedTreeIndexes, taxonIdTreeIndexMap.values()); + Set notNullGroups = new HashSet<>(groupedMap.values()); + notNullGroups.remove(null); + + //get taxonInfo for treeIndexes + Map> treeIndexTaxonIdMap = taxonNodeDao.taxonUuidsForTreeIndexes(notNullGroups); + + //fill result list + for (UUID originalTaxonUuid : originalTaxonUuids){ + GroupedTaxonDTO item = new GroupedTaxonDTO(); + result.add(item); + item.setTaxonUuid(originalTaxonUuid); + + TreeIndex toBeGroupedTreeIndex = taxonIdTreeIndexMap.get(originalTaxonUuid); + TreeIndex groupTreeIndex = groupedMap.get(toBeGroupedTreeIndex); + UuidAndTitleCache uuidAndLabel = treeIndexTaxonIdMap.get(groupTreeIndex); + if (uuidAndLabel != null){ + item.setGroupTaxonUuid(uuidAndLabel.getUuid()); + item.setGroupTaxonName(uuidAndLabel.getTitleCache()); + } + } + + return result; + } + /** * {@inheritDoc} */ @@ -787,10 +839,7 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase acceptedTaxa = synonym.getAcceptedTaxa(); - //we expect every synonym to have only 1 accepted taxon as this is how - //CDM will be modelled soon - acceptedTaxon = acceptedTaxa.isEmpty()? null : acceptedTaxa.iterator().next(); + acceptedTaxon = synonym.getAcceptedTaxon(); if (acceptedTaxon == null) { throw new EntityNotFoundException("Accepted taxon not found for synonym" ); } @@ -812,6 +861,18 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase name = taxonBase.getName(); + TaxonName name = taxonBase.getName(); result.setNameUuid(name.getUuid()); result.setNameLabel(name.getTitleCache()); - if (name.isInstanceOf(NonViralName.class)){ - NonViralName nvn = CdmBase.deproxy(name, NonViralName.class); - - result.setNameWithoutAuthor(nvn.getNameCache()); - result.setGenusOrUninomial(nvn.getGenusOrUninomial()); - result.setInfraGenericEpithet(nvn.getInfraGenericEpithet()); - result.setSpeciesEpithet(nvn.getSpecificEpithet()); - result.setInfraSpecificEpithet(nvn.getInfraSpecificEpithet()); - - result.setAuthorship(nvn.getAuthorshipCache()); - - Rank rank = name.getRank(); - if (rank != null){ - result.setRankUuid(rank.getUuid()); - String rankLabel = rank.getAbbreviation(); - if (StringUtils.isBlank(rankLabel)){ - rankLabel = rank.getLabel(); - } - result.setRankLabel(rankLabel); + result.setNameWithoutAuthor(name.getNameCache()); + result.setGenusOrUninomial(name.getGenusOrUninomial()); + result.setInfraGenericEpithet(name.getInfraGenericEpithet()); + result.setSpeciesEpithet(name.getSpecificEpithet()); + result.setInfraSpecificEpithet(name.getInfraSpecificEpithet()); + + result.setAuthorship(name.getAuthorshipCache()); + + Rank rank = name.getRank(); + if (rank != null){ + result.setRankUuid(rank.getUuid()); + String rankLabel = rank.getAbbreviation(); + if (StringUtils.isBlank(rankLabel)){ + rankLabel = rank.getLabel(); } + result.setRankLabel(rankLabel); } boolean recursive = false; @@ -886,6 +943,27 @@ public class ClassificationServiceImpl extends IdentifiableServiceBase