Bug 7847: Implement YANG 1.1 XPath functions in YangFunctionContext
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / PatternStatementImpl.java
index d899ed879fbc1d8044f239e9ca45663f92f9443a..c9478c9de63aae4d53ed790be16576f0c901b1a4 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ModifierStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
+import org.opendaylight.yangtools.yang.model.util.RegexUtils;
 import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
@@ -53,7 +54,7 @@ public class PatternStatementImpl extends AbstractDeclaredStatement<PatternConst
 
         @Override
         public PatternConstraint parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-            final String pattern = getJavaRegexFromXSD(value);
+            final String pattern = RegexUtils.getJavaRegexFromXSD(value);
 
             try {
                 Pattern.compile(pattern);
@@ -65,57 +66,6 @@ public class PatternStatementImpl extends AbstractDeclaredStatement<PatternConst
             return new PatternConstraintEffectiveImpl(pattern, value, Optional.absent(), Optional.absent());
         }
 
-        static String getJavaRegexFromXSD(final String xsdRegex) {
-            return "^" + Utils.fixUnicodeScriptPattern(escapeChars(xsdRegex)) + '$';
-        }
-
-        /*
-         * As both '^' and '$' are special anchor characters in java regular
-         * expressions which are implicitly present in XSD regular expressions,
-         * we need to escape them in case they are not defined as part of
-         * character ranges i.e. inside regular square brackets.
-         */
-        private static String escapeChars(final String regex) {
-            final StringBuilder result = new StringBuilder(regex.length());
-            int bracket = 0;
-            boolean escape = false;
-            for (int i = 0; i < regex.length(); i++) {
-                final char ch = regex.charAt(i);
-                switch (ch) {
-                case '[':
-                    if (!escape) {
-                        bracket++;
-                    }
-                    escape = false;
-                    result.append(ch);
-                    break;
-                case ']':
-                    if (!escape) {
-                        bracket--;
-                    }
-                    escape = false;
-                    result.append(ch);
-                    break;
-                case '\\':
-                    escape = !escape;
-                    result.append(ch);
-                    break;
-                case '^':
-                case '$':
-                    if (bracket == 0) {
-                        result.append('\\');
-                    }
-                    escape = false;
-                    result.append(ch);
-                    break;
-                default:
-                    escape = false;
-                    result.append(ch);
-                }
-            }
-            return result.toString();
-        }
-
         @Override
         public PatternStatement createDeclared(final StmtContext<PatternConstraint, PatternStatement, ?> ctx) {
             return new PatternStatementImpl(ctx);