ref #8450 Check for duplicate features in matrix startup
authorPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 13 Dec 2019 09:23:42 +0000 (10:23 +0100)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Fri, 13 Dec 2019 09:23:42 +0000 (10:23 +0100)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrix.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrixPart.java

index e498d1b07d015179d4d7effe9d0909473c1d8ea5..ad2c0b0bbfe93eb5298134a1b31540310d239b5c 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -282,11 +283,11 @@ public class CharacterMatrix extends Composite {
 
     private List<Feature> initFeatureList(TermNode<Feature> node){
         List<Feature> features = new ArrayList<>();
-        node.getChildNodes().forEach(childNode->
-                {
-                    features.add(childNode.getTerm());
-                    features.addAll(initFeatureList(childNode));
-                });
+        List<TermNode<Feature>> childNodes = node.getChildNodes();
+        for (TermNode<Feature> childNode : childNodes) {
+            features.add(childNode.getTerm());
+            features.addAll(initFeatureList(childNode));
+        }
         return features;
     }
 
@@ -295,6 +296,14 @@ public class CharacterMatrix extends Composite {
         TermTree<Feature> tree = getDescriptiveDataSet().getDescriptiveSystem();
         features = initFeatureList(tree.getRoot());
 
+        Set<Feature> duplicateFeatures = features.stream().filter(i -> Collections.frequency(features, i) >1)
+        .collect(Collectors.toSet());
+
+        if (!duplicateFeatures.isEmpty()) {
+            throw new IllegalArgumentException("Duplicate features found: "
+                    + duplicateFeatures.stream().map(feature -> feature.getLabel()).collect(Collectors.joining(",")));
+        }
+
         //init state data for categorical features
         features.forEach(feature->fetchSupportedStates(feature));
 
index 0fb3648fe6b391f02df551909201a82ff88399ce..0d8c527530f3827ff4fd307cec6d95c0ea3ad2fe 100644 (file)
@@ -45,6 +45,7 @@ import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 import eu.etaxonomy.cdm.model.term.TermType;
 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.editor.internal.TaxeditorEditorPlugin;
 import eu.etaxonomy.taxeditor.editor.l10n.Messages;
 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
@@ -139,7 +140,13 @@ ICdmEntitySessionEnabled, IPartContentHasSupplementalData, IPartContentHasDetail
                 loadingFailed();
                 return;
             }
-            matrix.initDescriptiveDataSet();
+            try {
+                matrix.initDescriptiveDataSet();
+            } catch (IllegalArgumentException e) {
+                MessagingUtils.errorDialog("Error during initilization", this, "Could not load matrix", TaxeditorEditorPlugin.PLUGIN_ID, e, false);
+                loadingFailed();
+                return;
+            }
             matrix.createTable(treeView, true, true);
             thisPart.setLabel(descriptiveDataSet.getLabel());
             matrix.loadDescriptions(descriptiveDataSetUuid, true);