From 1366c55dcdfba3248d1c62ecb221a3b0c325fc99 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 23 Nov 2022 15:26:58 +0100 Subject: [PATCH] Move getRpcMethodToSchema() This method is only used by RpcServiceAdapter and depends only on BindingRuntimeContext. Move it to RpcServiceAdapter to improve containment. JIRA: MDSAL-777 Change-Id: Ib4222bb85214d27d82feec17fc8c91809ebe44de Signed-off-by: Robert Varga --- .../dom/adapter/CurrentAdapterSerializer.java | 34 -------------- .../dom/adapter/RpcServiceAdapter.java | 44 ++++++++++++++++++- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java index ac1a6fec29..212d26491d 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java @@ -29,7 +29,6 @@ import org.opendaylight.mdsal.binding.api.InstanceNotificationSpec; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.runtime.api.RpcRuntimeType; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; @@ -46,7 +45,6 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.slf4j.Logger; @@ -141,38 +139,6 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer return Map.entry(stack, lastNamespace); } - // FIXME: This should be probably part of Binding Runtime context and RpcServices perhaps should have their own - // RuntimeType - ImmutableBiMap getRpcMethodToSchema(final Class key) { - final var runtimeContext = getRuntimeContext(); - final var types = runtimeContext.getTypes(); - final var qnameModule = BindingReflections.getQNameModule(key); - - // We are dancing a bit here to reconstruct things a RpcServiceRuntimeType could easily hold - final var module = runtimeContext.getEffectiveModelContext().findModuleStatement(qnameModule) - .orElseThrow(() -> new IllegalStateException("No module found for " + qnameModule + " service " + key)); - return module.streamEffectiveSubstatements(RpcEffectiveStatement.class) - .map(rpc -> { - final var rpcName = rpc.argument(); - final var inputClz = runtimeContext.getRpcInput(rpcName); - final var methodName = BindingMapping.getRpcMethodName(rpcName); - - final Method method; - try { - method = key.getMethod(methodName, inputClz); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Cannot find RPC method for " + rpc, e); - } - - final var type = types.schemaTreeChild(rpcName); - if (!(type instanceof RpcRuntimeType rpcType)) { - throw new IllegalStateException("Unexpected run-time type " + type + " for " + rpcName); - } - return Map.entry(method, rpcType); - }) - .collect(ImmutableBiMap.toImmutableBiMap(Entry::getKey, Entry::getValue)); - } - // FIXME: This should be probably part of Binding Runtime context ImmutableBiMap getRpcMethodToQName(final Class key) { final Module module = getModule(key); diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java index bd1f68071e..18b2f2e41f 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java @@ -9,14 +9,21 @@ package org.opendaylight.mdsal.binding.dom.adapter; import static java.util.Objects.requireNonNull; +import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.Map; +import java.util.Map.Entry; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.runtime.api.RpcRuntimeType; +import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement; class RpcServiceAdapter implements InvocationHandler { private final ImmutableMap rpcNames; @@ -30,15 +37,15 @@ class RpcServiceAdapter implements InvocationHandler { this.type = requireNonNull(type); this.adapterContext = requireNonNull(adapterContext); delegate = requireNonNull(domService); + facade = (RpcService) Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, this); - final var methods = adapterContext.currentSerializer().getRpcMethodToSchema(type); + final var methods = getRpcMethodToSchema(adapterContext.currentSerializer(), type); final var rpcBuilder = ImmutableMap.builderWithExpectedSize(methods.size()); for (var entry : methods.entrySet()) { final var method = entry.getKey(); rpcBuilder.put(method, RpcInvocationStrategy.of(this, method, entry.getValue())); } rpcNames = rpcBuilder.build(); - facade = (RpcService) Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, this); } final @NonNull CurrentAdapterSerializer currentSerializer() { @@ -86,4 +93,37 @@ class RpcServiceAdapter implements InvocationHandler { throw new UnsupportedOperationException("Method " + method.toString() + "is unsupported."); } + + // FIXME: This should be probably part of BindingRuntimeContext and RpcServices perhaps should have their own + // RuntimeType + private static ImmutableBiMap getRpcMethodToSchema( + final CurrentAdapterSerializer serializer, final Class key) { + final var runtimeContext = serializer.getRuntimeContext(); + final var types = runtimeContext.getTypes(); + final var qnameModule = BindingReflections.getQNameModule(key); + + // We are dancing a bit here to reconstruct things a RpcServiceRuntimeType could easily hold + final var module = runtimeContext.getEffectiveModelContext().findModuleStatement(qnameModule) + .orElseThrow(() -> new IllegalStateException("No module found for " + qnameModule + " service " + key)); + return module.streamEffectiveSubstatements(RpcEffectiveStatement.class) + .map(rpc -> { + final var rpcName = rpc.argument(); + final var inputClz = runtimeContext.getRpcInput(rpcName); + final var methodName = BindingMapping.getRpcMethodName(rpcName); + + final Method method; + try { + method = key.getMethod(methodName, inputClz); + } catch (NoSuchMethodException e) { + throw new IllegalStateException("Cannot find RPC method for " + rpc, e); + } + + final var type = types.schemaTreeChild(rpcName); + if (!(type instanceof RpcRuntimeType rpcType)) { + throw new IllegalStateException("Unexpected run-time type " + type + " for " + rpcName); + } + return Map.entry(method, rpcType); + }) + .collect(ImmutableBiMap.toImmutableBiMap(Entry::getKey, Entry::getValue)); + } } -- 2.36.6