/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.jbpm.process.workitem.wsht; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.drools.process.instance.impl.WorkItemImpl; import org.drools.runtime.KnowledgeRuntime; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.process.NodeInstance; import org.drools.runtime.process.NodeInstanceContainer; import org.drools.runtime.process.ProcessInstance; 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.eventmessaging.EventResponseHandler; import org.jbpm.task.Group; import org.jbpm.task.I18NText; import org.jbpm.task.OrganizationalEntity; import org.jbpm.task.PeopleAssignments; import org.jbpm.task.SubTasksStrategy; import org.jbpm.task.SubTasksStrategyFactory; import org.jbpm.task.Task; import org.jbpm.task.TaskData; import org.jbpm.task.User; import org.jbpm.task.event.TaskEventKey; import org.jbpm.task.service.ContentData; import org.jbpm.task.utils.ContentMarshallerHelper; import org.jbpm.task.utils.OnErrorAction; import org.jbpm.workflow.instance.node.WorkItemNodeInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractHTWorkItemHandler implements WorkItemHandler { private static final Logger logger = LoggerFactory.getLogger(AbstractHTWorkItemHandler.class); protected KnowledgeRuntime session; protected OnErrorAction action; protected Map eventHandlers = new HashMap(); public AbstractHTWorkItemHandler(KnowledgeRuntime session) { this.session = session; this.action = OnErrorAction.LOG; } public AbstractHTWorkItemHandler(KnowledgeRuntime session, OnErrorAction action) { this.session = session; this.action = action; } public void setAction(OnErrorAction action) { this.action = action; } protected Task createTaskBasedOnWorkItemParams(WorkItem workItem) { Task task = new Task(); String locale = (String) workItem.getParameter("Locale"); if (locale == null) { locale = "en-UK"; } String taskName = (String) workItem.getParameter("TaskName"); if (taskName != null) { List names = new ArrayList(); names.add(new I18NText(locale, taskName)); task.setNames(names); } /** * Using node's name if Comment is empty */ String comment = getNodeInstance(workItem).getNodeName(); if (comment == null || comment.isEmpty()) { comment = (String) workItem.getParameter("Comment"); if (comment == null) { comment = ""; } } List descriptions = new ArrayList(); descriptions.add(new I18NText(locale, comment)); task.setDescriptions(descriptions); List subjects = new ArrayList(); subjects.add(new I18NText(locale, 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.setProcessInstanceId(workItem.getProcessInstanceId()); taskData.setNodeInstanceId(getNodeInstance(workItem).getId()); if (session != null && session.getProcessInstance(workItem.getProcessInstanceId()) != null) { taskData.setProcessId(session.getProcessInstance(workItem.getProcessInstanceId()).getProcess().getId()); } if (session != null && (session instanceof StatefulKnowledgeSession)) { taskData.setProcessSessionId(((StatefulKnowledgeSession) session).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 strategies = new ArrayList(); for (String subTaskStrategyString : subTaskStrategies) { SubTasksStrategy subTaskStrategy = SubTasksStrategyFactory.newStrategy(subTaskStrategyString); strategies.add(subTaskStrategy); } task.setSubTaskStrategies(strategies); } PeopleAssignments assignments = new PeopleAssignments(); List potentialOwners = new ArrayList(); String actorId = (String) workItem.getParameter("ActorId"); if (actorId != null && actorId.trim().length() > 0) { String[] actorIds = actorId.split(","); for (String id : actorIds) { potentialOwners.add(new User(id.trim())); } //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 && groupId.trim().length() > 0) { String[] groupIds = groupId.split(","); for (String id : groupIds) { potentialOwners.add(new Group(id.trim())); } } assignments.setPotentialOwners(potentialOwners); List businessAdministrators = new ArrayList(); businessAdministrators.add(new User("Administrator")); assignments.setBusinessAdministrators(businessAdministrators); task.setPeopleAssignments(assignments); task.setTaskData(taskData); task.setDeadlines(HumanTaskHandlerHelper.setDeadlines(workItem, businessAdministrators, session.getEnvironment())); return task; } protected ContentData createTaskContentBasedOnWorkItemParams(WorkItem workItem) { Object contentObject = workItem.getParameter("Content"); if (contentObject == null) { contentObject = new HashMap(workItem.getParameters()); } return ContentMarshallerHelper.marshal(contentObject, session.getEnvironment()); } public long getProcessInstanceId(WorkItem workItem) { return ((WorkItemImpl) workItem).getProcessInstanceId(); } public ProcessInstance getProcessInstance(WorkItem workItem) { ProcessInstance processInstance = session.getProcessInstance(getProcessInstanceId(workItem)); return processInstance; } public NodeInstance getNodeInstance(WorkItem workItem) { ProcessInstance processInstance = getProcessInstance(workItem); if (!(processInstance instanceof WorkflowProcessInstance)) { return null; } return findWorkItemNodeInstance(workItem.getId(), ((WorkflowProcessInstance) processInstance).getNodeInstances()); } private WorkItemNodeInstance findWorkItemNodeInstance(long workItemId, Collection nodeInstances) { for (NodeInstance nodeInstance : nodeInstances) { if (nodeInstance instanceof WorkItemNodeInstance) { WorkItemNodeInstance workItemNodeInstance = (WorkItemNodeInstance) nodeInstance; if (workItemId == workItemNodeInstance.getWorkItem().getId()) { return workItemNodeInstance; } } if (nodeInstance instanceof NodeInstanceContainer) { WorkItemNodeInstance result = findWorkItemNodeInstance(workItemId, ((NodeInstanceContainer) nodeInstance).getNodeInstances()); if (result != null) { return result; } } } return null; } public abstract void executeWorkItem(WorkItem workItem, WorkItemManager manager); public abstract void abortWorkItem(WorkItem workItem, WorkItemManager manager); }