/* * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.sal.restconf.rpc.impl; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorTag; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; public abstract class AbstractRpcExecutor implements RpcExecutor { private final RpcDefinition rpcDef; public AbstractRpcExecutor(RpcDefinition rpcDef) { this.rpcDef = rpcDef; } @Override public RpcDefinition getRpcDefinition() { return rpcDef; } @Override public RpcResult invokeRpc(CompositeNode rpcRequest) throws RestconfDocumentedException { try { return getRpcResult(invokeRpcUnchecked(rpcRequest)); } catch (IllegalArgumentException e) { throw new RestconfDocumentedException(e.getMessage(), ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); } catch (UnsupportedOperationException e) { throw new RestconfDocumentedException(e.getMessage(), ErrorType.RPC, ErrorTag.OPERATION_NOT_SUPPORTED); } catch (Exception e) { throw new RestconfDocumentedException("The operation encountered an unexpected error while executing.", e); } } protected abstract Future> invokeRpcUnchecked(CompositeNode rpcRequest); protected RpcResult getRpcResult(Future> fromFuture) { try { return fromFuture.get(); } catch (InterruptedException e) { throw new RestconfDocumentedException( "The operation was interrupted while executing and did not complete.", ErrorType.RPC, ErrorTag.PARTIAL_OPERATION); } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof CancellationException) { throw new RestconfDocumentedException("The operation was cancelled while executing.", ErrorType.RPC, ErrorTag.PARTIAL_OPERATION); } else if (cause != null) { while (cause.getCause() != null) { cause = cause.getCause(); } if (cause instanceof IllegalArgumentException) { throw new RestconfDocumentedException(cause.getMessage(), ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); } throw new RestconfDocumentedException("The operation encountered an unexpected error while executing.", cause); } else { throw new RestconfDocumentedException("The operation encountered an unexpected error while executing.", e); } } } }