return sb.toString();
}
+ /**
+ * Returns a string description of what the compiler/weaver is currently doing
+ * @param prependNLIfNotEmpty Prepend a newline character to the message? This can be nice when printing the context
+ * as part of an exception stack trace.
+ */
+ public static String getCurrentContext(boolean prependNLIfNotEmpty) {
+ String context = getCurrentContext();
+ return context.isEmpty() ? context : (prependNLIfNotEmpty ? "\n" : "") + context;
+ }
+
public static ContextToken enteringPhase(int phaseId, Object data) {
Stack<ContextStackEntry> contextStack = getContextStack();
ContextTokenImpl nextToken = nextToken();
package org.aspectj.weaver;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
import org.aspectj.bridge.context.CompilationAndWeavingContext;
/**
* Exception to use inside the bcweaver.
*/
-@SuppressWarnings("serial")
public class BCException extends RuntimeException {
- Throwable thrown;
-
public BCException() {
- super();
- }
+ super();
+ }
- public BCException(String s) {
- super(s + "\n" + CompilationAndWeavingContext.getCurrentContext());
+ public BCException(String message) {
+ super(message + CompilationAndWeavingContext.getCurrentContext(true));
}
- public BCException(String s, Throwable thrown) {
- this(s);
- this.thrown = thrown;
- }
-
- // TODO: Is it really necessary to re-invent stack trace printing here? Can these methods simply go away?
- // The only doubtful "benefit" is that the causing exception's stack trace is printed fully instead of shortened.
- // But OTOH, the JVM just omits the lines which were present in the original stack trace above already, so there is
- // really no extra information here.
-
- public void printStackTrace() {
- printStackTrace(System.err);
+ public BCException(String message, Throwable cause) {
+ super(message + CompilationAndWeavingContext.getCurrentContext(true), cause);
}
-
- public void printStackTrace(PrintStream s) {
- printStackTrace(new PrintWriter(s));
- }
-
- public void printStackTrace(PrintWriter s) {
- super.printStackTrace(s);
- if (null != thrown) {
- s.print("Caused by: ");
- thrown.printStackTrace(s);
- }
- // Flush PrintWriter in case the JVM exits before the stack trace was printed. Otherwise, when e.g. calling
- // UnresolvedType.signatureToName from a main method or a test directly and a BCException is thrown, nothing but
- // Exception in thread "main"
- // would be printed without flushing the PrintWriter, because the JVM exits immediately.
- s.flush();
- }
-
}