Change transformation from DOMRpcResult to RpcResult 03/69603/6
authorPeter Nosal <peter.nosal@pantheon.tech>
Mon, 19 Mar 2018 07:59:37 +0000 (08:59 +0100)
committerRobert Varga <nite@hq.sk>
Thu, 22 Mar 2018 20:32:17 +0000 (20:32 +0000)
When RpcResult was created, it was always as successful RpcResult,
this is changed so in presence of RpcErrors, RcpResult is built as
failed RpcResult with RpcErrors and binding result.

Change-Id: I7ee54dfffb271505fd52feee4c6b2235c0ae4964
Signed-off-by: Peter Nosal <peter.nosal@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java
binding2/mdsal-binding2-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/adapter/impl/operation/RpcServiceAdapter.java

index 8652b99ba7e60bda340d9757e3d4343aa5023316..ce6292c48734909ee357c0de77868dd781764904 100644 (file)
@@ -18,6 +18,7 @@ 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.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.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;
@@ -163,10 +166,15 @@ 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<RpcError> 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 final class NonRoutedStrategy extends RpcInvocationStrategy {
index c6df3b681c1f6f1b2d707320c7ad2cd27eaa7e36..c60032b413466a65c1fb8c61d9f18de7b646b8c4 100644 (file)
@@ -19,6 +19,7 @@ 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.mdsal.binding.javav2.dom.adapter.extractor.ContextReferenceExtractor;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
@@ -33,6 +34,8 @@ import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.spi.RpcRoutingStrategy;
 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;
@@ -170,10 +173,15 @@ 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<RpcError> 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 final class NonRoutedStrategy extends RpcInvocationStrategy {
@@ -218,4 +226,4 @@ class RpcServiceAdapter implements InvocationHandler {
         }
 
     }
-}
\ No newline at end of file
+}