content: package com.alibaba.tamper.core.process;
  
  import java.util.List;
  
  import com.alibaba.tamper.core.BeanMappingException;
  import com.alibaba.tamper.core.introspect.GetExecutor;
  import com.alibaba.tamper.core.introspect.SetExecutor;
  
  /**
   * ValueProcess执行的get操作的控制器
   * 
   * @author jianghang 2011-5-30 上午07:44:02
   */
  public class ValueProcessInvocation {
  
      private ValueProcessContext context;          // valueProcess执行的上下文参数
      private List<ValueProcess>  processes;        // 处理的process列表
      private GetExecutor         getExecutor;      // get方法调用
      private SetExecutor         setExecutor;      // set方法调用
      private int                 currentIndex = -1; // 当前执行的valueProcess下标
  
      public ValueProcessInvocation(GetExecutor getExecutor, SetExecutor setExecutor, ValueProcessContext context,
                                    List<ValueProcess> processes){
          this.getExecutor = getExecutor;
          this.setExecutor = setExecutor;
          this.context = context;
          this.processes = processes;
      }
  
      /**
       * 获取初始value值
       */
      public Object getInitialValue() {
          return invokeGetExecutor();
      }
  
      public Object proceed(Object value) throws BeanMappingException {
          if (processes == null) { // 如果处理列表为空，则直接调用
              return invokeSetExecutor(value);
          } else {
              if (this.currentIndex == this.processes.size() - 1) {
                  return invokeSetExecutor(value);
              } else {
                  ValueProcess vp = this.processes.get(++this.currentIndex);
                  return vp.process(value, this);
              }
          }
  
      }
  
      /**
       * 执行GetExecutor
       */
      protected Object invokeGetExecutor() {
          if (isGetBatch()) { // 如果是batch模式
              return context.getHolder().getNext();
          }
  
          if (getExecutor != null) {
              return getExecutor.invoke(context.getParam().getSrcRef());
          } else {
              return null;
          }
      }
  
      /**
       * 执行SetExecutor
       */
      protected Object invokeSetExecutor(Object value) {
          if (isSetBatch()) { // 如果是batch模式
              context.getHolder().setObject(value); // 更新下holder的value值
              return value;
          }
  
          if (setExecutor != null) {
              return setExecutor.invoke(context.getParam().getTargetRef(), value);
          } else {
              return null;
          }
      }
  
      /**
       * 判断当前是否处于debug模式
       */
      public boolean isDebug() {
          return getContext().getBeanObject().getBehavior().isDebug();
      }
  
      /**
       * 判断一下是否处于get batch处理模式
       */
      private boolean isGetBatch() {
          return context.getBeanObject().isBatch() && context.getBeanObject().getGetBatchExecutor() != null;
      }
  
      /**
       * 判断一下是否处于set batch处理模式
       */
      private boolean isSetBatch() {
          return context.getBeanObject().isBatch() && context.getBeanObject().getSetBatchExecutor() != null;
      }
  
      // =================== get 操作===============
  
      public ValueProcessContext getContext() {
          return context;
      }
  
  }
  