Override Rpc/Action invoke method 27/109827/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 18 Jan 2024 06:56:56 +0000 (07:56 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 18 Jan 2024 07:53:02 +0000 (08:53 +0100)
Add a plain @Override method for Rpc/Action's invoke method, so that it
is manifested in the generated type.

JIRA: MDSAL-852
Change-Id: I7db7c9036bdb3051ae48a903b66df933fb338fae
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcAdapter.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/AbstractInvokableGenerator.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/RpcGenerator.java

index 624d8ffe9a9eb8b7fbc4ddce7bc17025b25dbba9..1903d3011652a9ad7ef42bc4d8efb4ff92de395d 100644 (file)
@@ -26,7 +26,6 @@ final class RpcAdapter implements InvocationHandler {
     private final @NonNull DOMRpcService delegate;
     private final RpcInvocationStrategy strategy;
     private final @NonNull Rpc<?, ?> facade;
-    private final Method invokeMethod;
     private final String name;
 
     <T extends Rpc<?, ?>> RpcAdapter(final AdapterContext adapterContext, final DOMRpcService delegate,
@@ -40,12 +39,6 @@ final class RpcAdapter implements InvocationHandler {
             throw new IllegalStateException("Failed to find runtime type for " + type);
         }
 
-        try {
-            invokeMethod = type.getMethod(Naming.RPC_INVOKE_NAME, RpcInput.class);
-        } catch (NoSuchMethodException e) {
-            throw new IllegalStateException("Failed to find invoke method in " + type, e);
-        }
-
         facade = type.cast(Proxy.newProxyInstance(type.getClassLoader(), new Class<?>[] { type }, this));
         name = type.getName();
 
@@ -67,11 +60,12 @@ final class RpcAdapter implements InvocationHandler {
 
     @Override
     public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
-        if (invokeMethod.equals(method)) {
-            return strategy.invoke((RpcInput) requireNonNull(args[0]));
-        }
-
         switch (method.getName()) {
+            case Naming.RPC_INVOKE_NAME:
+                if (method.getParameterCount() == 1) {
+                    return strategy.invoke((RpcInput) requireNonNull(args[0]));
+                }
+                break;
             case "toString":
                 if (method.getReturnType().equals(String.class) && method.getParameterCount() == 0) {
                     return name + "$Adapter{delegate=" + delegate + "}";
index 55313f5bd3ec2fa1b335c86a55146c3448902a9f..a3851f9279d4bc3ec2101d01e5bb3d8bd879cb04 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl.reactor;
 
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
-import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
+import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
 import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
@@ -39,9 +38,11 @@ abstract class AbstractInvokableGenerator<S extends SchemaTreeEffectiveStatement
     @Override
     final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
         final var builder = builderFactory.newGeneratedTypeBuilder(typeName());
-        builder.addImplementsType(implementedType(builderFactory,
-            getChild(this, InputEffectiveStatement.class).getOriginal().getGeneratedType(builderFactory),
-            getChild(this, OutputEffectiveStatement.class).getOriginal().getGeneratedType(builderFactory)));
+        final var inputType = getChild(this, InputEffectiveStatement.class).getOriginal()
+            .getGeneratedType(builderFactory);
+        final var outputType = getChild(this, OutputEffectiveStatement.class).getOriginal()
+            .getGeneratedType(builderFactory);
+        addImplementedType(builderFactory, builder, inputType, outputType);
         builder.addAnnotation(FUNCTIONAL_INTERFACE_ANNOTATION);
         defaultImplementedInterace(builder);
 
@@ -54,6 +55,6 @@ abstract class AbstractInvokableGenerator<S extends SchemaTreeEffectiveStatement
         return builder.build();
     }
 
-    abstract @NonNull ParameterizedType implementedType(TypeBuilderFactory builderFactory, GeneratedType input,
-        GeneratedType output);
+    abstract void addImplementedType(TypeBuilderFactory builderFactory, GeneratedTypeBuilder builder,
+        GeneratedType input, GeneratedType output);
 }
index f4849f151a63bba8ccba36792a8598246d3e75ef..b5d1329cb055127482bc87485c76d23bc330f7b5 100644 (file)
@@ -10,11 +10,13 @@ package org.opendaylight.mdsal.binding.generator.impl.reactor;
 import java.util.List;
 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultActionRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.model.ri.Types;
 import org.opendaylight.mdsal.binding.runtime.api.ActionRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
 import org.opendaylight.yangtools.yang.binding.contract.StatementNamespace;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
 
@@ -40,17 +42,29 @@ final class ActionGenerator extends AbstractInvokableGenerator<ActionEffectiveSt
     }
 
     @Override
-    ParameterizedType implementedType(final TypeBuilderFactory builderFactory, final GeneratedType input,
-            final GeneratedType output) {
+    void addImplementedType(final TypeBuilderFactory builderFactory, final GeneratedTypeBuilder builder,
+            final GeneratedType input, final GeneratedType output) {
         final var parent = getParent();
         final var parentType = Type.of(parent.typeName());
         if (parent instanceof ListGenerator list) {
             final var keyGen = list.keyGenerator();
             if (keyGen != null) {
-                return BindingTypes.keyedListAction(parentType, keyGen.getGeneratedType(builderFactory), input, output);
+                final var keyType = keyGen.getGeneratedType(builderFactory);
+                builder.addImplementsType(BindingTypes.keyedListAction(parentType, keyType, input, output));
+                builder.addMethod(Naming.RPC_INVOKE_NAME).setAbstract(true)
+                    .addParameter(BindingTypes.keyedInstanceIdentifier(parentType, keyType), "path")
+                    .addParameter(input, "input")
+                    .setReturnType(Types.listenableFutureTypeFor(BindingTypes.rpcResult(output)))
+                    .addAnnotation(OVERRIDE_ANNOTATION);
+                return;
             }
         }
-        return BindingTypes.action(parentType, input, output);
+        builder.addImplementsType(BindingTypes.action(parentType, input, output));
+        builder.addMethod(Naming.RPC_INVOKE_NAME).setAbstract(true)
+            .addParameter(BindingTypes.instanceIdentifier(parentType), "path")
+            .addParameter(input, "input")
+            .setReturnType(Types.listenableFutureTypeFor(BindingTypes.rpcResult(output)))
+            .addAnnotation(OVERRIDE_ANNOTATION);
     }
 
     @Override
index ed3d5c3e00386d9778b1478d8638acdfcb7eec6c..c431fb355b9bbef8da8260c9f92dbef808a6649a 100644 (file)
@@ -10,10 +10,12 @@ package org.opendaylight.mdsal.binding.generator.impl.reactor;
 import java.util.List;
 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultRpcRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
+import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.model.ri.Types;
 import org.opendaylight.mdsal.binding.runtime.api.RpcRuntimeType;
 import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
 import org.opendaylight.yangtools.yang.binding.contract.StatementNamespace;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 
@@ -36,9 +38,13 @@ final class RpcGenerator extends AbstractInvokableGenerator<RpcEffectiveStatemen
     }
 
     @Override
-    ParameterizedType implementedType(final TypeBuilderFactory builderFactory, final GeneratedType input,
-            final GeneratedType output) {
-        return BindingTypes.rpc(input, output);
+    void addImplementedType(final TypeBuilderFactory builderFactory, final GeneratedTypeBuilder builder,
+            final GeneratedType input, final GeneratedType output) {
+        builder.addImplementsType(BindingTypes.rpc(input, output));
+        builder.addMethod(Naming.RPC_INVOKE_NAME).setAbstract(true)
+            .addParameter(input, "input")
+            .setReturnType(Types.listenableFutureTypeFor(BindingTypes.rpcResult(output)))
+            .addAnnotation(OVERRIDE_ANNOTATION);
     }
 
     @Override