/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License v3 as published by the Free Software
* Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, see http://www.gnu.org/licenses/lgpl.html.
*
*/
package org.fireflow.pdl.fpdl.test.wfcontrolpattern;
import java.util.List;
import org.fireflow.FireWorkflowJunitEnviroment;
import org.fireflow.client.WorkflowQuery;
import org.fireflow.client.WorkflowSession;
import org.fireflow.client.WorkflowSessionFactory;
import org.fireflow.client.WorkflowStatement;
import org.fireflow.client.query.Order;
import org.fireflow.client.query.Restrictions;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.ActivityInstanceProperty;
import org.fireflow.engine.entity.runtime.ProcessInstance;
import org.fireflow.engine.entity.runtime.ProcessInstanceState;
import org.fireflow.engine.exception.InvalidOperationException;
import org.fireflow.engine.exception.WorkflowProcessNotFoundException;
import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem;
import org.fireflow.model.InvalidModelException;
import org.fireflow.model.misc.Duration;
import org.fireflow.pdl.fpdl.misc.FpdlConstants;
import org.fireflow.pdl.fpdl.process.SubProcess;
import org.fireflow.pdl.fpdl.process.WorkflowProcess;
import org.fireflow.pdl.fpdl.process.impl.ActivityImpl;
import org.fireflow.pdl.fpdl.process.impl.EndNodeImpl;
import org.fireflow.pdl.fpdl.process.impl.StartNodeImpl;
import org.fireflow.pdl.fpdl.process.impl.TransitionImpl;
import org.fireflow.pdl.fpdl.process.impl.WorkflowProcessImpl;
import org.fireflow.pvm.kernel.Token;
import org.fireflow.pvm.kernel.TokenProperty;
import org.fireflow.pvm.kernel.TokenState;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
/**
*
* @author 非也 nychen2000@163.com
* Fire Workflow 官方网站:www.firesoa.com 或者 www.fireflow.org
*
*/
public class TheSimplestTest2 extends FireWorkflowJunitEnviroment{
protected static final String processName = "TheSimplestSquenceProcess";
protected static final String processDisplayName = "最简单的测试流程";
protected static final String description = "一个最简单的顺序流程,没有绑定服务和resource";
protected static final String bizId = "ThisIsAJunitTest";
@Test
public void testStartProcess(){
final WorkflowSession session = WorkflowSessionFactory.createWorkflowSession(fireflowRuntimeContext,FireWorkflowSystem.getInstance());
final WorkflowStatement stmt = session.createWorkflowStatement(FpdlConstants.PROCESS_TYPE_FPDL20);
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
//构建流程定义
WorkflowProcess process = getWorkflowProcess();
//启动流程
try {
ProcessInstance processInstance = stmt.createProcessInstance(process);
if (processInstance!=null){
processInstanceId = processInstance.getId();
}
} catch (InvalidModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
//构建流程定义
WorkflowProcess process = getWorkflowProcess();
//启动流程
try {
ProcessInstance processInstance = stmt.runProcessInstance(processInstanceId, bizId, null);
if (processInstance!=null){
processInstanceId = processInstance.getId();
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
});
assertResult(session);
}
/**
* Start-->Activity-->End
* @return
*/
public WorkflowProcess createWorkflowProcess(){
WorkflowProcessImpl process = new WorkflowProcessImpl(processName,processDisplayName);
process.setDescription(description);
SubProcess mainflow = process.getMainSubProcess();
mainflow.setDuration(new Duration(5,Duration.MINUTE));
StartNodeImpl startNode = new StartNodeImpl(process.getMainSubProcess(),"Start");
ActivityImpl activity = new ActivityImpl(process.getMainSubProcess(),"Activity1");
activity.setDuration(new Duration(6,Duration.DAY));
EndNodeImpl endNode = new EndNodeImpl(process.getMainSubProcess(),"End");
mainflow.setEntry(startNode);
mainflow.getStartNodes().add(startNode);
mainflow.getActivities().add(activity);
mainflow.getEndNodes().add(endNode);
TransitionImpl transition1 = new TransitionImpl(process.getMainSubProcess(),"start2activity");
transition1.setFromNode(startNode);
transition1.setToNode(activity);
startNode.getLeavingTransitions().add(transition1);
activity.getEnteringTransitions().add(transition1);
TransitionImpl transition2 = new TransitionImpl(process.getMainSubProcess(),"activity2end");
transition2.setFromNode(activity);
transition2.setToNode(endNode);
activity.getLeavingTransitions().add(transition2);
endNode.getEnteringTransitions().add(transition2);
mainflow.getTransitions().add(transition1);
mainflow.getTransitions().add(transition2);
return process;
}
public void assertResult(WorkflowSession session){
super.assertResult(session);
//验证ProcessInstance信息
WorkflowQuery<ProcessInstance> q4ProcInst = session.createWorkflowQuery(ProcessInstance.class);
ProcessInstance procInst = q4ProcInst.get(processInstanceId);
Assert.assertNotNull(procInst);
Assert.assertEquals(bizId,procInst.getBizId());
Assert.assertEquals(processName, procInst.getProcessId());
Assert.assertEquals(FpdlConstants.PROCESS_TYPE_FPDL20, procInst.getProcessType());
Assert.assertEquals(new Integer(1), procInst.getVersion());
Assert.assertEquals(processName, procInst.getProcessId());//name 为空的情况下默认等于processId,
Assert.assertEquals(processDisplayName, procInst.getProcessDisplayName());//displayName为空的情况下默认等于name
Assert.assertEquals(ProcessInstanceState.COMPLETED, procInst.getState());
Assert.assertEquals(Boolean.FALSE, procInst.isSuspended());
Assert.assertEquals(FireWorkflowSystem.getInstance().getId(),procInst.getCreatorId());
Assert.assertEquals(FireWorkflowSystem.getInstance().getName(), procInst.getCreatorName());
Assert.assertEquals(FireWorkflowSystem.getInstance().getDeptId(), procInst.getCreatorDeptId());
Assert.assertEquals(FireWorkflowSystem.getInstance().getDeptName(),procInst.getCreatorDeptName());
Assert.assertNotNull(procInst.getCreatedTime());
Assert.assertNotNull(procInst.getEndTime());
Assert.assertNotNull(procInst.getExpiredTime());
Assert.assertNull(procInst.getParentActivityInstanceId());
Assert.assertNull(procInst.getParentProcessInstanceId());
Assert.assertNull(procInst.getParentScopeId());
Assert.assertNull(procInst.getNote());
//验证Token信息
WorkflowQuery<Token> q4Token = session.createWorkflowQuery(Token.class);
q4Token.add(Restrictions.eq(TokenProperty.PROCESS_INSTANCE_ID, processInstanceId))
.addOrder(Order.asc(TokenProperty.STEP_NUMBER));
List<Token> tokenList = q4Token.list();
Assert.assertNotNull(tokenList);
Assert.assertEquals(6, tokenList.size());
Token procInstToken = tokenList.get(0);
Assert.assertEquals(processName+"."+WorkflowProcess.MAIN_PROCESS_NAME,procInstToken.getElementId() );
Assert.assertEquals(processInstanceId,procInstToken.getElementInstanceId());
Assert.assertEquals(processName,procInstToken.getProcessId());
Assert.assertEquals(FpdlConstants.PROCESS_TYPE_FPDL20, procInstToken.getProcessType());
Assert.assertEquals(new Integer(1), procInstToken.getVersion());
Assert.assertEquals(TokenState.COMPLETED, procInstToken.getState());
Assert.assertNull(procInstToken.getParentTokenId());
Assert.assertTrue(procInstToken.isBusinessPermitted());
Assert.assertEquals(procInst.getTokenId(), procInstToken.getId());
Token startNodeToken = tokenList.get(1);
Assert.assertEquals(processName, startNodeToken.getProcessId());
Assert.assertEquals(new Integer(1), startNodeToken.getVersion());
Assert.assertEquals(FpdlConstants.PROCESS_TYPE_FPDL20, startNodeToken.getProcessType());
Assert.assertEquals(procInstToken.getId(), startNodeToken.getParentTokenId());
Assert.assertTrue(startNodeToken.isBusinessPermitted());
Token activity1Token = tokenList.get(3);
//验证ActivityInstance信息
WorkflowQuery<ActivityInstance> q4ActInst = session.createWorkflowQuery(ActivityInstance.class);
q4ActInst.add(Restrictions.eq(ActivityInstanceProperty.PROCESS_INSTANCE_ID, processInstanceId))
.add(Restrictions.eq(ActivityInstanceProperty.NODE_ID, processName+"."+WorkflowProcess.MAIN_PROCESS_NAME+".Activity1"));
List<ActivityInstance> actInstList = q4ActInst.list();
Assert.assertNotNull(actInstList);
Assert.assertEquals(1, actInstList.size());
ActivityInstance activityInstance = actInstList.get(0);
Assert.assertEquals(bizId, activityInstance.getBizId());
Assert.assertEquals("Activity1", activityInstance.getName());
Assert.assertEquals("Activity1", activityInstance.getDisplayName());
Assert.assertEquals(processInstanceId, activityInstance.getParentScopeId());
Assert.assertNotNull(activityInstance.getCreatedTime());
Assert.assertNotNull(activityInstance.getStartedTime());
Assert.assertNotNull(activityInstance.getEndTime());
Assert.assertNotNull(activityInstance.getExpiredTime());
Assert.assertNotNull( activityInstance.getTokenId());
Assert.assertEquals(activity1Token.getId(), activityInstance.getTokenId());
Assert.assertEquals(activity1Token.getElementId(), activityInstance.getNodeId());
Assert.assertEquals(activity1Token.getElementInstanceId(), activityInstance.getId());
Assert.assertNotNull(activityInstance.getScopeId());
Assert.assertEquals(new Integer(1),activityInstance.getVersion());
Assert.assertEquals(FpdlConstants.PROCESS_TYPE_FPDL20,activityInstance.getProcessType());
Assert.assertEquals(procInst.getProcessName(), activityInstance.getProcessName());
Assert.assertEquals(procInst.getProcessDisplayName(), activityInstance.getProcessDisplayName());
}
}