[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] nested calls

Hi all,
I've got the following Java interface:

public interface StatefullDatabaseObject extends DatabaseObject {
    public abstract boolean refresh() throws DatabaseException;
    public abstract boolean update() throws DatabaseException;
    public abstract boolean insert() throws DatabaseException;
    public abstract boolean delete() throws DatabaseException;

that implements a kind of CRUD support. I've got a few objects that implement 
such interface and that performs something like the following:

public class Person implements StatefullDatabaseObject {

   List<Skill> skills = ....				// skill is also a StatefullDatabaseObject 

    public boolean refresh() throws DatabaseException{
	// do something
	for(Skill s : skills)
             s.refresh();		// nested call

    public void addSkill(Skill s){
       if( s.insert() )
         this.skills.add(s);	// undirect call

here I've got what I call "nested calls", that is a StatefullDatabaseObject 
method that calls the same StatefullDatabaseObject method on another object, 
and undirect call, that is a not StatefullDatabaseObject method that calls a 
StatefullDatabaseObject method on another object. I want to refactor such 
code removing the undirect calls from within the method. So I designed a 
pointcut to catch calls like the one in the addSkill method:

pointcut nestedDatabaseOperation() : this(StatefullDatabaseObject)		
               // I want the call to be made within a StatefullDatabaseObject
    					 &&					// and
               // the callee must be another StatefullDatabaseObject
    					 &&					// and 
    		call( boolean StatefullDatabaseObject.*() throws DatabaseException)	
              // a method call to the main StatefullDatabaseObject methods
    					 &&					// and
    	      cflow(! call( boolean StatefullDatabaseObject.*() throws 
DatabaseException ) );
             // I'm not in a StatefullObject method

My aim is to capture with this aspect all the undirect calls, that are those 
performed from a StatefullDatabaseObject but not from a 
StatefullDatabaseObject.*() method, so to catch all calls like that in the 
addSkill method, while the weaver is advicing also the refresh method (that 
I'd like to catch with another aspect).
What am I doing wrong in the aspect declaration? Even if I use cflowbelow I 
still catch the refresh nested calls.