RefineStatement should operate on SchemaNodeIdentifier.Descendant 97/87797/8
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 16 Feb 2020 16:23:29 +0000 (17:23 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 17 Feb 2020 09:14:25 +0000 (10:14 +0100)
The spec is clear, this has to be a descendant, make sure we reflect
that in the API.

JIRA: YANGTOOLS-1083
Change-Id: Icab418a7e5f8ff2c9f0e3b6e2640a3b87010538a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java

index 27c72a518990e1f00868fd9b653b75c298a988f4..08034770826f3e4637cb9cf0963dd808d908e604 100644 (file)
@@ -9,8 +9,9 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 @Beta
-public interface RefineEffectiveStatement extends EffectiveStatement<SchemaNodeIdentifier, RefineStatement> {
+public interface RefineEffectiveStatement extends EffectiveStatement<Descendant, RefineStatement> {
 
 }
index fb9afef39650e4760d5e206ed517fd7435c58644..711789b966dbd767668d2ce2ce437aaff1524f0d 100644 (file)
@@ -13,11 +13,12 @@ import java.util.Collection;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
-public interface RefineStatement extends ConfigStatementAwareDeclaredStatement<SchemaNodeIdentifier>,
-        DocumentedDeclaredStatement<SchemaNodeIdentifier>, IfFeatureAwareDeclaredStatement<SchemaNodeIdentifier>,
-        MandatoryStatementAwareDeclaredStatement<SchemaNodeIdentifier>,
-        MustStatementAwareDeclaredStatement<SchemaNodeIdentifier> {
+public interface RefineStatement extends ConfigStatementAwareDeclaredStatement<Descendant>,
+        DocumentedDeclaredStatement<Descendant>, IfFeatureAwareDeclaredStatement<Descendant>,
+        MandatoryStatementAwareDeclaredStatement<Descendant>,
+        MustStatementAwareDeclaredStatement<Descendant> {
     default @NonNull String getTargetNode() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(rawArgument());
index 7e168e6a8b235d4ff22fd35efa20014ea4bdf9b8..c4d12229d93e763f068f8d2b85745f4ab563fb31 100644 (file)
@@ -85,24 +85,33 @@ public final class ArgumentUtils {
         return PATH_ABS.matcher(path).matches();
     }
 
-    @SuppressWarnings("checkstyle:illegalCatch")
+    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);
             }
         }
 
-        if (qNames.isEmpty()) {
+        if (qnames.isEmpty()) {
             throw new SourceException("Schema node identifier must not be empty", ctx.getStatementSourceReference());
         }
-
-        return PATH_ABS.matcher(path).matches() ? Absolute.of(qNames) : Descendant.of(qNames);
+        return qnames;
     }
 
     private static String trimSingleLastSlashFromXPath(final String path) {
index 2ff1b67e11cb91f03644afdd3246ca32bdbeb4d7..5bb975b16ab97ddf7cd6d4d09e712250c3078b21 100644 (file)
@@ -10,31 +10,31 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 abstract class AbstractRefineStatementSupport
-        extends AbstractStatementSupport<SchemaNodeIdentifier, RefineStatement, RefineEffectiveStatement> {
+        extends AbstractStatementSupport<Descendant, RefineStatement, RefineEffectiveStatement> {
 
     AbstractRefineStatementSupport() {
         super(YangStmtMapping.REFINE);
     }
 
     @Override
-    public final SchemaNodeIdentifier parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        return ArgumentUtils.nodeIdentifierFromPath(ctx, value);
+    public final Descendant parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        return ArgumentUtils.parseDescendantSchemaNodeIdentifier(ctx, value);
     }
 
     @Override
-    public final RefineStatement createDeclared(final StmtContext<SchemaNodeIdentifier, RefineStatement, ?> ctx) {
+    public final RefineStatement createDeclared(final StmtContext<Descendant, RefineStatement, ?> ctx) {
         return new RefineStatementImpl(ctx);
     }
 
     @Override
     public final RefineEffectiveStatement createEffective(
-            final StmtContext<SchemaNodeIdentifier, RefineStatement, RefineEffectiveStatement> ctx) {
+            final StmtContext<Descendant, RefineStatement, RefineEffectiveStatement> ctx) {
         return new RefineEffectiveStatementImpl(ctx);
     }
 }
\ No newline at end of file
index 7eda2fa60208422094abaa225721ad6583b40cdb..8185174af16acf8ab73bb8908510899825c411e9 100644 (file)
@@ -14,20 +14,20 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNode;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 // FIXME: 5.0.0: hide this class
 public final class RefineEffectiveStatementImpl
-        extends AbstractEffectiveDocumentedNode<SchemaNodeIdentifier, RefineStatement>
+        extends AbstractEffectiveDocumentedNode<Descendant, RefineStatement>
         implements RefineEffectiveStatement, SchemaNode {
 
     private final @NonNull QName qname;
     private final @NonNull SchemaPath path;
     private final SchemaNode refineTargetNode;
 
-    RefineEffectiveStatementImpl(final StmtContext<SchemaNodeIdentifier, RefineStatement, ?> ctx) {
+    RefineEffectiveStatementImpl(final StmtContext<Descendant, RefineStatement, ?> ctx) {
         super(ctx);
         qname = Iterables.getLast(ctx.coerceStatementArgument().getNodeIdentifiers());
         path = ctx.getSchemaPath().get();
index 6f8ee8e9c3ae2152d10490e2daf7b985ae36edc8..1cd6c04489e2a082a75ebce8c627bd224f980703 100644 (file)
@@ -8,12 +8,12 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class RefineStatementImpl extends AbstractDeclaredStatement<SchemaNodeIdentifier> implements RefineStatement {
-    RefineStatementImpl(final StmtContext<SchemaNodeIdentifier, RefineStatement, ?> context) {
+final class RefineStatementImpl extends AbstractDeclaredStatement<Descendant> implements RefineStatement {
+    RefineStatementImpl(final StmtContext<Descendant, RefineStatement, ?> context) {
         super(context);
     }
 }