Browse Source

Bug 129525 "Don't Dump Bytecodes to Syserr in LTW" (don't throw AbortException in LTW message handler)

tags/BEFORE_133532
mwebster 18 years ago
parent
commit
04fa1dcce1

+ 10
- 1
loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java View File

@@ -355,6 +355,8 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
*/
private void registerAspects(final BcelWeaver weaver, final ClassLoader loader, final List definitions) {
if (trace.isTraceEnabled()) trace.enter("registerAspects",this, new Object[] { weaver, loader, definitions} );
boolean success = true;
//TODO: the exclude aspect allow to exclude aspect defined upper in the CL hierarchy - is it what we want ??
// if not, review the getResource so that we track which resource is defined by which CL

@@ -393,6 +395,7 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
ConcreteAspectCodeGen gen = new ConcreteAspectCodeGen(concreteAspect, weaver.getWorld());
if (!gen.validate()) {
error("Concrete-aspect '"+concreteAspect.name+"' could not be registered");
success = false;
break;
}
this.generatedClassHandler.acceptClass(
@@ -412,8 +415,14 @@ 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) {
disable();
warn("failure(s) registering aspects. Disabling weaver for class loader " + getClassLoaderName(loader));
}
/* We didn't register any aspects so disable the adaptor */
if (namespace == null) {
else if (namespace == null) {
disable();
info("no aspects registered. Disabling weaver for class loader " + getClassLoaderName(loader));
}

+ 21
- 2
loadtime/src/org/aspectj/weaver/loadtime/WeavingURLClassLoader.java View File

@@ -24,7 +24,10 @@ import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.aspectj.bridge.AbortException;
import org.aspectj.weaver.ExtensibleURLClassLoader;
import org.aspectj.weaver.tools.Trace;
import org.aspectj.weaver.tools.TraceFactory;
import org.aspectj.weaver.tools.WeavingAdaptor;
import org.aspectj.weaver.tools.WeavingClassLoader;

@@ -37,6 +40,8 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W
private WeavingAdaptor adaptor;
private boolean initializingAdaptor;
private Map generatedClasses = new HashMap(); /* String -> byte[] */
private static Trace trace = TraceFactory.getTraceFactory().getTrace(WeavingURLClassLoader.class);

/*
* This constructor is needed when using "-Djava.system.class.loader".
@@ -48,7 +53,9 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W
public WeavingURLClassLoader (URL[] urls, ClassLoader parent) {
super(urls,parent);
if (trace.isTraceEnabled()) trace.enter("<init>",this,new Object[] { urls, parent });
// System.out.println("WeavingURLClassLoader.WeavingURLClassLoader()");
if (trace.isTraceEnabled()) trace.exit("<init>");
}
public WeavingURLClassLoader (URL[] classURLs, URL[] aspectURLs, ClassLoader parent) {
@@ -106,6 +113,7 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W
* Override to weave class using WeavingAdaptor
*/
protected Class defineClass(String name, byte[] b, CodeSource cs) throws IOException {
if (trace.isTraceEnabled()) trace.enter("defineClass",this,new Object[] { name, b, cs });
// System.err.println("? WeavingURLClassLoader.defineClass(" + name + ", [" + b.length + "])");

/* Avoid recursion during adaptor initialization */
@@ -116,9 +124,20 @@ public class WeavingURLClassLoader extends ExtensibleURLClassLoader implements W
createAdaptor();
}
b = adaptor.weaveClass(name,b);
try {
b = adaptor.weaveClass(name,b);
}
catch (AbortException ex) {
trace.error("defineClass",ex);
throw ex;
}
catch (Throwable th) {
trace.error("defineClass",th);
}
}
return super.defineClass(name, b, cs);
Class clazz = super.defineClass(name, b, cs);
if (trace.isTraceEnabled()) trace.exit("defineClass",clazz);
return clazz;
}
private void createAdaptor () {

+ 5
- 0
tests/ltw/aop-missingaspect.xml View File

@@ -0,0 +1,5 @@
<aspectj>
<aspects>
<aspect name="EmptyAspect"/>
</aspects>
</aspectj>

+ 3
- 0
tests/ltw/pakkage/EmptyAspect.aj View File

@@ -0,0 +1,3 @@
public aspect EmptyAspect {
}

+ 4
- 2
tests/src/org/aspectj/systemtest/ajc152/ajc152.xml View File

@@ -483,7 +483,8 @@
<run class="HelloWorld" ltw="aop-tracing.xml">
<stderr>
<line text="error Abstract method 'void ConcreteMethods.foo(int)' cannot be concretized in XML:"/>
<line text="warning register definition failed"/>
<line text="error Concrete-aspect 'TraceHelloWorld' could not be registered"/>
<line text="warning failure(s) registering aspects. Disabling weaver for class loader"/>
</stderr>
<stdout>
<line text="Hello World!"/>
@@ -497,7 +498,8 @@
<run class="HelloWorld" ltw="aop-tracing.xml">
<stderr>
<line text="error Abstract method 'void AbstractMethods.test()' cannot be concretized in XML"/>
<line text="warning register definition failed"/>
<line text="error Concrete-aspect 'TraceHelloWorld' could not be registered"/>
<line text="warning failure(s) registering aspects. Disabling weaver for class loader"/>
</stderr>
<stdout>
<line text="Hello World!"/>

+ 4
- 0
tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java View File

@@ -66,6 +66,10 @@ public class Ajc153Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
public void testDuplicateJVMTIAgents_pr151938() {runTest("Duplicate JVMTI agents");};
public void testLTWWorldWithAnnotationMatching_pr153572() { runTest("LTWWorld with annotation matching");}
public void testReweavableAspectNotRegistered_pr129525 () {
runTest("reweavableAspectNotRegistered error");
}
/////////////////////////////////////////
public static Test suite() {
return XMLBasedAjcTestCase.loadSuite(Ajc153Tests.class);

+ 16
- 0
tests/src/org/aspectj/systemtest/ajc153/ajc153.xml View File

@@ -333,4 +333,20 @@
</run>
</ajc-test>
<ajc-test dir="ltw" title="reweavableAspectNotRegistered error">
<compile files="HelloWorld.java, ExceptionHandler.aj" options="-showWeaveInfo">
<message kind="weave" text="Join point 'method-execution(void HelloWorld.main(java.lang.String[]))' in Type 'HelloWorld' (HelloWorld.java:3) advised by around advice from 'ExceptionHandler' (ExceptionHandler.aj:2)"/>
</compile>
<compile files="EmptyAspect.aj">
</compile>
<run class="HelloWorld" ltw="aop-missingaspect.xml">
<stdout>
<line text="Hello World!"/>
</stdout>
<stderr>
<line text="error aspect 'ExceptionHandler' woven into 'HelloWorld' must be defined to the weaver (placed on the aspectpath, or defined in an aop.xml file if using LTW)."/>
</stderr>
</run>
</ajc-test>
</suite>

+ 4
- 2
tests/src/org/aspectj/systemtest/tracing/tracing.xml View File

@@ -52,8 +52,10 @@
<line text="warning aspect ExcludedAspect exluded"/>
<line text="error Cannot find m_parent aspect"/>
<line text="error Cannot find m_parent aspect"/>
<line text="warning register definition failed"/>
<line text="warning register definition failed"/>
<line text="error Concrete-aspect 'IncludedMissingAspect' could not be registered"/>
<line text="error Concrete-aspect 'IncludedMissingAspect' could not be registered"/>
<line text="warning failure(s) registering aspects. Disabling weaver for class loader"/>
<line text="warning failure(s) registering aspects. Disabling weaver for class loader"/>
</stderr>
</ant>
</ajc-test>

+ 8
- 2
weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java View File

@@ -80,6 +80,7 @@ public class WeavingAdaptor implements IMessageContext {
protected BcelWeaver weaver;
private IMessageHandler messageHandler;
private WeavingAdaptorMessageHandler messageHolder;
private boolean abortOnError = false;
protected GeneratedClassHandler generatedClassHandler;
protected Map generatedClasses = new HashMap(); /* String -> UnwovenClassFile */
protected BcelObjectType delegateForCurrentClass; // lazily initialized, should be used to prevent parsing bytecode multiple times
@@ -153,6 +154,7 @@ public class WeavingAdaptor implements IMessageContext {
}
private void init(List classPath, List aspectPath) {
abortOnError = true;
createMessageHandler();
info("using classpath: " + classPath);
@@ -191,8 +193,12 @@ public class WeavingAdaptor implements IMessageContext {
}
protected void disable () {
if (trace.isTraceEnabled()) trace.enter("disable",this);

enabled = false;
messageHolder.flushMessages();
if (trace.isTraceEnabled()) trace.exit("disable");
}
protected boolean isEnabled () {
@@ -469,7 +475,7 @@ public class WeavingAdaptor implements IMessageContext {
if (traceMessages) traceMessage(message);
if (accumulating) {
boolean result = addMessage(message);
if (0 <= message.getKind().compareTo(IMessage.ERROR)) {
if (abortOnError && 0 <= message.getKind().compareTo(IMessage.ERROR)) {
throw new AbortException(message);
}
return result;
@@ -553,7 +559,7 @@ public class WeavingAdaptor implements IMessageContext {

public boolean handleMessage(IMessage message) throws AbortException {
boolean result = super.handleMessage(message);
if (0 <= message.getKind().compareTo(failKind)) {
if (abortOnError && 0 <= message.getKind().compareTo(failKind)) {
throw new AbortException(message);
}
return true;

Loading…
Cancel
Save