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