+ \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