aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authormwebster <mwebster>2006-07-14 17:39:46 +0000
committermwebster <mwebster>2006-07-14 17:39:46 +0000
commitb15cda7add8a6d7f288ce6132c9c2cd328bba7bc (patch)
tree2a5ce1c68f4fc021f1124c033b35c910cc132dcb /weaver
parentb1024db14f7290378784988e14dffd2def5c251f (diff)
downloadaspectj-b15cda7add8a6d7f288ce6132c9c2cd328bba7bc.tar.gz
aspectj-b15cda7add8a6d7f288ce6132c9c2cd328bba7bc.zip
First drop of Bug 150487 "Tracing and Logging Framework" (Trace & TraceFactory)
Diffstat (limited to 'weaver')
-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
13 files changed, 471 insertions, 3 deletions
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;