From a89eac7f94cbea34f2ca76e49a1c42a594194080 Mon Sep 17 00:00:00 2001 From: mwebster Date: Tue, 1 Aug 2006 13:09:06 +0000 Subject: [PATCH] Bug 150487 "Tracing and Logging Framework" (lazy initialize SimpleDateFormat to prevent recursion in JDK 1.4 LTW) --- .../loadtime/WeavingURLClassLoader.java | 49 ++++++++++++------- tests/ltw/ExceptionHandler.aj | 9 ++++ tests/ltw/HelloWorld.java | 1 + tests/ltw/ant.xml | 26 +++++++++- .../systemtest/ajc150/ltw/LTWTests.java | 8 ++- .../systemtest/ajc150/ltw/ltw-tests.xml | 17 ++++--- .../weaver/ExtensibleURLClassLoader.java | 8 ++- .../aspectj/weaver/bcel/ClassPathManager.java | 10 ++-- .../aspectj/weaver/tools/AbstractTrace.java | 12 ++++- 9 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 tests/ltw/ExceptionHandler.aj diff --git a/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java index 2a3d19381..0dc1506df 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java @@ -43,7 +43,7 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W */ public WeavingURLClassLoader (ClassLoader parent) { this(getURLs(getClassPath()),getURLs(getAspectPath()),parent); -// System.err.println("? WeavingURLClassLoader.(" + m_parent + ")"); +// System.out.println("? WeavingURLClassLoader.WeavingURLClassLoader()"); } public WeavingURLClassLoader (URL[] urls, ClassLoader parent) { @@ -53,15 +53,22 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W public WeavingURLClassLoader (URL[] classURLs, URL[] aspectURLs, ClassLoader parent) { super(classURLs,parent); -// System.err.println("? WeavingURLClassLoader.() classURLs=" + classURLs.length + ", aspectURLs=" + aspectURLs.length); +// System.out.println("> WeavingURLClassLoader.WeavingURLClassLoader() classURLs=" + Arrays.asList(classURLs)); this.aspectURLs = aspectURLs; - /* If either we nor our m_parent is using an ASPECT_PATH use a new-style + /* If either we nor our parent is using an ASPECT_PATH use a new-style * adaptor */ - if (this.aspectURLs.length > 0 || parent instanceof WeavingClassLoader) { - adaptor = new WeavingAdaptor(this); + if (this.aspectURLs.length > 0 || getParent() instanceof WeavingClassLoader) { + try { + adaptor = new WeavingAdaptor(this); + } + catch (ExceptionInInitializerError ex) { + ex.printStackTrace(System.out); + throw ex; + } } +// System.out.println("< WeavingURLClassLoader.WeavingURLClassLoader() adaptor=" + adaptor); } private static String getAspectPath () { @@ -106,26 +113,30 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W /* Need to defer creation because of possible recursion during constructor execution */ if (adaptor == null && !initializingAdaptor) { - DefaultWeavingContext weavingContext = new DefaultWeavingContext (this) { - - /* Ensures consistent LTW messages for testing */ - public String getClassLoaderName() { - return loader.getClass().getName(); - } - - }; - - ClassLoaderWeavingAdaptor clwAdaptor = new ClassLoaderWeavingAdaptor(); - initializingAdaptor = true; - clwAdaptor.initialize(this,weavingContext); - initializingAdaptor = false; - adaptor = clwAdaptor; + createAdaptor(); } b = adaptor.weaveClass(name,b); } return super.defineClass(name, b, cs); } + + private void createAdaptor () { + DefaultWeavingContext weavingContext = new DefaultWeavingContext (this) { + + /* Ensures consistent LTW messages for testing */ + public String getClassLoaderName() { + return loader.getClass().getName(); + } + + }; + + ClassLoaderWeavingAdaptor clwAdaptor = new ClassLoaderWeavingAdaptor(); + initializingAdaptor = true; + clwAdaptor.initialize(this,weavingContext); + initializingAdaptor = false; + adaptor = clwAdaptor; + } /** * Override to find classes generated by WeavingAdaptor diff --git a/tests/ltw/ExceptionHandler.aj b/tests/ltw/ExceptionHandler.aj new file mode 100644 index 000000000..447b59577 --- /dev/null +++ b/tests/ltw/ExceptionHandler.aj @@ -0,0 +1,9 @@ +public aspect ExceptionHandler { + void around() : execution(public void main(String[])) { + try { + proceed(); + } + catch (Exception ex) { + } + } +} \ No newline at end of file diff --git a/tests/ltw/HelloWorld.java b/tests/ltw/HelloWorld.java index 8e5a1fdd7..9c810cf25 100644 --- a/tests/ltw/HelloWorld.java +++ b/tests/ltw/HelloWorld.java @@ -2,6 +2,7 @@ public class HelloWorld { public static void main (String[] args) throws Exception { System.out.println("Hello World!"); + throw new Exception(); } } \ No newline at end of file diff --git a/tests/ltw/ant.xml b/tests/ltw/ant.xml index 6f7971d96..38f51fd49 100644 --- a/tests/ltw/ant.xml +++ b/tests/ltw/ant.xml @@ -6,16 +6,38 @@ name="jdwp" value="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/> - + + + + + + + + + + + + + + + - + + + + + diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java index 4a5a7e0ee..73b6eebd1 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java @@ -97,8 +97,12 @@ public class LTWTests extends org.aspectj.testing.XMLBasedAjcTestCase { runTest("Odd zip on classpath"); } - public void testJDK14LTW() { - runTest("JDK14 LTW"); + public void testJ14LTWWithXML() { + runTest("JDK14 LTW with XML"); + } + + public void testJ14LTWWithASPECTPATH() { + runTest("JDK14 LTW with ASPECTPATH"); } // separate bugzilla patch has this one... commented out diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml index 57946c186..bc7120870 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml @@ -470,11 +470,16 @@ commented out: reported in another bugzilla bug... --> - - - + + + + + + + + + + + \ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/ExtensibleURLClassLoader.java b/weaver/src/org/aspectj/weaver/ExtensibleURLClassLoader.java index 74d68703d..e35d95eb3 100644 --- a/weaver/src/org/aspectj/weaver/ExtensibleURLClassLoader.java +++ b/weaver/src/org/aspectj/weaver/ExtensibleURLClassLoader.java @@ -29,7 +29,13 @@ public abstract class ExtensibleURLClassLoader extends URLClassLoader { super(urls,parent); // System.err.println("? ExtensibleURLClassLoader.() path=" + WeavingAdaptor.makeClasspath(urls)); - classPath = new ClassPathManager(FileUtil.makeClasspath(urls),null); + try { + classPath = new ClassPathManager(FileUtil.makeClasspath(urls),null); + } + catch (ExceptionInInitializerError ex) { + ex.printStackTrace(System.out); + throw ex; + } } protected void addURL(URL url) { diff --git a/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java b/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java index 6f9025e20..5f06c0e6f 100644 --- a/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java +++ b/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java @@ -46,11 +46,7 @@ public class ClassPathManager { private static int maxOpenArchives = -1; private static final int MAXOPEN_DEFAULT = 1000; - /* - * FIXME maw Tracing ClassPathManager can cause recursion for JDK 1.4 - * LTW i.e. -Djava.system.class.loader - */ -// private static Trace trace = TraceFactory.getTraceFactory().getTrace(ClassPathManager.class); + private static Trace trace = TraceFactory.getTraceFactory().getTrace(ClassPathManager.class); static { String openzipsString = getSystemPropertyWithoutSecurityException("org.aspectj.weaver.openarchives",Integer.toString(MAXOPEN_DEFAULT)); @@ -61,13 +57,13 @@ public class ClassPathManager { public ClassPathManager(List classpath, IMessageHandler handler) { -// if (trace.isTraceEnabled()) trace.enter("",this,new Object[] { classpath, handler }); + if (trace.isTraceEnabled()) trace.enter("",this,new Object[] { classpath, handler }); entries = new ArrayList(); for (Iterator i = classpath.iterator(); i.hasNext();) { String name = (String) i.next(); addPath(name, handler); } -// if (trace.isTraceEnabled()) trace.exit(""); + if (trace.isTraceEnabled()) trace.exit(""); } protected ClassPathManager() {}; diff --git a/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java b/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java index 877fc79dd..4b421f2ae 100644 --- a/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java +++ b/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java @@ -18,7 +18,7 @@ public abstract class AbstractTrace implements Trace { protected Class tracedClass; - private static SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss.SSS"); + private static SimpleDateFormat timeFormat; protected AbstractTrace (Class clazz) { this.tracedClass = clazz; @@ -94,7 +94,7 @@ public abstract class AbstractTrace implements Trace { protected String formatMessage(String kind, String className, String methodName, Object thiz, Object[] args) { StringBuffer message = new StringBuffer(); Date now = new Date(); - message.append(time.format(now)).append(" "); + message.append(formatDate(now)).append(" "); message.append(Thread.currentThread().getName()).append(" "); message.append(kind).append(" "); message.append(className); @@ -103,6 +103,14 @@ public abstract class AbstractTrace implements Trace { if (args != null) message.append(" ").append(formatArgs(args)); return message.toString(); } + + private static String formatDate (Date date) { + if (timeFormat == null) { + timeFormat = new SimpleDateFormat("HH:mm:ss.SSS"); + } + + return timeFormat.format(date); + } /** * Format objects safely avoiding toString which can cause recursion, -- 2.39.5