Optimize refine statement implementations
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / refine / RefineEffectiveStatementImpl.java
index 9085350c4c625790d25735433ca9c149f1f19e04..a695518034341c4f4ce76dcdfa4d8b73a89417e9 100644 (file)
@@ -7,31 +7,36 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 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.Descendant;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithStatus;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin;
 
 // FIXME: 6.0.0: hide this class
-public final class RefineEffectiveStatementImpl
-        extends AbstractEffectiveDocumentedNodeWithStatus<Descendant, RefineStatement>
-        implements RefineEffectiveStatement, SchemaNode {
-
-    private final @NonNull QName qname;
+// FIXME: 6.0.0: do not implement SchemaNode
+public final class RefineEffectiveStatementImpl extends WithSubstatements<Descendant, RefineStatement>
+        implements RefineEffectiveStatement, SchemaNode, DocumentedNodeMixin<Descendant, RefineStatement> {
     private final @NonNull SchemaPath path;
     private final SchemaNode refineTargetNode;
 
-    RefineEffectiveStatementImpl(final StmtContext<Descendant, RefineStatement, ?> ctx) {
-        super(ctx);
-        qname = Iterables.getLast(ctx.coerceStatementArgument().getNodeIdentifiers());
-        path = ctx.getSchemaPath().get();
-        refineTargetNode = (SchemaNode) ctx.getEffectOfStatement().iterator().next().buildEffective();
+    RefineEffectiveStatementImpl(final RefineStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final SchemaPath path,
+            final SchemaNode refineTargetNode) {
+        super(declared, substatements);
+        this.path = requireNonNull(path);
+        this.refineTargetNode = requireNonNull(refineTargetNode);
     }
 
     public SchemaNode getRefineTargetNode() {
@@ -39,8 +44,9 @@ public final class RefineEffectiveStatementImpl
     }
 
     @Override
+    @Deprecated
     public QName getQName() {
-        return qname;
+        return Iterables.getLast(argument().getNodeIdentifiers());
     }
 
     @Override
@@ -48,4 +54,9 @@ public final class RefineEffectiveStatementImpl
     public SchemaPath getPath() {
         return path;
     }
-}
\ No newline at end of file
+
+    @Override
+    public Status getStatus() {
+        return findFirstEffectiveSubstatementArgument(StatusEffectiveStatement.class).orElse(Status.CURRENT);
+    }
+}