Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] cflowbelow and capturing context

Same program in annotation style, it works too...

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
import java.util.List;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Retention(RetentionPolicy.RUNTIME)
@interface RuleSet {
}

@Retention(RetentionPolicy.RUNTIME)
@interface Category {
}

@Aspect
class Watcher {
	@Pointcut("execution(public java.util.List<Health> getHealth(AggregateInfo))")
	public void computationOfHealth() {
	}

	@Before("computationOfHealth()")
	public void before1() {
		System.out.println("advice on getHealth");
	}

	@Pointcut("execution(@Category * *(..)) &&
cflowbelow(computationOfHealth()) && @annotation(category)")
	public void category(Category category) {
	}

	@Before("category(category)")
	public void before2(Category category) {
		System.out.println("advice on @Category tagged method running in
cflow of getHealth");
		System.out.println("category=" + category);
	}

	@Pointcut("execution(@RuleSet * *(..)) && cflowbelow(category(c)) &&
@annotation(rs)")
	public void ruleset(RuleSet rs, Category c) {
	}

	@Before("ruleset(rs,c)")
	public void before3(RuleSet rs, Category c) {
		System.out
				.println("advice on @RuleSet tagged method running in cflow of
something tagged @Category which is in the cflow of getHealth");
		System.out.println("ruleset=" + rs + " category=" + c);
	}

}

public class AA {

	@Category
	public void computationMethod() {
		System.out.println("@Category tagged method running");
		doSomething();
	}

	@RuleSet
	public void doSomething() {
		System.out.println("@RuleSet tagged method running");
	}

	public List<Health> getHealth(AggregateInfo ai) {
		System.out.println(">getHealth");
		doSomething(); // not advised, not in the cflow of an @Category tagged thing
		computationMethod(); // called in the cflow of getHealth()
		doSomething(); // not advised, not in the cflow of an @Category tagged thing
		System.out.println(">getHealth");
		return Collections.emptyList();
	}

	public static void main(String[] args) {
		AA aa = new AA();
		aa.computationMethod();
		Object o = aa.getHealth(null);
	}
}

class AggregateInfo {
}

class Health {
}

Andy

On 21 May 2010 15:14, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
> This complete program works for me.  Can you perhaps try code style
> instead of annotation style?
> The pointcut is as I wrote in my previous email.
>
> ---
> import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.util.Collections;
> import java.util.List;
>
> @Retention(RetentionPolicy.RUNTIME)
> @interface RuleSet {}
>
> @Retention(RetentionPolicy.RUNTIME)
> @interface Category {}
>
> aspect Watcher {
>        pointcut computationOfHealth(): execution(public List<Health>
> getHealth(AggregateInfo));
>
>        before(): computationOfHealth() {System.out.println("advice on getHealth");}
>
>        pointcut category(Category category): execution(@Category * *(..)) &&
> cflowbelow(computationOfHealth()) && @annotation(category);
>
>        before(Category category): category(category) {
>                System.out.println("advice on @Category tagged method running in
> cflow of getHealth");
>                System.out.println("category="+category);
>        }
>
>        pointcut ruleset(RuleSet rs, Category c): execution(@RuleSet * *(..))
> && cflowbelow(category(c)) && @annotation(rs);
>
>        before(RuleSet rs, Category c): ruleset(rs,c) {
>                System.out.println("advice on @RuleSet tagged method running in
> cflow of something tagged @Category which is in the cflow of
> getHealth");
>                System.out.println("ruleset="+rs+" category="+c);
>        }
>
> }
>
> public class AA {
>
>        @Category
>        public void computationMethod() {
>                System.out.println("@Category tagged method running");
>                doSomething();
>        }
>
>        @RuleSet
>        public void doSomething() {
>                System.out.println("@RuleSet tagged method running");
>        }
>
>        public List<Health> getHealth(AggregateInfo ai) {
>                System.out.println(">getHealth");
>                doSomething(); // not advised, not in the cflow of an @Category tagged thing
>                computationMethod(); // called in the cflow of getHealth()
>                doSomething(); // not advised, not in the cflow of an @Category tagged thing
>                System.out.println(">getHealth");
>                return Collections.emptyList();
>        }
>
>        public static void main(String[] args) {
>                AA aa = new AA();
>                aa.computationMethod();
>                Object o = aa.getHealth(null);
>        }
> }
>
> class AggregateInfo {}
> class Health {}
> ---
>
> Andy
>
> On 21 May 2010 14:20, Bhaskar Maddala <maddalab@xxxxxxxxx> wrote:
>> I thought I did try that, however I did again just to be certain
>>
>>     [iajc] error at AuditorPointcutCaptures.java::0 incompatible
>> number of arguments to pointcut, expected 2 found 0
>>
>>    It is interesting that I get a similar error
>>
>>    [iajc] [error   0]: error at audit/AuditorPointcutCaptures.java::0
>> incompatible number of arguments to pointcut, expected 1 found 0
>>
>>   when I try
>>   @Pointcut("execution(@RuleSet * *(..)) && @annotation(rs)")
>>   public void ruleset(RuleSet rs) {
>>   }
>>
>>   But I cannot track that down either and this
>>
>>   @Pointcut("execution(@Category * *(..)) &&
>> cflowbelow(computationOfHealth()) && @annotation(category)")
>>   public void category(Category category) {
>>   }
>>
>>   works fine, so I am flummoxed.
>>
>> -Bhaskar
>>
>>
>> On Fri, May 21, 2010 at 2:10 PM, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
>>> I haven't tried out this code in a real testcase, but perhaps
>>> something like this:
>>>
>>> @Pointcut("execution(@RuleSet * *(..)) && cflowbelow(category(c)) &&
>>> @annotation(rs)")
>>> public void ruleset(RuleSet rs, Category c) {
>>>
>>> Andy
>>>
>>> On 21 May 2010 13:56, Bhaskar Maddala <maddalab@xxxxxxxxx> wrote:
>>>> Hello,
>>>>
>>>>    I am trying to write a few point cuts and capture context and am
>>>> having trouble capturing the necessary context
>>>>
>>>>    Capture the execution pointcut for the Calculation.getHealth JP
>>>> method invocation
>>>>    @Pointcut("execution(public java.util.List<metrics.Health>
>>>> metrics.Calculation.getHealth(metrics.AggregateInfo))")
>>>>    public void computationOfHealth() {
>>>>    }
>>>>
>>>>    execution of any methods with the @Category annotation in the
>>>> cflowbelow computationOfHealth capture the annotation
>>>>    @Pointcut("execution(@Category * *(..)) &&
>>>> cflowbelow(computationOfHealth()) && @annotation(category)")
>>>>    public void category(Category category) {
>>>>    }
>>>>
>>>>   Require help here-
>>>>   execution of any methods with the @RuleSet annotation in the
>>>> cflowbelow category
>>>>   I would like to capture the ruleset (and if possible) the Category annotation
>>>>   @Pointcut("execution(@RuleSet * *(..)) &&
>>>> cflowbelow(category(Category)) && @annotation(rs)")
>>>>    public void ruleset(RuleSet rs) {
>>>>    }
>>>>
>>>>   I have tried a couple of different options
>>>>
>>>>   Not what I want but worth a shot
>>>>   @Pointcut("execution(@RuleSet * *(..)) && @annotation(rs)")
>>>>   and
>>>>   @Pointcut("execution(@RuleSet * *(..)) &&
>>>> cflowbelow(category(Category)) && @annotation(rs)")
>>>>    with the error message
>>>>     [iajc] MessageHolder:  (6 weaveinfo)  (530 info)  (1 error)
>>>>     [iajc] [error   0]: error at
>>>> audit/AuditorPointcutCaptures.java::0 incompatible number of arguments
>>>> to pointcut, expected 1 found 0
>>>>
>>>>     Assistance much appreciated.
>>>>
>>>> Thanks
>>>> Bhaskar
>>>> _______________________________________________
>>>> 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