YANGTOOLS-823: take modifier into account when enforcing patterns 49/64849/5
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 28 Oct 2017 11:02:07 +0000 (13:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Nov 2017 13:58:50 +0000 (14:58 +0100)
Modifiers are an RFC7950 addition to the metamodel and need to be
accounted for to comply with the specification.

Change-Id: Ide9625812a2df26e931a2b5d472af80bba07d730
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java

index cf1a35c1c6a5a50ef978b5b8fe9678d9ab272860..afddefdcd771338a48fd44da8399cd41ae6e8618 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.codec;
 
+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 {
@@ -15,20 +17,36 @@ 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.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 {
+            invert = false;
+        }
     }
 
     void validate(final String str) {
-        if (!pattern.matcher(str).matches()) {
+        if (pattern.matcher(str).matches() == invert) {
             if (errorMessage != null) {
                 throw new IllegalArgumentException(errorMessage);
             }
 
-            throw new IllegalArgumentException("Value " + str + "does not match regular expression '" + regEx + "'");
+            throw new IllegalArgumentException("Value " + str + " " + (invert ? "matches" : "does not match")
+                    + " regular expression '" + regEx + "'");
         }
     }
 }