From 18a241d51d4db8f4bd8f86154ea86177ee43f335 Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Wed, 18 Sep 2019 11:12:31 +0200
Subject: [PATCH] Add syntax check for values (creation of Boundary was a
 success)

---
 .../utils/boundary/impl/BooleanBoundary.java  |  8 ++--
 .../utils/boundary/impl/DateBoundary.java     |  2 +-
 .../utils/boundary/impl/DoubleBoundary.java   |  3 +-
 .../utils/boundary/impl/IntegerBoundary.java  |  4 +-
 .../utils/boundary/impl/InvalidBoundary.java  | 36 +++++++++++++++++
 .../utils/boundary/impl/LongBoundary.java     |  3 +-
 .../utils/boundary/impl/StringBoundary.java   | 34 +++++++++-------
 .../fgbks/core/dmn/domain/vdmn/VTypeRef.java  |  4 +-
 .../impl/InputValueSyntaxVerifier.java        | 39 +++++++++++++++++++
 .../types/EmptyOutputVerification.java        |  5 ++-
 .../IdenticalBusinessRuleVerification.java    |  9 +++--
 .../types/InputValueSyntaxVerification.java   | 23 +++++++++++
 12 files changed, 140 insertions(+), 30 deletions(-)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java

diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java
index 634f8674..b8ba1308 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java
@@ -31,14 +31,12 @@ public class BooleanBoundary extends AbstractGrowingBoundary<Boolean> {
     if (text.trim().isEmpty()) {
       lowerBound = getMinValue();
       upperBound = getMaxValue();
-    }
-    if (TRUE_STRING.equals(text.toLowerCase())) {
+    } else if (TRUE_STRING.equals(text.toLowerCase())) {
       lowerBound = upperBound = getMaxValue();
-    }
-    if (FALSE_STRING.equals(text.toLowerCase())) {
+    } else if (FALSE_STRING.equals(text.toLowerCase())) {
       lowerBound = upperBound = getMinValue();
     } else {
-      throw new BoundaryParseException("Boolean value cloud not be parsed. " + text);
+      throw new BoundaryParseException("Boolean value cloud not be parsed: " + text);
     }
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java
index 9075ea94..3ffd379c 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java
@@ -96,7 +96,7 @@ public class DateBoundary extends AbstractGrowingBoundary<LocalDateTime> {
         throw new IllegalArgumentException();
       }
     } catch (Exception e) {
-      throw new BoundaryParseException("Date value " + text + " couldn't be parsed.");
+      throw new BoundaryParseException("Date value " + this.getText() + " couldn't be parsed.");
     }
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java
index 7dfc6f21..3d1acde6 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java
@@ -62,7 +62,8 @@ public class DoubleBoundary extends AbstractGrowingBoundary<Double> {
       }
     } catch (Exception e) {
       throw new BoundaryParseException(
-          String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage()));
+          String.format(
+              "Parsing Double boundary failed: %s. Exception: %s", this.getText(), e.getMessage()));
     }
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java
index 18156bf2..b2d5a790 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java
@@ -62,7 +62,9 @@ public class IntegerBoundary extends AbstractGrowingBoundary<Integer> {
       }
     } catch (Exception e) {
       throw new BoundaryParseException(
-          String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage()));
+          String.format(
+              "Parsing Integer boundary failed: %s. Exception: %s",
+              this.getText(), e.getMessage()));
     }
     simplifyBound();
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java
new file mode 100644
index 00000000..31a98ec1
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java
@@ -0,0 +1,36 @@
+package de.unikoblenz.fgbks.base.utils.boundary.impl;
+
+import de.unikoblenz.fgbks.base.utils.boundary.Boundary;
+import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType;
+import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
+
+public class InvalidBoundary implements Boundary {
+
+  private static InvalidBoundary instance = new InvalidBoundary();
+
+  private InvalidBoundary() {}
+
+  public static InvalidBoundary getInstance() {
+    return instance;
+  }
+
+  @Override
+  public VTypeRef getTypeRef() {
+    return null;
+  }
+
+  @Override
+  public String getText() {
+    return "null";
+  }
+
+  @Override
+  public boolean checkWith(BoundaryCheckType checkType, Boundary other) {
+    return false;
+  }
+
+  @Override
+  public int compareTo(Boundary o) {
+    return 0;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java
index f449c305..162c0404 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java
@@ -62,7 +62,8 @@ public class LongBoundary extends AbstractGrowingBoundary<Long> {
       }
     } catch (Exception e) {
       throw new BoundaryParseException(
-          String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage()));
+          String.format(
+              "Parsing Long boundary failed: %s. Exception: %s", this.getText(), e.getMessage()));
     }
     simplifyBound();
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
index 84b4254a..2041c38d 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java
@@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.base.utils.boundary.impl;
 
 import de.unikoblenz.fgbks.base.utils.boundary.AbstractBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.Boundary;
