From a67ddb57cc5fa0a7a0ae03c4bb5703966168ed4e Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Wed, 11 Sep 2019 00:38:50 +0200
Subject: [PATCH] New logic for verifier instantiation

---
 dmnverifierapi/pom.xml                        |  6 ++
 .../fgbks/api/test/GreetingResource.java      |  2 +-
 .../de/unikoblenz/fgbks/api/test/TestApi.java |  2 +-
 .../fgbks/core/dmn/domain/Description.java    | 19 +++++
 .../fgbks/core/dmn/domain/Message.java        |  4 +
 .../fgbks/core/{test => dmn/domain}/Name.java | 10 ++-
 .../fgbks/core/dmn/domain/id/AbstractId.java  |  4 +
 .../fgbks/core/dmn/domain/id/DecisionId.java  |  4 +
 .../core/dmn/domain/id/DecisionTableId.java   |  4 +
 .../core/dmn/domain/id/InputEntryId.java      |  4 +
 .../core/dmn/domain/id/InputExpressionId.java |  4 +
 .../fgbks/core/dmn/domain/id/InputId.java     |  4 +
 .../core/dmn/domain/id/OutputEntryId.java     |  4 +
 .../fgbks/core/dmn/domain/id/OutputId.java    |  4 +
 .../fgbks/core/dmn/domain/id/RuleId.java      |  4 +
 .../verfication/VerificationGenerator.java    | 46 -----------
 .../dmn/verfication/VerificationType.java     | 41 ----------
 .../VerificationTypeClassification.java       | 36 ---------
 .../verification/VerificationGenerator.java   | 80 +++++++++++++++++++
 .../result/AbstractResultObject.java          |  2 +-
 .../result/VerificationResultEntry.java       |  6 +-
 .../VerificationResultEntryElement.java       |  4 +-
 .../VerificationResultEntryFactory.java       |  8 +-
 .../result/VerifierResult.java                | 21 +----
 .../result/VerifierResultSet.java             |  2 +-
 .../verifier/AbstractVerifier.java            | 29 +++++--
 .../verification/verifier/DmnVerifier.java    | 19 +++++
 .../verifier/SampleVerifier.java              | 18 ++---
 .../verifier/Verifier.java                    |  4 +-
 .../config/AbstractVerificationConfig.java    | 22 +++++
 .../verifier/config/DefaultConfiguration.java | 24 ++++++
 .../config/DmnVerifierConfigProperty.java     |  6 ++
 .../types/AbstractVerificationType.java       |  3 +
 .../IdenticalBusinessRuleVerification.java    | 24 ++++++
 .../verifier/types/VerificationType.java      | 22 +++++
 .../types/VerificationTypeClassification.java | 25 ++++++
 .../de/unikoblenz/fgbks/core/test/Person.java |  1 +
 37 files changed, 347 insertions(+), 175 deletions(-)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Description.java
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/{test => dmn/domain}/Name.java (51%)
 delete mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationGenerator.java
 delete mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationType.java
 delete mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationTypeClassification.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationGenerator.java
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/AbstractResultObject.java (92%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/VerificationResultEntry.java (93%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/VerificationResultEntryElement.java (93%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/VerificationResultEntryFactory.java (86%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/VerifierResult.java (73%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/result/VerifierResultSet.java (95%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/verifier/AbstractVerifier.java (52%)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/DmnVerifier.java
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/verifier/SampleVerifier.java (58%)
 rename dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/{verfication => verification}/verifier/Verifier.java (56%)
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/AbstractVerificationConfig.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DefaultConfiguration.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DmnVerifierConfigProperty.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/AbstractVerificationType.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationType.java
 create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationTypeClassification.java

diff --git a/dmnverifierapi/pom.xml b/dmnverifierapi/pom.xml
index 769aebc4..a484ccd6 100644
--- a/dmnverifierapi/pom.xml
+++ b/dmnverifierapi/pom.xml
@@ -43,6 +43,12 @@
       <artifactId>commons-lang3</artifactId>
       <version>3.7</version>
     </dependency>
+
+    <dependency>
+      <groupId>org.reflections</groupId>
+      <artifactId>reflections</artifactId>
+      <version>0.9.11</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/GreetingResource.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/GreetingResource.java
index 1a16a2bb..543c2012 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/GreetingResource.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/GreetingResource.java
@@ -1,6 +1,6 @@
 package de.unikoblenz.fgbks.api.test;
 
-import de.unikoblenz.fgbks.core.test.Name;
+import de.unikoblenz.fgbks.core.dmn.domain.Name;
 import de.unikoblenz.fgbks.core.test.Person;
 import de.unikoblenz.fgbks.core.test.Synonyms;
 import javax.inject.Inject;
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java
index da063f0e..046edef6 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/test/TestApi.java
@@ -1,6 +1,6 @@
 package de.unikoblenz.fgbks.api.test;
 
-import de.unikoblenz.fgbks.core.dmn.verfication.VerificationGenerator;
+import de.unikoblenz.fgbks.core.dmn.verification.VerificationGenerator;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Description.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Description.java
new file mode 100644
index 00000000..db6a82fe
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Description.java
@@ -0,0 +1,19 @@
+package de.unikoblenz.fgbks.core.dmn.domain;
+
+import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
+
+public class Description extends AbstractStringValueObject {
+
+  public Description(Description initialValue) {
+    this(initialValue.getValue());
+  }
+
+  public Description(String initialValue) {
+    super(initialValue);
+  }
+
+  @Override
+  protected Integer getMaxLength() {
+    return 1000;
+  }
+}
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
index b7ed52c9..c61a0d2a 100644
--- 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
@@ -4,6 +4,10 @@ import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
 
 public class Message extends AbstractStringValueObject {
 
+  public Message(Message initialValue) {
+    this(initialValue.getValue());
+  }
+
   public Message(String initialValue) {
     super(initialValue);
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Name.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Name.java
similarity index 51%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Name.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Name.java
index c29555f1..b862df3c 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Name.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/Name.java
@@ -1,11 +1,15 @@
-package de.unikoblenz.fgbks.core.test;
+package de.unikoblenz.fgbks.core.dmn.domain;
 
 import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
 
 public class Name extends AbstractStringValueObject {
 
-  public Name(String name) {
-    super(name);
+  public Name(Name initialValue) {
+    this(initialValue.getValue());
+  }
+
+  public Name(String initialValue) {
+    super(initialValue);
   }
 
   @Override
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
index e57aadf9..7653de66 100644
--- 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
@@ -4,6 +4,10 @@ import de.unikoblenz.fgbks.base.value.AbstractStringValueObject;
 
 public abstract class AbstractId extends AbstractStringValueObject {
 
+  public AbstractId(AbstractId initialValue) {
+    this(initialValue.getValue());
+  }
+
   public AbstractId(String initialValue) {
     super(initialValue);
   }
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
index 6a95016f..5bd6e82f 100644
--- 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
@@ -2,6 +2,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 
 public class DecisionId extends AbstractId {
 
+  public DecisionId(DecisionId initialValue) {
+    this(initialValue.getValue());
+  }
+
   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
index 87292a93..99260d60 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("decisionTableId")
 public class DecisionTableId extends AbstractId {
 
+  public DecisionTableId(DecisionTableId initialValue) {
+    this(initialValue.getValue());
+  }
+
   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
index 9c1d594c..eaea5c1a 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("inputEntryId")
 public class InputEntryId extends AbstractId {
 
+  public InputEntryId(InputEntryId initialValue) {
+    this(initialValue.getValue());
+  }
+
   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
index b3966606..a42b31e4 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("inputExpressionId")
 public class InputExpressionId extends AbstractId {
 
+  public InputExpressionId(InputExpressionId initialValue) {
+    this(initialValue.getValue());
+  }
+
   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
index 91f65868..15b248d4 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("inputId")
 public class InputId extends AbstractId {
 
+  public InputId(InputId initialValue) {
+    this(initialValue.getValue());
+  }
+
   public InputId(String initialValue) {
     super(initialValue);
   }
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
index 853d5ce2..dc078793 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("outputEntryId")
 public class OutputEntryId extends AbstractId {
 
+  public OutputEntryId(OutputEntryId initialValue) {
+    this(initialValue.getValue());
+  }
+
   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
index 201b43b2..5a7da454 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("OutputId")
 public class OutputId extends AbstractId {
 
+  public OutputId(OutputId initialValue) {
+    super(initialValue.getValue());
+  }
+
   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
index b38220e9..e95876ac 100644
--- 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
@@ -3,6 +3,10 @@ package de.unikoblenz.fgbks.core.dmn.domain.id;
 @JsonIdentifier("ruleId")
 public class RuleId extends AbstractId {
 
+  public RuleId(RuleId initialValue) {
+    this(initialValue.getValue());
+  }
+
   public RuleId(String initialValue) {
     super(initialValue);
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationGenerator.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationGenerator.java
deleted file mode 100644
index e85edb31..00000000
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationGenerator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package de.unikoblenz.fgbks.core.dmn.verfication;
-
-import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResult;
-import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResultSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import org.eclipse.microprofile.config.Config;
-import org.eclipse.microprofile.config.ConfigProvider;
-
-public class VerificationGenerator {
-
-  public static final String CONF_VERIFIER_THREADS = "verifier.threads";
-
-  public static VerifierResultSet generate() {
-
-    Config config = ConfigProvider.getConfig();
-    Integer maxThreads = config.getOptionalValue(CONF_VERIFIER_THREADS, Integer.class).orElse(1);
-
-    ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
-
-    VerifierResultSet.Builder resultBuilder = VerifierResultSet.getBuilder();
-
-    List<Future<VerifierResult>> results = new ArrayList<>(VerificationType.values().length);
-    System.out.println("Starting calculation with " + maxThreads + " threads.");
-    for (VerificationType vType : VerificationType.values()) {
-      results.add(vType.createNewInstance().verify(executor));
-    }
-
-    results.forEach(
-        r -> {
-          try {
-            resultBuilder.addVerifierResult(r.get());
-          } catch (InterruptedException e) {
-            e.printStackTrace();
-          } catch (ExecutionException e) {
-            e.printStackTrace();
-          }
-        });
-
-    return resultBuilder.build();
-  }
-}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationType.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationType.java
deleted file mode 100644
index f65aa5bd..00000000
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationType.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package de.unikoblenz.fgbks.core.dmn.verfication;
-
-import static de.unikoblenz.fgbks.core.dmn.verfication.VerificationTypeClassification.DECISION_LOGIC_LEVEL_VERIFICATION;
-
-import de.unikoblenz.fgbks.core.dmn.verfication.verifier.AbstractVerifier;
-import de.unikoblenz.fgbks.core.dmn.verfication.verifier.SampleVerifier;
-import java.io.Serializable;
-import javax.json.bind.annotation.JsonbProperty;
-import org.apache.commons.lang3.Validate;
-
-public enum VerificationType implements Serializable {
-  IDENTICAL_BUSINESS_RULE_VERIFICATION(
-      DECISION_LOGIC_LEVEL_VERIFICATION, "Identical Business Rules");
-
-  private VerificationTypeClassification classification;
-  private String name;
-  private String description;
-  private Class<? extends AbstractVerifier> verifierClass;
-
-  @JsonbProperty("classification")
-  public VerificationTypeClassification getClassification() {
-    return classification;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public AbstractVerifier createNewInstance() {
-    return new SampleVerifier();
-  }
-
-  VerificationType(VerificationTypeClassification classification, String name) {
-    this.classification = Validate.notNull(classification);
-    this.name = Validate.notBlank(name);
-  }
-}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationTypeClassification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationTypeClassification.java
deleted file mode 100644
index 7eaf523f..00000000
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/VerificationTypeClassification.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package de.unikoblenz.fgbks.core.dmn.verfication;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-public enum VerificationTypeClassification implements Serializable {
-  DECISION_LOGIC_LEVEL_VERIFICATION(
-      "Decision Logic Verification",
-      "",
-      new HashSet<>(Arrays.asList(VerificationType.IDENTICAL_BUSINESS_RULE_VERIFICATION)));
-
-  private String name;
-  private String description;
-  private Set<VerificationType> verificationTypes;
-
-  public String getName() {
-    return name;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public Set<VerificationType> getVerificationTypes() {
-    return new HashSet<>(verificationTypes);
-  }
-
-  VerificationTypeClassification(
-      String name, String description, Set<VerificationType> verificationTypes) {
-    this.name = name;
-    this.description = description;
-    this.verificationTypes = verificationTypes;
-  }
-}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationGenerator.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationGenerator.java
new file mode 100644
index 00000000..0d1a66f8
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/VerificationGenerator.java
@@ -0,0 +1,80 @@
+package de.unikoblenz.fgbks.core.dmn.verification;
+
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet.Builder;
+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.AbstractVerificationConfig;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.reflections.Reflections;
+
+public class VerificationGenerator {
+
+  public static final String CONF_VERIFIER_THREADS = "verifier.threads";
+  public static final String DEFAULT_PACKAGE = "de.unikoblenz.fgbks.core.dmn.verification.verifier";
+  public static final Integer DEFAULT_MAX_THREADS = 1;
+
+  public static VerifierResultSet generate() {
+    return generate(DEFAULT_PACKAGE, DEFAULT_MAX_THREADS);
+  }
+
+  public static VerifierResultSet generate(String packagePath, Integer maxThreads) {
+
+    Config config = ConfigProvider.getConfig();
+    maxThreads = config.getOptionalValue(CONF_VERIFIER_THREADS, Integer.class).orElse(maxThreads);
+
+    ExecutorService executor = Executors.newFixedThreadPool(maxThreads);
+
+    Builder resultBuilder = VerifierResultSet.getBuilder();
+
+    List<Future<VerifierResult>> results = new ArrayList<>(10);
+    System.out.println("Starting calculation with " + maxThreads + " threads.");
+
+    Reflections reflections = new Reflections(packagePath);
+    Set<Class<?>> verifierClasses = reflections.getTypesAnnotatedWith(DmnVerifier.class);
+
+    for (Class<?> verifierClass : verifierClasses) {
+      AbstractVerifier av = null;
+      try {
+        av = (AbstractVerifier) verifierClass.newInstance();
+      } catch (InstantiationException | IllegalAccessException e) {
+        e.printStackTrace();
+      }
+      if (av != null) {
+        // Create Configuration
+        AbstractVerificationConfig vConfig = null;
+        try {
+          vConfig =
+              av.getClass()
+                  .getAnnotation(DmnVerifier.class)
+                  .verifierVerificationConfigClass()
+                  .newInstance();
+        } catch (InstantiationException | IllegalAccessException ignored) {
+        }
+        results.add(av.withConfiguration(vConfig).verify(executor));
+      }
+    }
+
+    results.forEach(
+        r -> {
+          try {
+            resultBuilder.addVerifierResult(r.get());
+          } catch (InterruptedException e) {
+            e.printStackTrace();
+          } catch (ExecutionException e) {
+            e.printStackTrace();
+          }
+        });
+
+    return resultBuilder.build();
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/AbstractResultObject.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/AbstractResultObject.java
similarity index 92%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/AbstractResultObject.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/AbstractResultObject.java
index 755889a6..9a195561 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/AbstractResultObject.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/AbstractResultObject.java
@@ -1,4 +1,4 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.result;
 
 import de.unikoblenz.fgbks.base.utils.UniqueIdGenerator;
 import java.io.Serializable;
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/verification/result/VerificationResultEntry.java
similarity index 93%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntry.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntry.java
index 029dd51e..6662f4d3 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/verification/result/VerificationResultEntry.java
@@ -1,4 +1,4 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.result;
 
 import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
 import de.unikoblenz.fgbks.core.dmn.domain.Message;
@@ -42,7 +42,7 @@ public class VerificationResultEntry extends AbstractResultObject {
 
   @JsonbProperty("message")
   public Message getMessage() {
-    return new Message(message.getValue());
+    return new Message(message);
   }
 
   private void addVerificationResultEntry(
@@ -63,7 +63,7 @@ public class VerificationResultEntry extends AbstractResultObject {
     }
 
     public Builder withMessage(Message message) {
-      value.message = new Message(message.getValue());
+      value.message = new Message(message);
       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/verification/result/VerificationResultEntryElement.java
similarity index 93%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryElement.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryElement.java
index 032ce6df..f55b115c 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/verification/result/VerificationResultEntryElement.java
@@ -1,4 +1,4 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.result;
 
 import de.unikoblenz.fgbks.core.dmn.domain.id.AbstractId;
 import de.unikoblenz.fgbks.core.dmn.domain.id.JsonIdentifier;
@@ -13,7 +13,7 @@ public class VerificationResultEntryElement extends AbstractResultObject {
   private final Map<String, AbstractId> identifier;
 
   @JsonbProperty("identifier")
-  public Map<String, Object> getIdentifier() {
+  public Map<String, AbstractId> getIdentifier() {
     return new HashMap<>(identifier);
   }
 
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/verification/result/VerificationResultEntryFactory.java
similarity index 86%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerificationResultEntryFactory.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerificationResultEntryFactory.java
index bc651b98..5bba3ac6 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/verification/result/VerificationResultEntryFactory.java
@@ -1,8 +1,8 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.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 de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult.Builder;
 import org.apache.commons.lang3.Validate;
 
 public class VerificationResultEntryFactory {
@@ -46,7 +46,7 @@ public class VerificationResultEntryFactory {
         verificationResultEntryBuilder,
         "First call \"addElement\" in VerificationResultEntryFactory before calling \"addToEntry\"");
     verificationResultEntryBuilder.withClassification(verificationClassification);
-    verificationResultEntryBuilder.withMessage(message);
+    verificationResultEntryBuilder.withMessage(new Message(message));
     verifierResultBuilder.addVerificationResultEntry(verificationResultEntryBuilder.build());
     verificationResultEntryBuilder = null;
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResult.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResult.java
similarity index 73%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResult.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResult.java
index 61fc946d..14c336d2 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResult.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResult.java
@@ -1,8 +1,8 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.result;
 
 import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
-import de.unikoblenz.fgbks.core.dmn.verfication.VerificationType;
-import de.unikoblenz.fgbks.core.dmn.verfication.verifier.AbstractVerifier;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationType;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -23,21 +23,6 @@ public class VerifierResult extends AbstractResultObject {
     return verificationType;
   }
 
-  @JsonbProperty("type_name")
-  public String getVerificationTypeName() {
-    return verificationType.getName();
-  }
-
-  @JsonbProperty("type_description")
-  public String getVerificationTypeDescription() {
-    return verificationType.getDescription();
-  }
-
-  @JsonbProperty("type_classification")
-  public String getVerificationTypeClassification() {
-    return verificationType.getClassification().getName();
-  }
-
   @JsonbProperty("entries")
   public Set<VerificationResultEntry> getVerificationResultEntries() {
     return new HashSet<>(verificationResultEntries);
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResultSet.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResultSet.java
similarity index 95%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResultSet.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResultSet.java
index 7d949525..52ccf5d5 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/result/VerifierResultSet.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/result/VerifierResultSet.java
@@ -1,4 +1,4 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.result;
+package de.unikoblenz.fgbks.core.dmn.verification.result;
 
 import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
 import java.util.HashSet;
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/AbstractVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/AbstractVerifier.java
similarity index 52%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/AbstractVerifier.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/AbstractVerifier.java
index f88b1d2e..365401bb 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/AbstractVerifier.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/AbstractVerifier.java
@@ -1,16 +1,19 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.verifier;
+package de.unikoblenz.fgbks.core.dmn.verification.verifier;
 
-import de.unikoblenz.fgbks.core.dmn.verfication.VerificationType;
-import de.unikoblenz.fgbks.core.dmn.verfication.result.VerificationResultEntryFactory;
-import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResult;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryFactory;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.config.AbstractVerificationConfig;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationType;
 import java.util.Objects;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import org.apache.commons.lang3.Validate;
 
 public abstract class AbstractVerifier implements Verifier {
 
   protected VerificationType verificationType;
+  protected AbstractVerificationConfig verificationConfig;
   private VerifierResult.Builder resultBuilder;
   protected VerificationResultEntryFactory vref;
 
@@ -18,17 +21,29 @@ public abstract class AbstractVerifier implements Verifier {
     return verificationType;
   }
 
-  public AbstractVerifier(VerificationType verificationType) {
-    this.verificationType = verificationType;
+  public final AbstractVerifier withConfiguration(AbstractVerificationConfig configuration) {
+    this.verificationConfig = Validate.notNull(configuration);
+    return this;
+  }
+
+  protected AbstractVerifier() {
+    try {
+      this.verificationType =
+          this.getClass().getAnnotation(DmnVerifier.class).verifierTypeClass().newInstance();
+    } catch (InstantiationException | IllegalAccessException e) {
+      e.printStackTrace();
+    }
     resultBuilder = VerifierResult.getBuilder().fromVerifier(this);
     vref = VerificationResultEntryFactory.create(resultBuilder);
   }
 
   public final Future<VerifierResult> verify(ExecutorService executor) {
+    Validate.notNull(verificationConfig, "Validation config has to been set.");
+    Validate.notNull(executor);
     return executor.submit((Callable<VerifierResult>) this::verify);
   }
 
-  public final VerifierResult verify() {
+  private VerifierResult verify() {
     doVerification();
     return resultBuilder.build();
   }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/DmnVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/DmnVerifier.java
new file mode 100644
index 00000000..a0a901fd
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/DmnVerifier.java
@@ -0,0 +1,19 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier;
+
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.config.AbstractVerificationConfig;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.config.DefaultConfiguration;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationType;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DmnVerifier {
+
+  Class<? extends VerificationType> verifierTypeClass();
+
+  Class<? extends AbstractVerificationConfig> verifierVerificationConfigClass() default
+      DefaultConfiguration.class;
+}
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/verification/verifier/SampleVerifier.java
similarity index 58%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/SampleVerifier.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/SampleVerifier.java
index 0edc2e93..c6104e2d 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/verification/verifier/SampleVerifier.java
@@ -1,19 +1,19 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.verifier;
+package de.unikoblenz.fgbks.core.dmn.verification.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 static de.unikoblenz.fgbks.core.dmn.verification.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;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.config.DefaultConfiguration;
+import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.IdenticalBusinessRuleVerification;
 
+@DmnVerifier(
+    verifierTypeClass = IdenticalBusinessRuleVerification.class,
+    verifierVerificationConfigClass = DefaultConfiguration.class)
 public class SampleVerifier extends AbstractVerifier {
 
-  public SampleVerifier() {
-    super(IDENTICAL_BUSINESS_RULE_VERIFICATION);
-  }
-
   @Override
   protected void doVerification() {
     vref.addElement(
@@ -28,7 +28,7 @@ public class SampleVerifier extends AbstractVerifier {
             .withIdentifier(new RuleId("asdasd")));
     vref.addToEntry(ERROR, "My sample message");
     try {
-      Thread.sleep(1500);
+      Thread.sleep(1);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/Verifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/Verifier.java
similarity index 56%
rename from dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/Verifier.java
rename to dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/Verifier.java
index dbc438c8..695ab043 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verfication/verifier/Verifier.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/Verifier.java
@@ -1,6 +1,6 @@
-package de.unikoblenz.fgbks.core.dmn.verfication.verifier;
+package de.unikoblenz.fgbks.core.dmn.verification.verifier;
 
-import de.unikoblenz.fgbks.core.dmn.verfication.result.VerifierResult;
+import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/AbstractVerificationConfig.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/AbstractVerificationConfig.java
new file mode 100644
index 00000000..eb1eb0c8
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/AbstractVerificationConfig.java
@@ -0,0 +1,22 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.config;
+
+import java.util.HashMap;
+import org.apache.commons.lang3.Validate;
+
+public abstract class AbstractVerificationConfig {
+
+  private HashMap<String, Object> configurationProperties;
+
+  public Object getConfiguration(String key) {
+    return configurationProperties.get(key);
+  }
+
+  protected AbstractVerificationConfig withConfigurationProperty(String key, Object value) {
+    configurationProperties.put(Validate.notNull(key), Validate.notNull(value));
+    return this;
+  }
+
+  protected AbstractVerificationConfig() {
+    configurationProperties = new HashMap<>();
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DefaultConfiguration.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DefaultConfiguration.java
new file mode 100644
index 00000000..6468f862
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DefaultConfiguration.java
@@ -0,0 +1,24 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.config;
+
+import de.unikoblenz.fgbks.base.builder.DefaultBuilder;
+
+public class DefaultConfiguration extends AbstractVerificationConfig {
+
+  public static final String DMN_DECISION_TABLE = "DmnDecisionTable";
+
+  public DefaultConfiguration() {
+    super();
+  }
+
+  public static Builder getBuilder() {
+    return new DefaultConfiguration().new Builder();
+  }
+
+  public class Builder extends DefaultBuilder<DefaultConfiguration> {
+
+    public Builder withDmnDecisionTable(String x) {
+      value.withConfigurationProperty(DMN_DECISION_TABLE, x);
+      return this;
+    }
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DmnVerifierConfigProperty.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DmnVerifierConfigProperty.java
new file mode 100644
index 00000000..f3f711cf
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/config/DmnVerifierConfigProperty.java
@@ -0,0 +1,6 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.config;
+
+public @interface DmnVerifierConfigProperty {
+
+  String key();
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/AbstractVerificationType.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/AbstractVerificationType.java
new file mode 100644
index 00000000..6b57fae4
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/AbstractVerificationType.java
@@ -0,0 +1,3 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+public abstract class AbstractVerificationType implements VerificationType {}
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
new file mode 100644
index 00000000..d51273ec
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java
@@ -0,0 +1,24 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+import static de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationTypeClassification.*;
+
+import de.unikoblenz.fgbks.core.dmn.domain.Description;
+import de.unikoblenz.fgbks.core.dmn.domain.Name;
+
+public class IdenticalBusinessRuleVerification extends AbstractVerificationType {
+
+  @Override
+  public VerificationTypeClassification getClassification() {
+    return DECISION_LOGIC_LEVEL_VERIFICATION;
+  }
+
+  @Override
+  public Name getName() {
+    return new Name(this.getClass().getSimpleName());
+  }
+
+  @Override
+  public Description getDescription() {
+    return new Description("test");
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationType.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationType.java
new file mode 100644
index 00000000..bfe01010
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationType.java
@@ -0,0 +1,22 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+import de.unikoblenz.fgbks.base.value.ValueObject;
+import de.unikoblenz.fgbks.core.dmn.domain.Description;
+import de.unikoblenz.fgbks.core.dmn.domain.Name;
+import javax.json.bind.annotation.JsonbProperty;
+import javax.validation.constraints.NotNull;
+
+public interface VerificationType extends ValueObject {
+
+  @NotNull
+  @JsonbProperty("classification")
+  VerificationTypeClassification getClassification();
+
+  @NotNull
+  @JsonbProperty("name")
+  Name getName();
+
+  @NotNull
+  @JsonbProperty("description")
+  Description getDescription();
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationTypeClassification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationTypeClassification.java
new file mode 100644
index 00000000..e6b1a003
--- /dev/null
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/VerificationTypeClassification.java
@@ -0,0 +1,25 @@
+package de.unikoblenz.fgbks.core.dmn.verification.verifier.types;
+
+import de.unikoblenz.fgbks.base.value.ValueObject;
+import de.unikoblenz.fgbks.core.dmn.domain.Description;
+import de.unikoblenz.fgbks.core.dmn.domain.Name;
+
+public enum VerificationTypeClassification implements ValueObject {
+  DECISION_LOGIC_LEVEL_VERIFICATION("Decision Logic Verification", "description of classification");
+
+  private Name name;
+  private Description description;
+
+  public Name getName() {
+    return name;
+  }
+
+  public Description getDescription() {
+    return description;
+  }
+
+  VerificationTypeClassification(String name, String description) {
+    this.name = new Name(name);
+    this.description = new Description(description);
+  }
+}
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Person.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Person.java
index 2da218fd..140a92d5 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Person.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/test/Person.java
@@ -1,5 +1,6 @@
 package de.unikoblenz.fgbks.core.test;
 
+import de.unikoblenz.fgbks.core.dmn.domain.Name;
 import java.io.Serializable;
 import java.util.Objects;
 
-- 
GitLab