From af4ef1452d8191f89e2bfabd7a976d09a6a74b2c Mon Sep 17 00:00:00 2001 From: Jonas Blatt <jonasblatt@uni-koblenz.de> Date: Wed, 23 Oct 2019 09:54:11 +0200 Subject: [PATCH] #22 Add Verifier: Multiple Input data of the same input column --- .../impl/MultipleInputDataVerifier.java | 84 +++++++++++++++++++ .../types/MultipleInputDataVerification.java | 30 +++++++ dmnverifierapi/verifier.md | 12 +++ 3 files changed, 126 insertions(+) create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MultipleInputDataVerifier.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MultipleInputDataVerification.java diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MultipleInputDataVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MultipleInputDataVerifier.java new file mode 100644 index 00000000..d28b1f8b --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MultipleInputDataVerifier.java @@ -0,0 +1,84 @@ +package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl; + +import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.getColumnStringName; +import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.templateDecision; +import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action.ACTION_SHOW_DECISION; +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.VerificationFix.DEFAULT_SHOW_NAME; + +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.result.actions.VerificationFix; +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.MultipleInputDataVerification; +import java.util.ArrayList; +import java.util.List; + +@DmnVerifier(verifierType = MultipleInputDataVerification.class) +public class MultipleInputDataVerifier 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 more than one input data nodes or output columns + // from decision nodes + for (VDmnInputColumn inputColumn : decision.getDmnDecisionTable().getInputColumns()) { + checkMultipleInputData(inputColumn, inputNodes); + } + } + } + + private void checkMultipleInputData(VDmnInputColumn inputColumn, List<VDmnNode> inputNodes) { + List<VDmnNode> matchingNodes = new ArrayList<>(); + // if the inputColumn has no name, add the column + if (inputColumn.getName().isPresent()) { + // Counter + 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)) { + matchingNodes.add(node); + } + } 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)) { + matchingNodes.add(node); + } + } + } + } + } + // if founded list of input nodes > 1 --> Add to result + if (matchingNodes.size() > 1) { + matchingNodes.forEach(n -> vreFactory.addElement(VerificationResultEntryElement.create(n))); + vreFactory + .addElement(VerificationResultEntryElement.create(inputColumn)) + .addVerificationFix( + VerificationFix.getBuilder() + .withFixName(DEFAULT_SHOW_NAME) + .addAction(ACTION_SHOW_INPUT_COLUMNS) + .addAction(ACTION_SHOW_INPUT_DATA) + .addAction(ACTION_SHOW_DECISION) + .build()) + .addToEntry( + VerificationClassification.WARNING, + templateDecision(inputColumn.getDmnDecision()) + + "Input column \"%s\" has multiple input data node.", + getColumnStringName(inputColumn)); + } + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MultipleInputDataVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MultipleInputDataVerification.java new file mode 100644 index 00000000..98103887 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MultipleInputDataVerification.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 MultipleInputDataVerification extends AbstractVerificationType { + + private static final MultipleInputDataVerification instance = new MultipleInputDataVerification(); + + private MultipleInputDataVerification() { + super( + new Name("MultipleInputDataVerification"), + new Name("Multiple Input Data"), + new Description( + "Detecting columns which has more than one input data (or output columns from decisions).")); + } + + public static MultipleInputDataVerification getInstance() { + return instance; + } + + @Override + public @NotNull ClassificationType getClassification() { + return DrdModelingLevelVerification.getInstance(); + } +} diff --git a/dmnverifierapi/verifier.md b/dmnverifierapi/verifier.md index 995bc297..f59d9942 100644 --- a/dmnverifierapi/verifier.md +++ b/dmnverifierapi/verifier.md @@ -52,6 +52,18 @@ Detecting for all decisions and input data nodes if their output names are found TODO ``` +### Multiple Input Data Verification +- Type: [MultipleInputDataVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/MultipleInputDataVerification.java) +- Verifier: [MultipleInputDataVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MultipleInputDataVerifier.java) + +#### Description +Detecting columns which has more than one input data (or output columns from decisions). + +#### Algorithm +``` +TODO +``` + ## Modeling Level Verification - Classification: [ModelingLevelVerification](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.java) -- GitLab