X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FBindingDOMRpcImplementationAdapter.java;h=c81cce5a4b752e998b7b1b07015be77e24f60da5;hb=refs%2Fchanges%2F22%2F21222%2F2;hp=c4a99efdbe1822542f43644a012a6ff8a9c0be83;hpb=81d69b64c20a8e17279a57920beab854922c668c;p=controller.git 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 c4a99efdbe..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,25 +7,27 @@ */ package org.opendaylight.controller.md.sal.binding.impl; -import com.google.common.base.Function; +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.Futures; import com.google.common.util.concurrent.JdkFutureAdapters; import com.google.common.util.concurrent.ListenableFuture; -import java.util.Collection; +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; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.binding.util.RpcServiceInvoker; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -33,24 +35,27 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation { - private static final Function EXCEPTION_MAPPER = new Function() { + private static final Cache, RpcServiceInvoker> SERVICE_INVOKERS = CacheBuilder.newBuilder().weakKeys().build(); - @Override - public DOMRpcException apply(final Exception input) { - // FIXME: Return correct exception - return null; - } - - }; 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); } @@ -67,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")); @@ -81,32 +86,7 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation private CheckedFuture transformResult(final SchemaPath schemaPath, final ListenableFuture> bindingResult) { - final ListenableFuture transformed = Futures.transform(bindingResult, new Function,DOMRpcResult>() { - - @Override - public DOMRpcResult apply(final RpcResult input) { - return new DOMRpcResult() { - - @Override - public NormalizedNode getResult() { - - if(input instanceof DataContainer) { - return codec.toNormalizedNodeRpcData((DataContainer) input); - } - return null; - } - - @Override - public Collection getErrors() { - return input.getErrors(); - } - }; - } - - }); - return Futures.makeChecked(transformed, EXCEPTION_MAPPER); + return LazyDOMRpcResultFuture.create(codec, bindingResult); } - - }