From d52df86f95881ab837401ea7036c40912ddb75e6 Mon Sep 17 00:00:00 2001 From: "f.revilla" Date: Thu, 24 Jun 2010 13:21:37 +0000 Subject: [PATCH] changes related to sorted distribution tree --- .gitattributes | 2 + .../api/service/DescriptionServiceImpl.java | 24 +++ .../service/DistributionNodeComparator.java | 12 ++ .../cdm/api/service/DistributionTree.java | 149 ++++++++++++++++++ .../cdm/api/service/IDescriptionService.java | 2 + .../cdm/api/service/NamedAreaTree.java | 15 +- 6 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeComparator.java create mode 100644 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java diff --git a/.gitattributes b/.gitattributes index 7be25c618a..b26f24167a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2710,6 +2710,8 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DefaultCategoricalDes cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DefaultQuantitativeDescriptionBuilder.java -text cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionBuilder.java -text cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java -text +cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeComparator.java -text +cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java -text cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/FeatureTreeServiceImpl.java -text cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAgentService.java -text cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.java -text diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java index 9e6c3245ca..459a0afdd6 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java @@ -203,6 +203,30 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase taxonDescriptions, + Set omitLevels){ + + DistributionTree tree = new DistributionTree(); + List distList = new ArrayList(); + + for (TaxonDescription taxonDescription : taxonDescriptions) { + taxonDescription = (TaxonDescription) dao.load(taxonDescription.getUuid()); + Set elements = taxonDescription.getElements(); + for (DescriptionElementBase element : elements) { + if(element.isInstanceOf(Distribution.class)){ + Distribution distribution = (Distribution) element; + distList.add(distribution); + } + } + } + + //ordering the areas + tree.merge(distList, omitLevels); + tree.sortChildren(); + return tree; + } public Pager getTaxonNameDescriptions(TaxonNameBase name, Integer pageSize, Integer pageNumber, List propertyPaths) { Integer numberOfResults = dao.countTaxonNameDescriptions(name); diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeComparator.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeComparator.java new file mode 100644 index 0000000000..040b9837b3 --- /dev/null +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeComparator.java @@ -0,0 +1,12 @@ +package eu.etaxonomy.cdm.api.service; + +import java.util.Comparator; + +import eu.etaxonomy.cdm.common.TreeNode; +import eu.etaxonomy.cdm.model.description.Distribution; + +public class DistributionNodeComparator implements Comparator>{ + public int compare(TreeNode arg0, TreeNode arg1) { + return arg0.data.getArea().getLabel().compareTo(arg1.data.getArea().getLabel()); + } +} diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java new file mode 100644 index 0000000000..fe2d8523ce --- /dev/null +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java @@ -0,0 +1,149 @@ +package eu.etaxonomy.cdm.api.service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import eu.etaxonomy.cdm.common.Tree; +import eu.etaxonomy.cdm.common.TreeNode; +import eu.etaxonomy.cdm.model.common.Language; +import eu.etaxonomy.cdm.model.description.Distribution; +import eu.etaxonomy.cdm.model.location.NamedArea; +import eu.etaxonomy.cdm.model.location.NamedAreaLevel; + +public class DistributionTree extends Tree{ + + public DistributionTree(){ + NamedArea area = new NamedArea(); + Distribution data = Distribution.NewInstance(); + data.setArea(area); + data.addModifyingText("test", Language.ENGLISH()); + TreeNode rootElement = new TreeNode(); + List> children = new ArrayList>(); + + rootElement.setData(data); + rootElement.setChildren(children); + setRootElement(rootElement); + } + + public boolean containsChild(TreeNode root, TreeNode treeNode){ + boolean result = false; + Iterator> it = root.getChildren().iterator(); + while (it.hasNext() && !result) { + TreeNode node = (TreeNode) it.next(); + if (node.getData().equalsForTree(treeNode.getData())) { + result = true; + } + } + /* + while (!result && it.hasNext()) { + if (it.next().data.equalsForTree(treeNode.data)){ + result = true; + } + } + */ + return result; + } + + public TreeNode getChild(TreeNode root, TreeNode TreeNode) { + boolean found = false; + TreeNode result = null; + Iterator> it = root.children.iterator(); + while (!found && it.hasNext()) { + result = (TreeNode) it.next(); + if (result.data.equalsForTree(TreeNode.data)){ + found = true; + } + } + if (!found){ + try { + throw new Exception("The node was not found in among children and that is a precondition of getChild(node) method"); + } catch (Exception e) { + e.printStackTrace(); + } + } + return result; + } + + public void merge(List distList, Set omitLevels){ + for (Distribution distribution : distList) { + List levelList = + this.getAreaLevelPathList(distribution.getArea(), omitLevels); + mergeAux(distribution, distribution.getArea().getLevel(), levelList, this.getRootElement()); + } + } + + public void sortChildren(){ + sortChildrenAux(this.getRootElement()); + } + + private void sortChildrenAux(TreeNode treeNode){ + DistributionNodeComparator comp = new DistributionNodeComparator(); + if (treeNode.children == null) { + //nothing => stop condition + return; + }else { + Collections.sort(treeNode.children, comp); + for (TreeNode child : treeNode.children) { + sortChildrenAux(child); + } + } + } + + private void mergeAux(Distribution distribution, + NamedAreaLevel level, + List areaHierarchieList, + TreeNode root){ + TreeNode highestDistNode; + TreeNode child;// the new child to add or the child to follow through the tree + //if the list to merge is empty finish the execution + if (areaHierarchieList.isEmpty()) { + return; + } + //getting the highest area and inserting it into the tree + NamedArea highestArea = areaHierarchieList.get(0); + //NamedAreaLevel highestAreaLevel = (NamedAreaLevel) HibernateProxyHelper.deproxy(highestArea.getLevel()); + //NamedAreaLevel currentLevel = (NamedAreaLevel) HibernateProxyHelper.deproxy(level); + //if (highestAreaLevel.compareTo(currentLevel) == 0){//if distribution.status is relevant + + if (highestArea.getLevel().getLabel().compareTo(level.getLabel()) == 0){ + highestDistNode = new TreeNode(distribution);//distribution.area comes from proxy!!!! + }else{ //if distribution.status is not relevant + Distribution data = Distribution.NewInstance(highestArea, null); + highestDistNode = new TreeNode(data); + } + if(highestDistNode.data.getModifyingText().isEmpty()){ + highestDistNode.data.addModifyingText("test", Language.ENGLISH()); + } + + if (root.getChildren().isEmpty() || !containsChild(root, highestDistNode)) { + //if the highest level is not on the depth-1 of the tree we add it. + //child = highestDistNode; + child = new TreeNode(highestDistNode.data); + root.addChild(child);//child.getData().getArea().getUuid().toString().equals("8cfc1722-e1e8-49d3-95a7-9879de6de490"); + }else { + //if the deepth-1 of the tree contains the highest area level + //get the subtree or create it in order to continuing merging + child = getChild(root,highestDistNode); + } + //continue merging with the next highest area of the list. + List newList = areaHierarchieList.subList(1, areaHierarchieList.size()); + mergeAux(distribution, level, newList, child); + } + + private List getAreaLevelPathList(NamedArea area, Set omitLevels){ + List result = new ArrayList(); + if (!omitLevels.contains(area.getLevel())){ + result.add(area); + } + while (area.getPartOf() != null) { + area = area.getPartOf(); + if (!omitLevels.contains(area.getLevel())){ + result.add(0, area); + } + } + return result; + } +} diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java index 374e3c7623..f85445eced 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java @@ -241,4 +241,6 @@ public interface IDescriptionService extends IIdentifiableEntityService getDescriptionElementsForTaxon(Taxon taxon, Set features, Class type, Integer pageSize, Integer pageNumber, List propertyPaths); + public DistributionTree getOrderedDistributionsB(Set taxonDescriptions, Set levels); + } \ No newline at end of file diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaTree.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaTree.java index e6563291ef..39863e0672 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaTree.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NamedAreaTree.java @@ -10,6 +10,11 @@ import eu.etaxonomy.cdm.common.TreeNode; import eu.etaxonomy.cdm.model.location.NamedArea; import eu.etaxonomy.cdm.model.location.NamedAreaLevel; +/** + * @author f.revilla + * @version 1.0 + * @created 10.06.2010 + */ public class NamedAreaTree extends Tree{ public NamedAreaTree() { @@ -36,22 +41,20 @@ public class NamedAreaTree extends Tree{ List levelList = this.getAreaLevelPathList(area, omitLevels); mergeAux(levelList, this.getRootElement()); } - - //mergeAux(areaHierarchieList, this.getRootElement()); } public void sortChildren(){ sortChildrenAux(this.getRootElement()); } - private void sortChildrenAux(TreeNode TreeNode){ + private void sortChildrenAux(TreeNode treeNode){ NamedAreaNodeComparator comp = new NamedAreaNodeComparator(); - if (TreeNode.children == null){ + if (treeNode.children == null){ //nothing => stop condition return; }else{ - Collections.sort(TreeNode.children, comp); - for (TreeNode child : TreeNode.children) { + Collections.sort(treeNode.children, comp); + for (TreeNode child : treeNode.children) { sortChildrenAux(child); } } -- 2.34.1