[jboss-svn-commits] JBL Code SVN: r26735 - labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue May 26 10:01:47 EDT 2009
Author: KrisVerlaenen
Date: 2009-05-26 10:01:47 -0400 (Tue, 26 May 2009)
New Revision: 26735
Added:
labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/CommandBasedWSHumanTaskHandler.java
Modified:
labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
Log:
- added command-based WSHumanTaskHandler
Added: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/CommandBasedWSHumanTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/CommandBasedWSHumanTaskHandler.java (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/CommandBasedWSHumanTaskHandler.java 2009-05-26 14:01:47 UTC (rev 26735)
@@ -0,0 +1,305 @@
+package org.drools.process.workitem.wsht;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.drools.SystemEventListenerFactory;
+import org.drools.eventmessaging.EventKey;
+import org.drools.eventmessaging.EventResponseHandler;
+import org.drools.eventmessaging.Payload;
+import org.drools.runtime.KnowledgeRuntime;
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.task.AccessType;
+import org.drools.task.Content;
+import org.drools.task.Group;
+import org.drools.task.I18NText;
+import org.drools.task.OrganizationalEntity;
+import org.drools.task.PeopleAssignments;
+import org.drools.task.SubTasksStrategy;
+import org.drools.task.SubTasksStrategyFactory;
+import org.drools.task.Task;
+import org.drools.task.TaskData;
+import org.drools.task.User;
+import org.drools.task.event.TaskCompletedEvent;
+import org.drools.task.event.TaskEvent;
+import org.drools.task.event.TaskEventKey;
+import org.drools.task.event.TaskFailedEvent;
+import org.drools.task.event.TaskSkippedEvent;
+import org.drools.task.service.ContentData;
+import org.drools.task.service.MinaTaskClient;
+import org.drools.task.service.TaskClientHandler;
+import org.drools.task.service.TaskClientHandler.AddTaskResponseHandler;
+import org.drools.task.service.TaskClientHandler.GetContentResponseHandler;
+import org.drools.task.service.TaskClientHandler.GetTaskResponseHandler;
+import org.drools.task.service.responsehandlers.AbstractBaseResponseHandler;
+
+public class CommandBasedWSHumanTaskHandler implements WorkItemHandler {
+
+ private String ipAddress = "127.0.0.1";
+ private int port = 9123;
+ private MinaTaskClient client;
+ private KnowledgeRuntime session;
+ private Map<Long, Long> idMapping = new HashMap<Long, Long>();
+
+ public CommandBasedWSHumanTaskHandler(KnowledgeRuntime session) {
+ this.session = session;
+ }
+
+ public void setConnection(String ipAddress, int port) {
+ this.ipAddress = ipAddress;
+ this.port = port;
+ }
+
+ public void connect() {
+ if (client == null) {
+ client = new MinaTaskClient(
+ "org.drools.process.workitem.wsht.WSHumanTaskHandler",
+ new TaskClientHandler(SystemEventListenerFactory.getSystemEventListener()));
+ NioSocketConnector connector = new NioSocketConnector();
+ SocketAddress address = new InetSocketAddress(ipAddress, port);
+ boolean connected = client.connect(connector, address);
+ if (!connected) {
+ throw new IllegalArgumentException(
+ "Could not connect task client");
+ }
+ }
+ }
+
+ public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+ connect();
+ Task task = new Task();
+ String taskName = (String) workItem.getParameter("TaskName");
+ if (taskName != null) {
+ List<I18NText> names = new ArrayList<I18NText>();
+ names.add(new I18NText("en-UK", taskName));
+ task.setNames(names);
+ }
+ String comment = (String) workItem.getParameter("Comment");
+ if (comment != null) {
+ List<I18NText> descriptions = new ArrayList<I18NText>();
+ descriptions.add(new I18NText("en-UK", comment));
+ task.setDescriptions(descriptions);
+ List<I18NText> subjects = new ArrayList<I18NText>();
+ subjects.add(new I18NText("en-UK", comment));
+ task.setSubjects(subjects);
+ }
+ String priorityString = (String) workItem.getParameter("Priority");
+ int priority = 0;
+ if (priorityString != null) {
+ try {
+ priority = new Integer(priorityString);
+ } catch (NumberFormatException e) {
+ // do nothing
+ }
+ }
+ task.setPriority(priority);
+
+ TaskData taskData = new TaskData();
+ taskData.setWorkItemId(workItem.getId());
+ taskData.setSkipable(!"false".equals(workItem.getParameter("Skippable")));
+ //Sub Task Data
+ Long parentId = (Long) workItem.getParameter("ParentId");
+ if(parentId != null){
+ taskData.setParentId(parentId);
+ }
+
+ String subTaskStrategiesCommaSeparated = (String) workItem.getParameter("SubTaskStrategies");
+ if(subTaskStrategiesCommaSeparated!= null && !subTaskStrategiesCommaSeparated.equals("")){
+ String[] subTaskStrategies = subTaskStrategiesCommaSeparated.split(",");
+ List<SubTasksStrategy> strategies = new ArrayList<SubTasksStrategy>();
+ for(String subTaskStrategyString : subTaskStrategies){
+ SubTasksStrategy subTaskStrategy = SubTasksStrategyFactory.newStrategy(subTaskStrategyString);
+ strategies.add(subTaskStrategy);
+ }
+ task.setSubTaskStrategies(strategies);
+ }
+
+ PeopleAssignments assignments = new PeopleAssignments();
+ List<OrganizationalEntity> potentialOwners = new ArrayList<OrganizationalEntity>();
+
+ String actorId = (String) workItem.getParameter("ActorId");
+ if (actorId != null) {
+
+ String[] actorIds = actorId.split(",");
+ for (String id: actorIds) {
+ User user = new User();
+ user.setId(id.trim());
+ potentialOwners.add(user);
+ }
+ //Set the first user as creator ID??? hmmm might be wrong
+ if (potentialOwners.size() > 0){
+ taskData.setCreatedBy((User)potentialOwners.get(0));
+ }
+ }
+ String groupId = (String) workItem.getParameter("GroupId");
+ if (groupId != null) {
+
+ String[] groupIds = groupId.split(",");
+ for (String id: groupIds) {
+
+ potentialOwners.add(new Group(id));
+ }
+
+ }
+
+ assignments.setPotentialOwners(potentialOwners);
+ List<OrganizationalEntity> businessAdministrators = new ArrayList<OrganizationalEntity>();
+ businessAdministrators.add(new User("Administrator"));
+ assignments.setBusinessAdministrators(businessAdministrators);
+ task.setPeopleAssignments(assignments);
+
+ task.setTaskData(taskData);
+
+ ContentData content = null;
+ Object contentObject = workItem.getParameter("Content");
+ if (contentObject != null) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream out;
+ try {
+ out = new ObjectOutputStream(bos);
+ out.writeObject(contentObject);
+ out.close();
+ content = new ContentData();
+ content.setContent(bos.toByteArray());
+ content.setAccessType(AccessType.Inline);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ TaskWorkItemAddTaskResponseHandler taskResponseHandler =
+ new TaskWorkItemAddTaskResponseHandler(this.client, workItem.getId());
+ client.addTask(task, content, taskResponseHandler);
+ }
+
+ public void dispose() {
+ if (client != null) {
+ client.disconnect();
+ }
+ }
+
+ public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+ Long taskId = idMapping.get(workItem.getId());
+ if (taskId != null) {
+ synchronized (idMapping) {
+ idMapping.remove(taskId);
+ }
+ client.skip(taskId, "Administrator", null);
+ }
+ }
+
+ public class TaskWorkItemAddTaskResponseHandler extends AbstractBaseResponseHandler implements AddTaskResponseHandler {
+
+ private long workItemId;
+
+ public TaskWorkItemAddTaskResponseHandler(MinaTaskClient client, long workItemId) {
+ this.workItemId = workItemId;
+ }
+
+ public void execute(long taskId) {
+ synchronized ( idMapping ) {
+ idMapping.put(workItemId, taskId);
+ }
+// System.out.println("Created task " + taskId + " for work item " + workItemId);
+
+ EventKey key = new TaskEventKey(TaskCompletedEvent.class, taskId );
+ TaskCompletedHandler eventResponseHandler =
+ new TaskCompletedHandler(workItemId, taskId);
+ client.registerForEvent( key, true, eventResponseHandler );
+ key = new TaskEventKey(TaskFailedEvent.class, taskId );
+ client.registerForEvent( key, true, eventResponseHandler );
+ key = new TaskEventKey(TaskSkippedEvent.class, taskId );
+ client.registerForEvent( key, true, eventResponseHandler );
+ }
+ }
+
+ private class TaskCompletedHandler extends AbstractBaseResponseHandler implements EventResponseHandler {
+ private long workItemId;
+ private long taskId;
+
+ public TaskCompletedHandler(long workItemId, long taskId) {
+ this.workItemId = workItemId;
+ this.taskId = taskId;
+ }
+
+ public void execute(Payload payload) {
+ TaskEvent event = ( TaskEvent ) payload.get();
+ if ( event.getTaskId() != taskId ) {
+ // defensive check that should never happen, just here for testing
+ setError(new IllegalStateException("Expected task id and arrived task id do not march"));
+ return;
+ }
+ if (event instanceof TaskCompletedEvent) {
+ GetTaskResponseHandler getTaskResponseHandler = new GetCompletedTaskResponseHandler();
+ client.getTask(taskId, getTaskResponseHandler);
+ } else {
+ session.getWorkItemManager().abortWorkItem(workItemId);
+ }
+ }
+ }
+
+ private class GetCompletedTaskResponseHandler extends AbstractBaseResponseHandler implements GetTaskResponseHandler {
+
+ public void execute(Task task) {
+ long workItemId = task.getTaskData().getWorkItemId();
+ String userId = task.getTaskData().getActualOwner().getId();
+ Map<String, Object> results = new HashMap<String, Object>();
+ results.put("ActorId", userId);
+ long contentId = task.getTaskData().getOutputContentId();
+ if (contentId != -1) {
+ GetContentResponseHandler getContentResponseHandler =
+ new GetResultContentResponseHandler(task, results);
+ client.getContent(contentId, getContentResponseHandler);
+ } else {
+ session.getWorkItemManager().completeWorkItem(workItemId, results);
+ }
+ }
+ }
+
+ private class GetResultContentResponseHandler extends AbstractBaseResponseHandler implements GetContentResponseHandler {
+
+ private Task task;
+ private Map<String, Object> results;
+
+ public GetResultContentResponseHandler(Task task, Map<String, Object> results) {
+ this.task = task;
+ this.results = results;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void execute(Content content) {
+ ByteArrayInputStream bis = new ByteArrayInputStream(content.getContent());
+ ObjectInputStream in;
+ try {
+ in = new ObjectInputStream(bis);
+ Object result = in.readObject();
+ in.close();
+ results.put("Result", result);
+ if (result instanceof Map) {
+ Map<?, ?> map = (Map) result;
+ for (Map.Entry<?, ?> entry: map.entrySet()) {
+ if (entry.getKey() instanceof String) {
+ results.put((String) entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ session.getWorkItemManager().completeWorkItem(task.getTaskData().getWorkItemId(), results);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
Modified: labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java 2009-05-26 13:59:44 UTC (rev 26734)
+++ labs/jbossrules/trunk/drools-process/drools-process-task/src/main/java/org/drools/process/workitem/wsht/WSHumanTaskHandler.java 2009-05-26 14:01:47 UTC (rev 26735)
@@ -304,6 +304,14 @@
Object result = in.readObject();
in.close();
results.put("Result", result);
+ if (result instanceof Map) {
+ Map<?, ?> map = (Map) result;
+ for (Map.Entry<?, ?> entry: map.entrySet()) {
+ if (entry.getKey() instanceof String) {
+ results.put((String) entry.getKey(), entry.getValue());
+ }
+ }
+ }
manager.completeWorkItem(task.getTaskData().getWorkItemId(), results);
} catch (IOException e) {
e.printStackTrace();
More information about the jboss-svn-commits
mailing list