/** 
  *  模拟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;  
  }  
    
 }