Package com.starflow.wf.engine.event.support

Source Code of com.starflow.wf.engine.event.support.ActivityStartRuleUtil

/*
* Copyright 2010-2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.starflow.wf.engine.event.support;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;

import com.starflow.wf.core.util.ApplicationContextHolder;
import com.starflow.wf.engine.ProcessEngineException;
import com.starflow.wf.engine.core.Constants;
import com.starflow.wf.engine.event.AbstractFlowEvent;
import com.starflow.wf.engine.model.ActivityInst;
import com.starflow.wf.engine.model.ProcessInstance;
import com.starflow.wf.engine.model.elements.ActivityElement;
import com.starflow.wf.service.spi.IActivateRuleAction;

public class ActivityStartRuleUtil {
  private static Logger logger = LoggerFactory.getLogger(ActivityStartRuleUtil.class);
 
  /**
   * 获取环节的激活规则
   *
   * @param event
   * @return
   */
  public static boolean isStartActivity(AbstractFlowEvent event, ActivityInst activityInst) {
    boolean isStart = true;
    ActivityElement activityXml = event.getProcessXml().getActivitys().get(activityInst.getActivityDefId());
   
    if(logger.isDebugEnabled()) {
      logger.debug("环节【{}】启动规则:{}", activityXml.getName(), activityXml.getActivateRuleType());
    }
   
    if(Constants.ACT_ACTIVATE_RULE_WAIT.equalsIgnoreCase(activityXml.getActivateRuleType()))
      isStart = false;
    else if(Constants.ACT_ACTIVATE_RULE_LOGIC.equalsIgnoreCase(activityXml.getActivateRuleType())) {
      String beanName = activityXml.getStartStrategybyAppAction();
     
      try {
        ProcessInstance cloneProcessInstance = new ProcessInstance();
        BeanUtils.copyProperties(event.getProcessInstance(), cloneProcessInstance);
        ActivityInst cloneActivityInst = new ActivityInst();
        BeanUtils.copyProperties(activityInst, cloneActivityInst);
        isStart = executeActivateRule(beanName, cloneProcessInstance, cloneActivityInst);
      } catch (Exception e) {
        throw new ProcessEngineException("环节激活规则逻辑失败", e);
      }
    }
     
    return isStart;
  }
 
  /**
   * 执行环节激活规则逻辑
   * @param beanName
   * @param cloneProcessInstance
   * @param cloneActivityInst
   * @return
   */
  private static boolean executeActivateRule(String beanName, ProcessInstance cloneProcessInstance, ActivityInst cloneActivityInst) {
    boolean isStart = true;
   
    try {
      //beanName 名称后面没有指定调用方法时。直接调用IToolAppAction.execute
      int index = beanName.indexOf("#");
      IActivateRuleAction action = ApplicationContextHolder.getBean(beanName, IActivateRuleAction.class);
      if(index == -1) {
        isStart = action.execute(cloneProcessInstance, cloneActivityInst);
      } else {
        //反射调用bean指定的方法。
        String methodName = beanName.substring(index + 1);
        if("".equals(beanName))
          throw new ProcessEngineException("IActivateRuleAction 实现类Bean:"+beanName+",没有指定方法名称");
       
        beanName = beanName.substring(0, index);
        try {
          Method method = action.getClass().getMethod(methodName, long.class, long.class);
          isStart = (Boolean)method.invoke(action, cloneProcessInstance, cloneActivityInst);
        } catch (Exception e) {
          throw new ProcessEngineException("IActivateRuleAction 实现类Bean:"+beanName+",没有此方法", e);
        }
      }
    } catch (Exception e) {
      throw new ProcessEngineException("环节激活规则逻辑执行失败", e);
    }
    return isStart;
  }
}
TOP

Related Classes of com.starflow.wf.engine.event.support.ActivityStartRuleUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.