YANGTOOLS-823: take modifier into account when enforcing patterns
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / CompiledPatternContext.java
index 6e9012229510ddedbb6e41295b844d8ce2b7319b..afddefdcd771338a48fd44da8399cd41ae6e8618 100644 (file)
@@ -7,28 +7,46 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.codec;
 
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
+import java.util.Optional;
 import java.util.regex.Pattern;
+import org.opendaylight.yangtools.yang.model.api.type.ModifierKind;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 
 class CompiledPatternContext {
 
     private final Pattern pattern;
     private final String errorMessage;
+    private final String regEx;
+    private final boolean invert;
 
     CompiledPatternContext(final PatternConstraint yangConstraint) {
-        pattern = Pattern.compile("^" + yangConstraint.getRegularExpression() + "$");
-        final String yangMessage = yangConstraint.getErrorMessage();
-        if (Strings.isNullOrEmpty(yangMessage)) {
-            errorMessage = "Value %s does not match regular expression <" + pattern.pattern() + ">";
+        pattern = Pattern.compile(yangConstraint.getJavaPatternString());
+        errorMessage = yangConstraint.getErrorMessage().orElse(null);
+        regEx = errorMessage == null ? yangConstraint.getRegularExpressionString() : null;
+
+        final Optional<ModifierKind> optModifier = yangConstraint.getModifier();
+        if (optModifier.isPresent()) {
+            final ModifierKind modifier = optModifier.get();
+            switch (modifier) {
+                case INVERT_MATCH:
+                    invert = true;
+                    break;
+                default:
+                    throw new IllegalStateException("Unhandled modifier " + modifier);
+            }
         } else {
-            errorMessage = yangMessage;
+            invert = false;
         }
     }
 
-    public void validate(final String s) {
-        Preconditions.checkArgument(pattern.matcher(s).matches(), errorMessage, s);
-    }
+    void validate(final String str) {
+        if (pattern.matcher(str).matches() == invert) {
+            if (errorMessage != null) {
+                throw new IllegalArgumentException(errorMessage);
+            }
 
-}
\ No newline at end of file
+            throw new IllegalArgumentException("Value " + str + " " + (invert ? "matches" : "does not match")
+                    + " regular expression '" + regEx + "'");
+        }
+    }
+}