Allow unqualified node-identifiers in instance-identifier
[yangtools.git] / xpath / yang-xpath-impl / src / main / java / org / opendaylight / yangtools / yang / xpath / impl / InstanceIdentifierParser.java
index 31fac3e9b0f09b85bf41ffa0442bde170b0c375d..ff9d33c6401ff7c9d5cfcf60f19e36f8b56a4cf5 100644 (file)
@@ -52,11 +52,21 @@ abstract class InstanceIdentifierParser {
             super(mathMode);
         }
 
+        @Override
+        YangQNameExpr createExpr(final String localName) {
+            return YangQNameExpr.of(UnresolvedQName.Unqualified.of(localName));
+        }
+
         @Override
         YangQNameExpr createExpr(final String prefix, final String localName) {
             return YangQNameExpr.of(UnresolvedQName.Qualified.of(prefix, localName));
         }
 
+        @Override
+        QNameStep createChildStep(final String localName, final Collection<YangExpr> predicates) {
+            return YangXPathAxis.CHILD.asStep(UnresolvedQName.Unqualified.of(localName), predicates);
+        }
+
         @Override
         QNameStep createChildStep(final String prefix, final String localName, final Collection<YangExpr> predicates) {
             return YangXPathAxis.CHILD.asStep(UnresolvedQName.Qualified.of(prefix, localName), predicates);
@@ -64,7 +74,7 @@ abstract class InstanceIdentifierParser {
     }
 
     static final class Qualified extends InstanceIdentifierParser {
-        final YangNamespaceContext namespaceContext;
+        private final YangNamespaceContext namespaceContext;
 
         Qualified(final YangXPathMathMode mathMode, final YangNamespaceContext namespaceContext) {
             super(mathMode);
@@ -72,16 +82,24 @@ abstract class InstanceIdentifierParser {
         }
 
         @Override
-        QNameStep createChildStep(final String prefix, final String localName, final Collection<YangExpr> predicates) {
-            return YangXPathAxis.CHILD.asStep(namespaceContext.createQName(prefix, localName), predicates);
+        YangQNameExpr createExpr(final String localName) {
+            return YangQNameExpr.of(UnresolvedQName.Unqualified.of(localName));
         }
 
-
         @Override
         YangQNameExpr createExpr(final String prefix, final String localName) {
             return YangQNameExpr.of(namespaceContext.createQName(prefix, localName));
         }
 
+        @Override
+        QNameStep createChildStep(final String localName, final Collection<YangExpr> predicates) {
+            return YangXPathAxis.CHILD.asStep(UnresolvedQName.Unqualified.of(localName), predicates);
+        }
+
+        @Override
+        QNameStep createChildStep(final String prefix, final String localName, final Collection<YangExpr> predicates) {
+            return YangXPathAxis.CHILD.asStep(namespaceContext.createQName(prefix, localName), predicates);
+        }
     }
 
     private final YangXPathMathSupport mathSupport;
@@ -111,19 +129,28 @@ abstract class InstanceIdentifierParser {
         return YangLocationPath.absolute(steps);
     }
 
+    abstract YangQNameExpr createExpr(String localName);
+
     abstract YangQNameExpr createExpr(String prefix, String localName);
 
+    abstract QNameStep createChildStep(String localName, Collection<YangExpr> predicates);
+
     abstract QNameStep createChildStep(String prefix, String localName, Collection<YangExpr> predicates);
 
     private QNameStep parsePathArgument(final PathArgumentContext expr) {
+        final var predicates = switch (expr.getChildCount()) {
+            case 1 -> ImmutableSet.<YangExpr>of();
+            case 2 -> parsePredicate(getChild(expr, PredicateContext.class, 1));
+            default -> throw illegalShape(expr);
+        };
+
         final NodeIdentifierContext childExpr = getChild(expr, NodeIdentifierContext.class, 0);
-        final String prefix = verifyIdentifier(childExpr, 0);
-        final String localName = verifyIdentifier(childExpr, 2);
+        final String first = verifyIdentifier(childExpr, 0);
 
-        return switch (expr.getChildCount()) {
-            case 1 -> createChildStep(prefix, localName, ImmutableSet.of());
-            case 2 -> createChildStep(prefix, localName, parsePredicate(getChild(expr, PredicateContext.class, 1)));
-            default -> throw illegalShape(expr);
+        return switch (childExpr.getChildCount()) {
+            case 1 -> createChildStep(first, predicates);
+            case 3 -> createChildStep(first, verifyIdentifier(childExpr, 2), predicates);
+            default -> throw illegalShape(childExpr);
         };
     }
 
@@ -151,7 +178,12 @@ abstract class InstanceIdentifierParser {
     }
 
     private YangQNameExpr createChildExpr(final NodeIdentifierContext expr) {
-        return createExpr(verifyIdentifier(expr, 0), verifyIdentifier(expr, 2));
+        final var first = verifyIdentifier(expr, 0);
+        return switch (expr.getChildCount()) {
+            case 1 -> createExpr(first);
+            case 3 -> createExpr(first, verifyIdentifier(expr, 2));
+            default -> throw illegalShape(expr);
+        };
     }
 
     private static String verifyIdentifier(final NodeIdentifierContext expr, final int child) {