From: wisberg Date: Thu, 15 Jan 2004 05:21:33 +0000 (+0000) Subject: 47952 fix: SoftException.printStackTrace(..) prints wrapped throwable (if not >=... X-Git-Tag: v_preCompileLoopAlteration~96 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ad2fb7a583f7451f3101f8101b090999d6a43341;p=aspectj.git 47952 fix: SoftException.printStackTrace(..) prints wrapped throwable (if not >= 1.4) tested in 1.1, 1.3, 1.4 (but not in 1.1 release tests) --- diff --git a/runtime/src/org/aspectj/lang/SoftException.java b/runtime/src/org/aspectj/lang/SoftException.java index 406eb5272..b1ac84cb4 100644 --- a/runtime/src/org/aspectj/lang/SoftException.java +++ b/runtime/src/org/aspectj/lang/SoftException.java @@ -1,6 +1,7 @@ /* ******************************************************************* * 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 @@ -14,6 +15,9 @@ 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 @@ -21,10 +25,29 @@ package org.aspectj.lang; * At the join points, any exceptions thrown which match * TypePattern will be wrapped in SoftException * and rethrown. You can get the original exception using - * getWrappedThrowable(). + * getWrappedThrowable() or + * getCause(). */ 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; @@ -33,4 +56,25 @@ public class SoftException extends RuntimeException { 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); + } + } } diff --git a/runtime/testsrc/RuntimeModuleTests.java b/runtime/testsrc/RuntimeModuleTests.java index a426025c5..ff7560c8e 100644 --- a/runtime/testsrc/RuntimeModuleTests.java +++ b/runtime/testsrc/RuntimeModuleTests.java @@ -11,10 +11,11 @@ * Xerox/PARC initial implementation * ******************************************************************/ - // default package -import org.aspectj.lang.NoAspectBoundException; +import java.io.*; + +import org.aspectj.lang.*; import junit.framework.*; @@ -27,12 +28,52 @@ public class RuntimeModuleTests extends TestCase { } 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")); } }