]> source.dussan.org Git - aspectj.git/commitdiff
fix LTW for JMX stuff, rename messageHolder, some doc on that + dump
authoravasseur <avasseur>
Mon, 18 Jul 2005 11:23:32 +0000 (11:23 +0000)
committeravasseur <avasseur>
Mon, 18 Jul 2005 11:23:32 +0000 (11:23 +0000)
docs/adk15ProgGuideDB/ltw.xml
loadtime/src/org/aspectj/weaver/loadtime/ClassLoaderWeavingAdaptor.java
loadtime/src/org/aspectj/weaver/loadtime/Options.java
tests/java5/ataspectj/ataspectj/aop-aroundinlinemungertest.xml
tests/java5/ataspectj/ataspectj/aop-aroundinlinemungertest2.xml
tests/java5/ataspectj/ataspectj/aop-dump.xml
tests/java5/ataspectj/ataspectj/aop-perclausetest.xml
weaver/src/org/aspectj/weaver/World.java
weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java

index 05aef43f6a50c224ffcfec49e5a21641bfcb8908..cbbdef913845c2f68e63a0d5cf9179b8310fc9fb 100644 (file)
                 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>
index 9414819b4918fd35c8f7a9d1c1134a41e136626f..ee078308885249bb87f06484d7a75db81b044999 100644 (file)
@@ -15,6 +15,7 @@ import org.aspectj.asm.IRelationship;
 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;
@@ -87,6 +88,7 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
 
         // register the definitions
         registerDefinitions(weaver, loader);
+        messageHandler = bcelWorld.getMessageHandler();
 
         // after adding aspects
         weaver.prepareForWeave();
@@ -100,20 +102,23 @@ public class ClassLoaderWeavingAdaptor extends WeavingAdaptor {
      */
     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));
             }
             
index 429adc2093676913a8ae924b34c4e97777293e28..e6c502d10917895b367102770893460c6b3d47f1 100644 (file)
@@ -38,9 +38,7 @@ public class Options {
     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)) {
@@ -55,9 +53,9 @@ public class 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());
@@ -94,7 +92,7 @@ public class Options {
                 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(
index ce025ce2958e95d431c7f57d62ad6a099964bf2d..b45c24430f11cf5213bbd3110d30341e981de926 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <aspectj>
-    <weaver options="-XmessageHolderClass:ataspectj.TestHelper"/>
+    <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/>
     <aspects>
         <aspect name="ataspectj.AroundInlineMungerTestAspects.Open"/>
     </aspects>
index 3f7de3cd3bade6b5dfae8785d714b3039390c462..bbf4b16748aa9e0d2aa63f6d5901e679c15dfc14 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <aspectj>
-    <weaver options="-XmessageHolderClass:ataspectj.TestHelper"/>
+    <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/>
     <aspects>
         <aspect name="ataspectj.AroundInlineMungerTestAspects2.Open"/>
     </aspects>
index 76bfda8290281421273512d8085a3feff30cedcb..8290814ab3cdf8ee0b0e471bf1b538e65ee03ac2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <aspectj>
-    <weaver options="-XmessageHolderClass:ataspectj.TestHelper">
+    <weaver options="-XmessageHandlerClass:ataspectj.TestHelper">
         <dump within="ataspectj.DumpTestThe*"/> 
     </weaver>
 </aspectj>
index 655e2b55e8a202eb76fecf75d4ca3d47d621014d..236a6a8569482e3213f61f3befc32af14e3f43ff 100644 (file)
@@ -1,6 +1,6 @@
 <?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"/>
index a49aebb1fde3deef2885551ddeba33c5bf44333c..d6905da18311609fe0849241def5218aca8e17b5 100644 (file)
@@ -193,7 +193,7 @@ public abstract class World implements Dump.INode {
                }
         //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;
index 91b5a07ccc84fd7b4325c20a7dd600eab13765f7..4430667c28d45a7ba8962c15f5a10877addc4bec 100644 (file)
@@ -28,15 +28,13 @@ import java.util.Map;
 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;
@@ -67,7 +65,7 @@ public class WeavingAdaptor {
        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 */
 
@@ -136,7 +134,6 @@ public class WeavingAdaptor {
        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); 
@@ -211,8 +208,8 @@ public class WeavingAdaptor {
      * @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());
        }
 
@@ -307,6 +304,7 @@ public class WeavingAdaptor {
                        super(writer,true);
                        
                        ignore(IMessage.WEAVEINFO);
+            ignore(IMessage.INFO);
                        this.failKind = IMessage.ERROR;
 
                }