X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/24f1c3c4034e0a1845940e0b40955f003d329335..50355d238b6a375caf844d5ede15a388690fe6f2:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java index 4113330654..68318b3534 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonNodeServiceImpl.java @@ -32,25 +32,27 @@ import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier; import eu.etaxonomy.cdm.api.service.pager.Pager; import eu.etaxonomy.cdm.api.service.pager.PagerUtils; import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl; +import eu.etaxonomy.cdm.hibernate.HHH_9751_Util; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; +import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; +import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.common.DefinedTerm; import eu.etaxonomy.cdm.model.description.TaxonDescription; import eu.etaxonomy.cdm.model.name.HomotypicalGroup; import eu.etaxonomy.cdm.model.name.TaxonNameBase; 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.Synonym; import eu.etaxonomy.cdm.model.taxon.SynonymRelationship; import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType; import eu.etaxonomy.cdm.model.taxon.Taxon; -import eu.etaxonomy.cdm.model.taxon.TaxonNaturalComparator; import eu.etaxonomy.cdm.model.taxon.TaxonNode; import eu.etaxonomy.cdm.model.taxon.TaxonNodeAgentRelation; -import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator; -import eu.etaxonomy.cdm.model.taxon.TaxonNodeByRankAndNameComparator; import eu.etaxonomy.cdm.model.taxon.TaxonRelationship; -import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao; import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer; import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao; +import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto; /** * @author n.hoffmann @@ -65,42 +67,92 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase taxonNodeComparator = new TaxonNodeByNameComparator(); - @Autowired private ITaxonService taxonService; @Autowired - private IClassificationService classService; - - @Autowired - private IDefinedTermDao termDao; + private IAgentService agentService; @Override public List loadChildNodesOfTaxonNode(TaxonNode taxonNode, List propertyPaths, boolean recursive, NodeSortMode sortMode) { - taxonNode = dao.load(taxonNode.getUuid()); + + getSession().refresh(taxonNode); List childNodes; if (recursive == true){ childNodes = dao.listChildrenOf(taxonNode, null, null, null, recursive); }else{ childNodes = new ArrayList(taxonNode.getChildNodes()); } + + HHH_9751_Util.removeAllNull(childNodes); + if (sortMode != null){ - Comparator comparator = null; - if (sortMode.equals(NodeSortMode.NaturalOrder)){ - comparator = new TaxonNaturalComparator(); - } else if (sortMode.equals(NodeSortMode.AlphabeticalOrder)){ - comparator = new TaxonNodeByNameComparator(); - } else if (sortMode.equals(NodeSortMode.RankAndAlphabeticalOrder)){ - comparator = new TaxonNodeByRankAndNameComparator(); - } + Comparator comparator = sortMode.newComparator(); Collections.sort(childNodes, comparator); } defaultBeanInitializer.initializeAll(childNodes, propertyPaths); return childNodes; } + /** + * {@inheritDoc} + */ + @Override + public Pager pageChildNodesDTOs(UUID taxonNodeUuid, boolean recursive, + boolean doSynonyms, NodeSortMode sortMode, + Integer pageSize, Integer pageIndex) { + + TaxonNode parentNode = dao.load(taxonNodeUuid); + + List allRecords = new ArrayList<>(); + + //acceptedTaxa + List childNodes = loadChildNodesOfTaxonNode(parentNode, null, recursive, sortMode); + allRecords.addAll(childNodes); + + //add synonyms if pager is not yet full synonyms + List synList = new ArrayList<>(parentNode.getTaxon().getSynonyms()); + Collections.sort(synList, new HomotypicGroupTaxonComparator(null)); + //TODO: test sorting + + allRecords.addAll(synList); + + + List dtos = new ArrayList<>(pageSize); + int start = PagerUtils.startFor(pageSize, pageIndex); + int limit = PagerUtils.limitFor(pageSize); + Long totalCount = Long.valueOf(allRecords.size()); + + if(PagerUtils.hasResultsInRange(totalCount, pageIndex, pageSize)) { + TaxonNameBase parentName = null; + + for(int i = start; i < Math.min(totalCount, start + limit); i++) { + CdmBase record = allRecords.get(i); + + if (record.isInstanceOf(TaxonNode.class)){ + dtos.add(new TaxonNodeDto(CdmBase.deproxy(record, TaxonNode.class))); + }else if (record.isInstanceOf(Synonym.class)){ + Synonym synonym = CdmBase.deproxy(record, Synonym.class); + parentName = parentName == null? parentNode.getTaxon().getName(): parentName; + boolean isHomotypic = synonym.getName().isHomotypic(parentName); + dtos.add(new TaxonNodeDto(synonym, isHomotypic)); + } + } + } + + return new DefaultPagerImpl(pageIndex, totalCount, pageSize , dtos); + } + + @Override + public TaxonNodeDto parentDto(UUID taxonNodeUuid) { + TaxonNode taxonNode = dao.load(taxonNodeUuid); + if(taxonNode.getParent() != null) { + return new TaxonNodeDto(taxonNode.getParent()); + } + return null; + } + @Override @Autowired protected void setDao(ITaxonNodeDao dao) { @@ -523,29 +575,38 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase taxonNodeUuids, UUID newParentNodeUuid, boolean isParent){ + public UpdateResult moveTaxonNodes(Set taxonNodeUuids, UUID newParentNodeUuid, int movingType){ UpdateResult result = new UpdateResult(); TaxonNode targetNode = dao.load(newParentNodeUuid); for (UUID taxonNodeUuid: taxonNodeUuids){ TaxonNode taxonNode = dao.load(taxonNodeUuid); - result.includeResult(moveTaxonNode(taxonNode,targetNode, isParent)); + result.includeResult(moveTaxonNode(taxonNode,targetNode, movingType)); } return result; } @@ -586,21 +647,70 @@ public class TaxonNodeServiceImpl extends AnnotatableServiceBase