package org.jbpm.process.workitem.bpmn2;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.xml.ws.Endpoint;
import org.drools.SystemEventListenerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;
import org.drools.runtime.process.WorkflowProcessInstance;
import org.jbpm.process.workitem.wsht.AsyncHornetQHTWorkItemHandler;
import org.jbpm.task.AsyncTaskService;
import org.jbpm.task.Group;
import org.jbpm.task.User;
import org.jbpm.task.identity.UserGroupCallbackManager;
import org.jbpm.task.service.TaskServer;
import org.jbpm.task.service.TaskService;
import org.jbpm.task.service.TaskServiceSession;
import org.jbpm.task.service.hornetq.AsyncHornetQTaskClient;
import org.jbpm.task.service.hornetq.HornetQTaskServer;
import org.jbpm.task.service.responsehandlers.BlockingTaskOperationResponseHandler;
import org.jbpm.task.service.responsehandlers.BlockingTaskSummaryResponseHandler;
import org.jbpm.test.JbpmJUnitTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class JaxWSServiceTaskTest extends JbpmJUnitTestCase {
private Endpoint endpoint;
private SimpleService service;
public JaxWSServiceTaskTest() {
super(true);
setPersistence(true);
}
@Before
public void setUp() throws Exception {
super.setUp();
startWebService();
}
@After
public void tearDown() throws Exception {
super.tearDown();
stopWebService();
}
@Test
public void testServiceInvocation() throws Exception {
StatefulKnowledgeSession ksession = createKnowledgeSession("MultiInstanceWSServiceProcess.bpmn2");
TestWorkItemHandler htHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Service Task", new ServiceTaskHandler(ksession));
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", htHandler);
Map<String, Object> params = new HashMap<String, Object>();
// change this parameter to sync to see elements executes sequentially
params.put("mode", "async");
WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess("MultiInstanceWSServiceProcess", params);
params = new HashMap<String, Object>();
// puts as many as needed elements in the map to create for each of them a ws call
params.put("r1", "mary");
params.put("r2", "john");
params.put("r3", "krisv");
HashMap<String, Object> results = new HashMap<String, Object>();
results.put("Result", params);
ksession.getWorkItemManager().completeWorkItem(htHandler.getWorkItem().getId(), results);
// wait 5 seconds as ws will hold the request for 3 seconds
Thread.sleep(5000);
ksession.getWorkItemManager().completeWorkItem(htHandler.getWorkItem().getId(), null);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testPublicServiceInvocation() throws Exception {
StatefulKnowledgeSession ksession = createKnowledgeSession("WeatherWSServiceProcess.bpmn2");
TestWorkItemHandler htHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Service Task", new ServiceTaskHandler(ksession));
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", htHandler);
Map<String, Object> params = new HashMap<String, Object>();
// change this parameter to sync to see elements executes sequentially
params.put("mode", "async");
WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess("WeatherWSServiceProcess", params);
params = new HashMap<String, Object>();
// puts as many as needed elements in the map to create for each of them a ws call
params.put("r1", "14025");
params.put("r2", "14513");
params.put("r3", "10172");
HashMap<String, Object> results = new HashMap<String, Object>();
results.put("Result", params);
ksession.getWorkItemManager().completeWorkItem(htHandler.getWorkItem().getId(), results);
// wait 5 seconds as ws will hold the request for 3 seconds
Thread.sleep(5000);
ksession.getWorkItemManager().completeWorkItem(htHandler.getWorkItem().getId(), null);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
private void startWebService() {
this.service = new SimpleService();
this.endpoint = Endpoint.publish("http://127.0.0.1:9876/HelloService/greeting", service);
}
private void stopWebService() {
this.endpoint.stop();
}
static class TestWorkItemHandler implements WorkItemHandler {
private static TestWorkItemHandler INSTANCE = new TestWorkItemHandler();
private WorkItem workItem;
private WorkItem aborted;
public static TestWorkItemHandler getInstance() {
return INSTANCE;
}
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
this.workItem = workItem;
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
this.aborted = workItem;
}
public WorkItem getWorkItem() {
WorkItem result = workItem;
workItem = null;
return result;
}
public WorkItem getAbortedWorkItem() {
WorkItem result = aborted;
aborted = null;
return result;
}
}
}