X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FBindingDOMRpcImplementationAdapter.java;h=8167d36c643a9c5da8c042d9baa01e11d33d074a;hb=refs%2Fchanges%2F54%2F76754%2F16;hp=9bb09f0d96469361c2bd48517b551bd23812517b;hpb=99bc0e872a9a3f2d2c892ef81b08a5ff5dcd2339;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java index 9bb09f0d96..8167d36c64 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java @@ -10,51 +10,50 @@ package org.opendaylight.mdsal.binding.dom.adapter; 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.FluentFuture; import com.google.common.util.concurrent.ListenableFuture; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -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.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker; +import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; +import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier; +import org.opendaylight.mdsal.dom.api.DOMRpcImplementation; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; 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.RpcResult; +import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; 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 static final Cache, RpcServiceInvoker> SERVICE_INVOKERS + = CacheBuilder.newBuilder().weakKeys().build(); + // Default implementations are 0, we need to perform some translation, hence we have a slightly higher cost + private static final int COST = 1; private final BindingNormalizedNodeCodecRegistry codec; private final RpcServiceInvoker invoker; private final RpcService delegate; private final QName inputQname; - public BindingDOMRpcImplementationAdapter(final BindingNormalizedNodeCodecRegistry codec, final Class type, final Map localNameToMethod, final T delegate) { + 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() { - final Map map = new HashMap<>(); - for (Entry e : localNameToMethod.entrySet()) { - map.put(e.getKey().getLastComponent(), e.getValue()); - } - - return RpcServiceInvoker.from(map); + 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); @@ -62,32 +61,31 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation this.codec = Preconditions.checkNotNull(codec); this.delegate = Preconditions.checkNotNull(delegate); - inputQname = QName.cachedReference(QName.create(BindingReflections.getQNameModule(type), "input")); + inputQname = YangConstants.operationInputQName(BindingReflections.getQNameModule(type)).intern(); } @Override - public CheckedFuture invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode input) { + public FluentFuture invokeRpc(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 LazyDOMRpcResultFuture.create(codec, bindingResult); + } + + @Override + public long invocationCost() { + return COST; } - 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(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, - final ListenableFuture> bindingResult) { - return LazyDOMRpcResultFuture.create(codec, bindingResult); - } - }