Register multiple LegacyDOMRpcImplementationAdapters 67/103367/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 24 Nov 2022 20:39:07 +0000 (21:39 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 24 Nov 2022 20:43:28 +0000 (21:43 +0100)
We have created all the building blocks for being able to remove
binding dispatch during method invocation -- we already have a 1:1
BindingDOMRpcImplementationAdapter to bridge to a Rpc.invoke().

There we can perform the same binding here -- and register multiple
legacy adapters, each servicing one method.

JIRA: MDSAL-86
Change-Id: Ifacaf5f61b73a0a7f0870477dac295b2d5a04287
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcProviderServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingRpcAdapterRegistration.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LegacyDOMRpcImplementationAdapter.java

index 8b37652982cc1f873f1ec84b91a0b175ca2d2790..d9f5eabc0b80d560415668505d1fd2a98c973c7b 100644 (file)
@@ -19,6 +19,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcMethodInvoker;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
@@ -118,11 +119,19 @@ public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<
     private <S extends RpcService, T extends S> ObjectRegistration<T> register(
             final CurrentAdapterSerializer serializer, final Class<S> type, final T implementation,
             final Collection<YangInstanceIdentifier> rpcContextPaths) {
-        final var rpcs = createQNameToMethod(currentSerializer(), type);
+        final var qnameToMethod = createQNameToMethod(currentSerializer(), type);
+        final var builder = ImmutableMap.<DOMRpcIdentifier, DOMRpcImplementation>builderWithExpectedSize(
+            qnameToMethod.size());
+        for (var entry : qnameToMethod.entrySet()) {
+            final var impl = new LegacyDOMRpcImplementationAdapter<>(adapterContext(), type, implementation,
+                RpcMethodInvoker.from(entry.getValue()));
+            for (var id : createDomRpcIdentifiers(Set.of(entry.getKey()), rpcContextPaths)) {
+                builder.put(id, impl);
+            }
+        }
 
-        return new BindingRpcAdapterRegistration<>(implementation, getDelegate().registerRpcImplementation(
-            new LegacyDOMRpcImplementationAdapter<>(adapterContext(), type, implementation, rpcs),
-            createDomRpcIdentifiers(rpcs.keySet(), rpcContextPaths)));
+        return new BindingRpcAdapterRegistration<>(implementation,
+            getDelegate().registerRpcImplementations(builder.build()));
     }
 
     @Deprecated
index ceb64d8996149decba4d587942cb1a5cc2323710..f4e711180e513cd27e641b1a38b23fff59ca58e9 100644 (file)
@@ -7,15 +7,15 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import org.opendaylight.mdsal.dom.api.DOMRpcImplementationRegistration;
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.RpcService;
 
 @Deprecated(since = "11.0.0", forRemoval = true)
 class BindingRpcAdapterRegistration<T extends RpcService> extends AbstractObjectRegistration<T> {
-    private final DOMRpcImplementationRegistration<?> reg;
+    private final Registration reg;
 
-    BindingRpcAdapterRegistration(T instance, DOMRpcImplementationRegistration<?> reg) {
+    BindingRpcAdapterRegistration(final T instance, final Registration reg) {
         super(instance);
         this.reg = reg;
     }
index 9446a6ea2ee767988e6397cc740e77fee2e49795..677176b4846b98a484267a3ed8f082c98609ad06 100644 (file)
@@ -7,52 +7,33 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.ListenableFuture;
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcMethodInvoker;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcService;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 
 @Deprecated(since = "11.0.0", forRemoval = true)
 final class LegacyDOMRpcImplementationAdapter<T extends RpcService> extends AbstractDOMRpcImplementationAdapter {
-    private static final Cache<Class<?>, ImmutableMap<QName, RpcMethodInvoker>> CLASS_INVOKERS =
-        CacheBuilder.newBuilder().weakKeys().build();
-
-    private final ImmutableMap<QName, RpcMethodInvoker> invokers;
+    private final RpcMethodInvoker invoker;
     private final T delegate;
 
     LegacyDOMRpcImplementationAdapter(final AdapterContext adapterContext, final Class<T> type, final T delegate,
-            final Map<QName, Method> qnameToMethod) {
+            final RpcMethodInvoker invoker) {
         // FIXME: do not use BindingReflections here
         super(adapterContext, YangConstants.operationInputQName(BindingReflections.getQNameModule(type)).intern());
         this.delegate = requireNonNull(delegate);
-
-        try {
-            invokers = CLASS_INVOKERS.get(type,
-                () -> ImmutableMap.copyOf(Maps.transformValues(qnameToMethod, RpcMethodInvoker::from)));
-        } catch (ExecutionException e) {
-            throw new IllegalArgumentException("Failed to create invokers for type " + type, e);
-        }
+        this.invoker = requireNonNull(invoker);
     }
 
     @Override
     ListenableFuture<RpcResult<?>> invokeRpc(final CurrentAdapterSerializer serializer, final DOMRpcIdentifier rpc,
             final ContainerNode input) {
-        final var rpcType = rpc.getType();
-        return verifyNotNull(invokers.get(rpcType)).invokeOn(delegate, deserialize(serializer, rpc.getType(), input));
+        return invoker.invokeOn(delegate, deserialize(serializer, rpc.getType(), input));
     }
 }