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 <[email protected]>: > 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: [email protected] > [mailto:[email protected]] On Behalf Of Leyzerzon, Simeon > [ICG-IT] > Sent: Tuesday, October 27, 2009 2:55 PM > To: '[email protected]' > 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: > [email protected] 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: [email protected] > [mailto:[email protected]] On Behalf Of Andy Clement > Sent: Tuesday, October 27, 2009 11:29 AM > To: [email protected] > 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 <[email protected]>: >> 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: [email protected] >> [mailto:[email protected]] On Behalf Of Andy Clement >> Sent: Tuesday, October 27, 2009 9:58 AM >> To: [email protected] >> 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 <[email protected]>: >>> 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 >>> [email protected] >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>> >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> _______________________________________________ >> aspectj-users mailing list >> [email protected] >> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ > aspectj-users mailing list > [email protected] > https://dev.eclipse.org/mailman/listinfo/aspectj-users > _______________________________________________ aspectj-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/aspectj-users
