From 08b528adcbf00bec5f84fd398ab8bed13fc40111 Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Mon, 9 Sep 2019 20:36:23 +0200
Subject: [PATCH] Add domain for identifier

---
 .../base/value/AbstractStringValueObject.java |  8 +--
 .../fgbks/core/dmn/domain/Message.java        | 15 ++++
 .../fgbks/core/dmn/domain/id/AbstractId.java  | 15 ++++
 .../fgbks/core/dmn/domain/id/DecisionId.java  |  8 +++
 .../core/dmn/domain/id/DecisionTableId.java   |  9 +++
 .../core/dmn/domain/id/InputEntryId.java      |  9 +++
 .../core/dmn/domain/id/InputExpressionId.java |  9 +++
 .../fgbks/core/dmn/domain/id/InputId.java     |  9 +++
 .../core/dmn/domain/id/JsonIdentifier.java    | 15 ++++
 .../core/dmn/domain/id/OutputEntryId.java     |  9 +++
 .../fgbks/core/dmn/domain/id/OutputId.java    |  9 +++
 .../fgbks/core/dmn/domain/id/RuleId.java      |  9 +++
 .../result/VerificationResultEntry.java       | 11 +--
 .../VerificationResultEntryElement.java       | 70 +++++--------------
 .../VerificationResultEntryFactory.java       |  7 +-
 .../verfication/verifier/SampleVerifier.java  | 17 +++--
 16 files changed, 161 insertions(+), 68 deletions(-)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java

diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
index ec5e6f96..a7f54fe6 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/value/AbstractStringValueObject.java
@@ -7,7 +7,7 @@ import static org.apache.commons.lang3.Validate.notNull;
 
 public abstract class AbstractStringValueObject extends AbstractSimpleValueObject<String> {
 
-  public static final int MIN_LEN = 1;
+  public static final int DEFAULT_MIN_LEN = 1;
 
   protected AbstractStringValueObject() {}
 
@@ -25,10 +25,10 @@ public abstract class AbstractStringValueObject extends AbstractSimpleValueObjec
     if (handleBlanksAsNull() && super.getValue().trim().isEmpty()) {
       return null;
     }
-    return isBlankAllowed() ? super.getValue() : toStringTimTrailing();
+    return isBlankAllowed() ? super.getValue() : toStringTrim();
   }
 
