Thanks Andy, I will try out a few different things and let you know. I guess I had figured since this was all being done at compile time, it would look at the compiled class (once the ITD was already woven in) and then see that the compiled class had the @RequiredUserDetails in it. I didn't realize that it was looking at the aspect first to determine how/where to weave in the extra code.
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