From 6b31b32ae338cdecea6e20aa87fe05ca0cc2fb57 Mon Sep 17 00:00:00 2001 From: mwebster Date: Wed, 4 Oct 2006 13:35:09 +0000 Subject: [PATCH] Bug 132080 "LTW concrete-aspect definitions not exposed to weaver" --- .../loadtime/ClassLoaderWeavingAdaptor.java | 41 ++++++++-- .../loadtime/ConcreteAspectCodeGen.java | 4 + tests/bugs153/pr132080/AbstractSuperAspect.aj | 20 +++++ .../pr132080/AbstractSuperAspectWithAround.aj | 9 +++ .../AbstractSuperAspectWithInterface.aj | 13 ++++ .../bugs153/pr132080/ConcreteAspectWithITD.aj | 4 + tests/bugs153/pr132080/HelloWorld.java | 11 +++ tests/bugs153/pr132080/TestAdvice.aj | 5 ++ tests/bugs153/pr132080/TestAroundClosure.aj | 7 ++ tests/bugs153/pr132080/TestITD.aj | 8 ++ tests/bugs153/pr132080/TestInterface.java | 3 + tests/bugs153/pr132080/aop-advice.xml | 11 +++ tests/bugs153/pr132080/aop-aroundclosure.xml | 11 +++ tests/bugs153/pr132080/aop-itd.xml | 14 ++++ tests/bugs153/pr149096/aop-pr149096.xml | 2 +- .../systemtest/ajc153/Ajc153Tests.java | 16 ++++ .../org/aspectj/systemtest/ajc153/ajc153.xml | 75 +++++++++++++++++++ .../aspectj/weaver/tools/WeavingAdaptor.java | 4 + 18 files changed, 251 insertions(+), 7 deletions(-) create mode 100644 tests/bugs153/pr132080/AbstractSuperAspect.aj create mode 100644 tests/bugs153/pr132080/AbstractSuperAspectWithAround.aj create mode 100644 tests/bugs153/pr132080/AbstractSuperAspectWithInterface.aj create mode 100644 tests/bugs153/pr132080/ConcreteAspectWithITD.aj create mode 100644 tests/bugs153/pr132080/HelloWorld.java create mode 100644 tests/bugs153/pr132080/TestAdvice.aj create mode 100644 tests/bugs153/pr132080/TestAroundClosure.aj create mode 100644 tests/bugs153/pr132080/TestITD.aj create mode 100644 tests/bugs153/pr132080/TestInterface.java create mode 100644 tests/bugs153/pr132080/aop-advice.xml create mode 100644 tests/bugs153/pr132080/aop-aroundclosure.xml create mode 100644 tests/bugs153/pr132080/aop-itd.xml diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java b/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java index e9d46182f..6d814ef95 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java @@ -40,6 +40,8 @@ import org.aspectj.weaver.UnresolvedType; import org.aspectj.weaver.World; import org.aspectj.weaver.Lint.Kind; import org.aspectj.weaver.bcel.BcelWeaver; +import org.aspectj.weaver.bcel.BcelWorld; +import org.aspectj.weaver.bcel.Utility; import org.aspectj.weaver.loadtime.definition.Definition; import org.aspectj.weaver.loadtime.definition.DocumentParser; import org.aspectj.weaver.ltw.LTWWorld; @@ -73,6 +75,8 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { private StringBuffer namespace; private IWeavingContext weavingContext; + private List concreteAspects = new ArrayList(); + private static Trace trace = TraceFactory.getTraceFactory().getTrace(ClassLoaderWeavingAdaptor.class); public ClassLoaderWeavingAdaptor() { @@ -156,6 +160,8 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { // after adding aspects weaver.prepareForWeave(); + boolean success = weaveAndDefineConceteAspects(); + if (!success) disable(); } else { bcelWorld = null; @@ -410,11 +416,12 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { success = false; break; } - this.generatedClassHandler.acceptClass( - concreteAspect.name, - gen.getBytes() - ); - /*ResolvedType aspect = */weaver.addLibraryAspect(concreteAspect.name); + + ((BcelWorld)weaver.getWorld()).addSourceObjectType(Utility.makeJavaClass(concreteAspect.name, gen.getBytes())); + + concreteAspects.add(gen); + + weaver.addLibraryAspect(concreteAspect.name); //generate key for SC if(namespace==null){ @@ -425,7 +432,6 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { } } } -// System.out.println("ClassLoaderWeavingAdaptor.registerAspects() classloader=" + weavingContext.getClassLoaderName() + ", namespace=" + namespace); /* We couldn't register one or more aspects so disable the adaptor */ if (!success) { @@ -442,6 +448,29 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor { if (trace.isTraceEnabled()) trace.exit("registerAspects",isEnabled()); } + private boolean weaveAndDefineConceteAspects () { + if (trace.isTraceEnabled()) trace.enter("weaveAndDefineConceteAspects",this,concreteAspects); + boolean success = true; + + for (Iterator iterator = concreteAspects.iterator(); iterator.hasNext();) { + ConcreteAspectCodeGen gen = (ConcreteAspectCodeGen)iterator.next(); + String name = gen.getClassName(); + byte[] bytes = gen.getBytes(); + + try { + byte[] newBytes = weaveClass(name, bytes); + this.generatedClassHandler.acceptClass(name,newBytes); + } + catch (IOException ex) { + trace.error("weaveAndDefineConceteAspects",ex); + error("exception weaving aspect '" + name + "'",ex); + } + } + + if (trace.isTraceEnabled()) trace.exit("weaveAndDefineConceteAspects",success); + return success; + } + /** * Register the include / exclude filters * We duplicate simple patterns in startWith filters that will allow faster matching without ResolvedType diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java index c3e9614b3..2b3a36381 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java @@ -265,6 +265,10 @@ public class ConcreteAspectCodeGen { return false; } + public String getClassName () { + return m_concreteAspect.name; + } + /** * Build the bytecode for the concrete aspect * diff --git a/tests/bugs153/pr132080/AbstractSuperAspect.aj b/tests/bugs153/pr132080/AbstractSuperAspect.aj new file mode 100644 index 000000000..9692579b9 --- /dev/null +++ b/tests/bugs153/pr132080/AbstractSuperAspect.aj @@ -0,0 +1,20 @@ +/******************************************************************************* + * 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 abstract aspect AbstractSuperAspect { + + protected abstract pointcut scope (); + + before () : execution(public static void main(String[])) && scope() { + System.out.println("? " + thisJoinPoint.getSignature()); + } +} diff --git a/tests/bugs153/pr132080/AbstractSuperAspectWithAround.aj b/tests/bugs153/pr132080/AbstractSuperAspectWithAround.aj new file mode 100644 index 000000000..15226f227 --- /dev/null +++ b/tests/bugs153/pr132080/AbstractSuperAspectWithAround.aj @@ -0,0 +1,9 @@ +public abstract aspect AbstractSuperAspectWithAround { + + protected abstract pointcut scope (); + + void around () : execution(public static void main(String[])) && scope() { + System.out.println("? " + thisJoinPoint.getSignature()); + proceed(); + } +} diff --git a/tests/bugs153/pr132080/AbstractSuperAspectWithInterface.aj b/tests/bugs153/pr132080/AbstractSuperAspectWithInterface.aj new file mode 100644 index 000000000..8182dfdf6 --- /dev/null +++ b/tests/bugs153/pr132080/AbstractSuperAspectWithInterface.aj @@ -0,0 +1,13 @@ +public abstract aspect AbstractSuperAspectWithInterface /*implements TestInterface*/ { + + protected abstract pointcut scope (); + + before () : execution(public static void main(String[])) && scope() { + System.out.println("? " + thisJoinPoint.getSignature()); + } + + protected AbstractSuperAspectWithInterface () { + TestInterface test = (TestInterface)this; + test.interfaceMethod(); + } +} diff --git a/tests/bugs153/pr132080/ConcreteAspectWithITD.aj b/tests/bugs153/pr132080/ConcreteAspectWithITD.aj new file mode 100644 index 000000000..94b82f34c --- /dev/null +++ b/tests/bugs153/pr132080/ConcreteAspectWithITD.aj @@ -0,0 +1,4 @@ +public aspect ConcreteAspectWithITD extends AbstractSuperAspectWithInterface { + protected pointcut scope () : + !within(AbstractSuperAspectWithInterface+); +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/HelloWorld.java b/tests/bugs153/pr132080/HelloWorld.java new file mode 100644 index 000000000..8f62298fa --- /dev/null +++ b/tests/bugs153/pr132080/HelloWorld.java @@ -0,0 +1,11 @@ +public class HelloWorld { + + public void println () { + System.out.println("Hello World!"); + } + + public static void main (String[] args) throws Exception { + new HelloWorld().println(); + } + +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/TestAdvice.aj b/tests/bugs153/pr132080/TestAdvice.aj new file mode 100644 index 000000000..f9f6453e4 --- /dev/null +++ b/tests/bugs153/pr132080/TestAdvice.aj @@ -0,0 +1,5 @@ +public aspect TestAdvice { + before () : execution(public new()) && within(!TestAdvice) { + System.out.println("? " + thisJoinPoint.getSignature()); + } +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/TestAroundClosure.aj b/tests/bugs153/pr132080/TestAroundClosure.aj new file mode 100644 index 000000000..b23254576 --- /dev/null +++ b/tests/bugs153/pr132080/TestAroundClosure.aj @@ -0,0 +1,7 @@ +public aspect TestAroundClosure { + void around () : execution(public new()) && within(!TestAroundClosure) { + System.out.println("> " + thisJoinPoint.getSignature()); + proceed(); + System.out.println("< " + thisJoinPoint.getSignature()); + } +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/TestITD.aj b/tests/bugs153/pr132080/TestITD.aj new file mode 100644 index 000000000..3203b82cf --- /dev/null +++ b/tests/bugs153/pr132080/TestITD.aj @@ -0,0 +1,8 @@ +public aspect TestITD { + + declare parents : AbstractSuperAspectWithInterface+ implements TestInterface; + + public void TestInterface.interfaceMethod () { + System.out.println("? void TestITD.interfaceMethod()"); + } +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/TestInterface.java b/tests/bugs153/pr132080/TestInterface.java new file mode 100644 index 000000000..1c831d346 --- /dev/null +++ b/tests/bugs153/pr132080/TestInterface.java @@ -0,0 +1,3 @@ +public interface TestInterface { + public void interfaceMethod (); +} \ No newline at end of file diff --git a/tests/bugs153/pr132080/aop-advice.xml b/tests/bugs153/pr132080/aop-advice.xml new file mode 100644 index 000000000..64b554864 --- /dev/null +++ b/tests/bugs153/pr132080/aop-advice.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/bugs153/pr132080/aop-aroundclosure.xml b/tests/bugs153/pr132080/aop-aroundclosure.xml new file mode 100644 index 000000000..1a2113cd9 --- /dev/null +++ b/tests/bugs153/pr132080/aop-aroundclosure.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/bugs153/pr132080/aop-itd.xml b/tests/bugs153/pr132080/aop-itd.xml new file mode 100644 index 000000000..9f5c0b408 --- /dev/null +++ b/tests/bugs153/pr132080/aop-itd.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/bugs153/pr149096/aop-pr149096.xml b/tests/bugs153/pr149096/aop-pr149096.xml index ba987f808..8b1584699 100644 --- a/tests/bugs153/pr149096/aop-pr149096.xml +++ b/tests/bugs153/pr149096/aop-pr149096.xml @@ -1,6 +1,6 @@ - + diff --git a/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java b/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java index bef05f716..caef4be71 100644 --- a/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java @@ -134,6 +134,22 @@ public class Ajc153Tests extends org.aspectj.testing.XMLBasedAjcTestCase { public void testNPEWithCustomAgent_pr158005() { runTest("NPE with custom agent"); } + + public void testWeaveConcreteSubaspectWithAdvice_pr132080() { + runTest("Weave concrete sub-aspect with advice"); + } + + public void testWeaveConcreteSubaspectWithITD_pr132080() { + runTest("Weave concrete sub-aspect with ITD"); + } + + public void testWeaveConcreteSubaspectWithAroundClosure_pr132080() { + runTest("Weave concrete sub-aspect with around closure"); + } + + public void testWeaveConcreteSubaspectWithCflow_pr132080() { + runTest("Weave concrete sub-aspect with cflow"); + } public void testNoInvalidAbsoluteTypeNameWarning_pr156904_1() {runTest("ensure no invalidAbsoluteTypeName when do match - 1");} public void testNoInvalidAbsoluteTypeNameWarning_pr156904_2() {runTest("ensure no invalidAbsoluteTypeName when do match - 2");} diff --git a/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml b/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml index 652472843..9b64b631f 100644 --- a/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml +++ b/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml @@ -544,4 +544,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java index 4e4213e19..7d52c3afa 100644 --- a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java +++ b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java @@ -418,6 +418,10 @@ public class WeavingAdaptor implements IMessageContext { return MessageUtil.error(messageHandler,message); } + protected boolean error (String message, Throwable th) { + return messageHandler.handleMessage(new Message(message, IMessage.ERROR, th, null)); + } + public String getContextId () { return "WeavingAdaptor"; } -- 2.39.5