package org.fireflow.service.human;
import javax.xml.namespace.QName;
import junit.framework.Assert;
import org.fireflow.client.WorkflowQuery;
import org.fireflow.client.WorkflowSession;
import org.fireflow.client.WorkflowSessionFactory;
import org.fireflow.client.WorkflowStatement;
import org.fireflow.client.impl.WorkflowSessionLocalImpl;
import org.fireflow.client.query.Restrictions;
import org.fireflow.engine.context.RuntimeContext;
import org.fireflow.engine.entity.runtime.ActivityInstance;
import org.fireflow.engine.entity.runtime.LocalWorkItem;
import org.fireflow.engine.entity.runtime.ProcessInstance;
import org.fireflow.engine.entity.runtime.WorkItem;
import org.fireflow.engine.entity.runtime.WorkItemProperty;
import org.fireflow.engine.entity.runtime.WorkItemState;
import org.fireflow.engine.exception.InvalidOperationException;
import org.fireflow.engine.exception.ServiceInvocationException;
import org.fireflow.engine.invocation.ServiceInvoker;
import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem;
import org.fireflow.model.binding.impl.ResourceBindingImpl;
import org.fireflow.model.binding.impl.ServiceBindingImpl;
import org.fireflow.model.data.impl.InputImpl;
import org.fireflow.model.resourcedef.ResourceType;
import org.fireflow.model.resourcedef.WorkItemAssignmentStrategy;
import org.fireflow.model.resourcedef.impl.ResourceDefImpl;
import org.fireflow.model.servicedef.ServiceDef;
import org.fireflow.model.servicedef.impl.CommonInterfaceDef;
import org.fireflow.model.servicedef.impl.OperationDefImpl;
import org.fireflow.service.AbsTestContext;
import org.firesoa.common.schema.NameSpaces;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
@SuppressWarnings("unused")
//hibernate
@ContextConfiguration(locations = { "classpath:/applicationContext.xml",
"classpath:/org/fireflow/service/human/HumanServiceInvokerTest-context.xml"
})
public class HumanServiceInvokerTest extends AbsTestContext {
WorkflowSession session = null;
ProcessInstance procInst = null;
ActivityInstance actInst = null;
@Test
public void testInvoke() {
final ServiceDef service = this.buildService();
TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate");
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
//测试invoker
String invokerClassName = service.getInvokerClassName();
Class clz;
try {
clz = Class.forName(invokerClassName);
ServiceInvoker invoker = (ServiceInvoker)clz.newInstance();
RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext");
session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance());
//构造processInstance
procInst = createProcessInstance(session, runtimeContext);
((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst);
//构造activityInstance
actInst = createActivityInstance(runtimeContext, procInst);
((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst);
//构造service binding
ServiceBindingImpl serviceBinding = new ServiceBindingImpl();
// serviceBinding.setService(service);
serviceBinding.setServiceId(service.getId());
serviceBinding.setOperationName("OpenForm");
// serviceBinding.setOperation(service.getInterface().getOperation("OpenForm"));
//serviceBinding.setInputAssignments(assignments);//TODO human service的Assignment 待补充
//构造resourceBinding
ResourceBindingImpl resourceBinding = new ResourceBindingImpl();
resourceBinding.setAssignmentHandlerBeanName("myAssignmentHandler");
resourceBinding.setName("指定的操作者");
invoker.invoke(session, actInst, serviceBinding, resourceBinding, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
}
catch (ServiceInvocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
WorkflowStatement stmt = session.createWorkflowStatement();
WorkflowQuery<WorkItem> query = session.createWorkflowQuery(WorkItem.class);
final WorkItem wi = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "zhangsan"))
.add(Restrictions.eq(WorkItemProperty.ACTIVITY_INSTANCE_ID, actInst.getId()))
.unique();
Assert.assertNotNull(wi);
Assert.assertEquals(WorkItemState.INITIALIZED, wi.getState());
Assert.assertEquals("/xyz.jsp", wi.getActionUrl());
Assert.assertNotNull(((LocalWorkItem)wi).getActivityInstanceId());
Assert.assertNotNull(wi.getCreatedTime());
Assert.assertEquals(WorkItemAssignmentStrategy.ASSIGN_TO_ANY, ((LocalWorkItem)wi).getAssignmentStrategy());
query.reset();
WorkItem wi2 = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "Mgr_C"))
.add(Restrictions.eq(WorkItemProperty.ACTIVITY_INSTANCE_ID, actInst.getId()))
.unique();
Assert.assertNotNull(wi2);
Assert.assertEquals(WorkItemState.READONLY, wi2.getState());
//测试wi claim()
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
try {
WorkflowStatement statement = session.createWorkflowStatement();
statement.claimWorkItem(wi.getId());
} catch (InvalidOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
query.reset();
query.add(Restrictions.eq(WorkItemProperty.ACTIVITY_INSTANCE_ID, actInst.getId()));
int workItemCount = query.count();
Assert.assertEquals(3, workItemCount);//两个抄送workitem,一个待处理workitem
//测试 wi.complete()动作
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
try {
WorkflowStatement statement = session.createWorkflowStatement();
statement.completeWorkItem(wi.getId(),null, null, null);
} catch (InvalidOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
}
@Test
public void testInvoke2() {
final ServiceDef service = this.buildService();
TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate");
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
//测试invoker
String invokerClassName = service.getInvokerClassName();
Class clz;
try {
clz = Class.forName(invokerClassName);
ServiceInvoker invoker = (ServiceInvoker)clz.newInstance();
RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext");
session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance());
//构造processInstance
procInst = createProcessInstance(session, runtimeContext);
((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst);
//构造activityInstance
actInst = createActivityInstance(runtimeContext, procInst);
((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst);
//构造service binding
ServiceBindingImpl serviceBinding = new ServiceBindingImpl();
// serviceBinding.setService(service);
serviceBinding.setServiceId(service.getId());
serviceBinding.setOperationName("OpenForm");
// serviceBinding.setOperation(service.getInterface().getOperation("OpenForm"));
//serviceBinding.setInputAssignments(assignments);//TODO human service的Assignment 待补充
//构造resourceBinding
ResourceBindingImpl resourceBinding = new ResourceBindingImpl();
resourceBinding.setAssignmentHandlerClassName("org.fireflow.service.human.mock.MyAssignmentHandler");
resourceBinding.setName("指定的操作者");
invoker.invoke(session, actInst, serviceBinding, resourceBinding, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
}
catch (ServiceInvocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
WorkflowStatement stmt = session.createWorkflowStatement();
WorkflowQuery<WorkItem> query = session.createWorkflowQuery(WorkItem.class);
WorkItem wi = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "zhangsan"))
.add(Restrictions.eq(WorkItemProperty.PROCESS_INSTANCE_ID, actInst.getProcessInstanceId()))
.unique();
Assert.assertNotNull(wi);
Assert.assertEquals(WorkItemState.INITIALIZED, wi.getState());
Assert.assertEquals("/xyz.jsp", wi.getActionUrl());
Assert.assertNotNull(((LocalWorkItem)wi).getActivityInstanceId());
Assert.assertNotNull(wi.getCreatedTime());
Assert.assertEquals(WorkItemAssignmentStrategy.ASSIGN_TO_ANY, ((LocalWorkItem)wi).getAssignmentStrategy());
query.reset();
WorkItem wi2 = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "Mgr_C"))
.add(Restrictions.eq(WorkItemProperty.PROCESS_INSTANCE_ID, actInst.getProcessInstanceId()))
.unique();
Assert.assertNotNull(wi2);
Assert.assertEquals(WorkItemState.READONLY, wi2.getState());
}
@Test
public void testInvoke3() {
final ServiceDef service = this.buildService();
TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate");
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
//测试invoker
String invokerClassName = service.getInvokerClassName();
Class clz;
try {
clz = Class.forName(invokerClassName);
ServiceInvoker invoker = (ServiceInvoker)clz.newInstance();
RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext");
session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance());
//构造processInstance
procInst = createProcessInstance(session, runtimeContext);
((WorkflowSessionLocalImpl)session).setCurrentProcessInstance(procInst);
procInst.setVariableValue(session, "thePotentialOwner", "wanghaha");
//构造activityInstance
actInst = createActivityInstance(runtimeContext, procInst);
((WorkflowSessionLocalImpl)session).setCurrentActivityInstance(actInst);
//构造service binding
ServiceBindingImpl serviceBinding = new ServiceBindingImpl();
// serviceBinding.setService(service);
serviceBinding.setServiceId(service.getId());
serviceBinding.setOperationName("OpenForm");
// serviceBinding.setOperation(service.getInterface().getOperation("OpenForm"));
//serviceBinding.setInputAssignments(assignments);//TODO human service的Assignment 待补充
//构造resourceBinding
ResourceBindingImpl resourceBinding = new ResourceBindingImpl();
ResourceDefImpl resource = new ResourceDefImpl();
resource.setName("coder");//码农
resource.setDisplayName("码农");
resource.setResourceType(ResourceType.ROLE);
resourceBinding.addPotentialOwnerRef(resource.getId());
resource = new ResourceDefImpl();
resource.setName("TestDept");
resource.setDisplayName("测试部");
resource.setResourceType(ResourceType.DEPARTMENT);
resourceBinding.addPotentialOwnerRef(resource.getId());
resource = new ResourceDefImpl();
resource.setName("limou");
resource.setDisplayName("李某");
resource.setResourceType(ResourceType.USER);
resourceBinding.addPotentialOwnerRef(resource.getId());
resource = new ResourceDefImpl();
resource.setName("processCreator");
resource.setDisplayName("流程创建者");
resource.setResourceType(ResourceType.PROCESS_INSTANCE_CREATOR);
resourceBinding.addPotentialOwnerRef(resource.getId());
resource = new ResourceDefImpl();
resource.setName("thePotentialOwner");
resource.setDisplayName("流程变量所指用户");
resource.setResourceType(ResourceType.VARIABLE_IMPLICATION);
resourceBinding.addPotentialOwnerRef(resource.getId());
//抄送
resource = new ResourceDefImpl();
resource.setName("manager");
resource.setDisplayName("部门经理");
resource.setResourceType(ResourceType.ROLE);
resourceBinding.addReaderRef(resource.getId());
resourceBinding.setName("指定的操作者");
invoker.invoke(session, actInst, serviceBinding, resourceBinding, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail(e.getMessage());
} catch (InvalidOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ServiceInvocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
});
WorkflowStatement stmt = session.createWorkflowStatement();
WorkflowQuery<WorkItem> query = session.createWorkflowQuery(WorkItem.class);
WorkItem wi = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "zhangsan"))
.add(Restrictions.eq(WorkItemProperty.PROCESS_INSTANCE_ID, actInst.getProcessInstanceId()))
.unique();
Assert.assertNotNull(wi);
Assert.assertEquals(WorkItemState.INITIALIZED, wi.getState());
Assert.assertEquals("/xyz.jsp", wi.getActionUrl());
Assert.assertNotNull(((LocalWorkItem)wi).getActivityInstanceId());
Assert.assertNotNull(wi.getCreatedTime());
Assert.assertEquals(WorkItemAssignmentStrategy.ASSIGN_TO_ANY, ((LocalWorkItem)wi).getAssignmentStrategy());
query.reset();
WorkItem wi2 = query.add(Restrictions.eq(WorkItemProperty.OWNER_ID, "Mgr_C"))
.add(Restrictions.eq(WorkItemProperty.PROCESS_INSTANCE_ID, actInst.getProcessInstanceId()))
.unique();
Assert.assertNotNull(wi2);
Assert.assertEquals(WorkItemState.READONLY, wi2.getState());
}
protected ServiceDef buildService(){
////////////service1//////////////////////////
HumanService svc = new HumanService();
svc.setName("Human_service_1");
svc.setDisplayName("打开XYZ表单");
svc.setDescription("This is a human service");
svc.setBizCategory("abc\\xyz");
svc.setInvokerBeanName("testInvokerBean");
svc.setFormUrl("/xyz.jsp");
//构建operation
CommonInterfaceDef commonInterface = new CommonInterfaceDef();
OperationDefImpl op = new OperationDefImpl();
op.setOperationName("OpenForm");
InputImpl input = new InputImpl();
input.setName("bizObj1");
input.setName("单据1");
input.setDataType(new QName(NameSpaces.JAVA.getUri(),"org.fireflow.junit.Abc",NameSpaces.JAVA.getPrefix()));
op.getInputs().add(input);
input = new InputImpl();
input.setName("todate");
input.setDisplayName("当前日期");
input.setDataType(new QName(NameSpaces.JAVA.getUri(),"java.util.Date",NameSpaces.JAVA.getPrefix()));
input.setDataPattern("yyyy-MM-dd");
input.setDefaultValueAsString("2011-09-20");
op.getInputs().add(input);
commonInterface.getOperations().add(op);
svc.setInterface(commonInterface);
svc.getExtendedAttributes().put("key1", "value1");
svc.getExtendedAttributes().put("key2", "value2");
return svc;
}
}