Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] declare @method syntax - is composite signature allowed??

The algorithm used in situations like this is a kind of iterate to a
fixed point - starting with what you specify.  However I doubt we make
guarantees if the declare @methods interact with each other and are
specified in different source aspects.

> public * *..I*Dao+.getSql*(..) != public * *..I*Dao+.getSql(..).

seems odd.  I wonder what set of join points are matched by each
variant and how they overlap.

Andy

2009/10/27 Leyzerzon, Simeon <simeon.leyzerzon@xxxxxxxx>:
> Ah, looks like the following properly excludes the getSql() calls:
>
> public aspect CachingIntroduction {
>
>        declare @method: public * *..I*Dao+.set*(..): @NonCacheable;
>        declare @method: public * *..I*Dao+.getSql*(..): @NonCacheable;
>        declare @method: public * *..I*Dao+.getSql(..): @NonCacheable;
>        declare @method: !@NonCacheable public * *..I*Dao+.*(..):
>                 @Cacheable(modelId="fooModel");
>
> }
>
> so apparently in this case  public * *..I*Dao+.getSql*(..) != public * *..I*Dao+.getSql(..).
>
> I'm not sure it's by design on not ;)
>
> Thanks,
> Simeon
>
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Leyzerzon, Simeon [ICG-IT]
> Sent: Tuesday, October 27, 2009 2:55 PM
> To: 'aspectj-users@xxxxxxxxxxx'
> Subject: RE: [aspectj-users] declare @method syntax - is composite signature allowed??
>
> Andy,
>
> No, I haven't defined another marker interface as you correctly spotted so that's what was breaking it.  So NPE is gone, my bad.
>
> But now, after the following aspect:
>
> public aspect CachingIntroduction {
>
>        declare @method: public * *..I*Dao+.set*(..): @NonCacheable;
>        declare @method: public * *..I*Dao+.getSql*(..): @NonCacheable;
>        declare @method: !@NonCacheable public * *..I*Dao+.*(..):
>                 @Cacheable(modelId="fooModel");
>
> }
>
> is applied to something like this class:
>
>
> public class ExpenseBaseDao implements IGmaBaseDao {
>
> ...
>
>        public String getSql() {
>                return sql;
>        }
> ...
> }
>
> in the CrossRef view I'm seeing
>
>
>
> both for getSql:
>
>            CachingIntroduction.declare @method: !@com.citi.gdos.smart.applib.service.cache.NonCacheable public * *..I*Dao+.*(..) : @Cacheable(modelId = "fooModel")
>            CachingIntroduction.declare @method: public * *..I*Dao+.getSql*(..) : @NonCacheable
>
> Does it mean getSql() is annotated as both @Cacheable and @NonCacheable, could I apply some precedence here?
>
> Thanks,
> Simeon
>
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Andy Clement
> Sent: Tuesday, October 27, 2009 11:29 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: Re: [aspectj-users] declare @method syntax - is composite signature allowed??
>
> Hey,
>
> Any NPE from the compiler is a bug.  I presume you have defined the Setter annotation? (ie. it must exist as a definition in order to
> succeed)
>
> I raised this problem as https://bugs.eclipse.org/bugs/show_bug.cgi?id=293457
>
> Due to it failing in the hierarchy building code, it may behave better on the command line where the model does not get constructed.
>
> cheers,
> Andy
>
> 2009/10/27 Leyzerzon, Simeon <simeon.leyzerzon@xxxxxxxx>:
>> Hi Andy,
>>
>> Thanks for responding.  I tried the approach you are suggesting, unfortunately I'm getting the following:
>>
>> java.lang.NullPointerException
>> at
>> org.aspectj.ajdt.internal.core.builder.AsmHierarchyBuilder.visit(AsmHi
>> erarchyBuilder.java:548) at
>> org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.tr
>> averse(MethodDeclaration.java:214)
>> at
>> org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.trav
>> erse(TypeDeclaration.java:1246) at
>> org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDecla
>> ration.traverse(Compilatio ... oBuildJob.run(AutoBuildJob.java:238)
>> at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
>>
>> Compile error: NullPointerException thrown: null
>>
>>
>> Here's the aspect I'm using:
>>
>> package com.citi.gdos.smart.applib.service.cache;
>>
>> import org.springmodules.cache.annotations.Cacheable;
>>
>> public aspect CachingIntroduction {
>>
>>        declare @method: public * *..I*Dao+.set*(..): @Setter; declare @method: !@Setter public * *..I*Dao+.*(..):
>>                @Cacheable(modelId="fooModel");
>>
>> }
>>
>>
>> Am I doing something wrong?  Do I need a nightly build perhaps for this to work?
>>
>> Thanks,
>> Simeon
>>
>> -----Original Message-----
>> From: aspectj-users-bounces@xxxxxxxxxxx
>> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Andy Clement
>> Sent: Tuesday, October 27, 2009 9:58 AM
>> To: aspectj-users@xxxxxxxxxxx
>> Subject: Re: [aspectj-users] declare @method syntax - is composite signature allowed??
>>
>> Hi Simeon,
>>
>> This restriction you've uncovered was actually only recently raised as this enhancement:
>>
>> https://bugs.eclipse.org/bugs/show_bug.cgi?id=287613
>>
>> To support it I need to change the serialized form of the attributes - I try not to do this often but for other reasons (optimization) I may be changing the format in 1.6.7 so I will be looking at it in that timeframe.
>>
>>> declare @method :
>>>                public * *..I*Dao+.*(..) && !public * *..I*Dao+.set*(..):
>>>                        @Cacheable(modelId="fooModel");
>>
>> a clunky approach might be:
>>
>> declare @method: public * *..I*Dao+.set*(..): @Setter; declare @method: !@Setter public * *..I*Dao+.*(..):
>> @Cacheable(modelId="fooModel");
>>
>> but I know that's not great...
>>
>> Andy
>>
>> 2009/10/26 Leyzerzon, Simeon <simeon.leyzerzon@xxxxxxxx>:
>>> I have a hierarchy of DAO classes into which I'm introducing an @Cacheable annotation via something like this:
>>>
>>> declare @method :
>>>                public * *..I*Dao+.*(..) :
>>>                        @Cacheable(modelId="fooModel");
>>>
>>> The problem is, we need to filter out more than is specified by this one signature pattern, and I'm not sure that a composite pattern is allowed in this type of expression.  When I tried something like this:
>>>
>>> declare @method :
>>>                public * *..I*Dao+.*(..) && !public * *..I*Dao+.set*(..):
>>>                        @Cacheable(modelId="fooModel");
>>>
>>> I'm getting compile errors saying:
>>>
>>> Syntax error on token "&&", ";" expected
>>>
>>> I also tried to define composite pointcuts representing the joint points I'm interested in (basically I want to exclude 'jdbcTemplate' and 'slq' Spring specific setters from the places where annotation is introduced) but declaration syntax doesn't seem to like it either.
>>>
>>> What would be a good approach in the use case I described?
>>>
>>> I'm using compile time weaving via Ant.  AspectJ version is 1.6
>>>
>>> Thank you in advance,
>>> Simeon
>>>
>>> _______________________________________________
>>> 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
>


Back to the top