From 9d864921bf14cfe05b21735f501238d68b5accd7 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 6 Oct 2022 13:58:58 +0200 Subject: [PATCH] Integrate Action with BindingContract 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 --- .../mdsal/binding/dom/adapter/ActionAdapter.java | 5 ++++- .../mdsal/binding/dom/adapter/ActionAdapterFilter.java | 2 +- .../binding/generator/impl/reactor/ActionGenerator.java | 5 +++++ .../org/opendaylight/yangtools/yang/binding/Action.java | 6 ++---- .../yangtools/yang/binding/BindingContract.java | 3 ++- .../yangtools/yang/binding/KeyedListAction.java | 3 --- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java index 51a13ceb8e..fa13ea1cc7 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java @@ -41,7 +41,7 @@ final class ActionAdapter extends AbstractBindingAdapter 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 imple break; } + if (method.isDefault()) { + return InvocationHandler.invokeDefault(proxy, method, args); + } throw new NoSuchMethodError("Method " + method.toString() + "is unsupported."); } } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapterFilter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapterFilter.java index b71187aeb7..79056cca7a 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapterFilter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapterFilter.java @@ -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)), diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java index 19cca901a5..fad601d721 100644 --- a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java +++ b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/ActionGenerator.java @@ -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 { + 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, I extends RpcInput, O extends RpcOutput> { +public non-sealed interface Action

, I extends RpcInput, O extends RpcOutput> + extends BindingContract> { /** * Invoke the action. * diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java index 53510f685f..76a9a2709c 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/BindingContract.java @@ -17,7 +17,8 @@ import org.eclipse.jdt.annotation.NonNull; */ @Beta // FIXME: evaluate integrating with BindingObject -public sealed interface BindingContract> permits BaseIdentity, DataContainer, YangFeature { +public sealed interface BindingContract> + 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. diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedListAction.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedListAction.java index 2f460f0dab..a27a95f255 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedListAction.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/KeyedListAction.java @@ -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, T extends DataObject & Identifiable, I extends RpcInput, O extends RpcOutput> extends Action, I, O> { @Override -- 2.36.6