The expression (@RequiredUserDetails *) means "any type that is annotated with @RequiredUserDetails".
The full expression (color-coded if you can see it) execution(* (@RequiredUserDetails *).*(..)) means "the execution of any method returning anything on any type annotated with @RequiredUserDetails" will be advised. HTH, Matthew On Thu, May 1, 2014 at 1:09 PM, Eric B <ebenza...@gmail.com> wrote: > Hi Andy, > > > Now instead of that what you can do is not use @within - this is not > ideal but I'm just mentioning it - change annotatedClass() to: > > > "execution(* (@RequiredUserDetails *).*(..))" > > Seems to work great. Although I have to admit that I am not entirely > sure as to why/how that pointcut works. How is that picking up everything > that is in an annotated class? > > I'm not sure what or how (@RequiredUserDetails *) picks up the right > pointcut? > > Thanks, > > Eric > > > > On Mon, Apr 21, 2014 at 7:28 PM, Andy Clement <andrew.clem...@gmail.com>wrote: > >> I found a few mins. >> >> So within() is a lexical thing. Your pointcut is: >> >> "testMethod() && (annotatedClass() || annotatedMethod()" >> >> The testMethod() part is matching but neither of the other two are. That >> is because the ITD'd method is not within the target, it is 'within' the >> declared aspect. So doing @within(RequiredUserDetails) isn't going to >> match because the aspect doesn't have @RequiredUserDetails on. Now you >> could add it to confirm what I'm saying but then you'll hit a real bug if >> you try. The use of privileged in the aspect declaration is breaking >> support for annotations on the aspect, so to confirm what I'm saying, add >> @RequiredUserDetails and remove the 'privileged' word. >> >> Now instead of that what you can do is not use @within - this is not >> ideal but I'm just mentioning it - change annotatedClass() to: >> >> "execution(* (@RequiredUserDetails *).*(..))" >> >> cheers, >> Andy >> >> >> >> On 21 April 2014 14:42, Andy Clement <andrew.clem...@gmail.com> wrote: >> >>> Hi, >>> >>> Sorry, I just haven't had a chance to have a look. Probably worth >>> logging an AspectJ bug in bugzilla so it is appropriately tracked as an >>> issue. >>> >>> cheers, >>> Andy >>> >>> >>> On 17 April 2014 21:44, Eric B <ebenza...@gmail.com> wrote: >>> >>>> Hi Andy, >>>> >>>> Have you had a chance to look at this at the sample application at all ( >>>> https://github.com/benze/AspectJUnitTestError)? Is this an aspectJ >>>> bug or a limitation? Or am I doing something wrong? >>>> >>>> Thanks, >>>> >>>> Eric >>>> >>>> >>>> On Thu, Apr 10, 2014 at 3:08 PM, Eric B <ebenza...@gmail.com> wrote: >>>> >>>>> Hi Andy, >>>>> >>>>> I've created a sample application that demonstrates this problem. >>>>> I've uploaded it to GitHub. I pulled this from a working project, but >>>>> have tried to make it as simple & basic as possible to illustrated the >>>>> problem. You can find it here: >>>>> https://github.com/benze/AspectJUnitTestError.git >>>>> >>>>> Basically, the pointcut is supposed to advise any methods in a class >>>>> that is annotated with my custom annotation and the @Test annotation. In >>>>> the *Roo*.aj aspect, a @Test method is crosscut into the class and yet the >>>>> advice is not called for that method. >>>>> >>>>> You can quickly see that the test for the crosscut method fails. >>>>> >>>>> Please let me know if you have any questions. >>>>> >>>>> Thanks, >>>>> >>>>> Eric >>>>> >>>>> >>>>> >>>>> On Fri, Apr 4, 2014 at 2:17 PM, Andy Clement <andrew.clem...@gmail.com >>>>> > wrote: >>>>> >>>>>> I presume all these aspects are being compiled together with the >>>>>> code. You shouldn't have to worry about that order the aspects are >>>>>> applied >>>>>> in - yes there are ITDs but the weaver considers the system as a whole >>>>>> and >>>>>> will apply the aspects to ITD'd methods as well as existing methods: >>>>>> >>>>>> public class Code { >>>>>> public void moo(String s) {} >>>>>> } >>>>>> >>>>>> aspect X { >>>>>> public void Code.boo(String s) {} >>>>>> } >>>>>> >>>>>> aspect Y { >>>>>> before(): execution(* *(String)) {} >>>>>> } >>>>>> >>>>>> > ajc -showWeaveInfo Code.java X.java Y.java >>>>>> >>>>>> Join point 'method-execution(void Code.boo(java.lang.String))' in >>>>>> Type 'X' (X.java:2) advised by before advice from 'Y' (Y.java:2) >>>>>> Type 'Code' (Code.java) has intertyped method from 'X' (X.java:'void >>>>>> Code.boo(java.lang.String)') >>>>>> Join point 'method-execution(void Code.moo(java.lang.String))' in >>>>>> Type 'Code' (Code.java:2) advised by before advice from 'Y' (Y.java:2) >>>>>> >>>>>> Precedence only affects advice, not ITDs. The advice is being applied >>>>>> to the ITDs, not to what you imagine is happening under the covers (the >>>>>> methods being stuffed into the target, hence you think you need to get >>>>>> that >>>>>> done first). All ITDs (and declares) are processed to ensure the type >>>>>> system is coherent and then the advice is applied. >>>>>> >>>>>> I feel like we used to have problems in this area but I thought they >>>>>> were all fixed up. Worth raising an AspectJ issue. If you can provide a >>>>>> simple test case that shows it failing (unlike mine which shows it >>>>>> working) >>>>>> that would be really useful. Maybe if any of the annotations you are >>>>>> triggering on are being applied by declare, try putting them directly on >>>>>> the methods of interest and temporarily removing the declare - does that >>>>>> make a difference. It may be the interplay between declare/itd and >>>>>> advice. >>>>>> >>>>>> cheers, >>>>>> Andy >>>>>> >>>>>> >>>>>> >>>>>> On 3 April 2014 18:37, Eric B <ebenza...@gmail.com> wrote: >>>>>> >>>>>>> I'm using Roo and Compile Time Weaving for my application. One of >>>>>>> the classes that Roo has generated is my `UserIntegrationTest`: >>>>>>> >>>>>>> @RooIntegrationTest(entity = User.class) >>>>>>> @WebAppConfiguration >>>>>>> @ActiveProfiles("test") >>>>>>> @DirtiesContext >>>>>>> @RequiredUserDetails(roles=Role.ROOT) >>>>>>> public class UserIntegrationTest { >>>>>>> @Test >>>>>>> public void myTestMethod(){ >>>>>>> >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> >>>>>>> Most of the code is all in the Roo generated ITD: >>>>>>> >>>>>>> privileged aspect UserIntegrationTest_Roo_IntegrationTest { >>>>>>> >>>>>>> declare @type: UserIntegrationTest: >>>>>>> @RunWith(SpringJUnit4ClassRunner.class); >>>>>>> >>>>>>> declare @type: UserIntegrationTest: >>>>>>> @ContextConfiguration(locations = >>>>>>> "classpath*:/META-INF/spring/applicationContext*.xml"); >>>>>>> >>>>>>> declare @type: UserIntegrationTest: @Transactional; >>>>>>> >>>>>>> @Autowired >>>>>>> UserDataOnDemand UserIntegrationTest.dod; >>>>>>> >>>>>>> @Autowired >>>>>>> UserService UserIntegrationTest.userService; >>>>>>> >>>>>>> @Autowired >>>>>>> UserRepository UserIntegrationTest.userRepository; >>>>>>> >>>>>>> @Test >>>>>>> public void UserIntegrationTest.testCountAllUsers() { >>>>>>> Assert.assertNotNull("Data on demand for 'User' failed >>>>>>> to initialize correctly", dod.getRandomUser()); >>>>>>> long count = userService.countAllUsers(); >>>>>>> Assert.assertTrue("Counter for 'User' incorrectly >>>>>>> reported there were no entries", count > 0); >>>>>>> } >>>>>>> >>>>>>> ... >>>>>>> ... >>>>>>> ... >>>>>>> >>>>>>> } >>>>>>> >>>>>>> >>>>>>> I've written my own aspect to handle my `@RequiredUserDetails` >>>>>>> annotation. My pointcut specifies any `@Test` method in a class that is >>>>>>> annotated with `@RequiredUserDetails`. Although the pointcut works fine >>>>>>> for any methods declared in the main class (ie: `MyTestMethod()`), it >>>>>>> does >>>>>>> not pick up any of the methods in the ITD. >>>>>>> >>>>>>> @Aspect >>>>>>> public class RequiredUserDetailsAspect { >>>>>>> /** >>>>>>> * Defines any public <code>@Test</code> method >>>>>>> */ >>>>>>> @Pointcut("execution(public * *(..)) && >>>>>>> @annotation(org.junit.Test)") >>>>>>> public void testMethod() {}; >>>>>>> >>>>>>> /** >>>>>>> * Anything with the {@link RequiredUserDetails} annotation on >>>>>>> the method >>>>>>> */ >>>>>>> @Pointcut("@annotation(RequiredUserDetails)") >>>>>>> public void annotatedMethod(){}; >>>>>>> >>>>>>> /** >>>>>>> * Anything with the {@link RequiredUserDetails} annotation on >>>>>>> the class >>>>>>> */ >>>>>>> @Pointcut("@within(RequiredUserDetails)") >>>>>>> public void annotatedClass(){}; >>>>>>> >>>>>>> >>>>>>> @Before("testMethod() && (annotatedClass() || >>>>>>> annotatedMethod())") >>>>>>> public void authenticateUser(JoinPoint jp){ >>>>>>> // check for any class annotations >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> >>>>>>> I would have expected that given Roo ITDs are being CTW, my aspect >>>>>>> would apply to those methods as well. I am presuming that my aspect is >>>>>>> woven before the Roo aspect and consequently doesn't see Roo's ITDs as >>>>>>> part >>>>>>> of my class. >>>>>>> >>>>>>> Is there a way to either ensure that Roo's ITDs are woven before my >>>>>>> own aspects or to ensure that my pointcut applies to the Roo ITDs as >>>>>>> well? >>>>>>> >>>>>>> I've tried adding `@DeclarePrecedence` to the top of the aspect, but >>>>>>> either it is not working as I hoped, or I have it defined incorrectly >>>>>>> as it >>>>>>> has made no difference. >>>>>>> >>>>>>> @Aspect >>>>>>> @DeclarePrecedence("**.*Roo*, RequiredUserDetailsAspect") >>>>>>> public class RequiredUserDetailsAspect { >>>>>>> ... >>>>>>> ... >>>>>>> } >>>>>>> >>>>>>> >>>>>>> Thanks! >>>>>>> >>>>>>> Eric >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> aspectj-users mailing list >>>>>>> aspectj-users@eclipse.org >>>>>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> aspectj-users mailing list >>>>>> aspectj-users@eclipse.org >>>>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>>>>> >>>>>> >>>>> >>>> >>>> _______________________________________________ >>>> aspectj-users mailing list >>>> aspectj-users@eclipse.org >>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>>> >>>> >>> >> >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@eclipse.org >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> > > > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > -- mailto:matt...@matthewadams.me <matt...@matthewadams.me> skype:matthewadams12 googletalk:matt...@matthewadams.me http://matthewadams.me http://www.linkedin.com/in/matthewadams
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users