From 997950c2a9cddbcddd3a5b3522d5684e271ab664 Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Thu, 10 Oct 2019 20:36:24 +0200
Subject: [PATCH] Add new verifier "Lonely Data Input Verification"

---
 .../VerificationResultEntryElement.java       | 15 +++++++++
 .../verification/result/actions/Action.java   |  3 ++
 .../result/actions/ActionScope.java           |  5 +--
 .../result/actions/VerificationFix.java       |  7 ++++
 .../DrdModelingLevelVerification.java         | 19 +++++++++++
 .../impl/LonelyDataInputVerifier.java         | 33 +++++++++++++++++++
 .../types/LonelyDataInputVerification.java    | 29 ++++++++++++++++
 7 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/DrdModelingLevelVerification.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/LonelyDataInputVerification.java

diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryElement.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryElement.java
index d25bbe50..9fc64878 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryElement.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryElement.java
@@ -4,6 +4,7 @@ import de.unikoblenz.fgbks.core.dmn.domain.ids.AbstractId;
 import de.unikoblenz.fgbks.core.dmn.domain.ids.JsonIdentifier;
 import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnColumn;
 import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDecisionTable;
+import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputData;
 import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnValue;
 import java.util.HashMap;
 import java.util.Map;
@@ -82,6 +83,20 @@ public class VerificationResultEntryElement extends AbstractResultObject {
         .withIdentifier(column.getColumnId());
   }
 
