Bug 345515

Summary: Pass information from match side to new annotation in declare statement
Product: [Tools] AspectJ Reporter: howard.adam
Component: CompilerAssignee: aspectj inbox <aspectj-inbox>
Status: NEW --- QA Contact:
Severity: enhancement    
Priority: P3 CC: frank.pavageau
Version: unspecified   
Target Milestone: ---   
Hardware: All   
OS: All   
Whiteboard:

Description howard.adam CLA 2011-05-11 23:47:36 EDT
I have discovered a pattern in my JPA mappings that I would like to codify. A simple example follows:

    @OneToMany(fetch=FetchType.EAGER)
    @Sort(type=SortType.NATURAL)
    private SortedSet<Item> items;

I would like to create a single annotation called SortedOneToMany that I can apply to the above set:

    public @interface SortedOneToMany {
        FetchType fetch() default EAGER;
        SortType sort() default NATURAL;
        Class comparator() default void.class;
    }

I have written the following aspect to "attach" the JPA annotations whenever it sees my annotation:

    public aspect SortedOneToManyAspect {
        declare @field: @SortedOneToMany * * : @OneToMany(fetch=FetchType.EAGER);
        declare @field: @SortedOneToMany * * : @Sort(type=SortType.NATURAL);
    }

But I don't know how can I access the values of the SortedOneToMany annotation parameters and use them when defining the OneToMany and Sort annotations. There may be cases where I want to change one of the default values like so:

    @SortedOneToMany(sort=SortType.COMPARATOR,comparator=ItemComparator.class)
    private SortedSet<Item> items;

So how can I pass the annotation values from SortedOneToMany to the Sort annotation?

Hypothetical syntax from Andy Clement:

declare @field:
    @SortedOneToMany(sort=SortType.COMPARATOR,comparator={1}) * * :
    @Sort(type=SortType.COMPARATOR,comparator={1});