Split out CaseNodeCodecContext.Prototype 79/106379/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 4 Jun 2023 22:47:14 +0000 (00:47 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 4 Jun 2023 22:52:00 +0000 (00:52 +0200)
Add an explicit subclass of DataObjectCodecProtype to serve case nodes.

Change-Id: I77a752be75673d1ffa768c5d76c422f082e03880
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CaseNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecPrototype.java

index 0352a82676e869c7ca1eef8f4ac75e7f9348fbeb..69c94c6a93f07c14bf7356a07da27cb973a6e146 100644 (file)
@@ -14,11 +14,23 @@ import org.opendaylight.mdsal.binding.runtime.api.CaseRuntimeType;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 final class CaseNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, CaseRuntimeType> {
-    CaseNodeCodecContext(final DataContainerCodecPrototype<CaseRuntimeType> prototype) {
+    static final class Prototype extends DataObjectCodecPrototype<CaseRuntimeType> {
+        Prototype(final Class<?> cls, final CaseRuntimeType type, final CodecContextFactory factory) {
+            super(cls, NodeIdentifier.create(type.statement().argument()), type, factory);
+        }
+
+        @Override
+        DataContainerCodecContext<?, CaseRuntimeType> createInstance() {
+            return new CaseNodeCodecContext<>(this);
+        }
+    }
+
+    private CaseNodeCodecContext(final Prototype prototype) {
         super(prototype, CodecItemFactory.of(prototype.getBindingClass()));
     }
 
index 639e2dc5f760d8d37fb88eca707b106cfbcec2c8..90038cac5ce8759b2e2fd75612683bd705586929 100644 (file)
@@ -117,20 +117,22 @@ final class ChoiceNodeCodecContext<D extends DataObject> extends DataContainerCo
         final var factory = prototype.getFactory();
         final var localCases = new HashSet<JavaTypeName>();
         for (var caseType : choiceType.validCaseChildren()) {
-            final var cazeDef = loadCase(factory, caseType);
+            final var caseProto = new CaseNodeCodecContext.Prototype(loadCase(factory.getRuntimeContext(), caseType),
+                caseType, factory);
+
             localCases.add(caseType.getIdentifier());
-            byClassBuilder.put(cazeDef.getBindingClass(), cazeDef);
+            byClassBuilder.put(caseProto.getBindingClass(), caseProto);
 
             // Updates collection of case children
             @SuppressWarnings("unchecked")
-            final var cazeCls = (Class<? extends DataObject>) cazeDef.getBindingClass();
+            final var cazeCls = (Class<? extends DataObject>) caseProto.getBindingClass();
             for (var cazeChild : getChildrenClasses(cazeCls)) {
-                childToCase.put(cazeChild, cazeDef);
+                childToCase.put(cazeChild, caseProto);
             }
             // Updates collection of YANG instance identifier to case
-            for (var stmt : cazeDef.getType().statement().effectiveSubstatements()) {
+            for (var stmt : caseProto.getType().statement().effectiveSubstatements()) {
                 if (stmt instanceof DataSchemaNode cazeChild) {
-                    byYangCaseChildBuilder.put(NodeIdentifier.create(cazeChild.getQName()), cazeDef);
+                    byYangCaseChildBuilder.put(NodeIdentifier.create(cazeChild.getQName()), caseProto);
                 }
             }
         }
@@ -188,11 +190,6 @@ final class ChoiceNodeCodecContext<D extends DataObject> extends DataContainerCo
         byClass = ImmutableMap.copyOf(byClassBuilder);
     }
 
-    private static DataContainerCodecPrototype<CaseRuntimeType> loadCase(final CodecContextFactory factory,
-            final CaseRuntimeType caseType) {
-        return DataContainerCodecPrototype.from(loadCase(factory.getRuntimeContext(), caseType), caseType, factory);
-    }
-
     private static Class<?> loadCase(final BindingRuntimeContext context, final CaseRuntimeType caseType) {
         final var className = caseType.getIdentifier();
         try {
index 2f6bacc52519b50810927aaa501cacf6d250a2bb..06b4c90b153e6fd5a7fb8ccebfbbb5e33b840810 100644 (file)
@@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
-import org.opendaylight.mdsal.binding.runtime.api.CaseRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.ChoiceRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.ContainerLikeRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.ContainerRuntimeType;
@@ -61,8 +60,6 @@ non-sealed class DataObjectCodecPrototype<T extends RuntimeTypeContainer> extend
                             : new ListNodeCodecContext(this);
         } else if (type instanceof ChoiceRuntimeType) {
             return new ChoiceNodeCodecContext(this);
-        } else if (type instanceof CaseRuntimeType) {
-            return new CaseNodeCodecContext(this);
         }
         throw new IllegalArgumentException("Unsupported type " + getBindingClass() + " " + type);
     }