Unify yangPathArgumentChild() 52/106852/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 10 Jul 2023 11:42:31 +0000 (13:42 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 10 Jul 2023 12:07:15 +0000 (14:07 +0200)
We have two implementations which are doing essentially the same thing
-- except ChoiceCodecContext performs lookup twice. Reduce the amount of
codec duplication.

JIRA: MDSAL-805
Change-Id: I834bf66d92f8bf3ad8621be28ba3fbb39f52f9fc
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java

index 2e7ba4732f8234a1f563470289b36ffad23f790e..d0b87666a43a61509f3c6367f3380ffa4b825af9 100644 (file)
@@ -21,7 +21,6 @@ import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
@@ -105,19 +104,7 @@ public abstract sealed class AbstractDataObjectCodecContext<D extends DataObject
     }
 
     @Override
-    public final CodecContext yangPathArgumentChild(final PathArgument arg) {
-        CodecContextSupplier supplier;
-        if (arg instanceof NodeIdentifier nodeId) {
-            supplier = yangChildSupplier(nodeId);
-        } else if (arg instanceof NodeIdentifierWithPredicates nip) {
-            supplier = yangChildSupplier(new NodeIdentifier(nip.getNodeType()));
-        } else {
-            supplier = null;
-        }
-        return childNonNull(supplier, arg, "Argument %s is not valid child of %s", arg, getSchema()).get();
-    }
-
-    @Nullable CodecContextSupplier yangChildSupplier(final @NonNull NodeIdentifier arg) {
+    CodecContextSupplier yangChildSupplier(final NodeIdentifier arg) {
         return byYang.get(arg);
     }
 
index b5b7866307bee56746a1f3e05a2c11693375e301..fb20296e4a14843af58da00d01c77366c1e422d9 100644 (file)
@@ -40,7 +40,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.binding.contract.Naming;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -219,15 +218,12 @@ final class ChoiceCodecContext<D extends DataObject> extends CommonDataObjectCod
 
     @Override
     public CodecContext yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
-        final CommonDataObjectCodecPrototype<?> cazeProto;
-        if (arg instanceof NodeIdentifierWithPredicates) {
-            cazeProto = byYangCaseChild.get(new NodeIdentifier(arg.getNodeType()));
-        } else {
-            cazeProto = byYangCaseChild.get(arg);
-        }
+        return ((CaseCodecContext<?>) super.yangPathArgumentChild(arg)).yangPathArgumentChild(arg);
+    }
 
-        return childNonNull(cazeProto, arg, "Argument %s is not valid child of %s", arg, getSchema()).get()
-                .yangPathArgumentChild(arg);
+    @Override
+    CaseCodecPrototype yangChildSupplier(final NodeIdentifier arg) {
+        return byYangCaseChild.get(arg);
     }
 
     @Override
index 838e55b4ebe4a82fe12b2e507e5c09768d124201..acaefd748a119b5310faf0e30845b802952df263 100644 (file)
@@ -44,6 +44,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
@@ -94,8 +96,21 @@ abstract sealed class DataContainerCodecContext<D extends BindingObject & DataCo
 
     protected abstract @NonNull T type();
 
+    // Non-final for ChoiceCodecContext
     @Override
-    public abstract CodecContext yangPathArgumentChild(YangInstanceIdentifier.PathArgument arg);
+    public CodecContext yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
+        CodecContextSupplier supplier;
+        if (arg instanceof NodeIdentifier nodeId) {
+            supplier = yangChildSupplier(nodeId);
+        } else if (arg instanceof NodeIdentifierWithPredicates nip) {
+            supplier = yangChildSupplier(new NodeIdentifier(nip.getNodeType()));
+        } else {
+            supplier = null;
+        }
+        return childNonNull(supplier, arg, "Argument %s is not valid child of %s", arg, getSchema()).get();
+    }
+
+    abstract @Nullable CodecContextSupplier yangChildSupplier(@NonNull NodeIdentifier arg);
 
     @Override
     public CommonDataObjectCodecContext<?, ?> bindingPathArgumentChild(final PathArgument arg,