Improve BindingCodecContext.getCodecContextNode() 75/106175/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 26 May 2023 21:45:56 +0000 (23:45 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 26 May 2023 21:45:56 +0000 (23:45 +0200)
This method always returns @NonNull, document that. Also improve the IAE
thrown on mismatched input and eliminate
SchemaRootCodecContext.create().

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

index 57492a4bf3f62bcf5054494104f0e6bddfbf93d1..4989f809a2aa9212ae0ee1311e717c55b4647dde 100644 (file)
@@ -149,7 +149,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
     private final @NonNull InstanceIdentifierCodec instanceIdentifierCodec;
     private final @NonNull IdentityCodec identityCodec;
     private final @NonNull BindingRuntimeContext context;
-    private final SchemaRootCodecContext<?> root;
+    private final @NonNull SchemaRootCodecContext<?> root;
 
     public BindingCodecContext() {
         this(ServiceLoader.load(BindingRuntimeContext.class).findFirst()
@@ -158,7 +158,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
 
     public BindingCodecContext(final BindingRuntimeContext context) {
         this.context = requireNonNull(context, "Binding Runtime Context is required.");
-        root = SchemaRootCodecContext.create(this);
+        root = new SchemaRootCodecContext<>(this);
         identityCodec = new IdentityCodec(context);
         instanceIdentifierCodec = new InstanceIdentifierCodec(this);
     }
@@ -237,14 +237,18 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return new BindingToNormalizedStreamWriter(getActionCodec(action).output(), domWriter);
     }
 
-    DataContainerCodecContext<?,?> getCodecContextNode(final InstanceIdentifier<?> binding,
+    @NonNull DataContainerCodecContext<?,?> getCodecContextNode(final InstanceIdentifier<?> binding,
             final List<YangInstanceIdentifier.PathArgument> builder) {
-        DataContainerCodecContext<?,?> currentNode = root;
-        for (final InstanceIdentifier.PathArgument bindingArg : binding.getPathArguments()) {
-            currentNode = currentNode.bindingPathArgumentChild(bindingArg, builder);
-            checkArgument(currentNode != null, "Supplied Instance Identifier %s is not valid.", binding);
+        DataContainerCodecContext<?, ?> current = root;
+        for (var bindingArg : binding.getPathArguments()) {
+            final var next = current.bindingPathArgumentChild(bindingArg, builder);
+            if (next == null) {
+                throw new IllegalArgumentException("%s is not valid: parent %s does not have a child %s".formatted(
+                    binding, current.bindingArg(), bindingArg));
+            }
+            current = next;
         }
-        return currentNode;
+        return current;
     }
 
     /**
index 52c3efdfc97e9a0264047771d342b848c27bffd8..b93ec3f2ad581ed79c01f92d65cb004949b6942b 100644 (file)
@@ -198,19 +198,8 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
             }
         });
 
-    private SchemaRootCodecContext(final DataContainerCodecPrototype<BindingRuntimeTypes> dataPrototype) {
-        super(dataPrototype);
-    }
-
-    /**
-     * Creates RootNode from supplied CodecContextFactory.
-     *
-     * @param factory
-     *            CodecContextFactory
-     * @return A new root node
-     */
-    static SchemaRootCodecContext<?> create(final CodecContextFactory factory) {
-        return new SchemaRootCodecContext<>(DataContainerCodecPrototype.rootPrototype(factory));
+    SchemaRootCodecContext(final CodecContextFactory factory) {
+        super(DataContainerCodecPrototype.rootPrototype(factory));
     }
 
     @Override