Avoid ClassCastException in remote-rpc-connector
[controller.git] / opendaylight / md-sal / sal-remoterpc-connector / src / main / java / org / opendaylight / controller / remote / rpc / RemoteRpcImplementation.java
index 360ac68a519f29695410ef50115ddc98c90f2343..2a4ea2e3e6d6208a371cdb163de9ec3344df89df 100644 (file)
@@ -53,12 +53,25 @@ public class RemoteRpcImplementation implements DOMRpcImplementation {
             @Override
             public void onComplete(final Throwable failure, final Object reply) throws Throwable {
                 if(failure != null) {
-                    LOG.error("InvokeRpc failed", failure);
 
-                    final String message = String.format("Execution of RPC %s failed",  rpcMsg.getRpc());
-                    Collection<RpcError> errors = ((RpcErrorsException)failure).getRpcErrors();
-                    if(errors == null || errors.size() == 0) {
-                        errors = Arrays.asList(RpcResultBuilder.newError(ErrorType.RPC, null, message));
+                    // When we return a failure to the caller they can choose to log it if they like
+                    // so here we just do basic warn logging by default and log the stack trace only when debug
+                    // is enabled
+
+                    LOG.warn("InvokeRpc failed rpc = {}, identifier = {}", rpcMsg.getRpc(), rpcMsg.getIdentifier());
+
+                    if(LOG.isDebugEnabled()){
+                        LOG.debug("Detailed Error", failure);
+                    }
+
+                    final String message = String.format("Execution of RPC %s failed because of %s",
+                            rpcMsg.getRpc(), failure.getMessage());
+                    Collection<RpcError> errors = Arrays.asList(RpcResultBuilder.newError(ErrorType.RPC, null, message));
+                    if(failure instanceof RpcErrorsException) {
+                        errors = ((RpcErrorsException) failure).getRpcErrors();
+                        if (errors == null || errors.size() == 0) {
+                            errors = Arrays.asList(RpcResultBuilder.newError(ErrorType.RPC, null, message));
+                        }
                     }
                     final DOMRpcResult rpcResult = new DefaultDOMRpcResult(errors);
 
@@ -67,8 +80,16 @@ public class RemoteRpcImplementation implements DOMRpcImplementation {
                 }
 
                 final RpcResponse rpcReply = (RpcResponse)reply;
-                final NormalizedNode<?, ?> result =
-                        NormalizedNodeSerializer.deSerialize(rpcReply.getResultNormalizedNode());
+                final NormalizedNode<?, ?> result;
+
+                if(rpcReply.getResultNormalizedNode() == null){
+                    result = null;
+                    LOG.debug("Received response for invoke rpc : {} result is null", rpcMsg.getRpc());
+                } else {
+                    result = NormalizedNodeSerializer.deSerialize(rpcReply.getResultNormalizedNode());
+                    LOG.debug("Received response for invoke rpc : {} result : {}", rpcMsg.getRpc(), result);
+                }
+
                 settableFuture.set(new DefaultDOMRpcResult(result));
             }
         };