-  private String toStringTimTrailing() {
+  private String toStringTrim() {
     return super.getValue().trim();
   }
 
@@ -54,7 +54,7 @@ public abstract class AbstractStringValueObject extends AbstractSimpleValueObjec
   }
 
   protected Integer getMinLength() {
-    return MIN_LEN;
+    return DEFAULT_MIN_LEN;
   }
 
   protected abstract Integer getMaxLength();
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java
new file mode 100644
index 00000000..b7ed52c9
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Message.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain;
+
+import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
+
+public class Message extends AbstractStringValueObject {
+
+  public Message(String initialValue) {
+    super(initialValue);
+  }
+
+  @Override
+  protected Integer getMaxLength() {
+    return 500;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java
new file mode 100644
index 00000000..e57aadf9
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/AbstractId.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
+
+public abstract class AbstractId extends AbstractStringValueObject {
+
+  public AbstractId(String initialValue) {
+    super(initialValue);
+  }
+
+  @Override
+  protected Integer getMaxLength() {
+    return 100;
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java
new file mode 100644
index 00000000..6a95016f
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionId.java
@@ -0,0 +1,8 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+public class DecisionId extends AbstractId {
+
+  public DecisionId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java
new file mode 100644
index 00000000..87292a93
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/DecisionTableId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("decisionTableId")
+public class DecisionTableId extends AbstractId {
+
+  public DecisionTableId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java
new file mode 100644
index 00000000..9c1d594c
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputEntryId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputEntryId")
+public class InputEntryId extends AbstractId {
+
+  public InputEntryId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java
new file mode 100644
index 00000000..b3966606
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputExpressionId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputExpressionId")
+public class InputExpressionId extends AbstractId {
+
+  public InputExpressionId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java
new file mode 100644
index 00000000..91f65868
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/InputId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("inputId")
+public class InputId extends AbstractId {
+
+  public InputId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java
new file mode 100644
index 00000000..4952c6a8
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/JsonIdentifier.java
@@ -0,0 +1,15 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface JsonIdentifier {
+
+  String value() default "id";
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java
new file mode 100644
index 00000000..853d5ce2
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputEntryId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("outputEntryId")
+public class OutputEntryId extends AbstractId {
+
+  public OutputEntryId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java
new file mode 100644
index 00000000..201b43b2
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/OutputId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("OutputId")
+public class OutputId extends AbstractId {
+
+  public OutputId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java
new file mode 100644
index 00000000..b38220e9
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/id/RuleId.java
@@ -0,0 +1,9 @@
+package de.unikoblenz.fgbks.core.dmn.domain.id;
+
+@JsonIdentifier("ruleId")
+public class RuleId extends AbstractId {
+
+  public RuleId(String initialValue) {
+    super(initialValue);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
index 287e719b..029dd51e 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
@@ -1,6 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
 import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
+import de.unikoblenz.fgbks.core.dmn.domain.Message;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -17,7 +18,7 @@ public class VerificationResultEntry extends AbstractResultObject {
   }
 
   private Set<VerificationResultEntryElement> verificationResultEntryElements;
-  private String message;
+  private Message message;
   private VerificationClassification verificationClassification;
 
   protected VerificationResultEntry() {
@@ -40,8 +41,8 @@ public class VerificationResultEntry extends AbstractResultObject {
   }
 
   @JsonbProperty("message")
-  public String getMessage() {
-    return message;
+  public Message getMessage() {
+    return new Message(message.getValue());
   }
 
   private void addVerificationResultEntry(
@@ -61,8 +62,8 @@ public class VerificationResultEntry extends AbstractResultObject {
       return this;
     }
 
-    public Builder withMessage(String message) {
-      value.message = message;
+    public Builder withMessage(Message message) {
+      value.message = new Message(message.getValue());
       return this;
     }
 
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
index 63e7360e..032ce6df 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
@@ -1,5 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
+import de.unikoblenz.fgbks.core.dmn.domain.id.AbstractId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.JsonIdentifier;
 import java.util.HashMap;
 import java.util.Map;
 import javax.json.bind.annotation.JsonbProperty;
@@ -8,71 +10,37 @@ import org.apache.commons.lang3.Validate;
 // @JsonbTypeSerializer(VerificationResultEntryElementJsonSerializer.class)
 public class VerificationResultEntryElement extends AbstractResultObject {
 
-  private static final String DECISION_ID = "decisionId";
-  private static final String DECISION_TABLE_ID = "decisionTableId";
-  private static final String INPUT_ID = "inputId";
-  private static final String INPUT_EXPRESSION_ID = "inputExpressionId";
-  private static final String OUTPUT_ID = "outputId";
-  private static final String RULE_ID = "ruleId";
-  private static final String INPUT_ENTRY_ID = "inputEntryId";
-  private static final String OUTPUT_ENTRY_ID = "outputEntryId";
+  private final Map<String, AbstractId> identifier;
 
-  private final Map<String, Object> properties;
-
-  @JsonbProperty("properties")
-  public Map<String, Object> getProperties() {
-    return new HashMap<>(properties);
+  @JsonbProperty("identifier")
+  public Map<String, Object> getIdentifier() {
+    return new HashMap<>(identifier);
   }
 
   private VerificationResultEntryElement() {
-    properties = new HashMap<>();
+    identifier = new HashMap<>();
   }
 
   public static VerificationResultEntryElement create() {
     return new VerificationResultEntryElement();
   }
 
-  public VerificationResultEntryElement withDecisionId(String decisionId) {
-    return withProperty(DECISION_ID, decisionId);
-  }
+  public VerificationResultEntryElement withIdentifier(AbstractId value) {
 
-  public VerificationResultEntryElement withDecisionTableId(String decisionTableId) {
-    return withProperty(DECISION_TABLE_ID, decisionTableId);
-  }
-
-  public VerificationResultEntryElement withInputId(String inputId) {
-    return withProperty(INPUT_ID, inputId);
-  }
-
-  public VerificationResultEntryElement withInputExpressionId(String inputExpressionId) {
-    return withProperty(INPUT_EXPRESSION_ID, inputExpressionId);
-  }
-
-  public VerificationResultEntryElement withOutputId(String outputId) {
-    return withProperty(OUTPUT_ID, outputId);
-  }
-
-  public VerificationResultEntryElement withRuleId(String ruleId) {
-    return withProperty(RULE_ID, ruleId);
-  }
-
-  public VerificationResultEntryElement withInputEntryId(String inputEntryId) {
-    return withProperty(INPUT_ENTRY_ID, inputEntryId);
-  }
-
-  public VerificationResultEntryElement withOutputEntryId(String outputEntryId) {
-    return withProperty(OUTPUT_ENTRY_ID, outputEntryId);
-  }
-
-  private VerificationResultEntryElement withProperty(String key, String value) {
-    // every properties can only be set once
+    // Check if annotation is present
+    Validate.isTrue(
+        value.getClass().isAnnotationPresent(JsonIdentifier.class),
+        "No annotation \"JsonIdentifier\" for AbstractId %s present.",
+        value.getClass().getSimpleName());
+    String keyValue = value.getClass().getAnnotation(JsonIdentifier.class).value();
+    // every identifier can only be set once
     Validate.isTrue(
-        !properties.containsKey(key),
-        "Property %s with value %s in %s already set",
-        key,
+        !identifier.containsKey(keyValue),
+        "Identifier %s with value %s in %s already set.",
+        keyValue,
         value,
         VerificationResultEntryElement.class.getSimpleName());
-    properties.put(key, value);
+    identifier.put(keyValue, value);
     return this;
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
index 5a57a753..bc651b98 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
@@ -1,5 +1,6 @@
 package de.unikoblenz.fgbks.core.dmn.verfication.result;
 
+import de.unikoblenz.fgbks.core.dmn.domain.Message;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntry.VerificationClassification;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResult.Builder;
 import org.apache.commons.lang3.Validate;
@@ -37,11 +38,15 @@ public class VerificationResultEntryFactory {
 
   public void addToEntry(
       VerificationClassification verificationClassification, String message, Object... args) {
+    addToEntry(verificationClassification, new Message(String.format(message, args)));
+  }
+
+  public void addToEntry(VerificationClassification verificationClassification, Message message) {
     Validate.notNull(
         verificationResultEntryBuilder,
         "First call \"addElement\" in VerificationResultEntryFactory before calling \"addToEntry\"");
     verificationResultEntryBuilder.withClassification(verificationClassification);
-    verificationResultEntryBuilder.withMessage(String.format(Validate.notNull(message), args));
+    verificationResultEntryBuilder.withMessage(message);
     verifierResultBuilder.addVerificationResultEntry(verificationResultEntryBuilder.build());
     verificationResultEntryBuilder = null;
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
index 6e202dd3..0edc2e93 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
@@ -3,6 +3,9 @@ package de.unikoblenz.fgbks.core.dmn.verfication.verifier;
 import static de.unikoblenz.fgbks.core.dmn.verfication.VerificationType.IDENTICAL_BUSINESS_RULE_VERIFICATION;
 import static de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntry.VerificationClassification.*;
 
+import de.unikoblenz.fgbks.core.dmn.domain.id.InputEntryId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.OutputEntryId;
+import de.unikoblenz.fgbks.core.dmn.domain.id.RuleId;
 import de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntryElement;
 
 public class SampleVerifier extends AbstractVerifier {
@@ -15,15 +18,15 @@ public class SampleVerifier extends AbstractVerifier {
   protected void doVerification() {
     vref.addElement(
         VerificationResultEntryElement.create()
-            .withDecisionId("hello workd")
-            .withInputEntryId("adsas")
-            .withRuleId("asdads"));
+            .withIdentifier(new InputEntryId("asdasda"))
+            .withIdentifier(new OutputEntryId("test"))
+            .withIdentifier(new RuleId("asdasd")));
     vref.addElement(
         VerificationResultEntryElement.create()
-            .withDecisionId("hello workd")
-            .withInputEntryId("adsas")
-            .withRuleId("asdads"));
-    vref.addToEntry(ERROR, "Asd");
+            .withIdentifier(new InputEntryId("asdasda"))
+            .withIdentifier(new OutputEntryId("test"))
+            .withIdentifier(new RuleId("asdasd")));
+    vref.addToEntry(ERROR, "My sample message");
     try {
       Thread.sleep(1500);
     } catch (InterruptedException e) {
-- 
GitLab