boolean sameAsSchema = true;
for (SchemaTreeEffectiveStatement<?> child : schemaTreeStatements) {
- if (child instanceof DataTreeEffectiveStatement) {
- putChild(dataChildren, (DataTreeEffectiveStatement<?>) child, "data");
- } else {
- sameAsSchema = false;
- putChoiceDataChildren(dataChildren, child);
- }
+ sameAsSchema = indexDataTree(dataChildren, child);
}
// This is a mighty hack to lower memory usage: if we consumed all schema tree children as data nodes,
return sameAsSchema ? (ImmutableMap) schemaTreeNamespace : ImmutableMap.copyOf(dataChildren);
}
+ private static boolean indexDataTree(final Map<QName, DataTreeEffectiveStatement<?>> map,
+ final EffectiveStatement<?, ?> stmt) {
+ if (stmt instanceof DataTreeEffectiveStatement) {
+ putChild(map, (DataTreeEffectiveStatement<?>) stmt, "data");
+ return true;
+ } else if (stmt instanceof ChoiceEffectiveStatement) {
+ // For choice statements go through all their cases and fetch their data children
+ for (EffectiveStatement<?, ?> choiceChild : stmt.effectiveSubstatements()) {
+ if (choiceChild instanceof CaseEffectiveStatement) {
+ for (EffectiveStatement<?, ?> caseChild : choiceChild.effectiveSubstatements()) {
+ indexDataTree(map, caseChild);
+ }
+ }
+ }
+ return false;
+ } else if (stmt instanceof CaseEffectiveStatement) {
+ // For case statements go through all their statements
+ for (EffectiveStatement<?, ?> child : stmt.effectiveSubstatements()) {
+ indexDataTree(map, child);
+ }
+ return false;
+ } else {
+ return true;
+ }
+ }
+
private static <T extends SchemaTreeEffectiveStatement<?>> void putChild(final Map<QName, T> map, final T child,
final String tree) {
final QName id = child.getIdentifier();
"Cannot add " + tree + " tree child with name " + id + ", a conflicting child already exists");
}
}
-
- private static void putChoiceDataChildren(final Map<QName, DataTreeEffectiveStatement<?>> map,
- final SchemaTreeEffectiveStatement<?> child) {
- // For choice statements go through all their cases and fetch their data children
- if (child instanceof ChoiceEffectiveStatement) {
- child.streamEffectiveSubstatements(CaseEffectiveStatement.class).forEach(
- caseStmt -> caseStmt.streamEffectiveSubstatements(SchemaTreeEffectiveStatement.class).forEach(stmt -> {
- if (stmt instanceof DataTreeEffectiveStatement) {
- putChild(map, (DataTreeEffectiveStatement<?>) stmt, "data");
- } else {
- putChoiceDataChildren(map, stmt);
- }
- }));
- }
- }
}
import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ChoiceStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AugmentationTargetMixin;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataSchemaNodeMixin;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.MandatoryMixin;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.AddedByUsesMixin;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin;