X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FBindingDOMRpcImplementationAdapter.java;h=d635b6c8dfe5bb50f673ad3583cc1501d131d400;hp=c4a99efdbe1822542f43644a012a6ff8a9c0be83;hb=a8a177691662c04798af604efcf5f268753c0ebe;hpb=d8d8f731bbe6c58fcbd0e616734e2e230aaf4ab4 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..d635b6c8df 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,28 @@ */ 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.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ExecutionException; +import javax.annotation.Nonnull; 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.mdsal.binding.dom.adapter.BindingDataAware; +import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; 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,80 +36,59 @@ 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 BindingNormalizedNodeSerializer 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); - module = BindingReflections.getQNameModule(type); - } + private final QName inputQname; + + BindingDOMRpcImplementationAdapter(final BindingNormalizedNodeSerializer codec, + final Class type, final Map localNameToMethod, final T delegate) { + try { + this.invoker = SERVICE_INVOKERS.get(type, () -> { + final Map map = new HashMap<>(); + for (Entry e : localNameToMethod.entrySet()) { + map.put(e.getKey().getLastComponent(), e.getValue()); + } + + return RpcServiceInvoker.from(map); + }); + } catch (ExecutionException e) { + throw new IllegalArgumentException("Failed to create invokers for type " + type, e); + } - public QNameModule getQNameModule() { - return module; + this.codec = Preconditions.checkNotNull(codec); + this.delegate = Preconditions.checkNotNull(delegate); + inputQname = QName.create(BindingReflections.getQNameModule(type), "input").intern(); } + @Nonnull @Override - public CheckedFuture invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode input) { + public CheckedFuture invokeRpc(@Nonnull final DOMRpcIdentifier rpc, + final NormalizedNode input) { final SchemaPath schemaPath = rpc.getType(); - final DataObject bindingInput = input != null ? deserilialize(rpc.getType(),input) : null; - final ListenableFuture> bindingResult = invoke(schemaPath,bindingInput); - return transformResult(schemaPath,bindingResult); + final DataObject bindingInput = input != null ? deserialize(rpc.getType(), input) : null; + final ListenableFuture> bindingResult = invoke(schemaPath, bindingInput); + return transformResult(bindingResult); } - private DataObject deserilialize(final SchemaPath rpcPath, final NormalizedNode input) { - if(input instanceof LazySerializedContainerNode) { - return ((LazySerializedContainerNode) input).bindingData(); + private DataObject deserialize(final SchemaPath rpcPath, final NormalizedNode input) { + if (input instanceof BindingDataAware) { + return ((BindingDataAware) input).bindingData(); } - final SchemaPath inputSchemaPath = rpcPath.createChild(QName.create(module,"input")); + final SchemaPath inputSchemaPath = rpcPath.createChild(inputQname); return codec.fromNormalizedNodeRpcData(inputSchemaPath, (ContainerNode) input); } - private ListenableFuture> invoke(final SchemaPath schemaPath, final DataObject input) { - return JdkFutureAdapters.listenInPoolThread(invoker.invokeRpc(delegate, schemaPath.getLastComponent(), input)); + return invoker.invokeRpc(delegate, schemaPath.getLastComponent(), input); } - private CheckedFuture transformResult(final SchemaPath schemaPath, + private CheckedFuture transformResult( 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); } - - }