From 445c3e6d558dbf123992939dcfadaa5526db6e77 Mon Sep 17 00:00:00 2001 From: Jonas Blatt <jonasblatt@uni-koblenz.de> Date: Sat, 12 Oct 2019 11:53:27 +0200 Subject: [PATCH] Add missing input data verifier --- .../fgbks/core/dmn/domain/vdmn/VDmnNode.java | 18 +++++ .../impl/MissingInputDataVerifier.java | 71 +++++++++++++++++++ .../types/MissingInputDataVerification.java | 30 ++++++++ dmnverifierapi/verifier.md | 11 +++ 4 files changed, 130 insertions(+) create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingInputDataVerification.java diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnNode.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnNode.java index e1be6f7a..d93f22cf 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnNode.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnNode.java @@ -31,4 +31,22 @@ public interface VDmnNode extends VDmnElement { * @return an optional {@link Name} */ Optional<Name> getName(); + + /** + * Check, if the node is a {@link VDmnDecision} node. + * + * @return true, if the node is a {@link VDmnDecision} + */ + default boolean isDecision() { + return this instanceof VDmnDecision; + } + + /** + * Check, if the node is a {@link VDmnInputData} node. + * + * @return true, if the node is a {@link VDmnInputData} + */ + default boolean isInputData() { + return this instanceof VDmnInputData; + } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java new file mode 100644 index 00000000..d498c3e3 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java @@ -0,0 +1,71 @@ +package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl; + +import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_INPUT_COLUMNS; + +import de.unikoblenz.fgbks.base.domain.Name; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDecision; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputColumn; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnNode; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnOutputColumn; +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.MissingInputDataVerification; +import java.util.List; + +@DmnVerifier(verifierType = MissingInputDataVerification.class) +public class MissingInputDataVerifier extends AbstractVerifier { + + @Override + protected void doVerification() { + for (VDmnDecision decision : dmnObjectContainer.getVDmnDefinition().getDmnDecisions()) { + List<VDmnNode> inputNodes = decision.getDmnInformationRequirements(); + // Check for each input column if there is one input data node or one output column from a + // decision node + for (VDmnInputColumn inputColumn : decision.getDmnDecisionTable().getInputColumns()) { + checkExistingInputData(inputColumn, inputNodes); + } + } + } + + private void checkExistingInputData(VDmnInputColumn inputColumn, List<VDmnNode> inputNodes) { + // if the inputColumn has no name, add the column + if (inputColumn.getName().isPresent()) { + Name inputColumnName = inputColumn.getName().get(); + // check, if there is one input Data with the same name + for (VDmnNode node : inputNodes) { + // input Data node, check only the name + if (node.isInputData()) { + if (node.getName().isPresent() && node.getName().get().equals(inputColumnName)) { + return; + } + } else if (node.isDecision()) { + VDmnDecision decision = (VDmnDecision) node; + // check for each output column, if the name of the output column matches the input column + // name + for (VDmnOutputColumn outputColumn : decision.getDmnDecisionTable().getOutputColumns()) { + if (outputColumn.getName().isPresent() + && outputColumn.getName().get().equals(inputColumnName)) { + return; + } + } + } + } + } + // no input data found yet -> add column to results + String label = ""; + if (inputColumn.getLabel().isPresent()) { + label = inputColumn.getLabel().get().getValue(); + } else if (inputColumn.getName().isPresent()) { + label = inputColumn.getName().get().getValue(); + } else { + label = "no name"; + } + vreFactory + .addElement(VerificationResultEntryElement.create(inputColumn)) + .addVerificationFix(SHOW_INPUT_COLUMNS) + .addToEntry( + VerificationClassification.WARNING, "Input column \"%s\" has no input data.", label); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingInputDataVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingInputDataVerification.java new file mode 100644 index 00000000..1aea6303 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingInputDataVerification.java @@ -0,0 +1,30 @@ +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 MissingInputDataVerification extends AbstractVerificationType { + + private static final MissingInputDataVerification instance = + new MissingInputDataVerification(); + + private MissingInputDataVerification() { + super( + new Name("MissingInputDataVerification"), + new Description( + "todo")); // TODO englisch + } + + public static MissingInputDataVerification getInstance() { + return instance; + } + + @Override + public @NotNull ClassificationType getClassification() { + return DrdModelingLevelVerification.getInstance(); + } +} diff --git a/dmnverifierapi/verifier.md b/dmnverifierapi/verifier.md index 021c0e6e..e58b900e 100644 --- a/dmnverifierapi/verifier.md +++ b/dmnverifierapi/verifier.md @@ -28,6 +28,17 @@ doVerification (Definition d) { } ``` +### Missing Input Data Verification +- Type: [MissingInputDataVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MissingInputDataVerification.java) +- Verifier: [MissingInputDataVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java) + +#### Description + +#### Algorithm +``` +TODO +``` + ## Modeling Level Verification - Classification: [ModelingLevelVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.java) -- GitLab