Clean up PatternConstraint's String confusion 38/64838/12
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 27 Oct 2017 23:03:10 +0000 (01:03 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Nov 2017 13:58:50 +0000 (14:58 +0100)
Make getRawRegularExpression() non-default and make sure we use descriptive
names for the two strings -- one is a XSD RegEx String, the other
a Pattern-compatible String.

Change-Id: I6a8be40aa172cdd2c4b0c461836245bc5a63a83b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
14 files changed:
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/PatternConstraint.java
yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/SchemaContextEmitter.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/PatternConstraintImpl.java
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/PatternConstraintImplTest.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/PatternConstraintEffectiveImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/PatternEffectiveStatementImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Bug5410Test.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug4623Test.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug5396Test.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6180Test.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/EffectiveStatementTypeTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/TypesResolutionTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserTest.java

index a42b2a46f28c34f1cc34f6804ff05f9a40d23830..cf1a35c1c6a5a50ef978b5b8fe9678d9ab272860 100644 (file)
@@ -14,10 +14,12 @@ class CompiledPatternContext {
 
     private final Pattern pattern;
     private final String errorMessage;
+    private final String regEx;
 
     CompiledPatternContext(final PatternConstraint yangConstraint) {
-        pattern = Pattern.compile("^" + yangConstraint.getRegularExpression() + "$");
+        pattern = Pattern.compile(yangConstraint.getJavaPatternString());
         errorMessage = yangConstraint.getErrorMessage().orElse(null);
+        regEx = errorMessage == null ? yangConstraint.getRegularExpressionString() : null;
     }
 
     void validate(final String str) {
@@ -26,8 +28,7 @@ class CompiledPatternContext {
                 throw new IllegalArgumentException(errorMessage);
             }
 
-            throw new IllegalArgumentException("Value " + str + "does not match regular expression '"
-                    + pattern.pattern() + "'");
+            throw new IllegalArgumentException("Value " + str + "does not match regular expression '" + regEx + "'");
         }
     }
 }
index b2d9cfc80ccabcefe5453976fe15e16d635ab1ca..5bf8762e83a91442213eb7ab3460e35c9d3fe68b 100644 (file)
@@ -8,31 +8,34 @@
 package org.opendaylight.yangtools.yang.model.api.type;
 
 import java.util.Optional;
