minor fixes and new method for taxonomic tree
authorAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 25 Jun 2009 10:47:54 +0000 (10:47 +0000)
committerAndreas Kohlbecker <a.kohlbecker@bgbm.org>
Thu, 25 Jun 2009 10:47:54 +0000 (10:47 +0000)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/OrderedTermVocabulary.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonNode.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonomicTree.java

index 28f668c4a6612dc24f47da06f98ff218448aa7cd..e6ffd17edba01f64d78461ebc9ff90c736e2da72 100644 (file)
@@ -52,7 +52,8 @@ public class OrderedTermVocabulary<T extends OrderedTermBase> extends TermVocabu
                return new TreeSet<T>();\r
        }\r
        \r
                return new TreeSet<T>();\r
        }\r
        \r
-       public SortedSet<T> getOrderedTerms(T otb) {\r
+       @Transient\r
+       public SortedSet<T> getOrderedTerms() {\r
                SortedSet<T> result = getSortedSetOfTerms();\r
                return result;\r
        }\r
                SortedSet<T> result = getSortedSetOfTerms();\r
                return result;\r
        }\r
index 98ff9b9eba5af867d3e8efd185b45f06ece716b3..9207c76585135c5657e3eed828ee466e3f98ce1c 100644 (file)
@@ -19,6 +19,7 @@ import javax.persistence.Entity;
 import javax.persistence.FetchType;\r
 import javax.persistence.ManyToOne;\r
 import javax.persistence.OneToMany;\r
 import javax.persistence.FetchType;\r
 import javax.persistence.ManyToOne;\r
 import javax.persistence.OneToMany;\r
+import javax.persistence.Transient;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
@@ -89,7 +90,7 @@ public class TaxonNode  extends AnnotatableEntity {
     @XmlSchemaType(name = "IDREF")\r
     @OneToMany(mappedBy="parent", fetch=FetchType.LAZY)\r
     @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
     @XmlSchemaType(name = "IDREF")\r
     @OneToMany(mappedBy="parent", fetch=FetchType.LAZY)\r
     @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})\r
-       private List<TaxonNode> childNodes = new ArrayList<TaxonNode>();\r
+       private Set<TaxonNode> childNodes = new HashSet<TaxonNode>();\r
        \r
        @XmlElement(name = "reference")\r
        @XmlIDREF\r
        \r
        @XmlElement(name = "reference")\r
        @XmlIDREF\r
