From: Peter Nosal Date: Mon, 19 Mar 2018 07:57:29 +0000 (+0100) Subject: Change transformation from DOMRpcResult to RpcResult X-Git-Tag: release/nitrogen-sr3~7 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=eb701461c46a59e4526615f5ae55094b53661775;p=controller.git Change transformation from DOMRpcResult to RpcResult When RpcResult was created, it was always as successful RpcResult, this is changed so in presence of RpcErrors, RcpResult is build as failed RpcResult with RpcErrors and binding result. Change-Id: Ibb74e5f5675e33e0103d1a7d4962176bb320fce3 Signed-off-by: Peter Nosal Signed-off-by: Robert Varga (cherry picked from commit fd643adb6b413aac90c4f5a23874beeee486f257) --- 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 c6ea9db3d8..4d3dcab8b8 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 @@ -8,15 +8,16 @@ 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; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +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; @@ -29,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; @@ -105,12 +108,12 @@ class RpcServiceAdapter implements InvocationHandler { private static boolean isObjectMethod(final Method m) { switch (m.getName()) { case "toString": - return (m.getReturnType().equals(String.class) && m.getParameterTypes().length == 0); + return m.getReturnType().equals(String.class) && m.getParameterTypes().length == 0; case "hashCode": - return (m.getReturnType().equals(int.class) && m.getParameterTypes().length == 0); + return m.getReturnType().equals(int.class) && m.getParameterTypes().length == 0; case "equals": - return (m.getReturnType().equals(boolean.class) && m.getParameterTypes().length == 1 && m - .getParameterTypes()[0] == Object.class); + return m.getReturnType().equals(boolean.class) && m.getParameterTypes().length == 1 && m + .getParameterTypes()[0] == Object.class; default: return false; } @@ -123,7 +126,7 @@ class RpcServiceAdapter implements InvocationHandler { case "hashCode": return System.identityHashCode(self); case "equals": - return (self == args[0]); + return self == args[0]; default: return null; } @@ -131,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) { @@ -140,8 +143,14 @@ 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()); } private abstract class RpcInvocationStrategy {