Bug 4662: Introduce a SemanticVersion concept - SchemaContextFactory
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / Utils.java
index a41a1a9de3f6cbe0a20cbd2abcaf2514e31278fd..c797294da592fc9268aa6e1ad0b9867899c9c7e0 100644 (file)
@@ -78,6 +78,7 @@ public final class Utils {
     private static final CharMatcher QUESTION_MARK_MATCHER = CharMatcher.is('?');
     private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings().trimResults();
     private static final Splitter SPACE_SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
+    private static final Splitter COLON_SPLITTER = Splitter.on(":").omitEmptyStrings().trimResults();
     private static final Pattern PATH_ABS = Pattern.compile("/[^/].*");
     private static final Pattern BETWEEN_CURLY_BRACES_PATTERN = Pattern.compile("\\{(.+?)\\}");
     private static final Set<String> JAVA_UNICODE_BLOCKS = ImmutableSet.<String>builder()
@@ -341,6 +342,19 @@ public final class Utils {
         return keyNodes;
     }
 
+    static Collection<SchemaNodeIdentifier.Relative> parseUniqueConstraintArgument(final StmtContext<?, ?, ?> ctx,
+            final String argumentValue) {
+        final Set<SchemaNodeIdentifier.Relative> uniqueConstraintNodes = new HashSet<>();
+        for (String uniqueArgToken : SPACE_SPLITTER.split(argumentValue)) {
+            final SchemaNodeIdentifier nodeIdentifier = Utils.nodeIdentifierFromPath(ctx, uniqueArgToken);
+            SourceException.throwIf(nodeIdentifier.isAbsolute(), ctx.getStatementSourceReference(),
+                    "Unique statement argument '%s' contains schema node identifier '%s' "
+                            + "which is not in the descendant node identifier form.", argumentValue, uniqueArgToken);
+            uniqueConstraintNodes.add((SchemaNodeIdentifier.Relative) nodeIdentifier);
+        }
+        return ImmutableSet.copyOf(uniqueConstraintNodes);
+    }
+
     private static String trimSingleLastSlashFromXPath(final String path) {
         return path.endsWith("/") ? path.substring(0, path.length() - 1) : path;
     }
@@ -372,6 +386,14 @@ public final class Utils {
         return identifier;
     }
 
+    public static String trimPrefix(final String identifier) {
+        List<String> namesParts = COLON_SPLITTER.splitToList(identifier);
+        if (namesParts.size() == 2) {
+            return namesParts.get(1);
+        }
+        return identifier;
+    }
+
     /**
      *
      * Based on identifier read from source and collections of relevant prefixes and statement definitions mappings