Do not use BindingReflections in mdsal-binding-dom-codec-api 06/106706/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 26 Jun 2023 18:33:35 +0000 (20:33 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 26 Jun 2023 18:47:50 +0000 (20:47 +0200)
The exact mechanics of now an Action's QNameModule is resolved should
not be dependent on reflection. Eliminate this assumption from API and
shift it down to implementation.

JIRA: MDSAL-781
Change-Id: I6c3a18c41ee8189c315be3cc2888c092f06bb6ec
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec-api/pom.xml
binding/mdsal-binding-dom-codec-api/src/main/java/module-info.java
binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java
binding/mdsal-binding-dom-codec-spi/src/main/java/module-info.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/AbstractBindingNormalizedNodeSerializer.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java

index 85576fa0120616923c8e121ac08e27f817cef528..65a14e2a61eec2515cbbb56c7039372988bee1f2 100644 (file)
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-model-api</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.opendaylight.mdsal</groupId>
-            <artifactId>mdsal-binding-spec-util</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-runtime-api</artifactId>
index 18162609c8aa129f152d876d2a202ecdfd61a418..04a10c31d19c8f3f7c8d20d45a17cf906781f20f 100644 (file)
@@ -12,7 +12,6 @@ module org.opendaylight.mdsal.binding.dom.codec.api {
     requires transitive org.opendaylight.yangtools.yang.model.api;
     requires transitive org.opendaylight.yangtools.yang.binding;
     requires transitive org.opendaylight.mdsal.binding.runtime.api;
-    requires org.opendaylight.mdsal.binding.spec.util;
 
     // Annotations
     requires static transitive org.eclipse.jdt.annotation;
index a3ce9deeaae14b7d57ef357d84af3c2c86811eed..18f32bbe49281ed7d71be7594ede04ef0c884d79 100644 (file)
@@ -16,7 +16,6 @@ import java.time.Instant;
 import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.Action;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.BaseNotification;
@@ -26,7 +25,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
-import org.opendaylight.yangtools.yang.common.YangConstants;
 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.ContainerNode;
@@ -241,11 +239,8 @@ public interface BindingNormalizedNodeSerializer {
      * @throws NullPointerException if any of the arguments is null
      */
     @Beta
-    default @NonNull BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
-            @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcInput input) {
-        return toLazyNormalizedNodeActionInput(action,
-            new NodeIdentifier(YangConstants.operationInputQName(BindingReflections.getQNameModule(action))), input);
-    }
+    @NonNull BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
+        @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull RpcInput input);
 
     /**
      * Translates supplied Binding action input into NormalizedNode data.
@@ -278,11 +273,9 @@ public interface BindingNormalizedNodeSerializer {
      * @param output Binding action output
      * @return NormalizedNode representation of action output
      */
-    @Beta default @NonNull BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
-            @NonNull final Class<? extends Action<?, ?, ?>> action, @NonNull final RpcOutput output) {
-        return toLazyNormalizedNodeActionOutput(action,
-            new NodeIdentifier(YangConstants.operationOutputQName(BindingReflections.getQNameModule(action))), output);
-    }
+    @Beta
+    @NonNull BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
+            @NonNull Class<? extends Action<?, ?, ?>> action, @NonNull RpcOutput output);
 
     /**
      * Translates supplied Binding action output into NormalizedNode data.
index b2bf958816239f8da96975d5af847d141d35aa03..02a568f0553cbcd6e30c1ddf48728684f9277163 100644 (file)
@@ -9,7 +9,6 @@ module org.opendaylight.mdsal.binding.dom.codec.spi {
     exports org.opendaylight.mdsal.binding.dom.codec.spi;
 
     requires transitive org.opendaylight.mdsal.binding.dom.codec.api;
-    requires org.opendaylight.mdsal.binding.spec.util;
 
     // Annotations
     requires static transitive org.eclipse.jdt.annotation;
index b4de0635a6ed71295577fd53e529cfeec6e0641c..e769543327f6db3923f8ba18390d0c0897da00f0 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.codec.spi;
 
 import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.Action;
@@ -23,9 +24,25 @@ public abstract class AbstractBindingNormalizedNodeSerializer implements Binding
         return new LazyActionInputContainerNode(identifier, input, this, action);
     }
 
+    @Override
+    public final BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
+            final Class<? extends Action<?, ?, ?>> action, final RpcInput input) {
+        return toLazyNormalizedNodeActionInput(action, actionInputName(action), input);
+    }
+
+    protected abstract @NonNull NodeIdentifier actionInputName(@NonNull Class<? extends Action<?, ?, ?>> action);
+
     @Override
     public final BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
             final Class<? extends Action<?, ?, ?>> action, final NodeIdentifier identifier, final RpcOutput output) {
         return new LazyActionOutputContainerNode(identifier, output, this, action);
     }
+
+    @Override
+    public final BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
+            final Class<? extends Action<?, ?, ?>> action, final RpcOutput output) {
+        return toLazyNormalizedNodeActionOutput(action, actionOutputName(action), output);
+    }
+
+    protected abstract @NonNull NodeIdentifier actionOutputName(@NonNull Class<? extends Action<?, ?, ?>> action);
 }
index 45e02d034da5905c7c63aa61653014bd088ef621..c434bef546850395c9a7b6aa3773b1a945544d58 100644 (file)
@@ -48,12 +48,24 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject
         return delegate().toLazyNormalizedNodeActionInput(action, identifier, input);
     }
 
+    @Override
+    public BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
+            final Class<? extends Action<?, ?, ?>> action, final RpcInput input) {
+        return delegate().toLazyNormalizedNodeActionInput(action, input);
+    }
+
     @Override
     public BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
             final Class<? extends Action<?, ?, ?>> action, final NodeIdentifier identifier, final RpcOutput output) {
         return delegate().toLazyNormalizedNodeActionOutput(action, identifier, output);
     }
 
+    @Override
+    public BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
+            final Class<? extends Action<?, ?, ?>> action, final RpcOutput output) {
+        return delegate().toLazyNormalizedNodeActionOutput(action, output);
+    }
+
     @Override
     public YangInstanceIdentifier toYangInstanceIdentifier(final InstanceIdentifier<?> binding) {
         return delegate().toYangInstanceIdentifier(binding);
index c85dfa3ca0fbabc65c9e017ef0d07fbc987ebc33..f851596df865c9530be6d34d0e139a207a757fcb 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Verify.verify;
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Strings;
@@ -698,6 +699,16 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return serializeDataObject(output, (ctx, iface, domWriter) -> ctx.newActionOutputWriter(action, domWriter));
     }
 
+    @Override
+    protected NodeIdentifier actionInputName(final Class<? extends Action<?, ?, ?>> action) {
+        return verifyNotNull(getActionCodec(action).input().getDomPathArgument());
+    }
+
+    @Override
+    protected NodeIdentifier actionOutputName(final Class<? extends Action<?, ?, ?>> action) {
+        return verifyNotNull(getActionCodec(action).output().getDomPathArgument());
+    }
+
     private <T extends DataContainer> @NonNull ContainerNode serializeDataObject(final DataObject data,
             final WriterFactoryMethod<T> newWriter) {
         final var result = new NormalizationResultHolder();
@@ -715,7 +726,6 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return (ContainerNode) result.getResult().data();
     }
 
-
     private static boolean notBindingRepresentable(final NormalizedNode data) {
         // ValueNode covers LeafNode and LeafSetEntryNode
         return data instanceof ValueNode
index 08b3f2ba1f7055d59e2f060b2359935a1dab82e1..23918c022f62c022b1e5418c21000e5175c0d796 100644 (file)
@@ -57,7 +57,7 @@ public final class BindingReflections {
         return CLASS_TO_QNAME.getUnchecked(dataType).orElse(null);
     }
 
-    public static QNameModule getQNameModule(final Class<?> clz) {
+    public static @NonNull QNameModule getQNameModule(final Class<?> clz) {
         if (DataContainer.class.isAssignableFrom(clz) || BaseIdentity.class.isAssignableFrom(clz)
                 || Action.class.isAssignableFrom(clz)) {
             return findQName(clz).getModule();