AugmentEffectiveStatement should be SchemaTreeAware 80/99780/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 16 Feb 2022 22:27:07 +0000 (23:27 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 17 Feb 2022 08:31:14 +0000 (09:31 +0100)
Design of downstream users' classes is somewhat hampered by
AugmentEffectiveStatement not exposing the fact it roots schema tree
addressable components. Fix that and eliminate AbstractDataNodeContainer
as it is no longer needed.

JIRA: YANGTOOLS-1400
Change-Id: I8c34d64e61efbf18780975718d017d12284763d4
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AugmentEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractDataNodeContainer.java [deleted file]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AugmentEffectiveStatementImpl.java

index bbdd448d21ba31b3e5edf64605b069796dc1036b..a27ff151dc02027b402ca35be272a33448dcd28a 100644 (file)
@@ -12,8 +12,13 @@ import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
+/**
++ * {@link EffectiveStatement} representation of a {@code augment} statement as defined by
++ * <a href="https://datatracker.ietf.org/doc/html/rfc7950#section-7.17">RFC7950</a>.
+ */
 @Beta
-public interface AugmentEffectiveStatement extends EffectiveStatement<SchemaNodeIdentifier, AugmentStatement> {
+public interface AugmentEffectiveStatement
+        extends SchemaTreeAwareEffectiveStatement<SchemaNodeIdentifier, AugmentStatement> {
     @Override
     default StatementDefinition statementDefinition() {
         return YangStmtMapping.AUGMENT;
diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractDataNodeContainer.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractDataNodeContainer.java
deleted file mode 100644 (file)
index caabdff..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
-
-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 org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
-import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.Default;
-import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataNodeContainerMixin;
-import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
-
-/**
- * Utility class for implementing {@link DataNodeContainer}-type statements.
- */
-@Beta
-public abstract class AbstractDataNodeContainer<A, D extends DeclaredStatement<A>> extends Default<A, D>
-        implements DataNodeContainerMixin<A, D> {
-    private final @NonNull ImmutableMap<QName, DataSchemaNode> dataChildren;
-    private final @NonNull Object substatements;
-
-    protected AbstractDataNodeContainer(final D declared,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
-        super(declared);
-        this.substatements = maskList(substatements);
-
-        // Note: we do not leak this map, so iteration order does not matter
-        final Map<QName, DataSchemaNode> 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);
-                if (prev != null) {
-                    throw new SubstatementIndexingException(
-                        "Cannot add child with name " + id + ", a conflicting child already exists");
-                }
-            }
-        }
-
-        dataChildren = ImmutableMap.copyOf(tmp);
-    }
-
-    @Override
-    public final ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
-        return unmaskList(substatements);
-    }
-
-    @Override
-    public final DataSchemaNode dataChildByName(final QName name) {
-        return dataChildren.get(requireNonNull(name));
-    }
-}
\ No newline at end of file
index c01af0dc6864dc481226bd95bdba603890f50b49..b92d94f7fe535f0f9043aa72b4c3278130bf29a4 100644 (file)
@@ -13,22 +13,27 @@ import com.google.common.collect.ImmutableList;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.QNameModuleAware;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultWithSchemaTree;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.ActionNodeContainerMixin;
+import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DataNodeContainerMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DocumentedNodeMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.NotificationNodeContainerMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.WhenConditionMixin;
 
 public final class AugmentEffectiveStatementImpl
-        extends AbstractDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
+        extends DefaultWithSchemaTree<SchemaNodeIdentifier, AugmentStatement>
         implements AugmentEffectiveStatement, AugmentationSchemaNode, QNameModuleAware,
             DocumentedNodeMixin.WithStatus<SchemaNodeIdentifier, AugmentStatement>,
+            DataNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
             ActionNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
             NotificationNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
             WhenConditionMixin<SchemaNodeIdentifier, AugmentStatement> {
@@ -64,6 +69,11 @@ public final class AugmentEffectiveStatementImpl
         return flags;
     }
 
+    @Override
+    public DataSchemaNode dataChildByName(final QName name) {
+        return dataSchemaNode(name);
+    }
+
     @Override
     public QNameModule getQNameModule() {
         return rootModuleQName;