Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] LTW into javax.swing

What I am trying to do: Swing has support for Tooltips, but that functionality is very basic. There are two functions (SetToolTip() and GetToolTip()) which either take a String argument or return one. I would like to have different Tooltips, to be precise, different verbosity levels, for all tooltips in my project. Of course I could either overload all used JComponents (hah!) or use some other nontrivial approach (manage my own listeners...) to set these values anew every time the user changes the verbosity level.

But on the other hand, having an Aspect weave into GetToolTip() would instantly solve my issues, as I could then change the return parameter (read from a properties file). I have managed to figure out how to basically do this, and it works, as long as I am weaving into my own code (I suppose it would work at compile time even). But for some reason, weaving into Swing fails without error messages, it just does not happen. I assume the class loader has my classes prepared before the weaver kicks in, but I have absolutely no idea how to do that different. There is also not a lot of literature on the subject and I only assume this happens because I've read somewhere that writing a classloader might be necessary (without explanation as to why or how). I am settnig the option to the weaver to include javax, but it won't find JComponent. If I don't exclude the org.jdesktop package, it even tries to find the superclasses of some of the jdesktop parts at javax.jnlp.*, so it doesn't completely fail.
As for the call I want to intercept: javax.swing.ToolTipManager is the class that calls my target function. It never gets woven.

As for the code I use:

aop.xml:
         <aspectj>
            <aspects>
              <aspect name="<something>.weaver.
Wrangler"/>
               <include within="<something>..*"/>
               <include within="javax.swing..*"/>
               <exclude within="org.jdesktop..*"/>
            </aspects>
            <weaver options="-verbose -Xset:weaveJavaxPackages=true -Xset:weaveJavaPackages=true -showWeaveInfo" >
               <include within="<something>..*"/>
               <include within="javax.swing..*"/>
               <exclude within="org.jdesktop..*"/>
            </weaver>
          </aspectj>

public aspect Wrangler {
    before(JComponent component):
        call( public String JComponent.getToolTipText(MouseEvent) )
        && target(component)
        {
            System.out.println("Intercepted!");
            //target.setToolTip("My new thing");
        }
}

The output I get:
[AppClassLoader@19134f4] weaveinfo Join point 'method-call(java.lang.String javax.swing.JMenuItem.getToolTipText())' in Type <something>.gui.AppClientView' (AppClientView.java:596) advised by before advice from '<something>.weaver.Wrangler' (Wrangler.aj:33)

And all other calls I make myself. Changing this to execution or anything like that does not help at all. No Javax.Swing classes are woven at all.

Back to the top