From 96832df9d1d1bdc6f543e50e8bc20b2ec585d47e Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 27 May 2015 13:45:07 +0200 Subject: [PATCH] Rework BindingDOMRpcImplementationAdapter instantiation Move the SchemaPath/Method map closer to where we instantiate invokers. This has the benefit of speeding up registration code very slightly, but more importantly it allows instantiating more efficient invokers, as we have the SchemaPath->Method map readily available. Change-Id: Iefc0faadcfd7df6c40240ce1f78c7b734f06c618 Signed-off-by: Robert Varga (cherry picked from commit 99783448ed6bbcad04b66379db638241c58e3ec8) --- .../BindingDOMRpcImplementationAdapter.java | 31 +++++++++++++---- .../BindingDOMRpcProviderServiceAdapter.java | 34 +++++++++---------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcImplementationAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcImplementationAdapter.java index fac13fb281..c81cce5a4b 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcImplementationAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcImplementationAdapter.java @@ -7,9 +7,16 @@ */ package org.opendaylight.controller.md.sal.binding.impl; +import com.google.common.base.Preconditions; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.JdkFutureAdapters; import com.google.common.util.concurrent.ListenableFuture; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcIdentifier; import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementation; @@ -28,15 +35,27 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation { + private static final Cache, RpcServiceInvoker> SERVICE_INVOKERS = CacheBuilder.newBuilder().weakKeys().build(); + private final BindingNormalizedNodeCodecRegistry codec; private final RpcServiceInvoker invoker; private final RpcService delegate; private final QNameModule module; - public BindingDOMRpcImplementationAdapter(final BindingNormalizedNodeCodecRegistry codec, final Class type ,final T delegate) { - this.codec = codec; - this.delegate = delegate; - invoker = RpcServiceInvoker.from(type); + public BindingDOMRpcImplementationAdapter(final BindingNormalizedNodeCodecRegistry codec, final Class type, final Map localNameToMethod, final T delegate) { + try { + this.invoker = SERVICE_INVOKERS.get(type, new Callable() { + @Override + public RpcServiceInvoker call() { + return RpcServiceInvoker.from(type); + } + }); + } catch (ExecutionException e) { + throw new IllegalArgumentException("Failed to create invokers for type " + type, e); + } + + this.codec = Preconditions.checkNotNull(codec); + this.delegate = Preconditions.checkNotNull(delegate); module = BindingReflections.getQNameModule(type); } @@ -53,7 +72,7 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation } private DataObject deserilialize(final SchemaPath rpcPath, final NormalizedNode input) { - if(input instanceof LazySerializedContainerNode) { + if (input instanceof LazySerializedContainerNode) { return ((LazySerializedContainerNode) input).bindingData(); } final SchemaPath inputSchemaPath = rpcPath.createChild(QName.create(module,"input")); @@ -67,7 +86,7 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation private CheckedFuture transformResult(final SchemaPath schemaPath, final ListenableFuture> bindingResult) { - return LazyDOMRpcResultFuture.create(codec,bindingResult); + return LazyDOMRpcResultFuture.create(codec, bindingResult); } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcProviderServiceAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcProviderServiceAdapter.java index ca87330308..f9cbe27231 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcProviderServiceAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingDOMRpcProviderServiceAdapter.java @@ -8,7 +8,11 @@ package org.opendaylight.controller.md.sal.binding.impl; import com.google.common.collect.ImmutableSet; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.opendaylight.controller.md.sal.dom.api.DOMRpcIdentifier; import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationRegistration; @@ -32,44 +36,38 @@ public class BindingDOMRpcProviderServiceAdapter { public ObjectRegistration registerRpcImplementation(final Class type, final T implementation) { - return register(type,implementation,createDomRpcIdentifiers(type,GLOBAL)); + return register(type, implementation, GLOBAL); } public ObjectRegistration registerRpcImplementation(final Class type, final T implementation, final Set> paths) { - return register(type,implementation,createDomRpcIdentifiers(type,toYangInstanceIdentifiers(paths))); + return register(type, implementation, toYangInstanceIdentifiers(paths)); } - private ObjectRegistration register(final Class type, final T implementation, final Set domRpcs) { - final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(codec.getCodecRegistry(), type, implementation); - + private ObjectRegistration register(final Class type, final T implementation, final Collection rpcContextPaths) { + final Map rpcs = codec.getRpcMethodToSchemaPath(type).inverse(); + final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(codec.getCodecRegistry(), type, rpcs, implementation); + final Set domRpcs = createDomRpcIdentifiers(rpcs.keySet(), rpcContextPaths); final DOMRpcImplementationRegistration domReg = domRpcRegistry.registerRpcImplementation(adapter, domRpcs); return new BindingRpcAdapterRegistration<>(implementation, domReg); } - private Set createDomRpcIdentifiers(final Class type, final Set paths) { - final Set rpcs = getRpcSchemaPaths(type); - + private static Set createDomRpcIdentifiers(final Set rpcs, final Collection paths) { final Set ret = new HashSet<>(); - for(final YangInstanceIdentifier path : paths) { - for(final SchemaPath rpc : rpcs) { + for (final YangInstanceIdentifier path : paths) { + for (final SchemaPath rpc : rpcs) { ret.add(DOMRpcIdentifier.create(rpc, path)); } } return ret; } - private Set toYangInstanceIdentifiers(final Set> identifiers) { - final Set ret = new HashSet<>(); - for(final InstanceIdentifier binding: identifiers) { + private Collection toYangInstanceIdentifiers(final Set> identifiers) { + final Collection ret = new ArrayList<>(identifiers.size()); + for (final InstanceIdentifier binding : identifiers) { ret.add(codec.toYangInstanceIdentifierCached(binding)); } return ret; } - - private Set getRpcSchemaPaths(final Class type) { - return codec.getRpcMethodToSchemaPath(type).values(); - } - } -- 2.36.6