diff options
author | mwebster <mwebster> | 2006-07-14 17:39:46 +0000 |
---|---|---|
committer | mwebster <mwebster> | 2006-07-14 17:39:46 +0000 |
commit | b15cda7add8a6d7f288ce6132c9c2cd328bba7bc (patch) | |
tree | 2a5ce1c68f4fc021f1124c033b35c910cc132dcb /weaver | |
parent | b1024db14f7290378784988e14dffd2def5c251f (diff) | |
download | aspectj-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/.classpath | 1 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/Lint.java | 10 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/World.java | 17 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java | 25 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/ClassPathManager.java | 6 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/AbstractTrace.java | 154 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/CommonsTrace.java | 57 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/CommonsTraceFactory.java | 23 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/DefaultTrace.java | 68 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/Trace.java | 49 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/TraceFactory.java | 42 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/Traceable.java | 17 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java | 5 |
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; |