Binding2 - Implement RpcActionProviderService
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / impl / operation / RpcServiceAdapter.java
index c6df3b681c1f6f1b2d707320c7ad2cd27eaa7e36..c30d2c8ebbfe974f2cefdcf9b5b96558108014a1 100644 (file)
@@ -8,8 +8,6 @@
 package org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation;
 
 import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.Futures;
@@ -19,7 +17,9 @@ 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 java.util.Optional;
 import org.opendaylight.mdsal.binding.javav2.dom.adapter.extractor.ContextReferenceExtractor;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
@@ -33,6 +33,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;
@@ -152,8 +154,8 @@ class RpcServiceAdapter implements InvocationHandler {
         private ListenableFuture<RpcResult<?>> invoke0(final SchemaPath schemaPath, final NormalizedNode<?, ?> input) {
             final ListenableFuture<DOMRpcResult> listenInPoolThread =
                     JdkFutureAdapters.listenInPoolThread(delegate.invokeRpc(schemaPath, input));
-            if (listenInPoolThread instanceof LazyDOMOperationResultFuture) {
-                return ((LazyDOMOperationResultFuture) listenInPoolThread).getBindingFuture();
+            if (listenInPoolThread instanceof LazyDOMRpcResultFuture) {
+                return ((LazyDOMRpcResultFuture) listenInPoolThread).getBindingFuture();
             }
 
             return transformFuture(schemaPath, listenInPoolThread, codec.getCodecFactory());
@@ -161,7 +163,7 @@ class RpcServiceAdapter implements InvocationHandler {
 
         private ListenableFuture<RpcResult<?>> transformFuture(final SchemaPath rpc,
                 final ListenableFuture<DOMRpcResult> domFuture, final BindingNormalizedNodeCodecRegistry resultCodec) {
-            return Futures.transform(domFuture, (Function<DOMRpcResult, RpcResult<?>>) input -> {
+            return Futures.transform(domFuture, input -> {
                 final NormalizedNode<?, ?> domData = input.getResult();
                 final TreeNode bindingResult;
                 if (domData != null) {
@@ -170,10 +172,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<? extends 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 +225,4 @@ class RpcServiceAdapter implements InvocationHandler {
         }
 
     }
-}
\ No newline at end of file
+}