Fix {Data,Schema}TreeAwareEffectiveStatement.Namespace 26/99926/4
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Mar 2022 22:44:24 +0000 (23:44 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Mar 2022 23:49:09 +0000 (00:49 +0100)
These two namespaces should not be generic, but rather specialized
to the corresponding wildcard statement. This fixes a number of
usability issues where type inference would not work correctly.

Change-Id: I0b4a2461df58265ae2db795c0c81e2b4e5972e41
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactorySupplier.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DataTreeAwareEffectiveStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/SchemaTreeAwareEffectiveStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/compat/ActionNodeContainerCompat.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/compat/NotificationNodeContainerCompat.java

index 2c3dacd2fe2a2255479b12e4ea3523506a7590f0..8744651ab9cc42e03d4ab6dd8af714c9b7a5c64b 100644 (file)
@@ -15,11 +15,9 @@ import com.google.common.base.Stopwatch;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
-import java.util.Map;
 import java.util.Optional;
 import java.util.function.BiFunction;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.util.codec.CodecCache;
 import org.opendaylight.yangtools.yang.data.util.codec.LazyCodecCache;
 import org.opendaylight.yangtools.yang.data.util.codec.NoopCodecCache;
@@ -28,7 +26,7 @@ import org.opendaylight.yangtools.yang.data.util.codec.SharedCodecCache;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement.Namespace;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
@@ -93,11 +91,10 @@ public enum JSONCodecFactorySupplier {
         private static int codecsForChildren(final JSONCodecFactory lazy, final SchemaInferenceStack stack,
                 final DataTreeAwareEffectiveStatement<?, ?> parent) {
             int ret = 0;
-            final Map<QName, DataTreeEffectiveStatement<?>> dataTree =
-                parent.getAll(DataTreeAwareEffectiveStatement.Namespace.class);
-            for (DataTreeEffectiveStatement<?> child : dataTree.values()) {
+            for (var entry : parent.getAll(Namespace.class).entrySet()) {
+                final var child = entry.getValue();
                 if (child instanceof DataTreeAwareEffectiveStatement) {
-                    stack.enterDataTree(child.argument());
+                    stack.enterDataTree(entry.getKey());
                     ret += codecsForChildren(lazy, stack, (DataTreeAwareEffectiveStatement<?, ?>) child);
                     stack.exit();
                 } else if (child instanceof TypedDataSchemaNode) {
index 7e2a54feb565fef19f0cb4747ca4715d5da137c8..897dabb20e137183bb9889132abc17d89b2f50d0 100644 (file)
@@ -35,11 +35,9 @@ public interface DataTreeAwareEffectiveStatement<A, D extends DeclaredStatement<
      *
      * <p>
      * This corresponds to the {@code data tree} view of a YANG-defined data.
-     *
-     * @param <T> Child statement type
      */
     @NonNullByDefault
-    abstract class Namespace<T extends DataTreeEffectiveStatement<?>> extends EffectiveStatementNamespace<T> {
+    abstract class Namespace extends EffectiveStatementNamespace<DataTreeEffectiveStatement<?>> {
         private Namespace() {
             // Should never be instantiated
         }
index 144473a6907f757363b467e31eaf0acd16802a01..f110b808bb1b24e2537bc76330c4dea6c4781b40 100644 (file)
@@ -30,18 +30,14 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce
  *
  * @param <A> Argument type
  * @param <D> Class representing declared version of this statement.
- * @author Robert Varga
  */
 @Beta
 public interface SchemaTreeAwareEffectiveStatement<A, D extends DeclaredStatement<A>> extends EffectiveStatement<A, D> {
     /**
      * Namespace of {@code schema node}s defined within this node.
-     *
-     * @param <T> Child statement type
-     * @author Robert Varga
      */
     @NonNullByDefault
-    abstract class Namespace<T extends SchemaTreeEffectiveStatement<?>> extends EffectiveStatementNamespace<T> {
+    abstract class Namespace extends EffectiveStatementNamespace<SchemaTreeEffectiveStatement<?>> {
         private Namespace() {
             // Should never be instantiated
         }
index f2f4f4d01eaae633a36e97fe5eeb634122b8ac42..4626c389e4fb03235013abbfad9fee121e0d6f52 100644 (file)
@@ -29,6 +29,7 @@ public interface ActionNodeContainerCompat<A, D extends DeclaredStatement<A>,
         // 'action' identifier must never collide with another element, hence if we look it up and it ends up being
         // an ActionDefinition, we have found a match.
         return get(Namespace.class, qname)
-                .flatMap(child -> child instanceof ActionDefinition ? Optional.of(child) : Optional.empty());
+            .flatMap(child -> child instanceof ActionDefinition ? Optional.of((ActionDefinition) child)
+                : Optional.empty());
     }
 }
index 16e9dc38ab8a98d6df668a1f1e14cd8ef6f4f8a5..7d98318cfe067906834997076f276fb2730b7902 100644 (file)
@@ -29,6 +29,7 @@ public interface NotificationNodeContainerCompat<A, D extends DeclaredStatement<
         // 'notification' identifier must never collide with another element, hence if we look it up and it ends up
         // being an NotificationDefinition, we have found a match.
         return get(Namespace.class, qname)
-                .flatMap(child -> child instanceof NotificationDefinition ? Optional.of(child) : Optional.empty());
+            .flatMap(child -> child instanceof NotificationDefinition ? Optional.of((NotificationDefinition) child)
+                : Optional.empty());
     }
 }