Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] How to capture a series of related joinpoints?

Hi! I'm a new AspectJ user and I'm struggling with trying to figure out how to capture a "transaction" as a series of related joinpoints.

Imagine a method:

void addActivities() {
 Account a = new Account();
 a.addActivity("Woke up");
 a.addActivity("Went to work"):
 a.addActivity("Ate lunch"):
 a.addActivity("Went home"):
}

What I want to do is encapsulate the 4 calls to addActivity() into a single transaction. Then I can (for example) open a session at the first call, and close it at the final call. This allows me to avoid opening and closing multiple sessions.

Initially I thought I could use cflowbelow for this, believing that it meant "below" in the current method. My code looked like this:

public aspect ActivityTransaction {
 pointcut InsertActivity(String s): call(void addActivity(String))
                                 && target(Account)
                                 && args(s);
 pointcut StartActivityTransaction(): InsertActivity(String)
                                   && !cflowbelow(InsertActivity(String));

 after(String s) returning : InsertActivity(s) {
   System.out.println("  inserted: " + s);
 }

 void around() : StartActivityTransaction() {
   System.out.println("Activity Transaction Started: " + new Date());
   proceed();
   System.out.println("Activity Transaction Ended:   " + new Date());
 }

However, it calls the around advice on all 4 addActivity() calls. So, now understanding that cflowbelow means "below" in the stacktrace, I'm trying to figure out another method to group these related calls from a single parent method invocation.

Is there a way to do this in AspectJ? It seems to me (from my naive newbie point of view) to be a valid sort of thing to want to
do.

Thanks for any help!


Back to the top