Merge branch 'release/5.11.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / matrix / DescriptionTreeFormat.java
index 15c6a550c45226617b5b3400f41c6e402a2c5d87..f9d0cb7c9bdefccd020cd20f2d85bff27fd74287 100644 (file)
@@ -18,9 +18,9 @@ import java.util.UUID;
 import ca.odell.glazedlists.TreeList;
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
 import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
+import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.name.Rank;
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
 import eu.etaxonomy.taxeditor.store.CdmStore;
 
@@ -36,6 +36,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 
      private Rank maxRank;
 
+     private Integer deepestTaxonLevel = null;
+
      private Map<UUID, TaxonNodeDto> uuidToTaxonNodeDtoMap = new HashMap<>();
 
      public DescriptionTreeFormat(DescriptiveDataSet descriptiveDataSet) {
@@ -44,9 +46,10 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
 
      @Override
      public void getPath(List path, Object element) {
+         Integer level = 0;
          if(element instanceof RowWrapperDTO){
              //TODO: check for multiple taxon nodes in multiple classifications
-             TaxonNodeDto taxonNode = ((RowWrapperDTO) element).getTaxonNode();
+             TaxonNodeDto taxonNode = ((RowWrapperDTO)element).getTaxonNode();
              //use dto from map cache because the elements have to be
              //exactly the same for the tree format to work
              if(uuidToTaxonNodeDtoMap.get(taxonNode.getUuid())!=null){
@@ -55,32 +58,46 @@ import eu.etaxonomy.taxeditor.store.CdmStore;
              else{
                  uuidToTaxonNodeDtoMap.put(taxonNode.getUuid(), taxonNode);
              }
-             addPathRecursive(path, taxonNode);
+             level = addPathRecursive(path, taxonNode, level);
+         }
+         if(element instanceof SpecimenRowWrapperDTO){
+             if(deepestTaxonLevel==null){
+                 deepestTaxonLevel = level;
+             }
+             else{
+                 deepestTaxonLevel = Math.min(level, deepestTaxonLevel);
+             }
          }
          path.add(element);
      }
 
-     private void addPathRecursive(List path, TaxonNodeDto node){
+     private Integer addPathRecursive(List path, TaxonNodeDto node, Integer level){
+         level++;
+
          if(node!=null){
              if(maxRank!=null && node.getRankOrderIndex()==maxRank.getOrderIndex()){
                  path.add(node);
-                 return;
+                 return level;
              }
              TaxonNodeDto parentNodeDto = uuidToTaxonNodeDtoMap.get(node.getParentUUID());
              if(parentNodeDto==null){
-                 TaxonNode parent = CdmStore.getService(ITaxonNodeService.class).load(node.getParentUUID());
-                 if(parent!=null){
-                     parentNodeDto = new TaxonNodeDto(parent);
+                 parentNodeDto = CdmStore.getService(ITaxonNodeService.class).parentDto(node.getUuid());
+                 if(parentNodeDto!=null){
                      uuidToTaxonNodeDtoMap.put(node.getParentUUID(), parentNodeDto);
                  }
              }
              if(parentNodeDto!=null){
-                 addPathRecursive(path, parentNodeDto);
+                 level = addPathRecursive(path, parentNodeDto, level);
                  path.add(node);
              }
          }
+         return level;
      }
 
+    public Integer getDeepestTaxonLevel() {
+        return deepestTaxonLevel;
+    }
+
      @Override
      public boolean allowsChildren(Object element) {
          return true;