Change DOM invokeRpc to FluentFuture
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / impl / operation / LazyDOMOperationResultFuture.java
index c1d9a0aa288417e679bedbad5def8bcd600bc627..946226a9fe0b384c75e9123204ca410b419f8071 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.AbstractFuture;
+import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -17,8 +19,11 @@ import java.util.concurrent.TimeoutException;
 import javax.annotation.Nonnull;
 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
+import org.opendaylight.mdsal.dom.api.DOMRpcException;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
+import org.opendaylight.mdsal.dom.api.DefaultDOMRpcException;
 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
+import org.opendaylight.yangtools.util.concurrent.ExceptionMapper;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -27,7 +32,15 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * DOM operation result from Binding.
  */
 @Beta
-final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResult> {
+final class LazyDOMOperationResultFuture extends AbstractFuture<DOMRpcResult> {
+    private static final ExceptionMapper<DOMRpcException> DOM_RPC_EX_MAPPER =
+            new ExceptionMapper<DOMRpcException>("rpc", DOMRpcException.class) {
+        @Override
+        protected DOMRpcException newWithCause(String message, Throwable cause) {
+            return cause instanceof DOMRpcException ? (DOMRpcException)cause
+                    : new DefaultDOMRpcException("RPC failed", cause);
+        }
+    };
 
     private final ListenableFuture<RpcResult<?>> bindingFuture;
     private final BindingNormalizedNodeCodecRegistry codec;
@@ -39,7 +52,7 @@ final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResul
         this.codec = Preconditions.checkNotNull(codec, "codec");
     }
 
-    static ListenableFuture<DOMRpcResult> create(final BindingNormalizedNodeCodecRegistry codec,
+    static FluentFuture<DOMRpcResult> create(final BindingNormalizedNodeCodecRegistry codec,
             final ListenableFuture<RpcResult<?>> bindingResult) {
         return new LazyDOMOperationResultFuture(bindingResult, codec);
     }
@@ -63,7 +76,12 @@ final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResul
         if (result != null) {
             return result;
         }
-        return transformIfNecessary(bindingFuture.get());
+
+        try {
+            return transformIfNecessary(bindingFuture.get());
+        } catch (ExecutionException e) {
+            throw new ExecutionException(e.getMessage(), DOM_RPC_EX_MAPPER.apply(e));
+        }
     }
 
     @Override
@@ -72,7 +90,12 @@ final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResul
         if (result != null) {
             return result;
         }
-        return transformIfNecessary(bindingFuture.get(timeout, unit));
+
+        try {
+            return transformIfNecessary(bindingFuture.get(timeout, unit));
+        } catch (ExecutionException e) {
+            throw new ExecutionException(e.getMessage(), DOM_RPC_EX_MAPPER.apply(e));
+        }
     }
 
     @Override
@@ -104,4 +127,4 @@ final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResul
         return new DefaultDOMRpcResult(input.getErrors());
     }
 
-}
\ No newline at end of file
+}