diff options
author | aclement <aclement> | 2005-10-14 07:23:40 +0000 |
---|---|---|
committer | aclement <aclement> | 2005-10-14 07:23:40 +0000 |
commit | 8982544f13eb5cb082ca19db2bd2c5f77b1e5965 (patch) | |
tree | d7e4c96b17ce76331686fc3cab53326d0087f039 /loadtime | |
parent | 51a0fe4edd56a626ef5570e43bd2225be0dcb4dd (diff) | |
download | aspectj-8982544f13eb5cb082ca19db2bd2c5f77b1e5965.tar.gz aspectj-8982544f13eb5cb082ca19db2bd2c5f77b1e5965.zip |
Code for enhancement 107741: Updated WeavingURLClassLoader (thanks to Matthew Webster for the patch)
Diffstat (limited to 'loadtime')
-rw-r--r-- | loadtime/.classpath | 56 | ||||
-rw-r--r-- | loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java | 163 | ||||
-rw-r--r-- | loadtime/testsrc/LoadtimeModuleTests.java | 4 | ||||
-rw-r--r-- | loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java | 502 |
4 files changed, 680 insertions, 45 deletions
diff --git a/loadtime/.classpath b/loadtime/.classpath index 47982eb80..5a9f37bcd 100644 --- a/loadtime/.classpath +++ b/loadtime/.classpath @@ -1,48 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="src" path="src"> - <attributes> - </attributes> - </classpathentry> - <classpathentry kind="src" path="testsrc"> - <attributes> - </attributes> - </classpathentry> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"> - <attributes> - </attributes> - </classpathentry> - <classpathentry combineaccessrules="false" kind="src" path="/asm"> - <attributes> - </attributes> - </classpathentry> - <classpathentry combineaccessrules="false" kind="src" path="/bridge"> - <attributes> - </attributes> - </classpathentry> - <classpathentry combineaccessrules="false" kind="src" path="/util"> - <attributes> - </attributes> - </classpathentry> - <classpathentry combineaccessrules="false" kind="src" path="/weaver"> - <attributes> - </attributes> - </classpathentry> - <classpathentry kind="lib" path="/lib/ext/jrockit/managementapi-jrockit81.jar"> - <attributes> - </attributes> - </classpathentry> - <classpathentry sourcepath="/lib/junit/junit-src.jar" kind="lib" path="/lib/junit/junit.jar"> - <attributes> - </attributes> - </classpathentry> - <classpathentry kind="lib" path="/lib/ant/lib/xml-apis.jar"> - <attributes> - </attributes> - </classpathentry> - <classpathentry kind="lib" path="/lib/ant/lib/xercesImpl.jar"> - <attributes> - </attributes> - </classpathentry> + <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="testsrc"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry combineaccessrules="false" kind="src" path="/asm"/> + <classpathentry combineaccessrules="false" kind="src" path="/bridge"/> + <classpathentry combineaccessrules="false" kind="src" path="/util"/> + <classpathentry combineaccessrules="false" kind="src" path="/weaver"/> + <classpathentry kind="lib" path="/lib/ext/jrockit/managementapi-jrockit81.jar"/> + <classpathentry sourcepath="/lib/junit/junit-src.jar" kind="lib" path="/lib/junit/junit.jar"/> + <classpathentry kind="lib" path="/lib/ant/lib/xml-apis.jar"/> + <classpathentry kind="lib" path="/lib/ant/lib/xercesImpl.jar"/> + <classpathentry combineaccessrules="false" kind="src" path="/testing-util"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java new file mode 100644 index 000000000..a80a4a918 --- /dev/null +++ b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java @@ -0,0 +1,163 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Matthew Webster, Adrian Colyer, + * Martin Lippert initial implementation + * ******************************************************************/ + +package org.aspectj.weaver.loadtime; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.CodeSource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.aspectj.weaver.ExtensibleURLClassLoader; +import org.aspectj.weaver.tools.WeavingAdaptor; +import org.aspectj.weaver.tools.WeavingClassLoader; + +public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements WeavingClassLoader { + + public static final String WEAVING_CLASS_PATH = "aj.class.path"; + public static final String WEAVING_ASPECT_PATH = "aj.aspect.path"; + + private URL[] aspectURLs; + private WeavingAdaptor adaptor; + private Map generatedClasses = new HashMap(); /* String -> byte[] */ + + /* + * This constructor is needed when using "-Djava.system.class.loader". + */ + public WeavingURLClassLoader (ClassLoader parent) { + this(getURLs(getClassPath()),getURLs(getAspectPath()),parent); +// System.err.println("? WeavingURLClassLoader.<init>(" + parent + ")"); + } + + public WeavingURLClassLoader (URL[] urls, ClassLoader parent) { + super(urls,parent); +// System.out.println("WeavingURLClassLoader.WeavingURLClassLoader()"); + } + + public WeavingURLClassLoader (URL[] classURLs, URL[] aspectURLs, ClassLoader parent) { + super(classURLs,parent); +// System.err.println("? WeavingURLClassLoader.<init>() classURLs=" + classURLs.length + ", aspectURLs=" + aspectURLs.length); + this.aspectURLs = aspectURLs; + + /* 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); + } + } + + private static String getAspectPath () { + return System.getProperty(WEAVING_ASPECT_PATH,""); + } + + private static String getClassPath () { + return System.getProperty(WEAVING_CLASS_PATH,""); + } + + private static URL[] getURLs (String path) { + List urlList = new ArrayList(); + for (StringTokenizer t = new StringTokenizer(path,File.pathSeparator); + t.hasMoreTokens();) { + File f = new File(t.nextToken().trim()); + try { + if (f.exists()) { + URL url = f.toURL(); + if (url != null) urlList.add(url); + } + } catch (MalformedURLException e) {} + } + + URL[] urls = new URL[urlList.size()]; + urlList.toArray(urls); + return urls; + } + + protected void addURL(URL url) { + adaptor.addURL(url); + super.addURL(url); + } + + /** + * Override to weave class using WeavingAdaptor + */ + protected Class defineClass(String name, byte[] b, CodeSource cs) throws IOException { +// System.err.println("? WeavingURLClassLoader.defineClass(" + name + ", [" + b.length + "])"); + + /* Need to defer creation because of possible recursion during constructor execution */ + if (adaptor == null) { + ClassLoaderWeavingAdaptor clwAdaptor = new ClassLoaderWeavingAdaptor(this,null); + clwAdaptor.initialize(this,null); + adaptor = clwAdaptor; + } + + b = adaptor.weaveClass(name,b); + return super.defineClass(name, b, cs); + } + + /** + * Override to find classes generated by WeavingAdaptor + */ + protected byte[] getBytes (String name) throws IOException { + byte[] bytes = super.getBytes(name); + + if (bytes == null) { +// return adaptor.findClass(name); + return (byte[])generatedClasses.remove(name); + } + + return bytes; + } + + /** + * Implement method from WeavingClassLoader + */ + public URL[] getAspectURLs() { + return aspectURLs; + } + + public void acceptClass (String name, byte[] bytes) { + generatedClasses.put(name,bytes); + } + +// private interface ClassPreProcessorAdaptor extends ClassPreProcessor { +// public void addURL(URL url); +// } +// +// private class WeavingAdaptorPreProcessor implements ClassPreProcessorAdaptor { +// +// private WeavingAdaptor adaptor; +// +// public WeavingAdaptorPreProcessor (WeavingClassLoader wcl) { +// adaptor = new WeavingAdaptor(wcl); +// } +// +// public void initialize() { +// } +// +// public byte[] preProcess(String className, byte[] bytes, ClassLoader classLoader) { +// return adaptor.weaveClass(className,bytes); +// } +// +// public void addURL(URL url) { +// +// } +// } + +} diff --git a/loadtime/testsrc/LoadtimeModuleTests.java b/loadtime/testsrc/LoadtimeModuleTests.java index 4cf2326dc..ba89bb113 100644 --- a/loadtime/testsrc/LoadtimeModuleTests.java +++ b/loadtime/testsrc/LoadtimeModuleTests.java @@ -14,6 +14,8 @@ import junit.framework.TestCase; import junit.framework.Test; import junit.framework.TestSuite; import junit.textui.TestRunner; + +import org.aspectj.weaver.loadtime.WeavingURLClassLoaderTest; import org.aspectj.weaver.loadtime.test.DocumentParserTest; /** @@ -25,7 +27,7 @@ public class LoadtimeModuleTests extends TestCase { TestSuite suite = new TestSuite(LoadtimeModuleTests.class.getName()); suite.addTestSuite(DocumentParserTest.class); - + suite.addTestSuite(WeavingURLClassLoaderTest.class); return suite; } diff --git a/loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java b/loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java new file mode 100644 index 000000000..fe3139314 --- /dev/null +++ b/loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java @@ -0,0 +1,502 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Matthew Webster initial implementation + * ******************************************************************/ + +package org.aspectj.weaver.loadtime; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.Enumeration; +import java.util.Properties; + +import junit.framework.TestCase; + +import org.aspectj.bridge.AbortException; +import org.aspectj.testing.util.TestUtil.TestError; +import org.aspectj.util.FileUtil; +import org.aspectj.weaver.BcweaverTests; +import org.aspectj.weaver.tools.WeavingAdaptor; + +/** + * @author websterm + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class WeavingURLClassLoaderTest extends TestCase { + + private final static String ASPECTJRT = "../runtime/bin"; + private final static String CLASSES_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-classes.jar"; + private final static String WOVEN_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-woven.jar"; + private final static String JUNK_JAR = BcweaverTests.TESTDATA_PATH + "/ltw-junk.jar"; + private final static String ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-aspects.jar"; + private final static String DW_ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-dwaspects.jar"; + private final static String DE_ADVICE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-deaspects.jar"; + private final static String AROUNDCLOSURE_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-acaspects.jar"; + private final static String ITD_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-itdaspects.jar"; + private final static String PER_ASPECTS = BcweaverTests.TESTDATA_PATH + "/ltw-peraspects.jar"; + private final static String TEST_BASE = BcweaverTests.TESTDATA_PATH + "/WeavingURLClassLoaderTest/builtLibs"; + + private final static String NULL = "null"; + + private Properties savedProperties; + + public WeavingURLClassLoaderTest(String name) { + super(name); + } + + public void testLoadClass () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,""); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,CLASSES_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] {}); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testLoadWovenClass () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,""); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,WOVEN_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveWovenClass () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,ADVICE_ASPECTS + File.pathSeparator + WOVEN_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + loader.loadClass("LTWHelloWorld"); + fail("Expecting org.aspectj.bridge.AbortException"); + } + catch (Exception ex) { + assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex,(ex instanceof AbortException)); + } + } + + public void testWeavingURLClassLoader () { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS)); + URL[] classURLs = new URL[] { aspects, classes, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveAdvice () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR + File.pathSeparator + ASPECTJRT); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveAdviceWithVerbose () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR + File.pathSeparator + ASPECTJRT); + setSystemProperty(WeavingAdaptor.WEAVING_ADAPTOR_VERBOSE,"true"); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveAdviceWithWeaveInfo () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR + File.pathSeparator + ASPECTJRT); + setSystemProperty(WeavingAdaptor.SHOW_WEAVE_INFO_PROPERTY,"true"); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveDeclareWarningAdvice () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,DW_ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,DW_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] {} ); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeaveDeclareErrorAdvice () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,DE_ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,DE_ADVICE_ASPECTS + File.pathSeparator + CLASSES_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] {} ); + fail("Expecting org.aspectj.bridge.AbortException"); + } + catch (Exception ex) { + assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex,(ex instanceof AbortException)); + } + } + + public void testWeaveAroundClosure () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,AROUNDCLOSURE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,AROUNDCLOSURE_ASPECTS + File.pathSeparator + CLASSES_JAR + File.pathSeparator + ASPECTJRT); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAroundClosure" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeavingITD () { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(new File(ITD_ASPECTS)); + URL[] classURLs = new URL[] { aspects, classes, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWInterfaceITD", "LTWFieldITD", "LTWMethodITD" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeavingPer () { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(new File(PER_ASPECTS)); + URL[] classURLs = new URL[] { aspects, classes, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWPerthis" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testWeavingAspects () { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects1 = FileUtil.getFileURL(new File(ADVICE_ASPECTS)); + URL aspects2 = FileUtil.getFileURL(new File(AROUNDCLOSURE_ASPECTS)); + URL aspects3 = FileUtil.getFileURL(new File(ITD_ASPECTS)); + URL aspects4 = FileUtil.getFileURL(new File(PER_ASPECTS)); + URL[] classURLs = new URL[] { aspects1, aspects2, aspects3, aspects4, classes, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects1, aspects2, aspects3, aspects4 }; + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect", "LTWAroundClosure", "LTWPerthis", "LTWInterfaceITD", "LTWFieldITD", "LTWMethodITD", "LTWPerthis"}); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testJunkJar () { + File junkJar = new File(JUNK_JAR); + assertFalse(junkJar + " should not exist",junkJar.exists()); + + URL classes = FileUtil.getFileURL(junkJar); + URL[] classURLs = new URL[] { classes }; + URL[] aspectURLs = new URL[] { }; + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + try { + loader.loadClass("LTWHelloWorld"); + fail("Expecting java.lang.ClassNotFoundException"); + } + catch (Exception ex) { + assertTrue("Expecting java.lang.ClassNotFoundException caught " + ex,(ex instanceof ClassNotFoundException)); + } + } + + public void testJunkAspectJar () { + File junkJar = new File(JUNK_JAR); + assertFalse(junkJar + " should not exist",junkJar.exists()); + + URL aspects = FileUtil.getFileURL(junkJar); + URL[] classURLs = new URL[] { aspects }; + URL[] aspectURLs = new URL[] { aspects }; + + try { + new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + fail("Expecting org.aspectj.bridge.AbortException"); + } + catch (Exception ex) { + assertTrue("Expecting org.aspectj.bridge.AbortException caught " + ex,(ex instanceof org.aspectj.bridge.AbortException)); + } + } + + public void testAddURL () { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS)); + URL[] classURLs = new URL[] { aspects, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + + WeavingURLClassLoader loader = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + loader.addURL(classes); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testParentChild() { + URL classes = FileUtil.getFileURL(new File(CLASSES_JAR)); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(new File(ADVICE_ASPECTS)); + + URL[] classURLs = new URL[] { aspects, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + WeavingURLClassLoader parent = new WeavingURLClassLoader(classURLs,aspectURLs,getClass().getClassLoader()); + + classURLs = new URL[] { classes }; + aspectURLs = new URL[] { }; + WeavingURLClassLoader child = new WeavingURLClassLoader(classURLs,aspectURLs,parent); + + try { + Class clazz = child.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + /* + * Aspects on ASPECTPATH but missing from CLASSPATH + */ + public void testIncompletePath () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,ADVICE_ASPECTS); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,CLASSES_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("LTWHelloWorld"); + invokeMain(clazz,new String[] { "LTWAspect" }); + fail("Expecting java.lang.NoClassDefFoundError"); + } + catch (Exception ex) { + } + } + + /* + * Ensure package object is correct + */ + public void testPackage () { + setSystemProperty(WeavingURLClassLoader.WEAVING_ASPECT_PATH,""); + setSystemProperty(WeavingURLClassLoader.WEAVING_CLASS_PATH,CLASSES_JAR); + WeavingURLClassLoader loader = new WeavingURLClassLoader(getClass().getClassLoader()); + + try { + Class clazz = loader.loadClass("ltw.LTWPackageTest"); + invokeMain(clazz,new String[] { }); + Package pakkage = clazz.getPackage(); + assertTrue("Expected 'ltw' got " + pakkage,(pakkage != null)); + } + catch (Exception ex) { + fail(ex.toString()); + } + } + + public void testZipAspects() { + try { + doTestZipAspects(TEST_BASE + "/aspect.zip"); + } catch (Error ex) { + failWithException(ex); + } catch (Exception ex) { + failWithException(ex); + } + } + + public void testJarAspects() { + try { + doTestZipAspects(TEST_BASE + "/aspect.jar"); + } catch (Error ex) { + failWithException(ex); + } catch (Exception ex) { + failWithException(ex); + } + } + + /** PR#106736 */ + public void testClassAspects() { + try { + doTestZipAspects(TEST_BASE + "/classes"); + } catch (Error ex) { + failWithException(ex); + } catch (Exception ex) { + failWithException(ex); + } + } + + public void testZipJarAspectsTest() { + try { + doTestZipAspectsTest(); + // bug: doTestZipAspects("") attempts to load packag.Aspect? + fail("expected error to be thrown"); + } catch (InvocationTargetException ex) { + // expecting error + assertTrue(ex.getTargetException() instanceof Error); + } catch (RuntimeException ex) { + // expecting error + String message = ex.getMessage(); + // expecting error - seems to be wrapped wrong + if (-1 == message.indexOf("around advice")) { + failWithException(ex); + } + } catch (Error ex) { + failWithException(ex); + } catch (Exception ex) { + failWithException(ex); + } + } + + private void doTestZipAspects(String aspectLib) throws Exception { + File classZip = new File(TEST_BASE + "/main.zip"); + File zipLib = new File(aspectLib); + URL classes = FileUtil.getFileURL(classZip); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL aspects = FileUtil.getFileURL(zipLib); + URL[] classURLs = new URL[] { aspects, classes, aspectjrt }; + URL[] aspectURLs = new URL[] { aspects }; + ClassLoader parent = getClass().getClassLoader(); + WeavingURLClassLoader loader + = new WeavingURLClassLoader(classURLs, aspectURLs, parent); + Class clazz = loader.loadClass("packag.Main"); + invokeMain(clazz,new String[] { }); + // throws Error unless advice applies + } + + private void doTestZipAspectsTest() throws Exception { + URL classes = FileUtil.getFileURL(new File(TEST_BASE + "/main.zip")); + URL aspectjrt = FileUtil.getFileURL(new File(ASPECTJRT)); + URL[] classURLs = new URL[] { classes, aspectjrt }; + ClassLoader parent = getClass().getClassLoader(); + WeavingURLClassLoader loader + = new WeavingURLClassLoader(classURLs, new URL[] { }, parent); + Class clazz = loader.loadClass("packag.Main"); + invokeMain(clazz,new String[] { }); + // throws Error because advice does not apply + } + + private void failWithException(Throwable t) { + throw new TestError(t.getMessage(), t); + } + public static void invokeMain (Class clazz, String[] args) + { + Class[] paramTypes = new Class[1]; + paramTypes[0] = args.getClass(); + + try { + Method method = clazz.getDeclaredMethod("main",paramTypes); + Object[] params = new Object[1]; + params[0] = args; + method.invoke(null,params); + } + catch (InvocationTargetException ex) { + throw new RuntimeException(ex.getTargetException().toString()); + } + catch (Exception ex) { + throw new RuntimeException(ex.toString()); + } + } + + private void setSystemProperty (String key, String value) { + Properties systemProperties = System.getProperties(); + copyProperty(key,systemProperties,savedProperties); + systemProperties.setProperty(key,value); + } + + private static void copyProperty (String key, Properties from, Properties to) { + String value = from.getProperty(key,NULL); + to.setProperty(key,value); + } + + protected void setUp() throws Exception { + super.setUp(); + savedProperties = new Properties(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + + /* Restore system properties */ + Properties systemProperties = System.getProperties(); + for (Enumeration enu = savedProperties.keys(); enu.hasMoreElements(); ) { + String key = (String)enu.nextElement(); + String value = savedProperties.getProperty(key); + if (value == NULL) systemProperties.remove(key); + else systemProperties.setProperty(key,value); + } + } + +} |