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

Reply via email to