/**  
  *  模拟webwork的拦截器
  
*/   
 
import  java.util.ArrayList;  
 
import  java.util.Iterator;  
   
 
public   class  ActionInvocation {  
  
public   boolean  executed  =   false ;  
   
// 这个intercepters必须是成员变量
   protected  Iterator intercepters;  
   
  
public  String resultCode;  
   
  
public  String invoke()  throws  Exception {  
   
if  (executed) {  
    
throw   new  IllegalStateException( " Action has already executed " );  
   }  
   
   
if  (intercepters.hasNext()) { 
    
//  因为intercepters是类成员变量,所以递归执行到这里的时候,会执行一个Intercepter的intercept方法,知道都迭代完毕
    Intercepter intercepter  =  (Intercepter) intercepters.next(); 


    
// 递归  
    
//  here is recure point ,programm run to here  
    
//  then save the state into the stack ,and jump to the top of the method run again  
    
//  and so and so util the condition to else branch  
    resultCode  =  intercepter.intercept( this );  
      
   } 
else  {  
    resultCode 
=  invokeActionOnly();  
   }  
   
   
if  ( ! executed) {  
      
    System.out.println(
" now it is time to run the action, and this method should not run again!! " );  
    executed 
=   true ;  
   }  
   
return  resultCode;  
  }  
   
  
private  String invokeActionOnly() {  
   System.out.println(
" run invokeActionOnly()  " );  
   
//  invoke和intercept的递归的时候返回都将是这个值,所以这个返回值能够保存到最后,  
   
//  只是在两个方法之间被多次地传递  
    return   " here is action return value,it's the result; " ;  
  }  
   
  
public  ActionInvocation(){  
   ArrayList ay
= new  ArrayList();  
   ay.add(
new  Intercepter( 1 ));  
   ay.add(
new  Intercepter( 2 ));  
   ay.add(
new  Intercepter( 3 ));  
   intercepters
= ay.iterator();  
     
  }  
  
public   static   void  main(String[] args) {  
   ActionInvocation actionInvocation 
= new  ActionInvocation();  
   
try  {  
    System.out.println(actionInvocation.invoke());  
   } 
catch  (Exception e) {    
    e.printStackTrace();  
   }   
  }  
 } 



  public   class  Intercepter {  
  
private   int  id;  
  
public  Intercepter( int  id){  
   
this .id = id;  
  }  
    
  
public  String intercept(ActionInvocation actionInvocation)  throws  Exception {  
   String result 
=   null ;  
   System.out.println(
" run the intercept() " + this .id);  
   String resultCode
= actionInvocation.invoke();  
    System.out.println(
" after the action run,run the intercept continue   " + this .id);  
   
return  resultCode;  
  }  
    
 }