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%2FRpcServiceAdapter.java;h=d61c9a4b6e2f5af78e35128f7b278134dd6ad074;hb=88936a5b76150f059aa04f5990c9acd06aa9dbf2;hp=c0232298245fe95a73ddae1e257208d932731445;hpb=03c13bd8a8bb89a729d739eb2fcd501a4dfa5439;p=controller.git diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/RpcServiceAdapter.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/RpcServiceAdapter.java index c023229824..d61c9a4b6e 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/RpcServiceAdapter.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/RpcServiceAdapter.java @@ -5,10 +5,8 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.md.sal.binding.impl; -import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.CheckedFuture; @@ -18,11 +16,13 @@ import com.google.common.util.concurrent.MoreExecutors; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.Collection; import java.util.Map.Entry; import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; import org.opendaylight.controller.md.sal.dom.broker.spi.rpc.RpcRoutingStrategy; +import org.opendaylight.mdsal.binding.dom.adapter.BindingRpcFutureAware; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -30,6 +30,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -62,10 +64,10 @@ class RpcServiceAdapter implements InvocationHandler { proxy = (RpcService) Proxy.newProxyInstance(type.getClassLoader(), new Class[] {type}, this); } - private ListenableFuture> invoke0(final SchemaPath schemaPath, final NormalizedNode input) { + ListenableFuture> invoke0(final SchemaPath schemaPath, final NormalizedNode input) { final CheckedFuture result = delegate.invokeRpc(schemaPath, input); - if (result instanceof LazyDOMRpcResultFuture) { - return ((LazyDOMRpcResultFuture) result).getBindingFuture(); + if (result instanceof BindingRpcFutureAware) { + return ((BindingRpcFutureAware) result).getBindingFuture(); } return transformFuture(schemaPath, result, codec.getCodecFactory()); @@ -132,7 +134,7 @@ class RpcServiceAdapter implements InvocationHandler { private static ListenableFuture> transformFuture(final SchemaPath rpc, final ListenableFuture domFuture, final BindingNormalizedNodeSerializer codec) { - return Futures.transform(domFuture, (Function>) input -> { + return Futures.transform(domFuture, input -> { final NormalizedNode domData = input.getResult(); final DataObject bindingResult; if (domData != null) { @@ -141,7 +143,13 @@ class RpcServiceAdapter implements InvocationHandler { } else { bindingResult = null; } - return RpcResult.class.cast(RpcResultBuilder.success(bindingResult).build()); + + // DOMRpcResult does not have a notion of success, hence we have to reverse-engineer it by looking + // at reported errors and checking whether they are just warnings. + final Collection errors = input.getErrors(); + return RpcResult.class.cast(RpcResultBuilder.status(errors.stream() + .noneMatch(error -> error.getSeverity() == ErrorSeverity.ERROR)) + .withResult(bindingResult).withRpcErrors(errors).build()); }, MoreExecutors.directExecutor()); }