You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2004/10/09 12:04:04 UTC
cvs commit: jakarta-commons/lang/src/java/org/apache/commons/lang/exception ExceptionUtils.java
scolebourne 2004/10/09 03:04:04
Modified: lang/src/test/org/apache/commons/lang/exception
ExceptionUtilsTestCase.java
lang/src/java/org/apache/commons/lang/exception
ExceptionUtils.java
Log:
Add additional method to support subclass searching of exceptions in a chain
bug 30929
Revision Changes Path
1.13 +54 -0 jakarta-commons/lang/src/test/org/apache/commons/lang/exception/ExceptionUtilsTestCase.java
Index: ExceptionUtilsTestCase.java
===================================================================
RCS file: /home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/exception/ExceptionUtilsTestCase.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ExceptionUtilsTestCase.java 18 Feb 2004 23:22:29 -0000 1.12
+++ ExceptionUtilsTestCase.java 9 Oct 2004 10:04:03 -0000 1.13
@@ -179,6 +179,8 @@
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class));
assertEquals(1, ExceptionUtils.indexOfThrowable(withCause, NestableException.class));
assertEquals(2, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithoutCause.class));
+
+ assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class));
}
public void testIndexOf_ThrowableClassInt() {
@@ -204,6 +206,58 @@
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 1));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 9));
+
+ assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class, 0));
+ }
+
+ //-----------------------------------------------------------------------
+ public void testIndexOfType_ThrowableClass() {
+ assertEquals(-1, ExceptionUtils.indexOfType(null, null));
+ assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class));
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class));
+ assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(nested, null));
+ assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class));
+ assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class));
+ assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class));
+ assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class));
+ assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class));
+
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class));
+ }
+
+ public void testIndexOfType_ThrowableClassInt() {
+ assertEquals(-1, ExceptionUtils.indexOfType(null, null, 0));
+ assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class, 0));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class, 0));
+ assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class, 0));
+ assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class, 0));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(nested, null, 0));
+ assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class, 0));
+ assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class, 0));
+ assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class, 0));
+
+ assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
+ assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class, 0));
+ assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class, 0));
+
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, -1));
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
+ assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 1));
+ assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 9));
+
+ assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class, 0));
}
//-----------------------------------------------------------------------
1.42 +72 -14 jakarta-commons/lang/src/java/org/apache/commons/lang/exception/ExceptionUtils.java
Index: ExceptionUtils.java
===================================================================
RCS file: /home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/exception/ExceptionUtils.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- ExceptionUtils.java 30 Sep 2004 07:03:25 -0000 1.41
+++ ExceptionUtils.java 9 Oct 2004 10:04:04 -0000 1.42
@@ -391,24 +391,28 @@
//-----------------------------------------------------------------------
/**
* <p>Returns the (zero based) index of the first <code>Throwable</code>
- * that matches the specified type in the exception chain.</p>
+ * that matches the specified class (exactly) in the exception chain.
+ * Subclasses of the specified class do not match - see
+ * {@link #indexOfType(Throwable, Class)} for the opposite.</p>
*
* <p>A <code>null</code> throwable returns <code>-1</code>.
* A <code>null</code> type returns <code>-1</code>.
* No match in the chain returns <code>-1</code>.</p>
*
* @param throwable the throwable to inspect, may be null
- * @param type the type to search for
+ * @param clazz the class to search for, subclasses do not match, null returns -1
* @return the index into the throwable chain, -1 if no match or null input
*/
- public static int indexOfThrowable(Throwable throwable, Class type) {
- return indexOfThrowable(throwable, type, 0);
+ public static int indexOfThrowable(Throwable throwable, Class clazz) {
+ return indexOf(throwable, clazz, 0, false);
}
/**
* <p>Returns the (zero based) index of the first <code>Throwable</code>
* that matches the specified type in the exception chain from
- * a specified index.</p>
+ * a specified index.
+ * Subclasses of the specified class do not match - see
+ * {@link #indexOfType(Throwable, Class, int)} for the opposite.</p>
*
* <p>A <code>null</code> throwable returns <code>-1</code>.
* A <code>null</code> type returns <code>-1</code>.
@@ -417,13 +421,61 @@
* A start index greater than the number of throwables returns <code>-1</code>.</p>
*
* @param throwable the throwable to inspect, may be null
- * @param type the type to search for
+ * @param clazz the class to search for, subclasses do not match, null returns -1
* @param fromIndex the (zero based) index of the starting position,
* negative treated as zero, larger than chain size returns -1
* @return the index into the throwable chain, -1 if no match or null input
*/
- public static int indexOfThrowable(Throwable throwable, Class type, int fromIndex) {
- if (throwable == null) {
+ public static int indexOfThrowable(Throwable throwable, Class clazz, int fromIndex) {
+ return indexOf(throwable, clazz, fromIndex, false);
+ }
+
+ //-----------------------------------------------------------------------
+ /**
+ * <p>Returns the (zero based) index of the first <code>Throwable</code>
+ * that matches the specified class or subclass in the exception chain.
+ * Subclasses of the specified class do match - see
+ * {@link #indexOfThrowable(Throwable, Class)} for the opposite.</p>
+ *
+ * <p>A <code>null</code> throwable returns <code>-1</code>.
+ * A <code>null</code> type returns <code>-1</code>.
+ * No match in the chain returns <code>-1</code>.</p>
+ *
+ * @param throwable the throwable to inspect, may be null
+ * @param type the type to search for, subclasses match, null returns -1
+ * @return the index into the throwable chain, -1 if no match or null input
+ * @since 2.1
+ */
+ public static int indexOfType(Throwable throwable, Class type) {
+ return indexOf(throwable, type, 0, true);
+ }
+
+ /**
+ * <p>Returns the (zero based) index of the first <code>Throwable</code>
+ * that matches the specified type in the exception chain from
+ * a specified index.
+ * Subclasses of the specified class do match - see
+ * {@link #indexOfThrowable(Throwable, Class)} for the opposite.</p>
+ *
+ * <p>A <code>null</code> throwable returns <code>-1</code>.
+ * A <code>null</code> type returns <code>-1</code>.
+ * No match in the chain returns <code>-1</code>.
+ * A negative start index is treated as zero.
+ * A start index greater than the number of throwables returns <code>-1</code>.</p>
+ *
+ * @param throwable the throwable to inspect, may be null
+ * @param type the type to search for, subclasses match, null returns -1
+ * @param fromIndex the (zero based) index of the starting position,
+ * negative treated as zero, larger than chain size returns -1
+ * @return the index into the throwable chain, -1 if no match or null input
+ * @since 2.1
+ */
+ public static int indexOfType(Throwable throwable, Class type, int fromIndex) {
+ return indexOf(throwable, type, fromIndex, true);
+ }
+
+ private static int indexOf(Throwable throwable, Class type, int fromIndex, boolean subclass) {
+ if (throwable == null || type == null) {
return -1;
}
if (fromIndex < 0) {
@@ -433,11 +485,17 @@
if (fromIndex >= throwables.length) {
return -1;
}
- for (int i = fromIndex; i < throwables.length; i++) {
-// TODO: decide on whether to include this
-// if (type.isAssignableFrom(throwables[i].getClass())) {
- if (throwables[i].getClass().equals(type)) {
- return i;
+ if (subclass) {
+ for (int i = fromIndex; i < throwables.length; i++) {
+ if (type.isAssignableFrom(throwables[i].getClass())) {
+ return i;
+ }
+ }
+ } else {
+ for (int i = fromIndex; i < throwables.length; i++) {
+ if (type.equals(throwables[i].getClass())) {
+ return i;
+ }
}
}
return -1;
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org