X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2FAbstractDeclaredEffectiveStatement.java;h=bc09f534e609bd9993e950ec7543233f6c196fca;hb=34fee1a4bb89a7b42a89f2b8a233417a65f2f633;hp=fe88538bf05baa5db1778db47e8dc8185705df4f;hpb=98948981ae99dd0a8366908c7448b5b7de0584d3;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredEffectiveStatement.java index fe88538bf0..bc09f534e6 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredEffectiveStatement.java @@ -13,6 +13,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import java.util.HashMap; import java.util.Map; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; @@ -28,7 +29,9 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStat import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; /** @@ -84,7 +87,7 @@ public abstract class AbstractDeclaredEffectiveStatement> schemaTreeNamespace(); + protected abstract Map> schemaTreeNamespace(); } /** @@ -107,7 +110,7 @@ public abstract class AbstractDeclaredEffectiveStatement> dataTreeNamespace(); + protected abstract Map> dataTreeNamespace(); } /** @@ -131,6 +134,46 @@ public abstract class AbstractDeclaredEffectiveStatement> extends Default + implements DataNodeContainerMixin { + private final @NonNull ImmutableMap dataChildren; + private final @NonNull Object substatements; + + protected DefaultDataNodeContainer(final D declared, final StatementSourceReference ref, + final ImmutableList> substatements) { + super(declared); + this.substatements = maskList(substatements); + + // Note: we do not leak this map, so iteration order does not matter + final Map tmp = new HashMap<>(); + + for (EffectiveStatement stmt : effectiveSubstatements()) { + if (stmt instanceof DataSchemaNode) { + final DataSchemaNode node = (DataSchemaNode) stmt; + final QName id = node.getQName(); + final DataSchemaNode prev = tmp.put(id, node); + SourceException.throwIf(prev != null, ref, + "Cannot add child with name %s, a conflicting child already exists", id); + } + } + + dataChildren = ImmutableMap.copyOf(tmp); + } + + @Override + public final ImmutableList> effectiveSubstatements() { + return unmaskList(substatements); + } + + @Override + public final Optional findDataChildByName(final QName name) { + return Optional.ofNullable(dataChildren.get(requireNonNull(name))); + } + } + /** * An extra building block on top of {@link Default}, which is wiring {@link #argument()} to the declared statement. * This is mostly useful for arguments that are not subject to inference transformation -- for example Strings in @@ -176,14 +219,30 @@ public abstract class AbstractDeclaredEffectiveStatement, E extends SchemaTreeAwareEffectiveStatement> extends WithSchemaTree { + public abstract static class WithSubstatements, + E extends SchemaTreeAwareEffectiveStatement> extends DefaultWithSchemaTree { + private final @NonNull Object substatements; + + protected WithSubstatements(final D declared, final StmtContext ctx, + final ImmutableList> substatements) { + super(declared, ctx, substatements); + this.substatements = maskList(substatements); + } + + @Override + public final ImmutableList> effectiveSubstatements() { + return unmaskList(substatements); + } + } + private final @NonNull ImmutableMap> schemaTree; private final @NonNull D declared; protected DefaultWithSchemaTree(final D declared, final StmtContext ctx, final ImmutableList> substatements) { this.declared = requireNonNull(declared); - this.schemaTree = AbstractSchemaEffectiveDocumentedNode.createSchemaTreeNamespace( - ctx.getStatementSourceReference(), substatements); + this.schemaTree = ImmutableMap.copyOf(createSchemaTreeNamespace( + ctx.getStatementSourceReference(), substatements)); } @Override @@ -192,7 +251,7 @@ public abstract class AbstractDeclaredEffectiveStatement> schemaTreeNamespace() { + protected final Map> schemaTreeNamespace() { return schemaTree; } } @@ -207,6 +266,22 @@ public abstract class AbstractDeclaredEffectiveStatement, E extends DataTreeAwareEffectiveStatement> extends WithDataTree { + public abstract static class WithSubstatements, + E extends DataTreeAwareEffectiveStatement> extends DefaultWithDataTree { + private final @NonNull Object substatements; + + protected WithSubstatements(final D declared, final StmtContext ctx, + final ImmutableList> substatements) { + super(declared, ctx, substatements); + this.substatements = maskList(substatements); + } + + @Override + public final ImmutableList> effectiveSubstatements() { + return unmaskList(substatements); + } + } + private final @NonNull ImmutableMap> schemaTree; private final @NonNull ImmutableMap> dataTree; private final @NonNull D declared; @@ -215,8 +290,9 @@ public abstract class AbstractDeclaredEffectiveStatement> substatements) { this.declared = requireNonNull(declared); final StatementSourceReference ref = ctx.getStatementSourceReference(); - this.schemaTree = AbstractSchemaEffectiveDocumentedNode.createSchemaTreeNamespace(ref, substatements); - this.dataTree = AbstractSchemaEffectiveDocumentedNode.createDataTreeNamespace(ref, schemaTree); + final Map> schema = createSchemaTreeNamespace(ref, substatements); + this.schemaTree = ImmutableMap.copyOf(schema); + this.dataTree = createDataTreeNamespace(ref, schema.values(), schemaTree); } @Override @@ -225,12 +301,12 @@ public abstract class AbstractDeclaredEffectiveStatement> schemaTreeNamespace() { + protected final Map> schemaTreeNamespace() { return schemaTree; } @Override - protected final ImmutableMap> dataTreeNamespace() { + protected final Map> dataTreeNamespace() { return dataTree; } }