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 d25bbe5016a31cdbdea1bb96bcd66ae8f0b17a33..9fc648783c6424d961e69944af696b94c43940c7 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 43d7797930ea92f104ba73ac1f5eca405537ae38..9586c99acf32edf0e236d8fedfd2c458a8bd490a 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 5988bfa9981bad4b7f0d22e8617352b4f1a42c54..2a529ed1352d704ee095196af661512d767c4cc3 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 32f837e0fdb44110d8c3aaca55e344e8f3352b9d..a0430635346f11ef21577ff05d6c4ff3b41abe97 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 0000000000000000000000000000000000000000..6de26519a2b797c7da11ef380ae6a4464ea08464 --- /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 0000000000000000000000000000000000000000..231b3da7bc1a669a0c7af973a01b4bb502a989b2 --- /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 0000000000000000000000000000000000000000..201bfa5aef1e5354d907e2096ca0f81be6075d0e --- /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(); + } +}