+import de.unikoblenz.fgbks.base.utils.boundary.BoundaryParseException;
 import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck;
 import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType;
 import java.util.Arrays;
@@ -28,19 +29,26 @@ public class StringBoundary extends AbstractBoundary<String> {
   @Override
   protected void parse(String text) {
     matchNoneOfValues = false;
-    matchAny = Validate.notNull(text).isEmpty();
-    if (!matchAny) {
-      matchNoneOfValues = text.toLowerCase().startsWith("not");
-      text = text.replace('(', '\0').replace(')', '\0').trim();
-      if (matchNoneOfValues) {
-        text = text.replaceFirst("not", "").trim();
-      }
-      values = text.split(",");
-      valuesHashes = new int[values.length];
-      for (int i = 0; i < values.length; i++) {
-        values[i] = values[i].replace('"', '\0').trim();
-        valuesHashes[i] = Objects.hashCode(values[i]);
+    matchAny = false;
+    try {
+      matchAny = Validate.notNull(text).isEmpty();
+      if (matchAny) {
+        values = new String[0];
+      } else {
+        matchNoneOfValues = text.toLowerCase().startsWith("not");
+        text = text.replace('(', '\0').replace(')', '\0').trim();
+        if (matchNoneOfValues) {
+          text = text.replaceFirst("not", "").trim();
+        }
+        values = text.split(",");
+        valuesHashes = new int[values.length];
+        for (int i = 0; i < values.length; i++) {
+          values[i] = values[i].replace('"', '\0').trim();
+          valuesHashes[i] = Objects.hashCode(values[i]);
+        }
       }
+    } catch (Exception e) {
+      throw new BoundaryParseException("String value is not valid: " + this.getText());
     }
   }
 
@@ -51,7 +59,7 @@ public class StringBoundary extends AbstractBoundary<String> {
 
   @Override
   protected HashMap<BoundaryCheckType, BoundaryCheck> getChecker() {
-    return null;
+    return new HashMap<>();
   }
 
   @Override
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java
index c01c662e..bd284bf3 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java
@@ -5,6 +5,7 @@ import de.unikoblenz.fgbks.base.utils.boundary.impl.BooleanBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.impl.DateBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.impl.DoubleBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary;
+import de.unikoblenz.fgbks.base.utils.boundary.impl.InvalidBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary;
 import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary;
 import java.time.LocalDateTime;
@@ -52,9 +53,8 @@ public enum VTypeRef {
     try {
       return Optional.of(boundaryClass.getDeclaredConstructor(String.class).newInstance(text));
     } catch (Exception ignored) {
-      // nothing
+      return Optional.of(InvalidBoundary.getInstance());
     }
-    return Optional.empty();
   }
 
   VTypeRef(String name, Class<?> javaClass, Class<? extends Boundary> boundaryClass) {
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java
new file mode 100644
index 00000000..fc690546
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java
@@ -0,0 +1,39 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
+
+import de.unikoblenz.fgbks.base.utils.boundary.impl.InvalidBoundary;
+import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputValue;
+import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
+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.config.DefaultConfiguration;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.InputValueSyntaxVerification;
+
+@DmnVerifier(
+    verifierType = InputValueSyntaxVerification.class,
+    verifierConfig = DefaultConfiguration.class)
+public class InputValueSyntaxVerifier extends AbstractVerifier {
+
+  @Override
+  protected void doVerification() {
+    dmnObjectContainer.getvDmnDefinition().getDmnDecisions().stream()
+        .flatMap(
+            d ->
+                d.getDmnDecisionTable().getRules().stream()
+                    .flatMap(r -> r.getDmnInputValues().stream()))
+        .forEach(v -> check(v));
+  }
+
+  private void check(VDmnInputValue inputValue) {
+    // no Date, because of extra DateVerifier
+    if (inputValue.getDmnColumn().getTypeRef() != VTypeRef.DATE
+        && inputValue.getBoundary() instanceof InvalidBoundary) {
+      vref.addElement(VerificationResultEntryElement.create(inputValue));
+      vref.addToEntry(
+          VerificationClassification.FATAL_ERROR,
+          "Input value is not valid: " + inputValue.getText());
+      System.out.println(inputValue.getText() + " IS INVALID SYNTAX");
+    }
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java
index 6866dfed..b34199f7 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java
@@ -2,16 +2,17 @@ package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
 
 import de.unikoblenz.fgbks.base.domain.Description;
 import de.unikoblenz.fgbks.base.domain.Name;
+import javax.validation.constraints.NotNull;
 
 public class EmptyOutputVerification extends AbstractVerificationType {
 
   @Override
-  public VerificationTypeClassification getClassification() {
+  public @NotNull VerificationTypeClassification getClassification() {
     return VerificationTypeClassification.SYNTAX_LEVEL_VERIFICATION;
   }
 
   @Override
-  public Name getName() {
+  public @NotNull Name getName() {
     return new Name("Empty output check");
   }
 
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java
index 647f92db..cb5dcebd 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java
@@ -1,24 +1,25 @@
 package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
 
-import static de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationTypeClassification.*;
+import static de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationTypeClassification.DECISION_LOGIC_LEVEL_VERIFICATION;
 
 import de.unikoblenz.fgbks.base.domain.Description;
 import de.unikoblenz.fgbks.base.domain.Name;
+import javax.validation.constraints.NotNull;
 
 public class IdenticalBusinessRuleVerification extends AbstractVerificationType {
 
   @Override
-  public VerificationTypeClassification getClassification() {
+  public @NotNull VerificationTypeClassification getClassification() {
     return DECISION_LOGIC_LEVEL_VERIFICATION;
   }
 
   @Override
-  public Name getName() {
+  public @NotNull Name getName() {
     return new Name(this.getClass().getSimpleName());
   }
 
   @Override
-  public Description getDescription() {
+  public @NotNull Description getDescription() {
     return new Description("test");
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java
new file mode 100644
index 00000000..fb9aeeac
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java
@@ -0,0 +1,23 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+import de.unikoblenz.fgbks.base.domain.Description;
+import de.unikoblenz.fgbks.base.domain.Name;
+import javax.validation.constraints.NotNull;
+
+public class InputValueSyntaxVerification extends AbstractVerificationType {
+
+  @Override
+  public @NotNull VerificationTypeClassification getClassification() {
+    return VerificationTypeClassification.SYNTAX_LEVEL_VERIFICATION;
+  }
+
+  @Override
+  public @NotNull Name getName() {
+    return new Name(this.getClass().getSimpleName());
+  }
+
+  @Override
+  public @NotNull Description getDescription() {
+    return new Description("Check values for syntactical correctness.");
+  }
+}
-- 
GitLab