diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnColumn.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnColumn.java index 0368d782ac59edbf3637b768ca38dd0fc16b0903..c4487cdeb81dcf9810a597257239fcb1182928ba 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnColumn.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnColumn.java @@ -20,6 +20,26 @@ public interface VDmnColumn extends VDmnElement { */ VDmnDecisionTable getDmnDecisionTable(); + /** + * Check, if the given column is a {@link VDmnInputColumn}. If this method returns true, than + * {@link VDmnColumn#isOutputColumn()} returns false. + * + * @return true, if the current column is a input column + */ + default boolean isInputColumn() { + return this instanceof VDmnInputColumn; + } + + /** + * Check, if the given column is a {@link VDmnOutputColumn}. If this method returns true, than + * {@link VDmnColumn#isInputColumn()} returns false. + * + * @return true, if the current column is a output column + */ + default boolean isOutputColumn() { + return this instanceof VDmnOutputColumn; + } + /** * Get the list of predefined {@link StringValue}s, if the column has the type {@link * VTypeRef#STRING} and the model contains these values. diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnValue.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnValue.java index cf33286d8bb9bf364a1a051950679e3b1fb52cc3..4b1821aaba9b89987bb338859aa65163fb605652 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnValue.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VDmnValue.java @@ -115,7 +115,7 @@ public interface VDmnValue extends VDmnElement { * @return true, if the value is a input value */ default boolean isInputValue() { - return getDmnColumn() instanceof VDmnInputColumn; + return getDmnColumn().isInputColumn(); } /** @@ -124,7 +124,7 @@ public interface VDmnValue extends VDmnElement { * @return true, if the value is a output value */ default boolean isOutputValue() { - return getDmnColumn() instanceof VDmnOutputColumn; + return getDmnColumn().isOutputColumn(); } /** diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.java new file mode 100644 index 0000000000000000000000000000000000000000..25f61e58602a13caa8afb9b96957a91791396756 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/classification/ModelingLevelVerification.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 ModelingLevelVerification extends AbstractClassificationType { + + private static final ModelingLevelVerification instance = + new ModelingLevelVerification(); + + private ModelingLevelVerification() { + super(new Name("Modeling"), new Description("test")); // TODO + } + + public static ModelingLevelVerification getInstance() { + return instance; + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java new file mode 100644 index 0000000000000000000000000000000000000000..aef754da4061b7c77d9b3b3b8cba51c7c5476ed2 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java @@ -0,0 +1,86 @@ +package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl; + +import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_INPUT_ENTRIES; +import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_OUTPUT_ENTRIES; + +import de.unikoblenz.fgbks.base.domain.StringValue; +import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnColumn; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputValue; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnOutputValue; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnValue; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions; +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.PredefinedExistingValueVerification; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +@DmnVerifier(verifierType = PredefinedExistingValueVerification.class) +public class PredefinedExistingValueVerifier extends AbstractVerifier { + + @Override + protected void doVerification() { + for (VDmnColumn stringColumn : + VDmnFunctions.getColumnsByTypeRef( + dmnObjectContainer.getVDmnDefinition(), VTypeRef.STRING)) { + checkStringColumns(stringColumn); + } + } + + private void checkStringColumns(VDmnColumn stringColumn) { + // Check, if there are PredefinedValues defined + boolean predefinedValuesArePresent = stringColumn.getPredefinedValues().isPresent(); + Set<String> predefinedValues = new HashSet<>(); + if (predefinedValuesArePresent) { + predefinedValues = + stringColumn.getPredefinedValues().get().stream() + .map(StringValue::getValue) + .collect(Collectors.toSet()); + } + for (VDmnValue stringValue : stringColumn.getValues()) { + // do not check empty values + if (!stringValue.getText().getValue().isEmpty()) { + if (stringValue.isInputValue()) { + checkStringValue((VDmnInputValue) stringValue, predefinedValues); + } else { + checkStringValue((VDmnOutputValue) stringValue, predefinedValues); + } + } + } + } + + private void checkStringValue(VDmnOutputValue stringValue, Set<String> predefinedValues) { + // get the Text and remove the " + String parsedOutputText = stringValue.getText().getValue().replace('"', '\0').trim(); + if (!predefinedValues.contains(parsedOutputText)) { + addToResult(stringValue, parsedOutputText); + } + } + + private void checkStringValue(VDmnInputValue stringValue, Set<String> predefinedValues) { + // Do check with input boundary + if (stringValue.getBoundary() instanceof StringBoundary) { + StringBoundary sb = (StringBoundary) stringValue.getBoundary(); + for (String s : sb.getValues()) { + if (!predefinedValues.contains(s)) { + addToResult(stringValue, s); + } + } + } + } + + private void addToResult(VDmnValue stringValue, String missingStringValue) { + vreFactory.addElement(VerificationResultEntryElement.create(stringValue)); + vreFactory.addVerificationFix( + stringValue.isInputValue() ? SHOW_INPUT_ENTRIES : SHOW_OUTPUT_ENTRIES); + vreFactory.addToEntry( + VerificationClassification.WARNING, + "String value \"%s\" was not found in the list of predefined values.", + missingStringValue); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/PredefinedExistingValueVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/PredefinedExistingValueVerification.java new file mode 100644 index 0000000000000000000000000000000000000000..c15ae69f9f7d523f445fc9b22389a0c4d778f8f2 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/PredefinedExistingValueVerification.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.ModelingLevelVerification; +import javax.validation.constraints.NotNull; + +@Type +public class PredefinedExistingValueVerification extends AbstractVerificationType { + + private static final PredefinedExistingValueVerification instance = new PredefinedExistingValueVerification(); + + private PredefinedExistingValueVerification() { + super( + new Name("PredefinedExistingValueVerification"), + new Description( + "Es gibt in einer Tabellen-Zelle einen String Value, der aber nicht in der Liste der " + + "Predefines Values vorgesehen ist.")); // TODO englisch + } + + public static PredefinedExistingValueVerification getInstance() { + return instance; + } + + @Override + public @NotNull ClassificationType getClassification() { + return ModelingLevelVerification.getInstance(); + } +}