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 e1be6f7a452f6e046d7cf1b2ee18f5a40d3ec4f6..d93f22cf53341b3b1c42c35c0b9e91895889866d 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 0000000000000000000000000000000000000000..d498c3e3f456ab9f4ab7f91761520cbda29fe6c5 --- /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 0000000000000000000000000000000000000000..1aea630323759b6d0877b853ee7f7679f05f3a44 --- /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 021c0e6ee39d3ebb75f6aaf1b16ba2c317e60128..e58b900e735a8b12dd2e825d7fae40809eef6126 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)