summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/Aj.java14
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java15
-rw-r--r--loadtime/src/org/aspectj/weaver/loadtime/DefaultWeavingContext.java2
-rw-r--r--loadtime/testsrc/LoadtimeModuleTests.java8
-rw-r--r--weaver/.classpath1
-rw-r--r--weaver/src/org/aspectj/weaver/Lint.java10
-rw-r--r--weaver/src/org/aspectj/weaver/World.java17
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java25
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java6
-rw-r--r--weaver/src/org/aspectj/weaver/tools/AbstractTrace.java154
-rw-r--r--weaver/src/org/aspectj/weaver/tools/CommonsTrace.java57
-rw-r--r--weaver/src/org/aspectj/weaver/tools/CommonsTraceFactory.java23
-rw-r--r--weaver/src/org/aspectj/weaver/tools/DefaultTrace.java68
-rw-r--r--weaver/src/org/aspectj/weaver/tools/Trace.java49
-rw-r--r--weaver/src/org/aspectj/weaver/tools/TraceFactory.java42
-rw-r--r--weaver/src/org/aspectj/weaver/tools/Traceable.java17
-rw-r--r--weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java5
-rw-r--r--weaver5/java5-src/org/aspectj/weaver/tools/Jdk14Trace.java63
-rw-r--r--weaver5/java5-src/org/aspectj/weaver/tools/Jdk14TraceFactory.java20
-rw-r--r--weaver5/testdata/logging.properties59
20 files changed, 648 insertions, 7 deletions
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/Aj.java b/loadtime/src/org/aspectj/weaver/loadtime/Aj.java
index b0552a040..015a245b3 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/Aj.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/Aj.java
@@ -14,6 +14,8 @@ package org.aspectj.weaver.loadtime;
import java.util.Map;
import java.util.WeakHashMap;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
import org.aspectj.weaver.tools.WeavingAdaptor;
/**
@@ -26,13 +28,17 @@ public class Aj implements ClassPreProcessor {
private IWeavingContext weavingContext;
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(Aj.class);
+
public Aj(){
this(null);
}
public Aj(IWeavingContext context){
- weavingContext = context;
+ if (trace.isTraceEnabled()) trace.enter("<init>",this,new Object[] {context});
+ this.weavingContext = context;
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
/**
@@ -51,22 +57,28 @@ public class Aj implements ClassPreProcessor {
* @return weaved bytes
*/
public byte[] preProcess(String className, byte[] bytes, ClassLoader loader) {
+ if (trace.isTraceEnabled()) trace.enter("preProcess",this,new Object[] {className,bytes,loader});
+
//TODO AV needs to doc that
if (loader == null || className == null) {
// skip boot loader or null classes (hibernate)
+ if (trace.isTraceEnabled()) trace.exit("preProcess",bytes);
return bytes;
}
try {
WeavingAdaptor weavingAdaptor = WeaverContainer.getWeaver(loader, weavingContext);
if (weavingAdaptor == null) {
+ if (trace.isTraceEnabled()) trace.exit("preProcess",bytes);
return bytes;
}
return weavingAdaptor.weaveClass(className, bytes);
} catch (Exception t) {
+ trace.error("preProcess",t);
//FIXME AV wondering if we should have the option to fail (throw runtime exception) here
// would make sense at least in test f.e. see TestHelper.handleMessage()
t.printStackTrace();
+ if (trace.isTraceEnabled()) trace.exit("preProcess",bytes);
return bytes;
}
}
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java b/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
index 2f02ca67d..7f6502361 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
@@ -46,6 +46,8 @@ import org.aspectj.weaver.ltw.LTWWorld;
import org.aspectj.weaver.patterns.PatternParser;
import org.aspectj.weaver.patterns.TypePattern;
import org.aspectj.weaver.tools.GeneratedClassHandler;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
import org.aspectj.weaver.tools.WeavingAdaptor;
/**
@@ -72,10 +74,14 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
private ClassLoader classLoader;
private IWeavingContext weavingContext;
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(ClassLoaderWeavingAdaptor.class);
+
public ClassLoaderWeavingAdaptor(final ClassLoader loader, IWeavingContext wContext) {
super();
+ if (trace.isTraceEnabled()) trace.enter("<init>",this);
this.classLoader = loader;
this.weavingContext = wContext;
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
protected void initialize (final ClassLoader deprecatedLoader, IWeavingContext deprecatedContext) {
@@ -334,6 +340,7 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
* @param definitions
*/
private void registerAspects(final BcelWeaver weaver, final ClassLoader loader, final List definitions) {
+ if (trace.isTraceEnabled()) trace.enter("registerAspects",this, new Object[] { weaver, loader, definitions} );
//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
@@ -396,6 +403,8 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
enabled = false;
info("no aspects registered. Disabling weaver for class loader " + getClassLoaderName(loader));
}
+
+ if (trace.isTraceEnabled()) trace.exit("registerAspects",enabled);
}
/**
@@ -647,6 +656,8 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
}
private void defineClass(ClassLoader loader, String name, byte[] bytes) {
+ if (trace.isTraceEnabled()) trace.enter("defineClass",this,new Object[] {loader,name,bytes});
+ Object clazz = null;
info("generating class '" + name + "'");
try {
@@ -655,7 +666,7 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
"defineClass", new Class[] { String.class,
bytes.getClass(), int.class, int.class });
defineClass.setAccessible(true);
- defineClass.invoke(loader, new Object[] { name, bytes,
+ clazz = defineClass.invoke(loader, new Object[] { name, bytes,
new Integer(0), new Integer(bytes.length) });
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof LinkageError) {
@@ -668,5 +679,7 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
} catch (Exception e) {
warn("define generated class failed",e);
}
+
+ if (trace.isTraceEnabled()) trace.exit("defineClass",clazz);
}
}
diff --git a/loadtime/src/org/aspectj/weaver/loadtime/DefaultWeavingContext.java b/loadtime/src/org/aspectj/weaver/loadtime/DefaultWeavingContext.java
index e3d7264e8..2ec089253 100644
--- a/loadtime/src/org/aspectj/weaver/loadtime/DefaultWeavingContext.java
+++ b/loadtime/src/org/aspectj/weaver/loadtime/DefaultWeavingContext.java
@@ -68,7 +68,7 @@ public class DefaultWeavingContext implements IWeavingContext {
*/
public String getId () {
if (shortName == null) {
- shortName = getClassLoaderName();
+ shortName = getClassLoaderName().replace('$','.');
int index = shortName.lastIndexOf(".");
shortName = shortName.substring(index + 1);
}
diff --git a/loadtime/testsrc/LoadtimeModuleTests.java b/loadtime/testsrc/LoadtimeModuleTests.java
index fe0ef3338..342b16f24 100644
--- a/loadtime/testsrc/LoadtimeModuleTests.java
+++ b/loadtime/testsrc/LoadtimeModuleTests.java
@@ -15,7 +15,10 @@ import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
+import org.aspectj.weaver.loadtime.AjTest;
+import org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptorTest;
import org.aspectj.weaver.loadtime.JRockitAgentTest;
+import org.aspectj.weaver.loadtime.WeavingContextTest;
import org.aspectj.weaver.loadtime.WeavingURLClassLoaderTest;
import org.aspectj.weaver.loadtime.test.DocumentParserTest;
@@ -28,8 +31,11 @@ public class LoadtimeModuleTests extends TestCase {
TestSuite suite = new TestSuite(LoadtimeModuleTests.class.getName());
suite.addTestSuite(DocumentParserTest.class);
- suite.addTestSuite(WeavingURLClassLoaderTest.class);
+ suite.addTestSuite(AjTest.class);
+ suite.addTestSuite(ClassLoaderWeavingAdaptorTest.class);
suite.addTestSuite(JRockitAgentTest.class);
+ suite.addTestSuite(WeavingContextTest.class);
+ suite.addTestSuite(WeavingURLClassLoaderTest.class);
return suite;
}
diff --git a/weaver/.classpath b/weaver/.classpath
index ab0c856c4..1cceb2d3a 100644
--- a/weaver/.classpath
+++ b/weaver/.classpath
@@ -12,5 +12,6 @@
<classpathentry combineaccessrules="false" kind="src" path="/aspectj5rt"/>
<classpathentry kind="lib" path="/lib/asm/asm-aj.jar"/>
<classpathentry sourcepath="/lib/bcel/bcel-src.zip" kind="lib" path="/lib/bcel/bcel.jar"/>
+ <classpathentry sourcepath="/lib/commons/commons-src.zip" kind="lib" path="/lib/commons/commons.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/weaver/src/org/aspectj/weaver/Lint.java b/weaver/src/org/aspectj/weaver/Lint.java
index 06898f61d..739ba02d0 100644
--- a/weaver/src/org/aspectj/weaver/Lint.java
+++ b/weaver/src/org/aspectj/weaver/Lint.java
@@ -28,6 +28,8 @@ import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.Message;
import org.aspectj.bridge.MessageUtil;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
public class Lint {
/* private */ Map kinds = new HashMap();
@@ -123,14 +125,20 @@ public class Lint {
new Kind("cantFindType","{0}");
public final Kind cantFindTypeAffectingJoinPointMatch = new Kind("cantFindTypeAffectingJPMatch","{0}");
+
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(Lint.class);
public Lint(World world) {
+ if (trace.isTraceEnabled()) trace.enter("<init>",this,world);
this.world = world;
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
public void setAll(String messageKind) {
+ if (trace.isTraceEnabled()) trace.enter("setAll",this,messageKind);
setAll(getMessageKind(messageKind));
+ if (trace.isTraceEnabled()) trace.exit("setAll");
}
private void setAll(IMessage.Kind messageKind) {
@@ -141,6 +149,7 @@ public class Lint {
}
public void setFromProperties(File file) {
+ if (trace.isTraceEnabled()) trace.enter("setFromProperties",this,file);
try {
InputStream s = new FileInputStream(file);
setFromProperties(s);
@@ -148,6 +157,7 @@ public class Lint {
MessageUtil.error(world.getMessageHandler(),
WeaverMessages.format(WeaverMessages.XLINT_LOAD_ERROR,file.getPath(),ioe.getMessage()));
}
+ if (trace.isTraceEnabled()) trace.exit("setFromProperties");
}
public void loadDefaultProperties() {
diff --git a/weaver/src/org/aspectj/weaver/World.java b/weaver/src/org/aspectj/weaver/World.java
index 0051e3106..8597690b8 100644
--- a/weaver/src/org/aspectj/weaver/World.java
+++ b/weaver/src/org/aspectj/weaver/World.java
@@ -38,6 +38,8 @@ import org.aspectj.weaver.patterns.DeclarePrecedence;
import org.aspectj.weaver.patterns.PerClause;
import org.aspectj.weaver.patterns.Pointcut;
import org.aspectj.weaver.reflect.ReflectionBasedReferenceTypeDelegate;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
/**
* A World is a collection of known types and crosscutting members.
@@ -109,6 +111,7 @@ public abstract class World implements Dump.INode {
public boolean forDEBUG_structuralChangesCode = false;
public boolean forDEBUG_bridgingCode = false;
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(World.class);
// Records whether ASM is around ... so we might use it for delegates
protected static boolean isASMAround;
@@ -138,6 +141,7 @@ public abstract class World implements Dump.INode {
*/
protected World() {
super();
+ if (trace.isTraceEnabled()) trace.enter("<init>", this);
Dump.registerNode(this.getClass(),this);
typeMap.put("B", ResolvedType.BYTE);
typeMap.put("S", ResolvedType.SHORT);
@@ -149,6 +153,7 @@ public abstract class World implements Dump.INode {
typeMap.put("Z", ResolvedType.BOOLEAN);
typeMap.put("V", ResolvedType.VOID);
precedenceCalculator = new AspectPrecedenceCalculator(this);
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
/**
@@ -305,7 +310,10 @@ public abstract class World implements Dump.INode {
* Convenience method for finding a type by name and resolving it in one step.
*/
public ResolvedType resolve(String name) {
- return resolve(UnresolvedType.forName(name));
+// trace.enter("resolve", this, new Object[] {name});
+ ResolvedType ret = resolve(UnresolvedType.forName(name));
+// trace.exit("resolve", ret);
+ return ret;
}
public ResolvedType resolve(String name,boolean allowMissing) {
@@ -595,6 +603,9 @@ public abstract class World implements Dump.INode {
}
}
+ public boolean debug (String message) {
+ return MessageUtil.debug(messageHandler,message);
+ }
public void setCrossReferenceHandler(ICrossReferenceHandler xrefHandler) {
this.xrefHandler = xrefHandler;
@@ -819,9 +830,13 @@ public abstract class World implements Dump.INode {
private int collectedTypes = 0;
private ReferenceQueue rq = new ReferenceQueue();
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(World.TypeMap.class);
+
TypeMap(World w) {
+ if (trace.isTraceEnabled()) trace.enter("<init>",this,w);
this.w = w;
memoryProfiling = false;// !w.getMessageHandler().isIgnoring(Message.INFO);
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
/**
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java
index 7ceffdd19..b38f470e9 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java
@@ -95,6 +95,8 @@ import org.aspectj.weaver.patterns.OrPointcut;
import org.aspectj.weaver.patterns.Pointcut;
import org.aspectj.weaver.patterns.PointcutRewriter;
import org.aspectj.weaver.patterns.WithinPointcut;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
public class BcelWeaver implements IWeaver {
@@ -106,11 +108,15 @@ public class BcelWeaver implements IWeaver {
private boolean inReweavableMode = false;
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(BcelWeaver.class);
+
public BcelWeaver(BcelWorld world) {
super();
+ if (trace.isTraceEnabled()) trace.enter("<init>",this,world);
WeaverMetrics.reset();
this.world = world;
this.xcutSet = world.getCrosscuttingMembersSet();
+ if (trace.isTraceEnabled()) trace.exit("<init>");
}
public BcelWeaver() {
@@ -149,7 +155,9 @@ public class BcelWeaver implements IWeaver {
* @return aspect
*/
public ResolvedType addLibraryAspect(String aspectName) {
- // 1 - resolve as is
+ if (trace.isTraceEnabled()) trace.enter("addLibraryAspect",this,aspectName);
+
+ // 1 - resolve as is
UnresolvedType unresolvedT = UnresolvedType.forName(aspectName);
unresolvedT.setNeedsModifiableDelegate(true);
ResolvedType type = world.resolve(unresolvedT, true);
@@ -185,10 +193,13 @@ public class BcelWeaver implements IWeaver {
//TODO AV - happens to reach that a lot of time: for each type flagged reweavable X for each aspect in the weaverstate
//=> mainly for nothing for LTW - pbly for something in incremental build...
xcutSet.addOrReplaceAspect(type);
+ if (trace.isTraceEnabled()) trace.exit("addLibraryAspect",type);
return type;
} else {
// FIXME AV - better warning upon no such aspect from aop.xml
- throw new RuntimeException("Cannot register non aspect: " + type.getName() + " , " + aspectName);
+ RuntimeException ex = new RuntimeException("Cannot register non aspect: " + type.getName() + " , " + aspectName);
+ if (trace.isTraceEnabled()) trace.exit("addLibraryAspect",ex);
+ throw ex;
}
}
@@ -436,6 +447,7 @@ public class BcelWeaver implements IWeaver {
}
public void prepareForWeave() {
+ if (trace.isTraceEnabled()) trace.enter("prepareForWeave",this);
needToReweaveWorld = xcutSet.hasChangedSinceLastReset();
CflowPointcut.clearCaches();
@@ -457,6 +469,7 @@ public class BcelWeaver implements IWeaver {
}
shadowMungerList = xcutSet.getShadowMungers();
+// world.debug("shadow mungers=" + shadowMungerList);
rewritePointcuts(shadowMungerList);
// Sometimes an error occurs during rewriting pointcuts (for example, if ambiguous bindings
// are detected) - we ought to fail the prepare when this happens because continuing with
@@ -486,6 +499,8 @@ public class BcelWeaver implements IWeaver {
return (sm2.getSourceLocation().getOffset()-sm1.getSourceLocation().getOffset());
}
});
+
+ if (trace.isTraceEnabled()) trace.exit("prepareForWeave");
}
/*
@@ -991,6 +1006,7 @@ public class BcelWeaver implements IWeaver {
// variation of "weave" that sources class files from an external source.
public Collection weave(IClassFileProvider input) throws IOException {
+ if (trace.isTraceEnabled()) trace.enter("weave",this,input);
ContextToken weaveToken = CompilationAndWeavingContext.enteringPhase(CompilationAndWeavingContext.WEAVING, "");
Collection wovenClassNames = new ArrayList();
IWeaveRequestor requestor = input.getRequestor();
@@ -1138,6 +1154,7 @@ public class BcelWeaver implements IWeaver {
requestor.weaveCompleted();
CompilationAndWeavingContext.leavingPhase(weaveToken);
+ if (trace.isTraceEnabled()) trace.exit("weave",wovenClassNames);
return wovenClassNames;
}
@@ -1693,9 +1710,11 @@ public class BcelWeaver implements IWeaver {
}
public void setReweavableMode(boolean xNotReweavable) {
+ if (trace.isTraceEnabled()) trace.enter("setReweavableMode",this,xNotReweavable);
inReweavableMode = !xNotReweavable;
WeaverStateInfo.setReweavableModeDefaults(!xNotReweavable,false,true);
BcelClassWeaver.setReweavableMode(!xNotReweavable);
+ if (trace.isTraceEnabled()) trace.exit("setReweavableMode");
}
public boolean isReweavable() {
@@ -1707,9 +1726,11 @@ public class BcelWeaver implements IWeaver {
}
public void tidyUp() {
+ if (trace.isTraceEnabled()) trace.enter("tidyUp",this);
shadowMungerList = null; // setup by prepareForWeave
typeMungerList = null; // setup by prepareForWeave
lateTypeMungerList = null; // setup by prepareForWeave
declareParentsList = null; // setup by prepareForWeave
+ if (trace.isTraceEnabled()) trace.exit("tidyUp");
}
}
diff --git a/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java b/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java
index 724d0a57a..5f06c0e6f 100644
--- a/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java
+++ b/weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java
@@ -30,6 +30,8 @@ import org.aspectj.bridge.MessageUtil;
import org.aspectj.weaver.BCException;
import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.WeaverMessages;
+import org.aspectj.weaver.tools.Trace;
+import org.aspectj.weaver.tools.TraceFactory;
public class ClassPathManager {
@@ -43,6 +45,8 @@ public class ClassPathManager {
private List openArchives = new ArrayList();
private static int maxOpenArchives = -1;
private static final int MAXOPEN_DEFAULT = 1000;
+
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(ClassPathManager.class);
static {
String openzipsString = getSystemPropertyWithoutSecurityException("org.aspectj.weaver.openarchives",Integer.toString(MAXOPEN_DEFAULT));
@@ -53,11 +57,13 @@ public class ClassPathManager {
public ClassPathManager(List classpath, IMessageHandler 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>");
}
protected ClassPathManager() {};
diff --git a/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java b/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java
new file mode 100644
index 000000000..d59eed999
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/AbstractTrace.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+import java.io.File;
+
+public abstract class AbstractTrace implements Trace {
+
+ protected Class tracedClass;
+
+ protected AbstractTrace (Class clazz) {
+ this.tracedClass = clazz;
+ }
+
+ public abstract void enter (String methodName, Object thiz, Object[] args);
+
+ public abstract void enter(String methodName, Object thiz);
+
+ public abstract void exit(String methodName, Object ret);
+
+ public abstract void exit(String methodName, Throwable th);
+
+ public void error(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void error(String message, Throwable th) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void event(String methodName) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void event(String methodName, Object thiz, Object[] args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void exit(String methodName) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void info(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void warn(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void warn(String message, Throwable th) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /*
+ * Convenience methods
+ */
+ public void enter (String methodName, Object thiz, Object arg) {
+ enter(methodName,thiz,new Object[] { arg });
+ }
+
+ public void enter (String methodName, Object thiz, boolean z) {
+ enter(methodName,thiz,new Boolean(z));
+ }
+
+ public void exit (String methodName, boolean b) {
+ exit(methodName,new Boolean(b));
+ }
+
+ public boolean isTraceEnabled () {
+ return true;
+ }
+
+ protected String formatMessage(String className, String methodName, Object thiz, Object[] args) {
+ StringBuffer message = new StringBuffer();
+ message.append(className);
+ message.append(".").append(methodName);
+ if (thiz != null) message.append(" ").append(formatObj(thiz));
+ if (args != null) message.append(" ").append(formatArgs(args));
+ return message.toString();
+ }
+
+ /**
+ * Format objects safely avoiding toString which can cause recursion,
+ * NullPointerExceptions or highly verbose results.
+ *
+ * @param obj parameter to be formatted
+ * @return the formated parameter
+ */
+ protected Object formatObj(Object obj) {
+
+ /* These classes have a safe implementation of toString() */
+ if (obj == null
+ || obj instanceof String
+ || obj instanceof Number
+ || obj instanceof Boolean
+ || obj instanceof Exception
+ || obj instanceof Character
+ || obj instanceof Class
+ || obj instanceof File
+ || obj instanceof StringBuffer
+ ) return obj;
+ else try {
+
+ /* Classes can provide an alternative implementation of toString() */
+ if (obj instanceof Traceable) {
+ Traceable t = (Traceable)obj;
+ return t.toTraceString();
+ }
+
+ /* Use classname@hashcode */
+ else return obj.getClass().getName() + "@" + Integer.toString(obj.hashCode(),16);
+
+ /* Object.hashCode() can be override and may thow an exception */
+ } catch (Exception ex) {
+ return obj.getClass().getName();
+ }
+ }
+
+ /**
+ * Format arguments into a comma separated list
+ *
+ * @param names array of argument names
+ * @param args array of arguments
+ * @return the formated list
+ */
+ protected String formatArgs(Object[] args) {
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < args.length; i++) {
+ sb.append(formatObj(args[i]));
+ if (i < args.length-1) sb.append(", ");
+ }
+
+ return sb.toString();
+ }
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/CommonsTrace.java b/weaver/src/org/aspectj/weaver/tools/CommonsTrace.java
new file mode 100644
index 000000000..c0301416d
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/CommonsTrace.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class CommonsTrace extends AbstractTrace {
+
+ private Log log;
+ private String className;
+
+ public CommonsTrace (Class clazz) {
+ super(clazz);
+ this.log = LogFactory.getLog(clazz);
+ this.className = tracedClass.getName();
+ }
+
+ public void enter(String methodName, Object thiz, Object[] args) {
+ if (log.isDebugEnabled()) {
+ log.debug("> " + formatMessage(className, methodName, thiz, args));
+ }
+ }
+
+ public void enter(String methodName, Object thiz) {
+ if (log.isDebugEnabled()) {
+ log.debug("> " + formatMessage(className, methodName, thiz, null));
+ }
+ }
+
+ public void exit(String methodName, Object ret) {
+ if (log.isDebugEnabled()) {
+ log.debug("< " + formatMessage(className, methodName, ret, null));
+ }
+ }
+
+ public void exit(String methodName, Throwable th) {
+ if (log.isDebugEnabled()) {
+ log.debug("< " + formatMessage(className, methodName, th, null));
+ }
+ }
+
+ public void exit(String methodName) {
+ if (log.isDebugEnabled()) {
+ log.debug("< " + formatMessage(className, methodName, null, null));
+ }
+ }
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/CommonsTraceFactory.java b/weaver/src/org/aspectj/weaver/tools/CommonsTraceFactory.java
new file mode 100644
index 000000000..296b1fdc4
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/CommonsTraceFactory.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+import org.apache.commons.logging.LogFactory;
+
+public class CommonsTraceFactory extends TraceFactory {
+
+ private LogFactory logFactory = LogFactory.getFactory();
+
+ public Trace getTrace(Class clazz) {
+ return new CommonsTrace(clazz);
+ }
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/DefaultTrace.java b/weaver/src/org/aspectj/weaver/tools/DefaultTrace.java
new file mode 100644
index 000000000..fdfc5e0e9
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/DefaultTrace.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+public class DefaultTrace extends AbstractTrace {
+
+ public DefaultTrace (Class clazz) {
+ super(clazz);
+ }
+
+ public void enter (String methodName, Object thiz, Object[] args) {
+ if (tracingEnabled) {
+// println("> " + tracedClass.getName() + "." + methodName + " " + formatObj(thiz) + " " + formatArgs(args));
+ println("> " + formatMessage(tracedClass.getName(),methodName,thiz,args));
+ }
+ }
+
+ public void enter (String methodName, Object thiz) {
+ if (tracingEnabled) {
+// println("> " + tracedClass.getName() + "." + methodName + " " + formatObj(thiz));
+ println("> " + formatMessage(tracedClass.getName(),methodName,thiz,null));
+ }
+ }
+
+ public void exit (String methodName, Object ret) {
+ if (tracingEnabled) {
+// println("< " + tracedClass.getName() + "." + methodName + " " + formatObj(ret));
+ println("< " + formatMessage(tracedClass.getName(),methodName,ret,null));
+ }
+ }
+
+ public void exit (String methodName) {
+ if (tracingEnabled) {
+// println("< " + tracedClass.getName() + "." + methodName);
+ println("< " + formatMessage(tracedClass.getName(),methodName,null,null));
+ }
+ }
+
+ public void exit(String methodName, Throwable th) {
+ exit(methodName,th);
+ }
+
+ /**
+ * Template method that allows choice of destination for output
+ *
+ * @param s message to be traced
+ */
+ protected void println (String s) {
+ System.err.println(s);
+ }
+
+ private static boolean tracingEnabled = getBoolean("org.aspectj.weaver.tools.tracing",false);
+
+ private static boolean getBoolean (String name, boolean def) {
+ String defaultValue = String.valueOf(def);
+ String value = System.getProperty(name,defaultValue);
+ return Boolean.valueOf(value).booleanValue();
+ }
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/Trace.java b/weaver/src/org/aspectj/weaver/tools/Trace.java
new file mode 100644
index 000000000..6337c6083
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/Trace.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+public interface Trace {
+
+ public void enter (String methodName, Object thiz, Object[] args);
+
+ public void enter (String methodName, Object thiz);
+
+ public void exit (String methodName, Object ret);
+
+ public void exit (String methodName, Throwable th);
+
+ public void exit (String methodName);
+
+ public void event (String methodName);
+
+ public void event (String methodName, Object thiz, Object[] args);
+
+ public void info (String message);
+
+ public void warn (String message);
+
+ public void warn (String message, Throwable th);
+
+ public void error (String message);
+
+ public void error (String message, Throwable th);
+
+ /*
+ * Convenience methods
+ */
+ public void enter (String methodName, Object thiz, Object arg);
+
+ public void enter (String methodName, Object thiz, boolean z);
+
+ public void exit (String methodName, boolean b);
+
+ public boolean isTraceEnabled ();
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/TraceFactory.java b/weaver/src/org/aspectj/weaver/tools/TraceFactory.java
new file mode 100644
index 000000000..d77b7e1ba
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/TraceFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+import org.aspectj.util.LangUtil;
+
+public class TraceFactory {
+
+ public static TraceFactory instance = new TraceFactory();
+
+ public Trace getTrace (Class clazz) {
+ return new DefaultTrace(clazz);
+ }
+
+ public static TraceFactory getTraceFactory () {
+ return instance;
+ }
+
+ static {
+ try {
+ if (LangUtil.is15VMOrGreater()) {
+ Class factoryClass = Class.forName("org.aspectj.weaver.tools.Jdk14TraceFactory");
+ instance = (TraceFactory)factoryClass.newInstance();
+ } else {
+ Class factoryClass = Class.forName("org.aspectj.weaver.tools.CommonsTraceFactory");
+ instance = (TraceFactory)factoryClass.newInstance();
+ }
+ }
+ catch (Exception ex) {
+ }
+// System.out.println("TraceFactory.<clinit>() instance=" + instance);
+ }
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/Traceable.java b/weaver/src/org/aspectj/weaver/tools/Traceable.java
new file mode 100644
index 000000000..957786e48
--- /dev/null
+++ b/weaver/src/org/aspectj/weaver/tools/Traceable.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+public interface Traceable {
+
+ public String toTraceString ();
+
+}
diff --git a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
index 1a637cfbc..f62c7305e 100644
--- a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
+++ b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
@@ -78,6 +78,8 @@ public class WeavingAdaptor {
protected GeneratedClassHandler generatedClassHandler;
protected Map generatedClasses = new HashMap(); /* String -> UnwovenClassFile */
+ private static Trace trace = TraceFactory.getTraceFactory().getTrace(WeavingAdaptor.class);
+
protected WeavingAdaptor () {
}
@@ -205,6 +207,7 @@ public class WeavingAdaptor {
*/
public byte[] weaveClass (String name, byte[] bytes) throws IOException {
if (enabled) {
+ if (trace.isTraceEnabled()) trace.enter("weaveClass",this,new Object[] {name,bytes});
if (shouldWeave(name, bytes)) {
info("weaving '" + name + "'");
@@ -217,6 +220,8 @@ public class WeavingAdaptor {
else {
info("not weaving '" + name + "'");
}
+
+ if (trace.isTraceEnabled()) trace.exit("weaveClass",bytes);
}
return bytes;
diff --git a/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14Trace.java b/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14Trace.java
new file mode 100644
index 000000000..93d816d90
--- /dev/null
+++ b/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14Trace.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class Jdk14Trace extends AbstractTrace {
+
+ private Logger logger;
+ private String name;
+
+ public Jdk14Trace (Class clazz) {
+ super(clazz);
+ this.name = clazz.getName();
+ this.logger = Logger.getLogger(name);
+ }
+
+ public void enter(String methodName, Object thiz, Object[] args) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.entering(name,methodName,formatObj(thiz));
+ if (args != null && logger.isLoggable(Level.FINER)) {
+ logger.entering(name,methodName,args);
+ }
+ }
+ }
+
+ public void enter(String methodName, Object thiz) {
+ enter(methodName,thiz,null);
+ }
+
+ public void exit(String methodName, Object ret) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.exiting(name,methodName,ret);
+ }
+ }
+
+ public void exit(String methodName, Throwable th) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.exiting(name,methodName,th);
+ }
+ }
+
+ public void exit(String methodName) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.exiting(name,methodName);
+ }
+ }
+
+ @Override
+ public boolean isTraceEnabled() {
+ return logger.isLoggable(Level.FINE);
+ }
+
+}
diff --git a/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14TraceFactory.java b/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14TraceFactory.java
new file mode 100644
index 000000000..4043d1d33
--- /dev/null
+++ b/weaver5/java5-src/org/aspectj/weaver/tools/Jdk14TraceFactory.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Matthew Webster - initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.tools;
+
+public class Jdk14TraceFactory extends TraceFactory {
+
+ @Override
+ public Trace getTrace(Class clazz) {
+ return new Jdk14Trace(clazz);
+ }
+
+}
diff --git a/weaver5/testdata/logging.properties b/weaver5/testdata/logging.properties
new file mode 100644
index 000000000..fb96358eb
--- /dev/null
+++ b/weaver5/testdata/logging.properties
@@ -0,0 +1,59 @@
+############################################################
+# Default Logging Configuration File
+#
+# You can use a different file by specifying a filename
+# with the java.util.logging.config.file system property.
+# For example java -Djava.util.logging.config.file=myfile
+############################################################
+
+############################################################
+# Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes. These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+# By default we only configure a ConsoleHandler, which will only
+# show messages at the INFO and above levels.
+#handlers= java.util.logging.ConsoleHandler
+
+# To also add the FileHandler, use the following line instead.
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+handlers= java.util.logging.FileHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers. For any given facility this global level
+# can be overriden by a facility specific level
+# Note that the ConsoleHandler also has a separate level
+# setting to limit messages printed to the console.
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/java%u.log
+#java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+#java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
+java.util.logging.FileHandler.level = FINER
+
+# Limit the message that are printed on the console to INFO and above.
+java.util.logging.ConsoleHandler.level = FINER
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+# For example, set the com.xyz.foo logger to only log SEVERE
+# messages:
+#com.xyz.foo.level = SEVERE
+org.aspectj.weaver.level = FINER
+org.aspectj.weaver.loadtime.level = FINER