diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java index fd5e6c9ff9e71a569f38fb1c34d949bb047fba4a..af0c490975fb8a43bdf93cb1a57fe3a9d83bbf92 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractBoundary.java @@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.base.utils.boundary; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; +import de.unikoblenz.fgbks.base.utils.boundary.impl.InvalidBoundary; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef; import java.util.HashMap; import org.apache.commons.lang3.Validate; @@ -32,6 +33,9 @@ public abstract class AbstractBoundary<T extends Comparable<? super T>> implemen @Override public boolean checkWith(BoundaryCheckType checkType, Boundary other) { + if (other instanceof InvalidBoundary) { + return false; + } BoundaryCheck checkFunction = getTestFunction(checkType); if (checkFunction == null || !isValidOperation(checkType, other)) { throw new BoundaryOperationNotSupportedException(); // TODO: add error text diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java index 9dc1ed2787a2e6321076b1e42d81e1f3fe8078ad..a0ce4f868c06dea827c575d41458234e8356efef 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqual.java @@ -4,16 +4,13 @@ import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; public class CheckEqual extends AbstractBoundaryCheck<AbstractGrowingBoundary> { - private static CheckEqual instance; + private static final CheckEqual instance = new CheckEqual(); private CheckEqual() { super(); } public static CheckEqual getInstance() { - if (instance == null) { - instance = new CheckEqual(); - } return instance; } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqualString.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqualString.java new file mode 100644 index 0000000000000000000000000000000000000000..e27fa98094e2dbd870fb84d7dae34738ea9bffae --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/checker/CheckEqualString.java @@ -0,0 +1,37 @@ +package de.unikoblenz.fgbks.base.utils.boundary.checker; + +import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; + +public class CheckEqualString extends AbstractBoundaryCheck<StringBoundary> { + + private static CheckEqualString instance = new CheckEqualString(); + + public static CheckEqualString getInstance() { + return instance; + } + + @Override + public BoundaryCheckType getType() { + return BoundaryCheckType.IS_EQUAL; + } + + @Override + public boolean check(StringBoundary b1, StringBoundary b2) { + if (b1 == b2 || b1.getText().equals(b2.getText()) || b1.isMatchAny() && b2.isMatchAny()) { + return true; + } + if (b1.isMatchNoneOfValues() != b2.isMatchNoneOfValues() + || b1.getAmountOfElements() != b2.getAmountOfElements()) { + return false; + } + // hashes are sorted while boundary creation + int[] h1 = b1.getValuesHashes(); + int[] h2 = b2.getValuesHashes(); + for (int i = 0; i < h1.length; i++) { + if (h1[i] != h2[i]) { + return false; + } + } + return true; + } +} 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 2041c38d8e998ecba2f2aa1c968c6889eac85cba..1aa866d510b6a205a546d74857b669da687028f3 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 @@ -5,6 +5,7 @@ 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 de.unikoblenz.fgbks.base.utils.boundary.checker.CheckEqualString; import java.util.Arrays; import java.util.HashMap; import java.util.Objects; @@ -26,6 +27,26 @@ public class StringBoundary extends AbstractBoundary<String> { return o.getText().compareTo(o.getText()); } + public boolean isMatchNoneOfValues() { + return matchNoneOfValues; + } + + public boolean isMatchAny() { + return matchAny; + } + + public String[] getValues() { + return values.clone(); // performance ? + } + + public int[] getValuesHashes() { + return valuesHashes.clone(); // performance ? + } + + public int getAmountOfElements() { + return values.length; + } + @Override protected void parse(String text) { matchNoneOfValues = false; @@ -47,6 +68,8 @@ public class StringBoundary extends AbstractBoundary<String> { valuesHashes[i] = Objects.hashCode(values[i]); } } + // Sort hashes for later comparisons + Arrays.sort(valuesHashes); } catch (Exception e) { throw new BoundaryParseException("String value is not valid: " + this.getText()); } @@ -59,7 +82,9 @@ public class StringBoundary extends AbstractBoundary<String> { @Override protected HashMap<BoundaryCheckType, BoundaryCheck> getChecker() { - return new HashMap<>(); + HashMap<BoundaryCheckType, BoundaryCheck> map = new HashMap<>(); + map.put(BoundaryCheckType.IS_EQUAL, CheckEqualString.getInstance()); + return map; } @Override