From 8982544f13eb5cb082ca19db2bd2c5f77b1e5965 Mon Sep 17 00:00:00 2001 From: aclement Date: Fri, 14 Oct 2005 07:23:40 +0000 Subject: [PATCH] Code for enhancement 107741: Updated WeavingURLClassLoader (thanks to Matthew Webster for the patch) --- loadtime/.classpath | 56 +++------- .../loadtime}/WeavingURLClassLoader.java | 50 ++++++++- loadtime/testsrc/LoadtimeModuleTests.java | 4 +- .../loadtime}/WeavingURLClassLoaderTest.java | 3 +- org.aspectj.ajdt.core/.classpath | 1 + .../org/aspectj/tools/ajc/AjcTestCase.java | 21 +++- testing/.classpath | 101 ++++-------------- .../newsrc/org/aspectj/testing/RunSpec.java | 34 +++++- .../aspectj/testing/XMLBasedAjcTestCase.java | 1 + .../testing/harness/bridge/JavaRun.java | 2 +- tests/ltw/Aspect1.aj | 19 ++++ tests/ltw/Aspect2.aj | 19 ++++ tests/ltw/Main.java | 28 +++++ tests/ltw/aop-ltwreweavable.xml | 6 ++ .../systemtest/ajc150/AllTestsAspectJ150.java | 5 +- .../systemtest/ajc150/ltw/LTWTests.java | 35 ++++++ .../systemtest/ajc150/ltw/ltw-tests.xml | 33 ++++++ .../org/aspectj/systemtest/ajc150/ltw/ltw.xml | 11 ++ .../org/aspectj/weaver/BcweaverTests.java | 1 - 19 files changed, 293 insertions(+), 137 deletions(-) rename {weaver/src/org/aspectj/weaver => loadtime/src/org/aspectj/weaver/loadtime}/WeavingURLClassLoader.java (69%) rename {weaver/testsrc/org/aspectj/weaver => loadtime/testsrc/org/aspectj/weaver/loadtime}/WeavingURLClassLoaderTest.java (99%) create mode 100644 tests/ltw/Aspect1.aj create mode 100644 tests/ltw/Aspect2.aj create mode 100644 tests/ltw/Main.java create mode 100644 tests/ltw/aop-ltwreweavable.xml create mode 100644 tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java create mode 100644 tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml create mode 100644 tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml diff --git a/loadtime/.classpath b/loadtime/.classpath index 47982eb80..5a9f37bcd 100644 --- a/loadtime/.classpath +++ b/loadtime/.classpath @@ -1,48 +1,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/weaver/src/org/aspectj/weaver/WeavingURLClassLoader.java b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java similarity index 69% rename from weaver/src/org/aspectj/weaver/WeavingURLClassLoader.java rename to loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java index 347cb104c..a80a4a918 100644 --- a/weaver/src/org/aspectj/weaver/WeavingURLClassLoader.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java @@ -11,7 +11,7 @@ * Martin Lippert initial implementation * ******************************************************************/ -package org.aspectj.weaver; +package org.aspectj.weaver.loadtime; import java.io.File; import java.io.IOException; @@ -24,6 +24,7 @@ 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; @@ -44,11 +45,22 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W // System.err.println("? WeavingURLClassLoader.(" + 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.()"); +// System.err.println("? WeavingURLClassLoader.() classURLs=" + classURLs.length + ", aspectURLs=" + aspectURLs.length); this.aspectURLs = aspectURLs; - adaptor = new WeavingAdaptor(this); + + /* 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 () { @@ -87,6 +99,14 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W */ 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); } @@ -115,5 +135,29 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W 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/weaver/testsrc/org/aspectj/weaver/WeavingURLClassLoaderTest.java b/loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java similarity index 99% rename from weaver/testsrc/org/aspectj/weaver/WeavingURLClassLoaderTest.java rename to loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java index c21115619..fe3139314 100644 --- a/weaver/testsrc/org/aspectj/weaver/WeavingURLClassLoaderTest.java +++ b/loadtime/testsrc/org/aspectj/weaver/loadtime/WeavingURLClassLoaderTest.java @@ -10,7 +10,7 @@ * Matthew Webster initial implementation * ******************************************************************/ -package org.aspectj.weaver; +package org.aspectj.weaver.loadtime; import java.io.File; import java.lang.reflect.InvocationTargetException; @@ -24,6 +24,7 @@ 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; /** diff --git a/org.aspectj.ajdt.core/.classpath b/org.aspectj.ajdt.core/.classpath index f31838dd6..eeb6941b2 100644 --- a/org.aspectj.ajdt.core/.classpath +++ b/org.aspectj.ajdt.core/.classpath @@ -13,5 +13,6 @@ + diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java index 58ea8e063..14fad2ef5 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java @@ -28,6 +28,7 @@ import java.util.StringTokenizer; import org.aspectj.bridge.IMessage; import org.aspectj.bridge.ISourceLocation; import org.aspectj.testing.util.TestUtil; +import org.aspectj.weaver.loadtime.WeavingURLClassLoader; import junit.framework.TestCase; @@ -518,7 +519,7 @@ public class AjcTestCase extends TestCase { return lastRunResult; } public void testNothingForAntJUnit() {} - + /** * Run the given class (main method), and return the result in a RunResult. The program runs with * a classpath containing the sandbox directory, runtime, testing-client, bridge, and @@ -527,6 +528,11 @@ public class AjcTestCase extends TestCase { public RunResult run(String className){ return run(className,new String[0],null); } + + public RunResult run(String className, String[] args, String classpath) { + return run(className,args,null,false); + } + /** * Run the given class, and return the result in a RunResult. The program runs with @@ -537,7 +543,7 @@ public class AjcTestCase extends TestCase { * bridge, and util projects will all be appended to the classpath, as will any jars in * the sandbox. */ - public RunResult run(String className, String[] args, String classpath) { + public RunResult run(String className, String[] args, String classpath, boolean useLTW) { lastRunResult = null; StringBuffer cp = new StringBuffer(); if (classpath != null) { @@ -569,8 +575,15 @@ public class AjcTestCase extends TestCase { } catch (Exception malEx) { fail("Bad classpath specification: " + classpath); } - URLClassLoader cLoader = new URLClassLoader(urls,null); - //System.out.println(cLoader.getParent()); + + URLClassLoader cLoader; + if (useLTW) { + cLoader = new WeavingURLClassLoader(urls,null); + } + else { + cLoader = new URLClassLoader(urls,null); + } + try { try { Class testerClass = cLoader.loadClass("org.aspectj.testing.Tester"); diff --git a/testing/.classpath b/testing/.classpath index be4d3e954..223b01f9b 100644 --- a/testing/.classpath +++ b/testing/.classpath @@ -1,84 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/testing/newsrc/org/aspectj/testing/RunSpec.java b/testing/newsrc/org/aspectj/testing/RunSpec.java index cb0d497a8..0716b8362 100644 --- a/testing/newsrc/org/aspectj/testing/RunSpec.java +++ b/testing/newsrc/org/aspectj/testing/RunSpec.java @@ -12,11 +12,13 @@ package org.aspectj.testing; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.aspectj.tools.ajc.AjcTestCase; +import org.aspectj.util.FileUtil; /** * @author colyer @@ -34,6 +36,7 @@ public class RunSpec implements ITestStep { private AjcTest myTest; private OutputSpec stdErrSpec; private OutputSpec stdOutSpec; + private String ltwFile; public RunSpec() { } @@ -46,7 +49,9 @@ public class RunSpec implements ITestStep { System.err.println("Warning, message spec for run command is currently ignored (org.aspectj.testing.RunSpec)"); } String[] args = buildArgs(); - AjcTestCase.RunResult rr = inTestCase.run(getClassToRun(),args,getClasspath()); +// System.err.println("? execute() inTestCase='" + inTestCase + "', ltwFile=" + ltwFile); + boolean useLtw = copyLtwFile(inTestCase.getSandboxDirectory()); + AjcTestCase.RunResult rr = inTestCase.run(getClassToRun(),args,getClasspath(),useLtw); if (stdErrSpec != null) { stdErrSpec.matchAgainst(rr.getStdErr()); } @@ -102,6 +107,14 @@ public class RunSpec implements ITestStep { public void setClassToRun(String classToRun) { this.classToRun = classToRun; } + + public String getLtwFile() { + return ltwFile; + } + + public void setLtwFile(String ltwFile) { + this.ltwFile = ltwFile; + } private String[] buildArgs() { if (options == null) return new String[0]; @@ -112,4 +125,23 @@ public class RunSpec implements ITestStep { } return ret; } + + private boolean copyLtwFile (File sandboxDirectory) { + boolean useLtw = false; + + if (ltwFile != null) { + File from = new File(baseDir,ltwFile); + File to = new File(sandboxDirectory,"META-INF" + File.separator + "aop.xml"); +// System.out.println("RunSpec.copyLtwFile() from=" + from.getAbsolutePath() + " to=" + to.getAbsolutePath()); + try { + FileUtil.copyFile(from,to); + useLtw = true; + } + catch (IOException ex) { + ex.printStackTrace(); + } + } + + return useLtw; + } } diff --git a/testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java b/testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java index 22cb30338..58a5f0d33 100644 --- a/testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java +++ b/testing/newsrc/org/aspectj/testing/XMLBasedAjcTestCase.java @@ -166,6 +166,7 @@ public abstract class XMLBasedAjcTestCase extends AjcTestCase { digester.addSetNext("suite/ajc-test/compile","addTestStep","org.aspectj.testing.ITestStep"); digester.addObjectCreate("suite/ajc-test/run",RunSpec.class); digester.addSetProperties("suite/ajc-test/run","class","classToRun"); + digester.addSetProperties("suite/ajc-test/run","ltw","ltwFile"); digester.addSetNext("suite/ajc-test/run","addTestStep","org.aspectj.testing.ITestStep"); digester.addObjectCreate("*/message",ExpectedMessageSpec.class); digester.addSetProperties("*/message"); diff --git a/testing/src/org/aspectj/testing/harness/bridge/JavaRun.java b/testing/src/org/aspectj/testing/harness/bridge/JavaRun.java index 223a0c8a6..cbf353fac 100644 --- a/testing/src/org/aspectj/testing/harness/bridge/JavaRun.java +++ b/testing/src/org/aspectj/testing/harness/bridge/JavaRun.java @@ -25,7 +25,7 @@ import org.aspectj.testing.xml.SoftMessage; import org.aspectj.testing.xml.XMLWriter; import org.aspectj.util.FileUtil; import org.aspectj.util.LangUtil; -import org.aspectj.weaver.WeavingURLClassLoader; +import org.aspectj.weaver.loadtime.WeavingURLClassLoader; import java.io.*; import java.lang.reflect.*; diff --git a/tests/ltw/Aspect1.aj b/tests/ltw/Aspect1.aj new file mode 100644 index 000000000..173cb8603 --- /dev/null +++ b/tests/ltw/Aspect1.aj @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster initial implementation + *******************************************************************************/ +import org.aspectj.lang.JoinPoint; + +public aspect Aspect1 { + + before () : execution(void Main.test1()) { + System.err.println("Aspect1.before_" + thisJoinPoint.getSignature().getName()); + } +} diff --git a/tests/ltw/Aspect2.aj b/tests/ltw/Aspect2.aj new file mode 100644 index 000000000..519a47eeb --- /dev/null +++ b/tests/ltw/Aspect2.aj @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster initial implementation + *******************************************************************************/ +import org.aspectj.lang.JoinPoint; + +public aspect Aspect2 { + + before () : execution(void Main.test2()){ + System.err.println("Aspect2.before_" + thisJoinPoint.getSignature().getName()); + } +} diff --git a/tests/ltw/Main.java b/tests/ltw/Main.java new file mode 100644 index 000000000..fca018ac9 --- /dev/null +++ b/tests/ltw/Main.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster initial implementation + *******************************************************************************/ + +public class Main { + + public void test1 () { + System.out.println("Main.test1"); + } + + public void test2 () { + System.out.println("Main.test2"); + } + + public static void main (String[] args) { + System.out.println("Main.main"); + new Main().test1(); + new Main().test2(); + } +} diff --git a/tests/ltw/aop-ltwreweavable.xml b/tests/ltw/aop-ltwreweavable.xml new file mode 100644 index 000000000..9afd80e02 --- /dev/null +++ b/tests/ltw/aop-ltwreweavable.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java b/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java index 0f457c739..32748c455 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java +++ b/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java @@ -13,6 +13,7 @@ package org.aspectj.systemtest.ajc150; import org.aspectj.systemtest.ajc150.ataspectj.AtAjSyntaxTests; import org.aspectj.systemtest.ajc150.ataspectj.AtAjMisuseTests; import org.aspectj.systemtest.ajc150.ataspectj.AtAjLTWTests; +import org.aspectj.systemtest.ajc150.ltw.LTWTests; import junit.framework.Test; import junit.framework.TestSuite; @@ -52,7 +53,9 @@ public class AllTestsAspectJ150 { suite.addTest(AtAjMisuseTests.suite()); suite.addTest(AtAjLTWTests.suite()); suite.addTest(HasMember.suite()); - //$JUnit-END$ + + suite.addTestSuite(LTWTests.class); + //$JUnit-END$ return suite; } } diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java new file mode 100644 index 000000000..543d586e8 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/LTWTests.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Matthew Webster initial implementation + *******************************************************************************/ +package org.aspectj.systemtest.ajc150.ltw; + +import java.io.File; + +import junit.framework.Test; + +import org.aspectj.testing.XMLBasedAjcTestCase; + +public class LTWTests extends org.aspectj.testing.XMLBasedAjcTestCase { + + public static Test suite() { + return XMLBasedAjcTestCase.loadSuite(LTWTests.class); + } + + protected File getSpecFile() { + return new File("../tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml"); + } + + + public void test001(){ + runTest("Ensure 1st aspect is rewoven when weaving 2nd aspect"); + } +} + diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml new file mode 100644 index 000000000..0e818afbf --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml new file mode 100644 index 000000000..311872c09 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml @@ -0,0 +1,11 @@ + +]> + + + + + +&tests; + + diff --git a/weaver/testsrc/org/aspectj/weaver/BcweaverTests.java b/weaver/testsrc/org/aspectj/weaver/BcweaverTests.java index 94cb7ddac..1c59bd841 100644 --- a/weaver/testsrc/org/aspectj/weaver/BcweaverTests.java +++ b/weaver/testsrc/org/aspectj/weaver/BcweaverTests.java @@ -52,7 +52,6 @@ public class BcweaverTests extends TestCase { //$JUnit-BEGIN$ suite.addTestSuite(MemberTestCase.class); suite.addTestSuite(TypeXTestCase.class); - suite.addTestSuite(WeavingURLClassLoaderTest.class); suite.addTestSuite(WeaverMessagesTestCase.class); suite.addTestSuite(DumpTestCase.class); //$JUnit-END$ -- 2.39.5