package org.fireflow;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.List;
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.engine.context.RuntimeContext;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.ActivityInstanceProperty;
import org.fireflow.engine.entity.runtime.LocalWorkItem;
import org.fireflow.engine.entity.runtime.ProcessInstance;
import org.fireflow.engine.entity.runtime.ScheduleJob;
import org.fireflow.engine.entity.runtime.ScheduleJobProperty;
import org.fireflow.engine.entity.runtime.Variable;
import org.fireflow.engine.entity.runtime.VariableProperty;
import org.fireflow.engine.entity.runtime.WorkItem;
import org.fireflow.engine.entity.runtime.WorkItemProperty;
import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem;
import org.fireflow.engine.modules.schedule.Scheduler;
import org.fireflow.pdl.fpdl.io.FPDLDeserializer;
import org.fireflow.pdl.fpdl.io.FPDLSerializer;
import org.fireflow.pdl.fpdl.misc.FpdlConstants;
import org.fireflow.pdl.fpdl.process.WorkflowProcess;
import org.fireflow.pvm.kernel.Token;
import org.fireflow.pvm.kernel.TokenProperty;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License 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 General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
/**
* @author 非也
* @version 2.0
*/
public abstract class FireWorkflowJunitEnviroment{
protected static final String[] springConfig = {"applicationContext.xml","fireflow-config/FireflowContext-Main.xml"};
protected static ApplicationContext applicationContext = null;
protected static RuntimeContext fireflowRuntimeContext = null;
protected static TransactionTemplate transactionTemplate = null;
protected static String processInstanceId = null;
protected static SimpleDateFormat formater = new SimpleDateFormat(
"yyyyMMdd HH:mm:ss");
/**
* 初始化引擎
*/
@BeforeClass
public static void beforeClass() {
applicationContext = new ClassPathXmlApplicationContext(springConfig);
fireflowRuntimeContext = (RuntimeContext) applicationContext.getBean(RuntimeContext.Fireflow_Runtime_Context_Name);
transactionTemplate = (TransactionTemplate) applicationContext
.getBean("transactionTemplate");
final JunitInitializer initializer = (JunitInitializer) applicationContext
.getBean("junitInitializer");
// 清除现有的数据
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus arg0) {
initializer.clearData();
return null;
}
});
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) {
try {
InputStream in = FireWorkflowJunitEnviroment.class
.getClassLoader().getResourceAsStream(
"FireWorkflow-Default-Resources.rsc.xml");
Map<ResourceDescriptorProperty, Object> props = new HashMap<ResourceDescriptorProperty, Object>();
props.put(ResourceDescriptorProperty.FILE_NAME,
"FireWorkflow-Default-Resources.rsc.xml");
stmt.uploadResourcesStream(in, Boolean.TRUE, props);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
});
*/
}
@AfterClass
public static void afterClass() {
// 等待调度器结束
Scheduler scheduler = fireflowRuntimeContext.getEngineModule(Scheduler.class,
FpdlConstants.PROCESS_TYPE_FPDL20);
boolean hasJobInSchedule = scheduler.hasJobInSchedule(fireflowRuntimeContext);
System.out.println();
while (hasJobInSchedule) {
System.out.print("...");
try {
Thread.currentThread().sleep(3 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hasJobInSchedule = scheduler.hasJobInSchedule(fireflowRuntimeContext);
}
WorkflowSession session = WorkflowSessionFactory.createWorkflowSession(
fireflowRuntimeContext, FireWorkflowSystem.getInstance());
WorkflowQuery<ProcessInstance> q4ProcInst = session
.createWorkflowQuery(ProcessInstance.class);
List<ProcessInstance> processInstanceList = q4ProcInst.list();
WorkflowQuery<ActivityInstance> q4ActInst = session
.createWorkflowQuery(ActivityInstance.class);
q4ActInst.addOrder(
Order.asc(ActivityInstanceProperty.PROCESS_INSTANCE_ID))
.addOrder(Order.asc(ActivityInstanceProperty.STEP_NUMBER));
List<ActivityInstance> activityInstanceList = q4ActInst.list();
WorkflowQuery<Token> q4Token = session.createWorkflowQuery(Token.class);
q4Token.addOrder(Order.asc(TokenProperty.PROCESS_INSTANCE_ID))
.addOrder(Order.asc(TokenProperty.STEP_NUMBER));
List<Token> tokenList = q4Token.list();
WorkflowQuery<Variable> q4Variable = session.createWorkflowQuery(
Variable.class);
q4Variable.addOrder(Order.asc(VariableProperty.SCOPE_ID));
List<Variable> variableList = q4Variable.list();
WorkflowQuery<WorkItem> q4WorkItem = session.createWorkflowQuery(
WorkItem.class);
q4WorkItem
.addOrder(
Order.asc(WorkItemProperty.PROCESSS_ID))
.addOrder(
Order.asc(WorkItemProperty.PROCESS_INSTANCE_ID))
.addOrder(Order.asc(WorkItemProperty.ACTIVITY_INSTANCE_ID));
List<WorkItem> workItemList = q4WorkItem.list();
WorkflowQuery<ScheduleJob> q4ScheduleJob = session.createWorkflowQuery(
ScheduleJob.class);
q4ScheduleJob
.addOrder(Order.asc(ScheduleJobProperty.PROCESS_ID));
// .addOrder(
// Order.asc(ScheduleJobProperty.ACTIVITY_INSTANCE_$_STEP_NUMBER));
List<ScheduleJob> jobList = q4ScheduleJob.list();
// //////////////////////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////////////////////
System.out
.println("******************************************************");
System.out
.println("**********Process Instance Staroge Content***********");
System.out
.println("******************************************************");
System.out.println("Id\t\tsubflowid\t\tState\t\tSubflowName\t\tSubflowDisplayName\t\t");
for (ProcessInstance procInst : processInstanceList) {
System.out.print(procInst.getId());
System.out.print("\t\t");
System.out.println(procInst.getSubProcessId());
System.out.print("\t\t");
System.out.print(procInst.getState().getDisplayName());
System.out.print("\t\t");
System.out.print(procInst.getSubProcessName());
System.out.print("\t\t");
System.out.print(procInst.getSubProcessDisplayName());
System.out.println("\n");
}
System.out
.println("******************************************************");
System.out
.println("**********Activity Instance Staroge Content***********");
System.out
.println("******************************************************");
System.out
.println("StepNumber\t\tState\t\tName\t\tDisplayName\t\tProcessInstanceId\t\tId\t\t");
for (ActivityInstance actInst : activityInstanceList) {
System.out.print(actInst.getStepNumber());
System.out.print("\t\t");
System.out.print(actInst.getState().getDisplayName());
System.out.print("\t\t");
System.out.print(actInst.getName());
System.out.print("\t\t");
System.out.print(actInst.getDisplayName());
System.out.print("\t\t");
System.out.print(actInst.getProcessInstanceId());
System.out.print("\t\t");
System.out.print(actInst.getId());
System.out.println("\n");
}
System.out
.println("******************************************************");
System.out
.println("**************Token Staroge Content*******************");
System.out
.println("******************************************************");
System.out
.println("StepNumber\tState\tNodeId\t\tOperationContext\t\tProcessId\t\tProcessInstanceId\t\tId");
for (Token token : tokenList) {
System.out.print(token.getStepNumber());
System.out.print("\t");
System.out.print(token.getState().getDisplayName());
System.out.print("\t");
System.out.print(token.getElementId());
System.out.print("\t\t");
System.out.print(token.getOperationContextName().name());
System.out.print("\t\t");
System.out.print(token.getProcessId());
System.out.print("\t\t");
System.out.print(token.getProcessInstanceId());
System.out.print("\t\t");
System.out.print(token.getId());
System.out.println("\n");
}
System.out
.println("******************************************************");
System.out
.println("**************Variable Staroge Content****************");
System.out
.println("******************************************************");
System.out.println("ScopeId\t\tName\t\tDataType\t\tValue");
for (Variable var : variableList) {
System.out.print(var.getScopeId());
System.out.print("\t\t");
System.out.print(var.getName());
System.out.print("\t\t");
System.out.print(var.getDataType());
System.out.print("\t\t");
System.out.print(var.getPayload());
System.out.println("\n");
}
System.out
.println("******************************************************");
System.out
.println("**************WorkItem Staroge Content *************");
System.out
.println("******************************************************");
System.out
.println("Name\t\tState\t\tOwner\t\tCreatedTime\t\tClaimedTime\t\tEndTime\t\tId\ttActivityInstanceId");
for (WorkItem workItem : workItemList) {
System.out.print(workItem.getSubject());
System.out.print("\t\t");
System.out.print(workItem.getState().getDisplayName());
System.out.print("\t\t");
System.out.print(workItem.getOwnerName());
System.out.print("\t\t");
System.out.print(workItem.getCreatedTime() == null ? "--"
: formater.format(workItem.getCreatedTime()));
System.out.print("\t\t");
System.out.print(workItem.getClaimedTime() == null ? "--"
: formater.format(workItem.getClaimedTime()));
System.out.print("\t\t");
System.out.print(workItem.getEndTime() == null ? "--" : formater
.format(workItem.getEndTime()));
System.out.print("\t\t");
System.out.print(workItem.getId());
System.out.print("\t\t");
if (workItem instanceof LocalWorkItem){
System.out.print(((LocalWorkItem)workItem).getActivityInstanceId());
}else{
System.out.print("--");
}
System.out.println();
}
System.out
.println("******************************************************");
System.out
.println("**************ScheduleJob Staroge Content*************");
System.out
.println("******************************************************");
System.out
.println("Name\t\tTriggeredTimes\t\tLastestTriggeredTime\t\tState\t\tEndTime\t\tTiggerType\t\tTriggerExpression");
for (ScheduleJob job : jobList) {
System.out.print(job.getName());
System.out.print("\t\t");
System.out.print(job.getTriggeredTimes());
System.out.print("\t\t");
System.out.print(job.getLatestTriggeredTime() == null ? "--"
: formater.format(job.getLatestTriggeredTime()));
System.out.print("\t\t");
System.out.print(job.getState().getDisplayName());
System.out.print("\t\t");
System.out.print(job.getEndTime() == null ? "--" : formater
.format(job.getEndTime()));
System.out.print("\t\t");
System.out.print(job.getTriggerType());
System.out.print("\t\t");
System.out.print(job.getTriggerExpression());
System.out.println();
}
}
public void assertResult(WorkflowSession session) {
Assert.assertNotNull(processInstanceId);
}
public WorkflowProcess getWorkflowProcess() {
try {
FPDLSerializer ser = new FPDLSerializer();
String xml = ser.serializeToXmlString(createWorkflowProcess());
System.out
.println("===================原始的 Workflow Process 是 :==================");
System.out.println(xml);
System.out
.println("==========================================================");
FPDLDeserializer deserializer = new FPDLDeserializer();
ByteArrayInputStream byteArrIn = new ByteArrayInputStream(
xml.getBytes("UTF-8"));
WorkflowProcess workflowProcess = deserializer
.deserialize(byteArrIn);
xml = ser.serializeToXmlString(workflowProcess);
System.out
.println("===================反序列化后的 Workflow Process 是 :==================");
System.out.println(xml);
System.out
.println("==========================================================");
return workflowProcess;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public abstract WorkflowProcess createWorkflowProcess();
}