+import java.util.regex.Pattern;
 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
 
 /**
- * Contains the method for getting the data from the YANG <code>pattern</code> which is substatement of
- * <code>type</code> statement.
+ * Contains the method for getting the data from the YANG <code>pattern</code> which is substatement
+ * of <code>type</code> statement.
  */
 public interface PatternConstraint extends ConstraintMetaDefinition {
 
     /**
-     * Returns a java regular expression (pattern).
+     * Returns a Java {@link Pattern}-compatible regular expression (pattern). Returned string performs equivalent
+     * matching in terms of enforcement, but it may have a structure completely different from the one in YANG model.
+     * This string DOES NOT include the effects of the modifier (if present, as indicated by {@link #getModifier()}.
      *
-     * @return string with java regular expression which is equal to the argument of
-     *         the YANG <code>pattern</code> substatement
+     * @return string Java Pattern regular expression
      */
-    String getRegularExpression();
+    // FIXME: should we be providing a Pattern instance? This, along with the other method is treading the fine
+    //        balance between usability of the effective model, the purity of effective view model and memory
+    //        overhead. We pick usability and memory footprint and expose both methods from effective model.
+    String getJavaPatternString();
 
     /**
-     * Returns a raw regular expression as it was declared in a source.
+     * Returns a raw regular expression as it was declared in a source. This string conforms to XSD regular expression
+     * syntax, which is notably different from Java's Pattern string.
      *
-     * @return argument of pattern statement as it was declared in a source.
+     * @return argument of pattern statement as it was declared in YANG model.
      */
-    // FIXME: version 2.0.0: make this method non-default
-    default String getRawRegularExpression() {
-        return getRegularExpression();
-    }
+    String getRegularExpressionString();
 
     /**
      * RFC7950 allows a pattern constraint to be inverted. For this purpose a general modifier concept has been
index 3c3850bb9b78b8c50dc0059bf8b0919700e1e1d0..63b2e2e11516a9ceb56142d9a6529e29ec5fdeeb 100644 (file)
@@ -1578,7 +1578,7 @@ abstract class SchemaContextEmitter {
         }
 
         private void emitPatternNode(final PatternConstraint pattern) {
-            super.writer.startPatternNode(pattern.getRawRegularExpression());
+            super.writer.startPatternNode(pattern.getRegularExpressionString());
             pattern.getErrorMessage().ifPresent(this::emitErrorMessageNode);
             pattern.getErrorAppTag().ifPresent(this::emitErrorAppTagNode);
             emitDocumentedNode(pattern);
index 3999853ac91429a5a70cb0914534de211a5841ca..19bc54c1b1edace8602808a2898eb6d2e8675aeb 100644 (file)
@@ -72,10 +72,15 @@ final class PatternConstraintImpl implements PatternConstraint, Immutable {
     }
 
     @Override
-    public String getRegularExpression() {
+    public String getJavaPatternString() {
         return regex;
     }
 
+    @Override
+    public String getRegularExpressionString() {
+        throw new UnsupportedOperationException();
+    }
+
     @Override
     public Optional<ModifierKind> getModifier() {
         return Optional.ofNullable(modifier);
index de067db4a9374e64eace86301c0be8cd6f04e3fc..b475e8243c794bb910080db96ee7b1b21759f8c1 100644 (file)
@@ -38,7 +38,7 @@ public class PatternConstraintImplTest {
         assertEquals(Optional.of("invalid-regular-expression"), patternConstraint.getErrorAppTag());
         assertTrue(patternConstraint.getErrorMessage().isPresent());
         assertEquals(Optional.of("RFC 6020"), patternConstraint.getReference());
-        assertEquals("Regular expression should be equls '\\D'.", "\\D", patternConstraint.getRegularExpression());
+        assertEquals("Regular expression should be equls '\\D'.", "\\D", patternConstraint.getJavaPatternString());
         assertNotEquals("Hash codes shouldn't be equals.", patternConstraint.hashCode(), patternConstraint2.hashCode());
         assertFalse("String representation shouldn't be empty.", patternConstraint.toString().isEmpty());
 
index f9b54c89bdd62b224ca63383da59473e1c6e225b..243541b52a796fb2f989a8944bb9914359b697d5 100644 (file)
@@ -43,12 +43,12 @@ public class PatternConstraintEffectiveImpl implements PatternConstraint {
     }
 
     @Override
-    public String getRegularExpression() {
+    public String getJavaPatternString() {
         return regEx;
     }
 
     @Override
-    public String getRawRegularExpression() {
+    public String getRegularExpressionString() {
         return rawRegEx;
     }
 
index 14a5aad109516acfcce69c31340b2dbf58a438cf..8eafcf2204bb55579b31cffe5b30519768ee4b0c 100644 (file)
@@ -23,7 +23,8 @@ public class PatternEffectiveStatementImpl extends
             return argument;
         }
 
-        return new PatternConstraintEffectiveImpl(argument.getRegularExpression(), argument.getRawRegularExpression(),
+        return new PatternConstraintEffectiveImpl(argument.getJavaPatternString(),
+            argument.getRegularExpressionString(),
             getDescription().orElse(null), getReference().orElse(null), getErrorAppTag().orElse(null),
             getErrorMessage().orElse(null), getModifier());
     }
index d81fa6a63732c0d7ee2da5aa46b469f38f86c916..dd6302374730316eab90fdd826aabcf2079021c1 100644 (file)
@@ -75,12 +75,12 @@ public class Bug5410Test {
 
         final PatternConstraint pattern = getPatternConstraintOf(context, "leaf-with-pattern");
 
-        final String rawRegex = pattern.getRawRegularExpression();
+        final String rawRegex = pattern.getRegularExpressionString();
         final String expectedYangRegex = "$0$.*|$1$[a-zA-Z0-9./]{1,8}$[a-zA-Z0-9./]{22}|$5$(rounds=\\d+$)?"
                 + "[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{43}|$6$(rounds=\\d+$)?[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{86}";
         assertEquals(expectedYangRegex, rawRegex);
 
-        final String javaRegexFromYang = pattern.getRegularExpression();
+        final String javaRegexFromYang = pattern.getJavaPatternString();
         final String expectedJavaRegex = "^\\$0\\$.*|\\$1\\$[a-zA-Z0-9./]{1,8}\\$[a-zA-Z0-9./]{22}|\\$5\\$"
                 + "(rounds=\\d+\\$)?[a-zA-Z0-9./]{1,16}\\$[a-zA-Z0-9./]{43}|\\$6\\$(rounds=\\d+\\$)?"
                 + "[a-zA-Z0-9./]{1,16}\\$[a-zA-Z0-9./]{86}$";
index 6cd3d2547c8afa88e066da178d04444fa57c2e69..a5fb57d3dcc1705629c313912cb1d27e6f456611 100644 (file)
@@ -65,7 +65,7 @@ public class Bug4623Test {
         Assert.assertEquals(Integer.valueOf(10), span.upperEndpoint());
 
         final PatternConstraint patternConstraint = patternConstraints.get(0);
-        Assert.assertEquals(patternConstraint.getRegularExpression(), "^[0-9a-fA-F]$");
+        Assert.assertEquals(patternConstraint.getJavaPatternString(), "^[0-9a-fA-F]$");
     }
 
     @Test
@@ -107,7 +107,7 @@ public class Bug4623Test {
         Assert.assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
 
         final PatternConstraint patternConstraint = patternConstraints.get(0);
-        Assert.assertEquals(patternConstraint.getRegularExpression(), "^[0-9a-fA-F]$");
+        Assert.assertEquals(patternConstraint.getJavaPatternString(), "^[0-9a-fA-F]$");
     }
 
     @Test
@@ -150,7 +150,7 @@ public class Bug4623Test {
         Assert.assertEquals(Integer.valueOf(10), lengthConstraint.upperEndpoint());
 
         final PatternConstraint patternConstraint = patternConstraints.get(0);
-        Assert.assertEquals(patternConstraint.getRegularExpression(), "^[0-9a-fA-F]$");
+        Assert.assertEquals(patternConstraint.getJavaPatternString(), "^[0-9a-fA-F]$");
     }
 
     private static Module typesModule(final SchemaContext context) {
index 837fbb24e5acdf52e017a1c6815f7e183759673f..0e287e19faf188bd0c886ff7c74c79cbd5a45605 100644 (file)
@@ -82,10 +82,10 @@ public class Bug5396Test {
         final PatternConstraint patternConstraint2 = patternConstraints2.get(0);
         final PatternConstraint patternConstraint3 = patternConstraints3.get(0);
 
-        assertEquals("^dp[0-9]+o[0-9]+(d[0-9]+)?$", patternConstraint0.getRegularExpression());
-        assertEquals("^dp[0-9]+s[0-9]+(f[0-9]+)?(d[0-9]+)?$", patternConstraint1.getRegularExpression());
+        assertEquals("^dp[0-9]+o[0-9]+(d[0-9]+)?$", patternConstraint0.getJavaPatternString());
+        assertEquals("^dp[0-9]+s[0-9]+(f[0-9]+)?(d[0-9]+)?$", patternConstraint1.getJavaPatternString());
         assertEquals("^dp[0-9]+(P[0-9]+)?p[0-9]{1,3}s[0-9]{1,3}(f[0-9]+)?(d[0-9]+)?$",
-                patternConstraint2.getRegularExpression());
-        assertEquals("^dp[0-9]+p[0-9]+p[0-9]+$", patternConstraint3.getRegularExpression());
+                patternConstraint2.getJavaPatternString());
+        assertEquals("^dp[0-9]+p[0-9]+p[0-9]+$", patternConstraint3.getJavaPatternString());
     }
 }
index a3a4080e0ffcaec186f22065d28e536c79d44192..a9636426afbec499049ef38bf2adbdbb98e0c560 100644 (file)
@@ -81,8 +81,8 @@ public class Bug6180Test {
         final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
         assertEquals(1, patternConstraints.size());
         final PatternConstraint pattern = patternConstraints.iterator().next();
-        assertEquals("^\".*\"$", pattern.getRegularExpression());
-        assertTrue(Pattern.compile(pattern.getRegularExpression()).matcher("\"enclosed string in quotes\"").matches());
+        assertEquals("^\".*\"$", pattern.getJavaPatternString());
+        assertTrue(Pattern.compile(pattern.getJavaPatternString()).matcher("\"enclosed string in quotes\"").matches());
     }
 
     private static void verifySingleQuotesExpression(final SchemaContext schemaContext) {
@@ -99,7 +99,7 @@ public class Bug6180Test {
         final List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
         assertEquals(1, patternConstraints.size());
         final PatternConstraint pattern = patternConstraints.iterator().next();
-        assertEquals("^'.*'$", pattern.getRegularExpression());
-        assertTrue(Pattern.compile(pattern.getRegularExpression()).matcher("'enclosed string in quotes'").matches());
+        assertEquals("^'.*'$", pattern.getJavaPatternString());
+        assertTrue(Pattern.compile(pattern.getJavaPatternString()).matcher("'enclosed string in quotes'").matches());
     }
 }
\ No newline at end of file
index dc9072d5f7923040708de5e015613b497e29472c..78d098ecc5f6f412fde0cbb9a8241da062499971 100644 (file)
@@ -438,7 +438,7 @@ public class EffectiveStatementTypeTest {
         final PatternConstraintEffectiveImpl patternConstraintSecond = (PatternConstraintEffectiveImpl)
                 ((StringTypeDefinition) currentLeaf.getType()).getPatternConstraints().get(0);
 
-        assertEquals("^[0-9a-fA-F]*$", patternConstraint.getRegularExpression());
+        assertEquals("^[0-9a-fA-F]*$", patternConstraint.getJavaPatternString());
         assertFalse(patternConstraint.getReference().isPresent());
         assertFalse(patternConstraint.getDescription().isPresent());
         assertEquals(Optional.of("Supplied value does not match the regular expression ^[0-9a-fA-F]*$."),
index 444ad5684835aeec2ab0b8ea5f8f356e8fa6880f..4588fc2962174ce1fd41132770fdf2b636f3109c 100644 (file)
@@ -135,7 +135,7 @@ public class TypesResolutionTest {
         assertNotNull(ipv4.getBaseType());
         String expectedPattern = "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}"
                 + "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" + "(%[\\p{N}\\p{L}]+)?$";
-        assertEquals(expectedPattern, ipv4.getPatternConstraints().get(0).getRegularExpression());
+        assertEquals(expectedPattern, ipv4.getPatternConstraints().get(0).getJavaPatternString());
 
         StringTypeDefinition ipv6 = (StringTypeDefinition) unionTypes.get(1);
         assertNotNull(ipv6.getBaseType());
@@ -143,11 +143,11 @@ public class TypesResolutionTest {
         expectedPattern = "^((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}"
                 + "((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|" + "(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}"
                 + "(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))" + "(%[\\p{N}\\p{L}]+)?$";
-        assertEquals(expectedPattern, ipv6Patterns.get(0).getRegularExpression());
+        assertEquals(expectedPattern, ipv6Patterns.get(0).getJavaPatternString());
 
         expectedPattern = "^(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|" + "((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)"
                 + "(%.+)?$";
-        assertEquals(expectedPattern, ipv6Patterns.get(1).getRegularExpression());
+        assertEquals(expectedPattern, ipv6Patterns.get(1).getJavaPatternString());
     }
 
     @Test
@@ -160,7 +160,7 @@ public class TypesResolutionTest {
         assertEquals(1, patterns.size());
         String expectedPattern = "^((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*"
                 + "([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?)" + "|\\.$";
-        assertEquals(expectedPattern, patterns.get(0).getRegularExpression());
+        assertEquals(expectedPattern, patterns.get(0).getJavaPatternString());
 
         LengthConstraint lengths = type.getLengthConstraint().get();
         assertEquals(1, lengths.getAllowedRanges().asRanges().size());
@@ -313,7 +313,7 @@ public class TypesResolutionTest {
         List<PatternConstraint> patterns = testedType.getPatternConstraints();
         assertEquals(1, patterns.size());
         PatternConstraint pattern = patterns.get(0);
-        assertEquals("^\\d*(\\.\\d*){1,127}$", pattern.getRegularExpression());
+        assertEquals("^\\d*(\\.\\d*){1,127}$", pattern.getJavaPatternString());
 
         QName testedTypeQName = testedType.getQName();
         assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeQName.getNamespace());
@@ -326,7 +326,7 @@ public class TypesResolutionTest {
 
         pattern = patterns.get(0);
         assertEquals("^(([0-1](\\.[1-3]?[0-9]))|(2\\.(0|([1-9]\\d*))))(\\.(0|([1-9]\\d*)))*$",
-                pattern.getRegularExpression());
+                pattern.getJavaPatternString());
 
         QName testedTypeBaseQName = testedTypeBase.getQName();
         assertEquals(URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types"), testedTypeBaseQName.getNamespace());
index 85439e2f36e60d8456ee1e0566d147a6ba3b3403..1694b84846bfa7e64b7e72a73bfa66c301cb0685 100644 (file)
@@ -226,7 +226,7 @@ public class YangParserTest {
         List<PatternConstraint> patterns = type.getPatternConstraints();
         assertEquals(1, patterns.size());
         PatternConstraint pattern = patterns.iterator().next();
-        assertEquals("^[e-z]*$", pattern.getRegularExpression());
+        assertEquals("^[e-z]*$", pattern.getJavaPatternString());
         assertEquals(1, type.getLengthConstraint().get().getAllowedRanges().asRanges().size());
 
         final StringTypeDefinition baseType1 = type.getBaseType();
@@ -238,7 +238,7 @@ public class YangParserTest {
         patterns = baseType1.getPatternConstraints();
         assertEquals(1, patterns.size());
         pattern = patterns.iterator().next();
-        assertEquals("^[b-u]*$", pattern.getRegularExpression());
+        assertEquals("^[b-u]*$", pattern.getJavaPatternString());
         assertEquals(1, baseType1.getLengthConstraint().get().getAllowedRanges().asRanges().size());
 
         final StringTypeDefinition baseType2 = baseType1.getBaseType();
@@ -261,7 +261,7 @@ public class YangParserTest {
         patterns = baseType3.getPatternConstraints();
         assertEquals(1, patterns.size());
         pattern = patterns.iterator().next();
-        assertEquals("^[a-k]*$", pattern.getRegularExpression());
+        assertEquals("^[a-k]*$", pattern.getJavaPatternString());
         final RangeSet<Integer> baseType3Lengths = baseType3.getLengthConstraint().get().getAllowedRanges();
         assertEquals(1, baseType3Lengths.asRanges().size());
         length = baseType3Lengths.span();
@@ -302,7 +302,7 @@ public class YangParserTest {
         assertTrue(!patterns.isEmpty());
         assertEquals(1, patterns.size());
         final PatternConstraint pattern = patterns.iterator().next();
-        assertEquals("^[e-z]*$", pattern.getRegularExpression());
+        assertEquals("^[e-z]*$", pattern.getJavaPatternString());
         assertEquals(1, type.getLengthConstraint().get().getAllowedRanges().asRanges().size());
 
         final LeafSchemaNode multiplePatternDirectStringDefLeaf = (LeafSchemaNode) foo
@@ -318,9 +318,9 @@ public class YangParserTest {
         boolean isEZPattern = false;
         boolean isADPattern = false;
         for (final PatternConstraint patternConstraint : patterns) {
-            if (patternConstraint.getRegularExpression().equals("^[e-z]*$")) {
+            if (patternConstraint.getJavaPatternString().equals("^[e-z]*$")) {
                 isEZPattern = true;
-            } else if (patternConstraint.getRegularExpression().equals("^[a-d]*$")) {
+            } else if (patternConstraint.getJavaPatternString().equals("^[a-d]*$")) {
                 isADPattern = true;
             }
         }
@@ -362,7 +362,7 @@ public class YangParserTest {
         final List<PatternConstraint> patterns = baseType2.getPatternConstraints();
         assertEquals(1, patterns.size());
         final PatternConstraint pattern = patterns.iterator().next();
-        assertEquals("^[a-k]*$", pattern.getRegularExpression());
+        assertEquals("^[a-k]*$", pattern.getJavaPatternString());
         final RangeSet<Integer> baseType3Lengths = baseType2.getLengthConstraint().get().getAllowedRanges();
         assertEquals(1, baseType3Lengths.asRanges().size());
         length = baseType3Lengths.span();