summaryrefslogtreecommitdiffstats
path: root/v3po/vpp-translate-utils
diff options
context:
space:
mode:
authorTibor Sirovatka <tsirovat@cisco.com>2016-05-30 16:52:57 +0200
committerTibor Sirovatka <tsirovat@cisco.com>2016-06-09 08:40:25 +0200
commit744551ed3b657da9f6c8d06bfed4dba4c9fc7700 (patch)
tree364de07c9a5eb1f4f5289f1624576eb5beeb1894 /v3po/vpp-translate-utils
parent8014d193008a60ef3857f14d57d931973daa7cc4 (diff)
HONEYCOMB-67 Introduce exception handling into JVPP
VppApiInvocationException replaced by VPP VPPBaseCallException(s) VppInvocationException - send request failed VppCallbackException - operation had failed (negative result) Change-Id: I897afead8d65ef1240e657116a0610850c62348f Signed-off-by: Tibor Sirovatka <tsirovat@cisco.com>
Diffstat (limited to 'v3po/vpp-translate-utils')
-rw-r--r--v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/FutureJVppCustomizer.java3
-rw-r--r--v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/TranslateUtils.java39
-rw-r--r--v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationException.java75
-rw-r--r--v3po/vpp-translate-utils/src/test/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationExceptionTest.java44
4 files changed, 25 insertions, 136 deletions
diff --git a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/FutureJVppCustomizer.java b/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/FutureJVppCustomizer.java
index 61495b71c..3f4f1f5ce 100644
--- a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/FutureJVppCustomizer.java
+++ b/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/FutureJVppCustomizer.java
@@ -18,9 +18,10 @@ package io.fd.honeycomb.v3po.translate.v3po.util;
import com.google.common.annotations.Beta;
import com.google.common.base.Preconditions;
-import javax.annotation.Nonnull;
import org.openvpp.jvpp.future.FutureJVpp;
+import javax.annotation.Nonnull;
+
/**
* Abstract utility to hold the vppApi reference.
*/
diff --git a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/TranslateUtils.java b/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/TranslateUtils.java
index 3c1ef7f28..9c3fea615 100644
--- a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/TranslateUtils.java
+++ b/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/TranslateUtils.java
@@ -16,21 +16,23 @@
package io.fd.honeycomb.v3po.translate.v3po.util;
-import static com.google.common.base.Preconditions.checkArgument;
-
import com.google.common.base.Splitter;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.openvpp.jvpp.VppBaseCallException;
+import org.openvpp.jvpp.dto.JVppReply;
+
+import javax.annotation.Nonnegative;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.BiConsumer;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.dto.JVppReply;
+
+import static com.google.common.base.Preconditions.checkArgument;
public final class TranslateUtils {
@@ -38,23 +40,26 @@ public final class TranslateUtils {
private TranslateUtils() {}
- public static <REP extends JVppReply<?>> REP getReply(Future<REP> future) {
+ public static <REP extends JVppReply<?>> REP getReply(Future<REP> future) throws VppBaseCallException {
try {
return future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted", e);
} catch (ExecutionException e) {
- // Execution exception should not occur, since we are using return codes for errors
- // TODO fix when using exceptions instead of return codes
- throw new IllegalArgumentException("Future " + " should not fail with an exception", e);
+ // Execution exception could generally contains any exception
+ // when using exceptions instead of return codes just rethrow it for processing on corresponding place
+ if (e instanceof ExecutionException && ( e.getCause() instanceof VppBaseCallException)) {
+ throw (VppBaseCallException) (e.getCause());
+ }
+ throw new IllegalStateException(e);
}
}
public static <REP extends JVppReply<?>> REP getReply(@Nonnull Future<REP> future,
@Nonnull final InstanceIdentifier<?> replyType,
@Nonnegative final int timeoutInSeconds)
- throws ReadTimeoutException {
+ throws ReadTimeoutException, VppBaseCallException {
try {
checkArgument(timeoutInSeconds > 0, "Timeout cannot be < 0");
return future.get(timeoutInSeconds, TimeUnit.SECONDS);
@@ -62,9 +67,11 @@ public final class TranslateUtils {
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted", e);
} catch (ExecutionException e) {
- // Execution exception should not occur, since we are using return codes for errors
- // TODO fix when using exceptions instead of return codes
- throw new IllegalArgumentException("Future " + " should not fail with an exception", e);
+ // Execution exception could generally contains any exception
+ // when using exceptions instead of return codes just rethrow it for processing on corresponding place
+ if ( e.getCause() instanceof VppBaseCallException)
+ throw (VppBaseCallException)(e.getCause());
+ throw new IllegalStateException(e);
} catch (TimeoutException e) {
throw new ReadTimeoutException(replyType, e);
}
diff --git a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationException.java b/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationException.java
deleted file mode 100644
index 4c50304c6..000000000
--- a/v3po/vpp-translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationException.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.v3po.translate.v3po.util;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
-import javax.annotation.Nonnull;
-
-/**
- * Thrown when Vpp jAPI method invocation failed.
- */
-@Beta
-public class VppApiInvocationException extends Exception {
- private final String methodName;
- private final int ctxId;
- private final int errorCode;
-
- /**
- * Constructs an VppApiInvocationFailedException with the specified api method name and error code.
- *
- * @param methodName method name that failed to invoke
- * @param ctxId api request context identifier
- * @param errorCode negative error code value associated with this failure
- * @throws NullPointerException if apiMethodName is null
- * @throws IllegalArgumentException if errorCode is nonnegative
- */
- public VppApiInvocationException(@Nonnull final String methodName, final int ctxId, final int errorCode) {
- super(String.format("vppApi.%s failed with error code: %d (ctxId=%d) ", methodName, errorCode, ctxId));
- this.methodName = Preconditions.checkNotNull(methodName, "apiMethodName is null!");
- this.ctxId = ctxId;
- Preconditions.checkArgument(errorCode < 0);
- this.errorCode = errorCode;
- }
-
- /**
- * Returns method name that failed to invoke.
- *
- * @return method name
- */
- public String getMethodName() {
- return methodName;
- }
-
- /**
- * Returns api request context identifier.
- *
- * @return value of context identifier
- */
- public int getCtxId() {
- return ctxId;
- }
-
- /**
- * Returns the error code associated with this failure.
- *
- * @return a negative integer error code
- */
- public int getErrorCode() {
- return errorCode;
- }
-}
diff --git a/v3po/vpp-translate-utils/src/test/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationExceptionTest.java b/v3po/vpp-translate-utils/src/test/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationExceptionTest.java
deleted file mode 100644
index 184beceef..000000000
--- a/v3po/vpp-translate-utils/src/test/java/io/fd/honeycomb/v3po/translate/v3po/util/VppApiInvocationExceptionTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.v3po.translate.v3po.util;
-
-import java.util.Random;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class VppApiInvocationExceptionTest {
-
- @Test
- public void testInstantiation() {
- final String apiMethodName = "methodName";
- final int ctxId = 1;
- final int code = -1;
- VppApiInvocationException e = new VppApiInvocationException(apiMethodName, ctxId, code);
- Assert.assertEquals(apiMethodName, e.getMethodName());
- Assert.assertEquals(ctxId, e.getCtxId());
- Assert.assertEquals(code, e.getErrorCode());
- Assert.assertTrue(e.getMessage().contains(apiMethodName));
- Assert.assertTrue(e.getMessage().contains(String.valueOf(code)));
- Assert.assertTrue(e.getMessage().contains(String.valueOf(ctxId)));
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testInstantiationFailed() {
- final int code = new Random().nextInt(Integer.MAX_VALUE);
- VppApiInvocationException e = new VppApiInvocationException("apiMethodName", 1, code);
- }
-}