package org.jbpm.task.service.jms;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.naming.Context;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import junit.framework.TestCase;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.drools.SystemEventListenerFactory;
import org.easymock.EasyMock;
import org.jbpm.task.Group;
import org.jbpm.task.I18NText;
import org.jbpm.task.Status;
import org.jbpm.task.Task;
import org.jbpm.task.TaskData;
import org.jbpm.task.User;
import org.jbpm.task.service.ContentData;
import org.jbpm.task.service.TaskClient;
import org.jbpm.task.service.TaskServer;
import org.jbpm.task.service.TaskService;
import org.jbpm.task.service.TaskServiceSession;
import org.jbpm.task.service.responsehandlers.BlockingAddTaskResponseHandler;
/**
* Test case to see if this component works.
*
* @author Mariano De Maio
*/
public class JMSTaskServerTest extends TestCase {
/**
* Initial context
*/
private Context context;
/**
* server instance
*/
private TaskServer server;
/**
* Starts the server
*/
@Override
protected void setUp() throws Exception {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
this.context = EasyMock.createMock(Context.class);
EasyMock.expect(context.lookup("ConnectionFactory")).andReturn(factory).anyTimes();
EasyMock.replay(context);
EntityManagerFactory localEntityManagerFactory = Persistence.createEntityManagerFactory("org.jbpm.task");
TaskService localTaskService = new TaskService(localEntityManagerFactory, SystemEventListenerFactory.getSystemEventListener());
TaskServiceSession localTaskServiceSession = localTaskService.createSession();
for (int i = 0; i < 10; i++) {
User user = new User("usr" + i);
localTaskServiceSession.addUser(user);
}
for (int j = 0; j < 3; j++) {
localTaskServiceSession.addGroup(new Group("grp" + j));
}
Properties serverProperties = new Properties();
serverProperties.setProperty("JMSTaskServer.connectionFactory", "ConnectionFactory");
serverProperties.setProperty("JMSTaskServer.transacted", "true");
serverProperties.setProperty("JMSTaskServer.acknowledgeMode", "AUTO_ACKNOWLEDGE");
serverProperties.setProperty("JMSTaskServer.queueName", "tasksQueue");
serverProperties.setProperty("JMSTaskServer.responseQueueName", "tasksResponseQueue");
this.server = new JMSTaskServer(localTaskService, serverProperties, context);
Thread thread = new Thread(this.server);
thread.start();
localTaskServiceSession.dispose();
}
/**
* Creates a new client
* @return the created client.
*/
protected TaskClient createTaskClient() {
Properties clientProperties = new Properties();
clientProperties.setProperty("JMSTaskClient.connectionFactory", "ConnectionFactory");
clientProperties.setProperty("JMSTaskClient.transactedQueue", "true");
clientProperties.setProperty("JMSTaskClient.acknowledgeMode", "AUTO_ACKNOWLEDGE");
clientProperties.setProperty("JMSTaskClient.queueName", "tasksQueue");
clientProperties.setProperty("JMSTaskClient.responseQueueName", "tasksResponseQueue");
TaskClient client = new TaskClient(
new JMSTaskClientConnector(
"org.jbpm.process.workitem.wsht.WSThroughJMSHumanTaskHandler",
new JMSTaskClientHandler(SystemEventListenerFactory.getSystemEventListener()),
clientProperties, context
)
);
return client;
}
/**
* Stops the server
*/
@Override
protected void tearDown() throws Exception {
server.stop();
}
/**
* Tests two consecutive connections to see how it works.
* @throws Exception
*/
public void testDoubleUsage() throws Exception {
while(!server.isRunning()) {
Thread.sleep(100); // waits until the server finishes the startup
}
TaskClient client = createTaskClient();
client.connect();
Task task = new Task();
List<I18NText> names1 = new ArrayList<I18NText>();
I18NText text1 = new I18NText("en-UK", "tarea1");
names1.add(text1);
task.setNames(names1);
TaskData taskData = new TaskData();
taskData.setStatus(Status.Created);
taskData.setCreatedBy(new User("usr0"));
taskData.setActualOwner(new User("usr0"));
task.setTaskData(taskData);
ContentData data = new ContentData();
BlockingAddTaskResponseHandler addTaskHandler = new BlockingAddTaskResponseHandler();
client.addTask(task, data, addTaskHandler);
long taskId = addTaskHandler.getTaskId();
client.disconnect();
client.connect();
assertTrue("taskId debe ser un valor mayor a cero", taskId > 0);
Task task2 = new Task();
List<I18NText> names2 = new ArrayList<I18NText>();
I18NText text2 = new I18NText("en-UK", "tarea1");
names2.add(text2);
task2.setNames(names2);
TaskData taskData2 = new TaskData();
taskData2.setStatus(Status.Created);
taskData2.setCreatedBy(new User("usr0"));
taskData2.setActualOwner(new User("usr0"));
task2.setTaskData(taskData2);
ContentData data2 = new ContentData();
BlockingAddTaskResponseHandler addTaskHandler2 = new BlockingAddTaskResponseHandler();
client.addTask(task2, data2, addTaskHandler2);
long taskId2 = addTaskHandler2.getTaskId();
assertTrue("taskId2 debe ser un valor mayor a cero", taskId2 > 0);
assertNotSame("taskId y taskId2 deben ser distintos", taskId, taskId2);
client.disconnect();
}
}