Improve RpcProviderService.registerRpcImplementations() 41/110141/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 5 Feb 2024 09:58:36 +0000 (10:58 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 12 Feb 2024 01:54:28 +0000 (02:54 +0100)
Each Rpc exposes its contract via implementedInterface(). Use this
information to make registerRpcImplementations() more user friendly.

JIRA: MDSAL-854
Change-Id: Iec6b3f65207078304380b1e3050da00c644c4ce4
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcProviderService.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiRpcProviderService.java

index 8de4f78950c2c3c4678c4c2171fae345676afe7b..6e34376d8938e3e438b6c651ace015ff2cf78d2b 100644 (file)
@@ -8,6 +8,9 @@
 package org.opendaylight.mdsal.binding.api;
 
 import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
+import java.util.Collection;
+import java.util.List;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Registration;
@@ -38,6 +41,48 @@ public interface RpcProviderService extends BindingService {
      */
     @NonNull Registration registerRpcImplementation(Rpc<?, ?> implementation, Set<InstanceIdentifier<?>> paths);
 
+    /**
+     * Register a set of {@link Rpc} implementations.
+     *
+     * @param implementations implementation objects
+     * @return A {@link Registration} controlling unregistration
+     * @throws NullPointerException if {@code implementations} is, or contains, {@code null}
+     * @throws IllegalArgumentException if there are implementations contains {@link Rpc#implementedInterface()}
+     *                                  duplicates
+     */
+    default @NonNull Registration registerRpcImplementations(final Rpc<?, ?>... implementations) {
+        return registerRpcImplementations(List.of(implementations));
+    }
+
+    /**
+     * Register a set of {@link Rpc} implementations.
+     *
+     * @param implementations implementation objects
+     * @return A {@link Registration} controlling unregistration
+     * @throws NullPointerException if {@code implementations} is, or contains, {@code null}
+     * @throws IllegalArgumentException if there are implementations contains {@link Rpc#implementedInterface()}
+     *                                  duplicates
+     */
+    default @NonNull Registration registerRpcImplementations(final Collection<Rpc<?, ?>> implementations) {
+        return registerRpcImplementations(indexImplementations(implementations));
+    }
+
+    /**
+     * Register a set of {@link Rpc} implementations on a set of datastore context paths. Note that this method does not
+     * support registering multiple implementations of the same {@link Rpc} and hence we require specifying them through
+     * a {@link ClassToInstanceMap}.
+     *
+     * @param implementations implementation objects
+     * @return A {@link Registration} controlling unregistration
+     * @throws NullPointerException if any argument is, or contains, {@code null}
+     * @throws IllegalArgumentException if there are implementations contains {@link Rpc#implementedInterface()}
+     *                                  duplicates
+     */
+    default @NonNull Registration registerRpcImplementations(final Collection<Rpc<?, ?>> implementations,
+            final Set<InstanceIdentifier<?>> paths) {
+        return registerRpcImplementations(indexImplementations(implementations), paths);
+    }
+
     /**
      * Register a set of {@link Rpc} implementations. Note that this method does not support registering multiple
      * implementations of the same {@link Rpc} and hence we require specifying them through a
@@ -60,4 +105,14 @@ public interface RpcProviderService extends BindingService {
      */
     @NonNull Registration registerRpcImplementations(ClassToInstanceMap<Rpc<?, ?>> implementations,
         Set<InstanceIdentifier<?>> paths);
+
+    @SuppressWarnings("unchecked")
+    private static @NonNull ImmutableClassToInstanceMap<Rpc<?, ?>> indexImplementations(
+            final Collection<Rpc<?, ?>> impls) {
+        final var builder = ImmutableClassToInstanceMap.<Rpc<?, ?>>builder();
+        for (var impl : impls) {
+            builder.put((Class<Rpc<?, ?>>) impl.implementedInterface(), impl);
+        }
+        return builder.build();
+    }
 }
index 8eab8da6ee3e3a40a77916fec3badd815923f4ca..d1694dca77ca28cf5f40e49495110c4df5890bea 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.adapter.osgi;
 
 import com.google.common.collect.ClassToInstanceMap;
+import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
@@ -45,6 +46,17 @@ public final class OSGiRpcProviderService extends AbstractAdaptedService<RpcProv
         return delegate.registerRpcImplementation(implementation, paths);
     }
 
+    @Override
+    public Registration registerRpcImplementations(final Collection<Rpc<?, ?>> implementations) {
+        return delegate.registerRpcImplementations(implementations);
+    }
+
+    @Override
+    public Registration registerRpcImplementations(final Collection<Rpc<?, ?>> implementations,
+            final Set<InstanceIdentifier<?>> paths) {
+        return delegate.registerRpcImplementations(implementations, paths);
+    }
+
     @Override
     public Registration registerRpcImplementations(final ClassToInstanceMap<Rpc<?, ?>> implementations) {
         return delegate.registerRpcImplementations(implementations);