diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java index 634f867459b0c6bfb88e0ce51fcd20cce26cfdf5..b8ba1308f5adfa4634dc6e9ba24b9cf9847db777 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/BooleanBoundary.java @@ -31,14 +31,12 @@ public class BooleanBoundary extends AbstractGrowingBoundary<Boolean> { if (text.trim().isEmpty()) { lowerBound = getMinValue(); upperBound = getMaxValue(); - } - if (TRUE_STRING.equals(text.toLowerCase())) { + } else if (TRUE_STRING.equals(text.toLowerCase())) { lowerBound = upperBound = getMaxValue(); - } - if (FALSE_STRING.equals(text.toLowerCase())) { + } else if (FALSE_STRING.equals(text.toLowerCase())) { lowerBound = upperBound = getMinValue(); } else { - throw new BoundaryParseException("Boolean value cloud not be parsed. " + text); + throw new BoundaryParseException("Boolean value cloud not be parsed: " + text); } } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java index 9075ea9475ad775111ef60f0450540814ac644b0..3ffd379c1201b0e0ee08b18d202ee444bf731f26 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DateBoundary.java @@ -96,7 +96,7 @@ public class DateBoundary extends AbstractGrowingBoundary<LocalDateTime> { throw new IllegalArgumentException(); } } catch (Exception e) { - throw new BoundaryParseException("Date value " + text + " couldn't be parsed."); + throw new BoundaryParseException("Date value " + this.getText() + " couldn't be parsed."); } } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java index 7dfc6f21c60ba2ca97bf4f7691334c02344d7074..3d1acde6ee8464482951d0c812ec5c93868faeaf 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/DoubleBoundary.java @@ -62,7 +62,8 @@ public class DoubleBoundary extends AbstractGrowingBoundary<Double> { } } catch (Exception e) { throw new BoundaryParseException( - String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage())); + String.format( + "Parsing Double boundary failed: %s. Exception: %s", this.getText(), e.getMessage())); } } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java index 18156bf2aeb9e7793666167f97f9ccae1ee4f8be..b2d5a7905edaa1c587a4bce5b64c09e8bd4c0963 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/IntegerBoundary.java @@ -62,7 +62,9 @@ public class IntegerBoundary extends AbstractGrowingBoundary<Integer> { } } catch (Exception e) { throw new BoundaryParseException( - String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage())); + String.format( + "Parsing Integer boundary failed: %s. Exception: %s", + this.getText(), e.getMessage())); } simplifyBound(); } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java new file mode 100644 index 0000000000000000000000000000000000000000..31a98ec19c0021fa91656fddd5b9fc79d8771461 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/InvalidBoundary.java @@ -0,0 +1,36 @@ +package de.unikoblenz.fgbks.base.utils.boundary.impl; + +import de.unikoblenz.fgbks.base.utils.boundary.Boundary; +import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef; + +public class InvalidBoundary implements Boundary { + + private static InvalidBoundary instance = new InvalidBoundary(); + + private InvalidBoundary() {} + + public static InvalidBoundary getInstance() { + return instance; + } + + @Override + public VTypeRef getTypeRef() { + return null; + } + + @Override + public String getText() { + return "null"; + } + + @Override + public boolean checkWith(BoundaryCheckType checkType, Boundary other) { + return false; + } + + @Override + public int compareTo(Boundary o) { + return 0; + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java index f449c3058a42577b4afc87f14edfa2bded477c7d..162c040494c46f934649e15bcb15ec3619374152 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/LongBoundary.java @@ -62,7 +62,8 @@ public class LongBoundary extends AbstractGrowingBoundary<Long> { } } catch (Exception e) { throw new BoundaryParseException( - String.format("Parsing boundary failed: %s. Exception: %s", text, e.getMessage())); + String.format( + "Parsing Long boundary failed: %s. Exception: %s", this.getText(), e.getMessage())); } simplifyBound(); } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java index 84b4254ad217bf43259b606fc0eb4c2b96418928..2041c38d8e998ecba2f2aa1c968c6889eac85cba 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/impl/StringBoundary.java @@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.base.utils.boundary.impl; import de.unikoblenz.fgbks.base.utils.boundary.AbstractBoundary; import de.unikoblenz.fgbks.base.utils.boundary.Boundary; +import de.unikoblenz.fgbks.base.utils.boundary.BoundaryParseException; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; import java.util.Arrays; @@ -28,19 +29,26 @@ public class StringBoundary extends AbstractBoundary<String> { @Override protected void parse(String text) { matchNoneOfValues = false; - matchAny = Validate.notNull(text).isEmpty(); - if (!matchAny) { - matchNoneOfValues = text.toLowerCase().startsWith("not"); - text = text.replace('(', '\0').replace(')', '\0').trim(); - if (matchNoneOfValues) { - text = text.replaceFirst("not", "").trim(); - } - values = text.split(","); - valuesHashes = new int[values.length]; - for (int i = 0; i < values.length; i++) { - values[i] = values[i].replace('"', '\0').trim(); - valuesHashes[i] = Objects.hashCode(values[i]); + matchAny = false; + try { + matchAny = Validate.notNull(text).isEmpty(); + if (matchAny) { + values = new String[0]; + } else { + matchNoneOfValues = text.toLowerCase().startsWith("not"); + text = text.replace('(', '\0').replace(')', '\0').trim(); + if (matchNoneOfValues) { + text = text.replaceFirst("not", "").trim(); + } + values = text.split(","); + valuesHashes = new int[values.length]; + for (int i = 0; i < values.length; i++) { + values[i] = values[i].replace('"', '\0').trim(); + valuesHashes[i] = Objects.hashCode(values[i]); + } } + } catch (Exception e) { + throw new BoundaryParseException("String value is not valid: " + this.getText()); } } @@ -51,7 +59,7 @@ public class StringBoundary extends AbstractBoundary<String> { @Override protected HashMap<BoundaryCheckType, BoundaryCheck> getChecker() { - return null; + return new HashMap<>(); } @Override diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java index c01c662eae205e6bb473f0e7c68e6485a9f8c2e1..bd284bf3bab50e3611f014ba20868f761843f693 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/domain/vdmn/VTypeRef.java @@ -5,6 +5,7 @@ import de.unikoblenz.fgbks.base.utils.boundary.impl.BooleanBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.DateBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.DoubleBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary; +import de.unikoblenz.fgbks.base.utils.boundary.impl.InvalidBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; import java.time.LocalDateTime; @@ -52,9 +53,8 @@ public enum VTypeRef { try { return Optional.of(boundaryClass.getDeclaredConstructor(String.class).newInstance(text)); } catch (Exception ignored) { - // nothing + return Optional.of(InvalidBoundary.getInstance()); } - return Optional.empty(); } VTypeRef(String name, Class<?> javaClass, Class<? extends Boundary> boundaryClass) { diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java new file mode 100644 index 0000000000000000000000000000000000000000..fc690546cbdd848834bce6a27f88552ddafcf345 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/InputValueSyntaxVerifier.java @@ -0,0 +1,39 @@ +package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl; + +import de.unikoblenz.fgbks.base.utils.boundary.impl.InvalidBoundary; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnInputValue; +import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef; +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.config.DefaultConfiguration; +import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.InputValueSyntaxVerification; + +@DmnVerifier( + verifierType = InputValueSyntaxVerification.class, + verifierConfig = DefaultConfiguration.class) +public class InputValueSyntaxVerifier extends AbstractVerifier { + + @Override + protected void doVerification() { + dmnObjectContainer.getvDmnDefinition().getDmnDecisions().stream() + .flatMap( + d -> + d.getDmnDecisionTable().getRules().stream() + .flatMap(r -> r.getDmnInputValues().stream())) + .forEach(v -> check(v)); + } + + private void check(VDmnInputValue inputValue) { + // no Date, because of extra DateVerifier + if (inputValue.getDmnColumn().getTypeRef() != VTypeRef.DATE + && inputValue.getBoundary() instanceof InvalidBoundary) { + vref.addElement(VerificationResultEntryElement.create(inputValue)); + vref.addToEntry( + VerificationClassification.FATAL_ERROR, + "Input value is not valid: " + inputValue.getText()); + System.out.println(inputValue.getText() + " IS INVALID SYNTAX"); + } + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java index 6866dfed8d00a011c3f00beb60f36aef9f7bdec2..b34199f759a289bea89214af2e4bba6620693ebb 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/EmptyOutputVerification.java @@ -2,16 +2,17 @@ package de.unikoblenz.fgbks.core.dmn.verification.verifier.types; import de.unikoblenz.fgbks.base.domain.Description; import de.unikoblenz.fgbks.base.domain.Name; +import javax.validation.constraints.NotNull; public class EmptyOutputVerification extends AbstractVerificationType { @Override - public VerificationTypeClassification getClassification() { + public @NotNull VerificationTypeClassification getClassification() { return VerificationTypeClassification.SYNTAX_LEVEL_VERIFICATION; } @Override - public Name getName() { + public @NotNull Name getName() { return new Name("Empty output check"); } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java index 647f92db3b04d915f4771ad034626513f63cee41..cb5dcebd494434a5aef53566de54e8dc6730f9d6 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java @@ -1,24 +1,25 @@ package de.unikoblenz.fgbks.core.dmn.verification.verifier.types; -import static de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationTypeClassification.*; +import static de.unikoblenz.fgbks.core.dmn.verification.verifier.types.VerificationTypeClassification.DECISION_LOGIC_LEVEL_VERIFICATION; import de.unikoblenz.fgbks.base.domain.Description; import de.unikoblenz.fgbks.base.domain.Name; +import javax.validation.constraints.NotNull; public class IdenticalBusinessRuleVerification extends AbstractVerificationType { @Override - public VerificationTypeClassification getClassification() { + public @NotNull VerificationTypeClassification getClassification() { return DECISION_LOGIC_LEVEL_VERIFICATION; } @Override - public Name getName() { + public @NotNull Name getName() { return new Name(this.getClass().getSimpleName()); } @Override - public Description getDescription() { + public @NotNull Description getDescription() { return new Description("test"); } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java new file mode 100644 index 0000000000000000000000000000000000000000..fb9aeeac682945c6b8b3cbe6d980277ecc5921f0 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/InputValueSyntaxVerification.java @@ -0,0 +1,23 @@ +package de.unikoblenz.fgbks.core.dmn.verification.verifier.types; + +import de.unikoblenz.fgbks.base.domain.Description; +import de.unikoblenz.fgbks.base.domain.Name; +import javax.validation.constraints.NotNull; + +public class InputValueSyntaxVerification extends AbstractVerificationType { + + @Override + public @NotNull VerificationTypeClassification getClassification() { + return VerificationTypeClassification.SYNTAX_LEVEL_VERIFICATION; + } + + @Override + public @NotNull Name getName() { + return new Name(this.getClass().getSimpleName()); + } + + @Override + public @NotNull Description getDescription() { + return new Description("Check values for syntactical correctness."); + } +}