X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frestconf%2Frpc%2Fimpl%2FAbstractRpcExecutor.java;h=4c5e3ab5301e0dc1fa4f27507030bc479f49a012;hb=92a9bca9109fef4ef261f5c711baa48f5d05bca2;hp=446d07d42639969eec1f999fb8713b96d0a3f307;hpb=b78e63501576638e1f000fd46663f8c42340f9e2;p=controller.git diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/rpc/impl/AbstractRpcExecutor.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/rpc/impl/AbstractRpcExecutor.java index 446d07d426..4c5e3ab530 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/rpc/impl/AbstractRpcExecutor.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/rpc/impl/AbstractRpcExecutor.java @@ -1,18 +1,26 @@ /* -* 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 -*/ + * 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 ){ + public AbstractRpcExecutor(RpcDefinition rpcDef) { this.rpcDef = rpcDef; } @@ -20,4 +28,50 @@ public abstract class AbstractRpcExecutor implements RpcExecutor { 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); + } + } + } } \ No newline at end of file