Integrate Action with BindingContract 77/102577/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Oct 2022 11:58:58 +0000 (13:58 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 12 Oct 2022 08:15:27 +0000 (10:15 +0200)
Having an integrated BindingContract allows us readily identify
the the implementation contract of an action. This allows us to ditch
the explicit class instance.

JIRA: MDSAL-776
Change-Id: I6fc297f331d5f0c545b80e84ca54025c44c67eb6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapterFilter.java
binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Action.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedListAction.java

index 51a13ceb8e1ed5c57a15a8aaa7bb0c92645159a1..fa13ea1cc739b7eb088fbde9e2e66da1f4edf4a0 100644 (file)
@@ -41,7 +41,7 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
     }
 
     @Override
-    public Object invoke(final Object proxy, final Method method, final Object [] args) throws NoSuchMethodError {
+    public Object invoke(final Object proxy, final Method method, final Object [] args) throws Throwable {
         switch (method.getName()) {
             case "equals":
                 if (args.length == 1) {
@@ -86,6 +86,9 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
                 break;
         }
 
+        if (method.isDefault()) {
+            return InvocationHandler.invokeDefault(proxy, method, args);
+        }
         throw new NoSuchMethodError("Method " + method.toString() + "is unsupported.");
     }
 }
index b71187aeb7e35e487f8cfffc32a5a46be00b7fab..79056cca7a3ec19e32cef842384ecd7cec64bfd1 100644 (file)
@@ -27,7 +27,7 @@ final class ActionAdapterFilter implements InvocationHandler {
     }
 
     @Override
-    public Object invoke(final Object proxy, final Method method, final Object[] args) throws NoSuchMethodError {
+    public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
         if (method.getName().equals("invoke") && args.length == 2) {
             final InstanceIdentifier<?> path = (InstanceIdentifier<?>) requireNonNull(args[0]);
             checkState(nodes.contains(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, path)),
index 19cca901a5e8cce304992671d1f0d0fab1203e15..fad601d721afdaa2277edbd976d321fdc7bbd493 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultActionRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
@@ -29,6 +30,8 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
  * Generator corresponding to a {@code action} statement.
  */
 final class ActionGenerator extends CompositeSchemaTreeGenerator<ActionEffectiveStatement, ActionRuntimeType> {
+    private static final JavaTypeName FUNCTIONAL_INTERFACE_ANNOTATION = JavaTypeName.create(FunctionalInterface.class);
+
     ActionGenerator(final ActionEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
         super(statement, parent);
     }
@@ -50,6 +53,8 @@ final class ActionGenerator extends CompositeSchemaTreeGenerator<ActionEffective
     GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
         final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
         builder.addImplementsType(implementedType(builderFactory));
+        builder.addAnnotation(FUNCTIONAL_INTERFACE_ANNOTATION);
+        defaultImplementedInterace(builder);
 
         final ModuleGenerator module = currentModule();
         module.addQNameConstant(builder, statement().argument());
index 7e809b4d08e349b0933b32e91e2ec896bd5268aa..e2d9ad0f726a1fa34c7c65ef3588cf6c167a30c9 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.binding;
 
-import com.google.common.annotations.Beta;
 import com.google.common.util.concurrent.ListenableFuture;
 import edu.umd.cs.findbugs.annotations.CheckReturnValue;
 import org.eclipse.jdt.annotation.NonNull;
@@ -18,9 +17,8 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
  *
  * @author Robert Varga
  */
-@Beta
-@FunctionalInterface
-public interface Action<P extends InstanceIdentifier<?>, I extends RpcInput, O extends RpcOutput> {
+public non-sealed interface Action<P extends InstanceIdentifier<?>, I extends RpcInput, O extends RpcOutput>
+        extends BindingContract<Action<P, I, O>> {
     /**
      * Invoke the action.
      *
index 53510f685f8324ab28efb5a74cf69bb9e5357bca..76a9a2709c4c057298cb0dbb9f898f4a275e1f25 100644 (file)
@@ -17,7 +17,8 @@ import org.eclipse.jdt.annotation.NonNull;
  */
 @Beta
 // FIXME: evaluate integrating with BindingObject
-public sealed interface BindingContract<T extends BindingContract<T>> permits BaseIdentity, DataContainer, YangFeature {
+public sealed interface BindingContract<T extends BindingContract<T>>
+        permits Action, BaseIdentity, DataContainer, YangFeature {
     /**
      * Return the interface implemented by this object. This method differs from {@link Object#getClass()} in that it
      * returns the interface contract, not a concrete implementation class.
index 2f460f0dab2df43381899b870c1b2e64d1797b47..a27a95f2551eeaf5205e14b72276e5755bd51060 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.binding;
 
-import com.google.common.annotations.Beta;
 import com.google.common.util.concurrent.ListenableFuture;
 import edu.umd.cs.findbugs.annotations.CheckReturnValue;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -17,8 +16,6 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
  *
  * @author Robert Varga
  */
-@Beta
-@FunctionalInterface
 public interface KeyedListAction<K extends Identifier<T>, T extends DataObject & Identifiable<K>,
         I extends RpcInput, O extends RpcOutput> extends Action<KeyedInstanceIdentifier<T, K>, I, O> {
     @Override