X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=parser%2Frfc8040-parser-support%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Frfc8040%2Fparser%2FYangDataEffectiveStatementImpl.java;h=13440a836790e82955fadd63b711aea78c3976ef;hb=be25c5f74f881ec189cf7522a1aee213a58539ff;hp=3b083715141837d907ccb6af7c1ab1afaa53a134;hpb=972cf3c8946759e2a5d724cb3f6e2d2cd2b06b6d;p=yangtools.git diff --git a/parser/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java b/parser/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java index 3b08371514..13440a8367 100644 --- a/parser/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java +++ b/parser/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java @@ -19,45 +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.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 - implements YangDataEffectiveStatement, YangDataSchemaNode { - private final @NonNull QName argumentQName; - private final @NonNull ContainerEffectiveStatement container; + implements YangDataEffectiveStatement, YangDataSchemaNode, DataNodeContainerMixin { + private final @NonNull DataSchemaNode child; YangDataEffectiveStatementImpl(final Current stmt, - final ImmutableList> substatements, final QName qname) { + final ImmutableList> 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 @@ -68,11 +57,23 @@ final class YangDataEffectiveStatementImpl extends AbstractEffectiveUnknownSchme @Override protected > Optional> getNamespaceContents( final Class namespace) { - if (SchemaTreeNamespace.class.equals(namespace) || DataTreeNamespace.class.equals(namespace)) { - @SuppressWarnings("unchecked") - final Map ns = (Map)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 Optional> castChild() { + return Optional.of((Map) Map.of(child.getQName(), child)); + } }