@@ -220,7 +221,7 @@ public class TaxonNode  extends AnnotatableEntity {
        protected void setTaxonomicView(TaxonomicTree taxonomicTree) {\r
                this.taxonomicTree = taxonomicTree;\r
        }\r
        protected void setTaxonomicView(TaxonomicTree taxonomicTree) {\r
                this.taxonomicTree = taxonomicTree;\r
        }\r
-       public List<TaxonNode> getChildNodes() {\r
+       public Set<TaxonNode> getChildNodes() {\r
                return childNodes;\r
        }\r
        \r
                return childNodes;\r
        }\r
        \r
@@ -282,7 +283,7 @@ public class TaxonNode  extends AnnotatableEntity {
         * @return\r
         */\r
        public boolean isRootNode(){\r
         * @return\r
         */\r
        public boolean isRootNode(){\r
-               return getParent() == null;\r
+               return parent == null;\r
        }\r
        \r
        /**\r
        }\r
        \r
        /**\r
@@ -291,6 +292,7 @@ public class TaxonNode  extends AnnotatableEntity {
         * @param possibleParent\r
         * @return true if this is a descendant\r
         */\r
         * @param possibleParent\r
         * @return true if this is a descendant\r
         */\r
+       @Transient\r
        public boolean isDescendant(TaxonNode possibleParent){\r
                return possibleParent.getAllNodes().contains(this);\r
        }\r
        public boolean isDescendant(TaxonNode possibleParent){\r
                return possibleParent.getAllNodes().contains(this);\r
        }\r
index a264365f4e87aa7c4072011d7baaea35844c3a15..68dad271b95f4fd87ce08bb8b6f9edc5089f6950 100644 (file)
@@ -10,7 +10,9 @@
 \r
 package eu.etaxonomy.cdm.model.taxon;\r
 \r
 \r
 package eu.etaxonomy.cdm.model.taxon;\r
 \r
+import java.util.ArrayList;\r
 import java.util.HashSet;\r
 import java.util.HashSet;\r
+import java.util.List;\r
 import java.util.Set;\r
 \r
 import javax.persistence.Entity;\r
 import java.util.Set;\r
 \r
 import javax.persistence.Entity;\r
@@ -18,6 +20,7 @@ import javax.persistence.FetchType;
 import javax.persistence.ManyToOne;\r
 import javax.persistence.OneToMany;\r
 import javax.persistence.OneToOne;\r
 import javax.persistence.ManyToOne;\r
 import javax.persistence.OneToMany;\r
 import javax.persistence.OneToOne;\r
+import javax.persistence.Transient;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
@@ -36,6 +39,7 @@ import eu.etaxonomy.cdm.model.common.IReferencedEntity;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.LanguageString;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.LanguageString;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 \r
 /**\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 \r
 /**\r
@@ -308,7 +312,7 @@ public class TaxonomicTree extends IdentifiableEntity implements IReferencedEnti
        }\r
        \r
        \r
        }\r
        \r
        \r
-\r
+       @Transient\r
        public ReferenceBase getCitation() {\r
                return reference;\r
        }\r
        public ReferenceBase getCitation() {\r
                return reference;\r
        }\r
@@ -329,6 +333,7 @@ public class TaxonomicTree extends IdentifiableEntity implements IReferencedEnti
         * \r
         * @return\r
         */\r
         * \r
         * @return\r
         */\r
+       @Transient\r
        @Deprecated\r
        public Set<TaxonNode> getAllNodes() {\r
                Set<TaxonNode> allNodes = new HashSet<TaxonNode>();\r
        @Deprecated\r
        public Set<TaxonNode> getAllNodes() {\r
                Set<TaxonNode> allNodes = new HashSet<TaxonNode>();\r
@@ -382,5 +387,44 @@ public class TaxonomicTree extends IdentifiableEntity implements IReferencedEnti
        public int compareTo(Object o) {\r
                return 0;\r
        }\r
        public int compareTo(Object o) {\r
                return 0;\r
        }\r
+       \r
+       /**\r
+        * Returns all TaxonNodes of the tree for a given Rank.\r
+        * If a branch does not contain a TaxonNode with a TaxonName at the given\r
+        * Rank the node associated with the next lower Rank is taken as root node.\r
+        * If the <code>rank</code> is null the absolute root nodes will be returned.\r
+        * \r
+        * @param rank may be null\r
+        * @return\r
+        */\r
+       public List<TaxonNode> getRankSpecificRootNodes(Rank rank) {\r
+               List<TaxonNode> baseNodes = new ArrayList<TaxonNode>();\r
+               if(rank != null){\r
+                       findNodesForRank(rank, getRootNodes(), baseNodes);\r
+               } else {\r
+                       baseNodes.addAll(getRootNodes());\r
+               }\r
+               return baseNodes;\r
+       }\r
+\r
+       /**\r
+        * findRankSpecificRootNodes\r
+        * @param rank\r
+        * @param nodeSet\r
+        * @param rootNodes\r
+        */\r
+       private List<TaxonNode> findNodesForRank(Rank rank, Set<TaxonNode> nodeSet, List<TaxonNode> rootNodes) {\r
+               for(TaxonNode node : nodeSet){\r
+                       Rank thisRank = node.getTaxon().getName().getRank();\r
+                       if(thisRank.isHigher(rank)){\r
+                               // iterate deeper into tree\r
+                               rootNodes.addAll(findNodesForRank(rank, node.getChildNodes(), rootNodes));\r
+                       } else {\r
+                               // gotsha! It is a base node of this level\r
+                               rootNodes.add(node);\r
+                       }\r
+               }\r
+               return rootNodes;\r
+       }\r
 \r
 }\r
 \r
 }\r