From b36a95a80b1d42191d070beb376a2495d8fd1923 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 5 Feb 2024 10:58:36 +0100 Subject: [PATCH] Improve RpcProviderService.registerRpcImplementations() 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 --- .../mdsal/binding/api/RpcProviderService.java | 55 +++++++++++++++++++ .../adapter/osgi/OSGiRpcProviderService.java | 12 ++++ 2 files changed, 67 insertions(+) diff --git a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcProviderService.java b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcProviderService.java index 8de4f78950..6e34376d89 100644 --- a/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcProviderService.java +++ b/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcProviderService.java @@ -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> 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> 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> implementations, + final Set> 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> implementations, Set> paths); + + @SuppressWarnings("unchecked") + private static @NonNull ImmutableClassToInstanceMap> indexImplementations( + final Collection> impls) { + final var builder = ImmutableClassToInstanceMap.>builder(); + for (var impl : impls) { + builder.put((Class>) impl.implementedInterface(), impl); + } + return builder.build(); + } } diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiRpcProviderService.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiRpcProviderService.java index 8eab8da6ee..d1694dca77 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiRpcProviderService.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiRpcProviderService.java @@ -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> implementations) { + return delegate.registerRpcImplementations(implementations); + } + + @Override + public Registration registerRpcImplementations(final Collection> implementations, + final Set> paths) { + return delegate.registerRpcImplementations(implementations, paths); + } + @Override public Registration registerRpcImplementations(final ClassToInstanceMap> implementations) { return delegate.registerRpcImplementations(implementations); -- 2.36.6