@@ -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.<init>(" + 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.<init>() 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 |
@@ -0,0 +1,9 @@ | |||
public aspect ExceptionHandler { | |||
void around() : execution(public void main(String[])) { | |||
try { | |||
proceed(); | |||
} | |||
catch (Exception ex) { | |||
} | |||
} | |||
} |
@@ -2,6 +2,7 @@ public class HelloWorld { | |||
public static void main (String[] args) throws Exception { | |||
System.out.println("Hello World!"); | |||
throw new Exception(); | |||
} | |||
} |
@@ -6,16 +6,38 @@ | |||
name="jdwp" | |||
value="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/> | |||
<target name="JDK14 LTW"> | |||
<target name="JDK14 LTW with XML"> | |||
<java fork="yes" classname="HelloWorld" failonerror="yes"> | |||
<classpath refid="aj.path"/> | |||
<!-- | |||
<classpath> | |||
<pathelement path="${aj.sandbox}/hello.jar"/> | |||
</classpath> | |||
--> | |||
<jvmarg value="-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader"/> | |||
<jvmarg value="-Daj.class.path=${aj.sandbox}/hello.jar;${aj.sandbox}/handler.jar"/> | |||
<jvmarg value="-Daj.weaving.verbose=true"/> | |||
<jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/> | |||
<jvmarg value="-Dorg.aspectj.tracing.debug=true"/> | |||
<!-- use META-INF/aop.xml style --> | |||
<!-- <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/>--> | |||
<!-- <jvmarg line="${jdwp}"/>--> | |||
</java> | |||
</target> | |||
<target name="JDK14 LTW with ASPECTPATH"> | |||
<java fork="yes" classname="HelloWorld" failonerror="yes"> | |||
<classpath refid="aj.path"/> | |||
<!-- | |||
<classpath> | |||
<pathelement path="${aj.sandbox}/hello.jar"/> | |||
</classpath> | |||
--> | |||
<jvmarg value="-Daj.class.path=${aj.sandbox}/hello.jar"/> | |||
<jvmarg value="-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader"/> | |||
<jvmarg value="-Daj.class.path=${aj.sandbox}/hello.jar;${aj.sandbox}/handler.jar"/> | |||
<jvmarg value="-Daj.aspect.path=${aj.sandbox}/handler.jar"/> | |||
<jvmarg value="-Daj.weaving.verbose=true"/> | |||
<jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/> | |||
<jvmarg value="-Dorg.aspectj.tracing.debug=true"/> | |||
<!-- use META-INF/aop.xml style --> | |||
<!-- <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/>--> |
@@ -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 |
@@ -470,11 +470,16 @@ commented out: reported in another bugzilla bug... | |||
</run> | |||
</ajc-test> | |||
--> | |||
<ajc-test dir="ltw" title="JDK14 LTW" keywords="ltw"> | |||
<compile | |||
files="HelloWorld.java" | |||
options="-outjar hello.jar" | |||
/> | |||
<ant file="ant.xml" target="JDK14 LTW" verbose="true"/> | |||
<ajc-test dir="ltw" title="JDK14 LTW with XML" keywords="ltw"> | |||
<compile files="HelloWorld.java" options="-outjar hello.jar"/> | |||
<compile files="ExceptionHandler.aj" options="-outxml -outjar handler.jar"/> | |||
<ant file="ant.xml" target="JDK14 LTW with XML" verbose="true"/> | |||
</ajc-test> | |||
<ajc-test dir="ltw" title="JDK14 LTW with ASPECTPATH" keywords="ltw"> | |||
<compile files="HelloWorld.java" options="-outjar hello.jar"/> | |||
<compile files="ExceptionHandler.aj" options="-outjar handler.jar"/> | |||
<ant file="ant.xml" target="JDK14 LTW with ASPECTPATH" verbose="true"/> | |||
</ajc-test> | |||
@@ -29,7 +29,13 @@ public abstract class ExtensibleURLClassLoader extends URLClassLoader { | |||
super(urls,parent); | |||
// System.err.println("? ExtensibleURLClassLoader.<init>() 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) { |
@@ -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("<init>",this,new Object[] { classpath, handler }); | |||
if (trace.isTraceEnabled()) trace.enter("<init>",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("<init>"); | |||
if (trace.isTraceEnabled()) trace.exit("<init>"); | |||
} | |||
protected ClassPathManager() {}; |
@@ -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, |