From: Robert Varga Date: Sat, 28 Oct 2017 11:02:07 +0000 (+0200) Subject: YANGTOOLS-823: take modifier into account when enforcing patterns X-Git-Tag: v2.0.0~122 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=sidebyside;h=b14de2ad9e4c5833efc82b5a0fa447eeee3082e6;p=yangtools.git YANGTOOLS-823: take modifier into account when enforcing patterns 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 --- diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java index cf1a35c1c6..afddefdcd7 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java @@ -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 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 + "'"); } } }