+  /**
+   * Create a new {@link VerificationResultEntryElement} with the initial identifier from a {@link
+   * VDmnInputData}. Call {@link VerificationResultEntryElement#withIdentifier(AbstractId)} to add
+   * further identifier.
+   *
+   * @param inputData the {@link VDmnInputData}
+   * @return the new {@link VerificationResultEntryElement}
+   */
+  public static VerificationResultEntryElement create(VDmnInputData inputData) {
+    return new VerificationResultEntryElement()
+        .withIdentifier(inputData.getDmnDefinition().getDefinitionId())
+        .withIdentifier(inputData.getInputDataId());
+  }
+
   /**
    * Get all required ids ({@link AbstractId}) of the {@link VerificationResultEntryElement}.
    *
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/Action.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/Action.java
index 43d77979..9586c99a 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/Action.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/Action.java
@@ -1,6 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verification.result.actions;
 
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_COLUMN;
+import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_DATA;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_ENTRY;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_COLUMN;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_ENTRY;
@@ -15,6 +16,7 @@ import org.apache.commons.lang3.Validate;
 
 public class Action extends AbstractResultObject {
 
+  public static Action ACTION_SHOW_INPUT_DATA;
   public static Action ACTION_SHOW_RULES;
   public static Action ACTION_SHOW_INPUT_ENTRIES;
   public static Action ACTION_SHOW_OUTPUT_ENTRIES;
@@ -22,6 +24,7 @@ public class Action extends AbstractResultObject {
   public static Action ACTION_SHOW_OUTPUT_COLUMNS;
 
   static {
+    ACTION_SHOW_INPUT_DATA = getBuilder().withActionType(SHOW).withActionScope(INPUT_DATA).build();
     ACTION_SHOW_RULES = getBuilder().withActionType(SHOW).withActionScope(RULE).build();
     ACTION_SHOW_INPUT_ENTRIES =
         getBuilder().withActionType(SHOW).withActionScope(INPUT_ENTRY).build();
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/ActionScope.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/ActionScope.java
index 5988bfa9..2a529ed1 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/ActionScope.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/ActionScope.java
@@ -4,7 +4,8 @@ public enum ActionScope {
   RULE,
   INPUT_ENTRY,
   OUTPUT_ENTRY,
-  INPUT_NODE,
+  INPUT_DATA,
   INPUT_COLUMN,
-  OUTPUT_COLUMN
+  OUTPUT_COLUMN,
+  DECISION
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/VerificationFix.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/VerificationFix.java
index 32f837e0..a0430635 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/VerificationFix.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/actions/VerificationFix.java
@@ -1,6 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verification.result.actions;
 
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_INPUT_COLUMNS;
+import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_INPUT_DATA;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_INPUT_ENTRIES;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_OUTPUT_COLUMNS;
 import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_OUTPUT_ENTRIES;
@@ -17,6 +18,7 @@ public class VerificationFix {
   private static final Name DEFAULT_FIX_NAME = new Name("Fix");
   private static final Name DEFAULT_SHOW_NAME = new Name("Show");
 
+  public static VerificationFix SHOW_INPUT_DATA;
   public static VerificationFix SHOW_RULES;
   public static VerificationFix SHOW_INPUT_ENTRIES;
   public static VerificationFix SHOW_OUTPUT_ENTRIES;
@@ -24,6 +26,11 @@ public class VerificationFix {
   public static VerificationFix SHOW_OUTPUT_COLUMNS;
 
   static {
+    SHOW_INPUT_DATA =
+        VerificationFix.getBuilder()
+            .withFixName(DEFAULT_SHOW_NAME)
+            .addAction(ACTION_SHOW_INPUT_DATA)
+            .build();
     SHOW_RULES =
         VerificationFix.getBuilder()
             .withFixName(DEFAULT_SHOW_NAME)
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/DrdModelingLevelVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/DrdModelingLevelVerification.java
new file mode 100644
index 00000000..6de26519
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/DrdModelingLevelVerification.java
@@ -0,0 +1,19 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.classification;
+
+import de.unikoblenz.fgbks.base.domain.Description;
+import de.unikoblenz.fgbks.base.domain.Name;
+
+@Classification
+public class DrdModelingLevelVerification extends AbstractClassificationType {
+
+  private static final DrdModelingLevelVerification instance =
+      new DrdModelingLevelVerification();
+
+  private DrdModelingLevelVerification() {
+    super(new Name("DrdModeling"), new Description("test")); // TODO
+  }
+
+  public static DrdModelingLevelVerification getInstance() {
+    return instance;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java
new file mode 100644
index 00000000..231b3da7
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java
@@ -0,0 +1,33 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
+
+import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_INPUT_DATA;
+
+import de.unikoblenz.fgbks.base.domain.Name;
+import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputData;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.LonelyDataInputVerification;
+import java.util.function.Supplier;
+
+@DmnVerifier(verifierType = LonelyDataInputVerification.class)
+public class LonelyDataInputVerifier extends AbstractVerifier {
+
+  private Supplier<Name> defaultName = () -> new Name("[no name]");
+
+  @Override
+  protected void doVerification() {
+    for (VDmnInputData i : dmnObjectContainer.getVDmnDefinition().getDmnInputData()) {
+      if (i.getInformationProvidingDecisions().isEmpty()) {
+        vreFactory
+            .addElement(VerificationResultEntryElement.create(i))
+            .addVerificationFix(SHOW_INPUT_DATA)
+            .addToEntry(
+                VerificationClassification.WARNING,
+                "Input data \"%s\" has no outgoing connections to at least one decision node.",
+                i.getName().orElseGet(defaultName));
+      }
+    }
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/LonelyDataInputVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/LonelyDataInputVerification.java
new file mode 100644
index 00000000..201bfa5a
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/LonelyDataInputVerification.java
@@ -0,0 +1,29 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+import de.unikoblenz.fgbks.base.domain.Description;
+import de.unikoblenz.fgbks.base.domain.Name;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.ClassificationType;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.DrdModelingLevelVerification;
+import javax.validation.constraints.NotNull;
+
+@Type
+public class LonelyDataInputVerification extends AbstractVerificationType {
+
+  private static final LonelyDataInputVerification instance = new LonelyDataInputVerification();
+
+  private LonelyDataInputVerification() {
+    super(
+        new Name("LonelyDataInputVerification"),
+        new Description(
+            "Checks for any input data node, if it has no connection to at least one decision table."));
+  }
+
+  public static LonelyDataInputVerification getInstance() {
+    return instance;
+  }
+
+  @Override
+  public @NotNull ClassificationType getClassification() {
+    return DrdModelingLevelVerification.getInstance();
+  }
+}
-- 
GitLab