Fix yang-data extension definition
[yangtools.git] / parser / rfc8040-parser-support / src / main / java / org / opendaylight / yangtools / rfc8040 / parser / YangDataEffectiveStatementImpl.java
index 6382d3c42746c81f93b71bb5fd38eecc3bfec3d2..13440a836790e82955fadd63b711aea78c3976ef 100644 (file)
@@ -19,47 +19,34 @@ import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
 import org.opendaylight.yangtools.rfc8040.model.api.YangDataSchemaNode;
 import org.opendaylight.yangtools.rfc8040.model.api.YangDataStatement;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
-import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractEffectiveUnknownSchmemaNode;
+import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataNodeContainerMixin;
 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
 
 @Beta
 final class YangDataEffectiveStatementImpl extends AbstractEffectiveUnknownSchmemaNode<String, YangDataStatement>
-        implements YangDataEffectiveStatement, YangDataSchemaNode {
-    private final @NonNull QName argumentQName;
-    private final @NonNull ContainerEffectiveStatement container;
+        implements YangDataEffectiveStatement, YangDataSchemaNode, DataNodeContainerMixin<String, YangDataStatement> {
+    private final @NonNull DataSchemaNode child;
 
     YangDataEffectiveStatementImpl(final Current<String, YangDataStatement> stmt,
-             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName qname) {
+             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final DataSchemaNode child) {
         super(stmt.declared(), stmt.argument(), stmt.history(), substatements);
-        argumentQName = requireNonNull(qname);
-
-        container = findFirstEffectiveSubstatement(ContainerEffectiveStatement.class).get();
-
-        // TODO: this is strong binding of two API contracts. Unfortunately ContainerEffectiveStatement design is
-        //       incomplete.
-        verify(container instanceof ContainerSchemaNode, "Incompatible container %s", container);
+        this.child = requireNonNull(child);
     }
 
     @Override
     public QName getQName() {
-        return argumentQName;
-    }
-
-    @Override
-    public ContainerEffectiveStatement getContainer() {
-        return container;
+        return child.getQName();
     }
 
     @Override
-    public ContainerSchemaNode getContainerSchemaNode() {
-        // Verified in the constructor
-        return (ContainerSchemaNode) container;
+    public DataSchemaNode dataChildByName(final QName name) {
+        return name.equals(child.getQName()) ? child : null;
     }
 
     @Override
@@ -70,12 +57,23 @@ final class YangDataEffectiveStatementImpl extends AbstractEffectiveUnknownSchme
     @Override
     protected <K, V, N extends IdentifierNamespace<K, V>> Optional<? extends Map<K, V>> getNamespaceContents(
             final Class<N> namespace) {
-        if (SchemaTreeAwareEffectiveStatement.Namespace.class.equals(namespace)
-            || DataTreeAwareEffectiveStatement.Namespace.class.equals(namespace)) {
-            @SuppressWarnings("unchecked")
-            final Map<K, V> ns = (Map<K, V>)Map.of(container.argument(), container);
-            return Optional.of(ns);
+        if (SchemaTreeNamespace.class.equals(namespace)) {
+            return castChild();
+        }
+        if (DataTreeNamespace.class.equals(namespace)) {
+            if (child instanceof DataTreeEffectiveStatement) {
+                return castChild();
+            }
+
+            // A schema tree statement which *has to* know about data tree -- just forward it
+            verify(child instanceof DataTreeAwareEffectiveStatement, "Unexpected child %s", child);
+            return Optional.of(((DataTreeAwareEffectiveStatement<?, ?>) child).getAll(namespace));
         }
         return super.getNamespaceContents(namespace);
     }
+
+    @SuppressWarnings("unchecked")
+    private <K, V> Optional<Map<K, V>> castChild() {
+        return Optional.of((Map<K, V>) Map.of(child.getQName(), child));
+    }
 }