methods). The following example shows a simple aop.xml file: </para>
<programlisting><![CDATA[
<aspectj>
-
+
<aspects>
<!-- declare two existing aspects to the weaver -->
<aspect name="com.MyAspect"/>
<concrete-aspect name="com.xyz.tracing.MyTracing" extends="tracing.AbstractTracing">
<pointcut name="tracingScope" expression="within(org.maw.*)"/>
</concrete-aspect>
-
+
<!-- Of the set of aspects known to the weaver, use aspects matching
the type pattern "com..*" for weaving. -->
<include within="com..*"/>
-
+
<!-- Do not use any aspects with the @CoolAspect annotation for weaving -->
- <exclude within="@CoolAspect *"/>
-
+ <exclude within="@CoolAspect *"/>
+
</aspects>
<weaver options="-verbose -XlazyTjp">
<include within="javax.*"/>
<include within="org.aspectj.*"/>
<include within="(!@NoWeave foo.*) AND foo.*"/>
+ <dump within="somepack.*"/><!-- will dump weaved classes to the "./_ajdump" folder on disk (for diagnostic purpose) -->
</weaver>
-
+
</aspectj>
-
+
]]></programlisting>
<para>
It will simply contain a (possibly empty) set of aspect elements, one for
each concrete aspect included in the JAR. </para>
</sect2>
-
+
+ <!-- TODO someone implement that -->
+ <!--
<sect2>
<title>Configuring Load-time Weaving with Properties Files</title>
<para> For memory constrained environments or those without support for XML a simple
weaver.include=javax.* OR org.aspectj.*
]]></programlisting>
</sect2>
-
+ -->
+
<sect2>
<title>Weaver Options</title>
<para> The table below lists the AspectJ options supported by LTW. All other options
</row>
</thead>
<tbody>
+ <row>
+ <entry>
+ <literal>-verbose</literal>
+ </entry>
+ <entry>Issue informational messages about the weaving process. If ever you need to have information
+ when the load time weaving engine is bootstrapped (hence its logger as per <literal>-XmessageHandlerClass:...</literal> not ready yet),
+ you can use the option <literal>-Daj.weaving.verbose=true</literal> on the JVM startup command line. Messages will then be printed
+ on stderr as long as the message handler class is not ready.
+ </entry>
+ </row>
<row>
<entry>
<literal>-1.5</literal>
<entry>Continue weaving even if errors occur (for example,
"... already woven" errors)</entry>
</row>
- <row>
- <entry>
- <literal>-verbose</literal>
- </entry>
- <entry>Issue informational messages about the weaving process</entry>
- </row>
<row>
<entry>
<literal>-Xreweavable</literal>
</row>
<row>
<entry>
- <literal>-XmessageHolderClass:...</literal>
+ <literal>-XmessageHandlerClass:...</literal>
</entry>
<entry>Provide alternative output destination to stdout/stderr for all weaver messages.
The given value must be the full qualified class name of a class that implements
- <literal>org.aspectj.weaver.loadtime</literal>
+ <literal>org.aspectj.bridge.IMessageHandler</literal>
and that is visible from where the <literal>aop.xml</literal> is packed.
If more than one such options are used,
the first occurence only is taken into account.</entry>
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation;
import org.aspectj.bridge.Message;
+import org.aspectj.bridge.MessageUtil;
import org.aspectj.weaver.ICrossReferenceHandler;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.UnresolvedType;
// register the definitions
registerDefinitions(weaver, loader);
+ messageHandler = bcelWorld.getMessageHandler();
// after adding aspects
weaver.prepareForWeave();
*/
private void registerDefinitions(final BcelWeaver weaver, final ClassLoader loader) {
try {
+ MessageUtil.info(messageHandler, "register classloader " + ((loader!=null)?loader.getClass().getName()+"@"+loader.hashCode():"null"));
//TODO av underoptimized: we will parse each XML once per CL that see it
Enumeration xmls = loader.getResources(AOP_XML);
List definitions = new ArrayList();
//TODO av dev mode needed ? TBD -Daj5.def=...
- if (loader != null && loader != ClassLoader.getSystemClassLoader().getParent()) {
+ if (ClassLoader.getSystemClassLoader().equals(loader)) {
String file = System.getProperty("aj5.def", null);
if (file != null) {
+ MessageUtil.info(messageHandler, "using (-Daj5.def) " + file);
definitions.add(DocumentParser.parse((new File(file)).toURL()));
}
}
while (xmls.hasMoreElements()) {
URL xml = (URL) xmls.nextElement();
+ MessageUtil.info(messageHandler, "using " + xml.getFile());
definitions.add(DocumentParser.parse(xml));
}
private final static String OPTION_reweavable = "-Xreweavable";
private final static String OPTION_noinline = "-Xnoinline";
private final static String OPTION_showWeaveInfo = "-showWeaveInfo";
- private final static String OPTIONVALUED_messageHolder = "-XmessageHolderClass:";//TODO rename to Handler
-
- //FIXME dump option - dump what - dump before/after ?
+ private final static String OPTIONVALUED_messageHandler = "-XmessageHandlerClass:";
public static WeaverOption parse(String options, ClassLoader laoder) {
if (LangUtil.isEmpty(options)) {
// do a first round on the message handler since it will report the options themselves
for (Iterator iterator = flags.iterator(); iterator.hasNext();) {
String arg = (String) iterator.next();
- if (arg.startsWith(OPTIONVALUED_messageHolder)) {
- if (arg.length() > OPTIONVALUED_messageHolder.length()) {
- String handlerClass = arg.substring(OPTIONVALUED_messageHolder.length()).trim();
+ if (arg.startsWith(OPTIONVALUED_messageHandler)) {
+ if (arg.length() > OPTIONVALUED_messageHandler.length()) {
+ String handlerClass = arg.substring(OPTIONVALUED_messageHandler.length()).trim();
try {
Class handler = Class.forName(handlerClass, false, laoder);
weaverOption.messageHandler = ((IMessageHandler) handler.newInstance());
weaverOption.showWeaveInfo = true;
} else if (arg.equalsIgnoreCase(OPTION_verbose)) {
weaverOption.verbose = true;
- } else if (arg.startsWith(OPTIONVALUED_messageHolder)) {
+ } else if (arg.startsWith(OPTIONVALUED_messageHandler)) {
;// handled in first round
} else {
weaverOption.messageHandler.handleMessage(
<?xml version="1.0"?>
<aspectj>
- <weaver options="-XmessageHolderClass:ataspectj.TestHelper"/>
+ <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/>
<aspects>
<aspect name="ataspectj.AroundInlineMungerTestAspects.Open"/>
</aspects>
<?xml version="1.0"?>
<aspectj>
- <weaver options="-XmessageHolderClass:ataspectj.TestHelper"/>
+ <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/>
<aspects>
<aspect name="ataspectj.AroundInlineMungerTestAspects2.Open"/>
</aspects>
<?xml version="1.0"?>
<aspectj>
- <weaver options="-XmessageHolderClass:ataspectj.TestHelper">
+ <weaver options="-XmessageHandlerClass:ataspectj.TestHelper">
<dump within="ataspectj.DumpTestThe*"/>
</weaver>
</aspectj>
<?xml version="1.0"?>
<aspectj>
- <weaver options="-XmessageHolderClass:ataspectj.TestHelper"/>
+ <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/>
<aspects>
<aspect name="ataspectj.PerClauseTestAspects.TestAspectPerSingleton"/>
<aspect name="ataspectj.PerClauseTestAspects.TestAspectPerTarget"/>
}
//System.out.println("ret: " + ret);
// Pulling in the type may have already put the right entry in the map
- if (typeMap.get(signature)==null) {
+ if (typeMap.get(signature)==null && !ResolvedType.MISSING.equals(ret)) {
typeMap.put(signature, ret);
}
return ret;
import java.util.Set;
import java.util.StringTokenizer;
-import org.aspectj.bridge.AbortException;
-import org.aspectj.bridge.IMessage;
-import org.aspectj.bridge.MessageUtil;
-import org.aspectj.bridge.MessageWriter;
+import org.aspectj.bridge.*;
import org.aspectj.bridge.IMessage.Kind;
import org.aspectj.util.FileUtil;
import org.aspectj.weaver.IClassFileProvider;
import org.aspectj.weaver.IWeaveRequestor;
import org.aspectj.weaver.ResolvedType;
+import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.bcel.BcelWeaver;
import org.aspectj.weaver.bcel.BcelWorld;
import org.aspectj.weaver.bcel.UnwovenClassFile;
protected boolean verbose = getVerbose();
protected BcelWorld bcelWorld = null;
protected BcelWeaver weaver = null;
- protected WeavingAdaptorMessageHandler messageHandler = null;
+ protected IMessageHandler/*WeavingAdaptorMessageHandler*/ messageHandler = null;
protected GeneratedClassHandler generatedClassHandler;
protected Map generatedClasses = new HashMap(); /* String -> UnwovenClassFile */
private void init(List classPath, List aspectPath) {
messageHandler = new WeavingAdaptorMessageHandler(new PrintWriter(System.err));
if (verbose) messageHandler.dontIgnore(IMessage.INFO);
- else messageHandler.ignore(IMessage.INFO);
if (Boolean.getBoolean(SHOW_WEAVE_INFO_PROPERTY)) messageHandler.dontIgnore(IMessage.WEAVEINFO);
info("using classpath: " + classPath);
* @param name
* @return
*/
- private boolean shouldWeaveAspect (String name) {
- ResolvedType type = bcelWorld.resolve(name);
+ private boolean shouldWeaveAspect(String name) {
+ ResolvedType type = bcelWorld.resolve(UnresolvedType.forName(name), true);
return (type == null || !type.isAspect() || type.isAnnotationStyleAspect());
}
super(writer,true);
ignore(IMessage.WEAVEINFO);
+ ignore(IMessage.INFO);
this.failKind = IMessage.ERROR;
}