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