/* *******************************************************************
* Copyright (c) 1999-2001 Xerox Corporation,
- * 2002 Palo Alto Research Center, Incorporated (PARC).
+ * 2002 Palo Alto Research Center, Incorporated (PARC),
+ * 2004 Contributors.
* All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Common Public License v1.0
package org.aspectj.lang;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
/**
* Wrapper for checked exceptions matched by a 'declare soft'.
* You can soften checked exceptions at join points by using
* At the join points, any exceptions thrown which match
* TypePattern will be wrapped in <code>SoftException</code>
* and rethrown. You can get the original exception using
- * <code>getWrappedThrowable()</code>.
+ * <code>getWrappedThrowable()</code> or
+ * <code>getCause()</code>.
*/
public class SoftException extends RuntimeException {
- Throwable inner;
+
+ private static final boolean HAVE_JAVA_14;
+
+ static {
+ boolean java14 = false;
+ try {
+ Class.forName("java.nio.Buffer");
+ java14 = true;
+ } catch (Throwable t) {
+ // still false;
+ }
+ HAVE_JAVA_14 = java14;
+ }
+
+ // shouldn't field be private final, constructor default or private?
+ // but either would be a binary incompatible change.
+
+ Throwable inner;
+
public SoftException(Throwable inner) {
super();
this.inner = inner;
public Throwable getWrappedThrowable() { return inner; }
public Throwable getCause() { return inner; }
+ public void printStackTrace() {
+ printStackTrace(System.err);
+ }
+
+ public void printStackTrace(PrintStream stream) {
+ super.printStackTrace(stream);
+ final Throwable _inner = this.inner;
+ if (!HAVE_JAVA_14 && (null != _inner)) {
+ stream.print("Caused by: ");
+ _inner.printStackTrace(stream);
+ }
+ }
+
+ public void printStackTrace(PrintWriter stream) {
+ super.printStackTrace(stream);
+ final Throwable _inner = this.inner;
+ if (!HAVE_JAVA_14 && (null != _inner)) {
+ stream.print("Caused by: ");
+ _inner.printStackTrace(stream);
+ }
+ }
}
* Xerox/PARC initial implementation
* ******************************************************************/
-
// default package
-import org.aspectj.lang.NoAspectBoundException;
+import java.io.*;
+
+import org.aspectj.lang.*;
import junit.framework.*;
}
public RuntimeModuleTests(String name) { super(name); }
-
- public void testNothing() {}
public void testNoAspectBoundException() {
- RuntimeException fun = new RuntimeException("fun");
- NoAspectBoundException nab = new NoAspectBoundException("Foo", fun);
- assertEquals(fun,nab.getCause());
+ RuntimeException fun = new RuntimeException("fun");
+ NoAspectBoundException nab = new NoAspectBoundException("Foo", fun);
+ assertEquals(fun,nab.getCause());
+ }
+
+ public void testSoftExceptionPrintStackTrace() {
+ // let's see
+// Throwable t = new Error("xyz");
+// new SoftException(t).printStackTrace();
+
+ // save to specified PrintStream
+ ByteArrayOutputStream sink = new ByteArrayOutputStream();
+ PrintStream out = new PrintStream(sink);
+ new SoftException(new Error("xyz")).printStackTrace(out);
+ String s = new String(sink.toByteArray());
+ out.flush();
+ checkSoftExceptionString(s);
+
+ // save to specified PrintWriter
+ sink = new ByteArrayOutputStream();
+ PrintWriter pout = new PrintWriter(sink);
+ new SoftException(new Error("xyz")).printStackTrace(pout);
+ pout.flush();
+ s = new String(sink.toByteArray());
+ checkSoftExceptionString(s);
+
+ // check System.err redirect
+ PrintStream systemErr = System.err;
+ try {
+ sink = new ByteArrayOutputStream();
+ out = new PrintStream(sink);
+ System.setErr(out);
+ new SoftException(new Error("xyz")).printStackTrace();
+ out.flush();
+ s = new String(sink.toByteArray());
+ checkSoftExceptionString(s);
+ } finally {
+ System.setErr(systemErr);
+ }
+ }
+ static void checkSoftExceptionString(String s) {
+ assertTrue(-1 != s.indexOf("SoftException"));
+ assertTrue(-1 != s.indexOf("Caused by: java.lang.Error"));
+ assertTrue(-1 != s.indexOf("xyz"));
+ assertTrue(-1 != s.indexOf("testSoftExceptionPrintStackTrace"));
}
}