Separate out Module and Submodule interfaces
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / ArgumentUtils.java
index cd05e74eefed0c2ed222ce4c6905f8c9b3f9da5f..5ed39e397599ce985bc24f076ecc1cd68c2376ce 100644 (file)
@@ -16,9 +16,10 @@ import java.util.regex.Pattern;
 import org.checkerframework.checker.regex.qual.Regex;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
@@ -43,7 +44,7 @@ public final class ArgumentUtils {
     private static final BigDecimal YANG_MAX_NUM = BigDecimal.valueOf(Double.MAX_VALUE);
 
     private ArgumentUtils() {
-        throw new UnsupportedOperationException();
+        // Hidden on purpose
     }
 
     public static int compareNumbers(final Number n1, final Number n2) {
@@ -75,28 +76,42 @@ public final class ArgumentUtils {
         }
     }
 
-    public static RevisionAwareXPath parseXPath(final StmtContext<?, ?, ?> ctx, final String path) {
-        return XPathSupport.parseXPath(ctx, path);
-    }
-
     public static boolean isAbsoluteXPath(final String path) {
         return PATH_ABS.matcher(path).matches();
     }
 
-    @SuppressWarnings("checkstyle:illegalCatch")
+    public static Absolute parseAbsoluteSchemaNodeIdentifier(final StmtContext<?, ?, ?> ctx, final String str) {
+        // FIXME: this does accept check for a leading slash
+        return Absolute.of(parseNodeIdentifiers(ctx, str));
+    }
+
+    public static Descendant parseDescendantSchemaNodeIdentifier(final StmtContext<?, ?, ?> ctx, final String str) {
+        // FIXME: this does accept a leading slash
+        return Descendant.of(parseNodeIdentifiers(ctx, str));
+    }
+
     public static SchemaNodeIdentifier nodeIdentifierFromPath(final StmtContext<?, ?, ?> ctx, final String path) {
+        final List<QName> qnames = parseNodeIdentifiers(ctx, path);
+        return PATH_ABS.matcher(path).matches() ? Absolute.of(qnames) : Descendant.of(qnames);
+    }
+
+    @SuppressWarnings("checkstyle:illegalCatch")
+    private static  List<QName> parseNodeIdentifiers(final StmtContext<?, ?, ?> ctx, final String path) {
         // FIXME: is the path trimming really necessary??
-        final List<QName> qNames = new ArrayList<>();
+        final List<QName> qnames = new ArrayList<>();
         for (final String nodeName : SLASH_SPLITTER.split(trimSingleLastSlashFromXPath(path))) {
             try {
-                qNames.add(StmtContextUtils.parseNodeIdentifier(ctx, nodeName));
+                qnames.add(StmtContextUtils.parseNodeIdentifier(ctx, nodeName));
             } catch (final RuntimeException e) {
                 throw new SourceException(ctx.getStatementSourceReference(), e,
                         "Failed to parse node '%s' in path '%s'", nodeName, path);
             }
         }
 
-        return SchemaNodeIdentifier.create(qNames, PATH_ABS.matcher(path).matches());
+        if (qnames.isEmpty()) {
+            throw new SourceException("Schema node identifier must not be empty", ctx.getStatementSourceReference());
+        }
+        return qnames;
     }
 
     private static String trimSingleLastSlashFromXPath(final String path) {