com.googlecode.starflow.engine.handle.impl.ToolAppHandlerAdapter.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.starflow.engine.handle.impl.ToolAppHandlerAdapter.java

Source

/*
 * 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.googlecode.starflow.engine.handle.impl;

import java.lang.reflect.Method;

import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;

import com.googlecode.starflow.core.util.ApplicationContextHolder;
import com.googlecode.starflow.engine.ProcessEngineException;
import com.googlecode.starflow.engine.core.RelaDataManagerBuilder;
import com.googlecode.starflow.engine.core.data.RelaDataManager;
import com.googlecode.starflow.engine.event.AbstractFlowEvent;
import com.googlecode.starflow.engine.event.ActivityStartEvent;
import com.googlecode.starflow.engine.handle.BaseHandlerAdapter;
import com.googlecode.starflow.engine.model.ActivityInst;
import com.googlecode.starflow.engine.model.ProcessInstance;
import com.googlecode.starflow.engine.model.elements.ActivityElement;
import com.googlecode.starflow.service.spi.IToolAppAction;

/**
 * 
 * 
 * @author libinsong1204@gmail.com
 * @version 1.0
 */
public class ToolAppHandlerAdapter extends BaseHandlerAdapter {

    public void action(final ActivityStartEvent event, final ActivityInst activityInst) {
        ActivityElement activityXml = event.getProcessElement().getActivitys().get(activityInst.getActivityDefId());
        String beanName = activityXml.getExecuteAction();
        if (StringUtils.hasText(beanName)) {
            IAction action = new Action(beanName);
            action(event, activityInst, activityXml, action);
        } else {
            logger.warn("?{}", activityXml.getName());
        }
    }

    protected void saveResultRelaData(ActivityStartEvent event, Object result, ActivityElement activityXml) {
        //?
        if (result != null) {
            RelaDataManager relaDataManager = RelaDataManagerBuilder.buildRelaDataManager();
            long processInstId = event.getProcessInstance().getProcessInstId();
            String activityDefId = event.getPreActivityXml().getId();
            relaDataManager.bindAutoActLogicResult(processInstId, activityDefId, result);
        }
    }

    private static class Action implements IAction {
        private String beanName;

        public Action(String beanName) {
            this.beanName = beanName.trim();
        }

        @Override
        public Object execute(AbstractFlowEvent event, ActivityInst activityInst) {
            ProcessInstance cloneProcessInstance = new ProcessInstance();
            BeanUtils.copyProperties(event.getProcessInstance(), cloneProcessInstance);
            ActivityInst cloneActivityInst = new ActivityInst();
            BeanUtils.copyProperties(activityInst, cloneActivityInst);

            try {
                //beanName ????IToolAppAction.execute
                int index = beanName.indexOf("#");
                if (index == -1) {
                    IToolAppAction action = ApplicationContextHolder.getBean(beanName, IToolAppAction.class);
                    return action.execute(cloneProcessInstance, cloneActivityInst);
                } else {
                    //??bean
                    String methodName = beanName.substring(index + 1);
                    if ("".equals(beanName))
                        throw new ProcessEngineException(
                                "IToolAppAction Bean" + beanName + "??");

                    beanName = beanName.substring(0, index);
                    IToolAppAction action = ApplicationContextHolder.getBean(beanName, IToolAppAction.class);
                    try {
                        Method method = action.getClass().getMethod(methodName, ProcessInstance.class,
                                ActivityInst.class);
                        return method.invoke(action, cloneProcessInstance, cloneActivityInst);
                    } catch (Exception e) {
                        throw new ProcessEngineException(
                                "IToolAppAction Bean" + beanName + "", e);
                    }
                }
            } catch (Exception e) {
                throw new ProcessEngineException("", e);
            }
        }
    }
}