@Jean: The "||" was not for "is()" (which I had not even noticed, as I said), but for combinations of specific package and class name specifiers. Please do not mix up my answer with Andy's (which is superior because more precise anyway). BTW, I did not test anything, because I am nowhere near a PC (iPad only here on the road).
Alexander Kriegisch
Thank you very-very much for theses answers
and we updated our code according to the new knowledge. Did you test with
|| is(InnerType) (instead of &&) ?
With && is(InnerType), we got only the inner classes.
Using OR triggers some compiler errors. Well, from your side, the proposed
solutions are what we wanted. ;)
Best regards and again thank you.
Jean André
De :
Alexander Kriegisch
<Alexander@xxxxxxxxxxxxxx>
A :
"aspectj-users@xxxxxxxxxxx"
<aspectj-users@xxxxxxxxxxx>,
Date :
2013-04-02 13:39
Objet :
Re: [aspectj-users]
@DeclareMixin with inner class - Syntax ?
Envoyé par :
aspectj-users-bounces@xxxxxxxxxxx
Sorry, it has gotten late here... I totally overlooked
the "&& is(InnerType)" part. Mea culpa.
Reminder to myself: read more carefully, then answer.
And maybe get some sleep.
Alexander Kriegisch
Am 02.04.2013 um 19:35 schrieb Alexander Kriegisch <Alexander@xxxxxxxxxxxxxx>:
True, but com.nested.my.concurrent.*.* will not just match
inner classes, but also regular classes in direct subpackages, which is
why I said that if you need to be more specific you can concatenate subconditions
with an "or" operator. ;-)
Am 02.04.2013 um 17:01 schrieb Andy Clement <andrew.clement@xxxxxxxxx>:
Or you could use com.nested.my.concurrent.*.*
(depending on your needs - Alexanders will choose everything below the
prefix, the .*.* is more selective). If you want to you can also combine
it with the type category type pattern:
"com.nested.my.concurrent.*.*
&& is(InnerType)"
"com.nested.my.concurrent..*
&& is(InnerType)"
cheers,
Andy
On 2 April 2013 07:51, Alexander Kriegisch <Alexander@xxxxxxxxxxxxxx>
wrote:
com.nested.my.concurrent.*
No, this does neither capture inner classes nor classes
in subpackages. You can capture both with
com.nested.my.concurrent..*
If you need to be more specific, you can still concatenate
subconditions with "||".
Alexander Kriegisch
Am 02.04.2013 um 16:23 schrieb Jean Andre <Jean.Andre@xxxxxxxxxx>:
Hello Andy,
Thank you very much for your answer. I've studied your code. It does not
work from our side because we do not specify a particular class but all
classes from a specific packages. We use "com.nested.my.concurrent.*"
which means for us, If I do not make a mistake, all classes from this package
? and then also the inner classes. But it seems it does not work like this.
So the other question, does it mean we have to declare in a separate aspect
(physical file) to avoid such duplicate mixin because in the code below,
the class CiaWebThreadFactory
has 2 mixins - One from the "com.nested.my.concurrent.*"
and the second from "com.nested.my.concurrent.CiaWebThreadFactory.*"
Then does it means there is no syntax to targeted class and inner
class at the same time by specifying only "all.classes.from.this.package.*"
?
@Aspect
public class
LoggingConcurrentBehavior extends
LoggingBaseBehavior {
@DeclareMixin("com.nested.my.concurrent.*")
public
static
Loggable createLoggerDelegate(Object o) {
return
new
ServantLogger(o.getClass());
}
@DeclareMixin("com.nested.my.concurrent.CiaWebThreadFactory.*")
public
static
Loggable createLoggerDelegate2(Object o) {
return
new
ServantLogger(o.getClass());
}
Regards,
Jean ANDRÉ
De : Andy
Clement <andrew.clement@xxxxxxxxx>
A : aspectj-users@xxxxxxxxxxx,
Date : 2013-04-01
11:05
Objet : Re:
[aspectj-users] @DeclareMixin with inner class - Syntax ?
Envoyé par : aspectj-users-bounces@xxxxxxxxxxx
Sorry I didn't reply earlier, I was at eclipsecon. I tried to scaffold
your situation but it just works for me. Are you loadtime weaving
or compile time weaving? Here is my complete code:
=== CiaWebThreadFactory.java
package com.foo.bar;
public class CiaWebThreadFactory {
public static void main(String []argv) {
new CiaWebThreadGroup().foo();
System.out.println("works");
}
static class CiaWebThreadGroup {
public void foo() {
Loggable cwtg = ((Loggable)new CiaWebThreadGroup());
cwtg.log("hello");
}
}
}
=== Loggable.java
package com.foo.bar;
interface Loggable {
void log(String msg);
}
=== ServantLogger.java
package com.foo.bar;
class ServantLogger implements Loggable {
public ServantLogger(Class clazz) {
System.out.println("ServantLogger for "+clazz.getName());
}
public void log(String message) { System.out.println(message);}
}
=== LoggingConcurrentBehaviour.java
package com.foo.bar;
import org.aspectj.lang.annotation.*;
@Aspect
class LoggingConcurrentBehaviour {
//works: @DeclareMixin("com.foo.bar.CiaWebThreadFactory.CiaWebThreadGroup")
@DeclareMixin("com.foo.bar.CiaWebThreadFactory.*")
public static Loggable createLoggerDelegate(Object o) {
return new ServantLogger(o.getClass());
}
}
===
ajc -1.5 *.java -d . -showWeaveInfo
Mixing interface 'com.foo.bar.Loggable' (LoggingConcurrentBehaviour.java)
into type 'com.foo.bar.CiaWebThreadFactory$CiaWebThreadGroup' (CiaWebThreadFactory.java)
Type 'com.foo.bar.CiaWebThreadFactory$CiaWebThreadGroup' (CiaWebThreadFactory.java)
has intertyped method from 'com.foo.bar.LoggingConcurrentBehaviour' (LoggingConcurrentBehaviour.java:'void
com.foo.bar.Loggable.log(java.lang.String)')
and then when I run it:
java com.foo.bar.CiaWebThreadFactory
ServantLogger for com.foo.bar.CiaWebThreadFactory$CiaWebThreadGroup
hello
works
In terms of mixin pattern matching I was using:
@DeclareMixin("com.foo.bar.CiaWebThreadFactory.*")
and that was fine (as you can see from the weave info messages).
I tried AspectJ 1.7.2 and 1.6.12 - worked on both.
If you can perhaps edit my code to be more representative of your failing
sample, I could investigate further. I wouldn't be surprised if there were
inner class problems (I half expected my code to fail) but at the moment
I'm not having luck finding problems.
cheers
Andy
On 25 March 2013 10:07, Jean Andre <Jean.Andre@xxxxxxxxxx>
wrote:
Hello,
A quick question, is it possible to declare Mixin (@DeclareMixin)
in order to have it in inner class ? If yes, we have difficulty to find
the right syntax.
We use aspectJ 1.6.12 under WAS 8.0.0.3
Here is our stuff - The mixin is perform well for the class CiaWebThreadFactory
but not for the inner class. We have tried different syntax without
any success.
Any help ? - and if we have several inner class, is there a shortcu to
catch all of them in a single syntax ?
Thank you very much.
JA
===========================================
THE ANNOTATED ASPECT
===========================================
@Aspect
public class
LoggingConcurrentBehavior extends
LoggingBaseBehavior {
@DeclareMixin("com.intact.my.concurrent.*")
public
static
Loggable createLoggerDelegate(Object o) {
return
new
ServantLogger(o.getClass());
}
.....
}
package com.intact.my.concurrent;
====================================================
THE INNER CLASS TO CATCH WITH ASPECT
====================================================
public final
class
CiaWebThreadFactory implements
ThreadFactory {
/**
* The name of the thread group. e.g: CiaWebGroup
* @see
java.lang.ThreadGroup
*/
private
final
ThreadGroup threadGroup;
/**
.....
}
public
static
final class
CiaWebThreadGroup extends
ThreadGroup {
public
void
uncaughtException(Thread t, Throwable e) {
// AspectJ
point cut - Please, do not remove - Log4J here.
}
}
}
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
|