I'm getting near to the solution, but I've got still a few problems. First of 
all the pointcut:

 pointcut lazyLoaderRequired( LazyLoading loadingProperties, FilteredLoader 
mySelf ) : 
      (  get( @LazyLoading Collection<SerializableObject+>+ 
SerializableObject+.* )         
       ||                               
          get( @LazyLoading Map<SerializableObject+, DatabaseObject+>+ 
SerializableObject+.* )
      )
     &&
     @annotation( loadingProperties )
     && 
     this( mySelf )
     &&
     (! execution( public void FilteredLoader.loadFilteredData(Class) ) ) ;

so I catch any access to a variable that is a plain collection or a map that 
has been annotated with @LazyLoading. This works, so I've got the following 
advice:

before( LazyLoading loadingProperties, FilteredLoader mySelf) : 
lazyLoaderRequired( loadingProperties, mySelf){
        
        // get the annotation properties
        Class requiredType = loadingProperties.type();
        
        
        
        try{
            // load the data only if it has not already been loaded or I must 
override the loaded
            // data
            if( (! this.loadingMap.containsKey(mySelf) ) || 
                (  loadingProperties.alwaysReload() && 
this.loadingMap.containsKey(mySelf) ) 
){
                mySelf.loadFilteredData(requiredType);
                this.loadingMap.put(mySelf, requiredType);
                System.out.println("Lazy loading for the type " + requiredType 
+ " " + 
mySelf);
            }
            else{
                System.out.println("not loading " + requiredType + " " + 
mySelf);
            }
        }catch(Exception e){
            Logger.exception("Exception caught while performing the lazy 
loading 
within the aspect", e);
        }
    }

So I got the Class type of the collection I need to load, and invoke the 
loadFilteredData on the target. The problem is that there's an infinite 
recursion. The loadFilteredData method is the following:

 public void loadFilteredData(Class type) throws DatabaseException{
        // check what kind of data should I load
        if( type == null )
            return;
        
        try{
            if( type.equals(Skill.class) ){
                // load the skills
                this.refreshSkills();
            }
            else
                if( type.equals(Role.class) ){
                    // load the roles
                    this.refreshRoles();
                }
                else
                    if( type.equals(KnowledgeLevel.class) ){
                        // load the knowledge level
                        this.refreshHires();
                    }
                    else
                        if( type.equals(Hire.class) ){
                            // load the hires
                            this.refreshHires();
                        }
        }catch(SQLException e){
            Logger.exception("Exception caught while loading filtered data", e);
            throw new DatabaseException("Exception caught while loading 
filtered data 
of type " + type);
        }
    }


I guess the problem is in the loadFIlteredData method, that invokes another 
method (e.g., refreshSkills()) that access a variable that is annotated with 
@LazyLoading, and so there's the recursion. How should I avoid the recursion, 
so excluding everything that happens since loadFilteredData ahead?

Thanks,
Luca


_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to