/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.examples.checklist.impl; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.drools.core.process.core.Work; import org.jbpm.examples.checklist.ChecklistItem; import org.jbpm.examples.checklist.ChecklistItem.Status; import org.jbpm.workflow.core.impl.NodeImpl; import org.jbpm.workflow.core.node.HumanTaskNode; import org.jbpm.workflow.core.node.StartNode; import org.kie.api.definition.process.Node; import org.kie.api.definition.process.NodeContainer; import org.kie.api.definition.process.WorkflowProcess; import org.kie.api.runtime.manager.audit.NodeInstanceLog; import org.kie.api.task.model.I18NText; import org.kie.api.task.model.OrganizationalEntity; import org.kie.api.task.model.Task; import org.kie.api.task.model.User; public final class ChecklistItemFactory { public static ChecklistItem createChecklistItem(Task task) { return new DefaultChecklistItem( getText(task.getNames()), getStatus(task.getTaskData().getStatus()), task.getId(), "HumanTaskNode", getActors(task), task.getPriority(), task.getTaskData().getProcessId(), task.getTaskData().getProcessInstanceId(), getText(task.getDescriptions())); } private static String getText(List<I18NText> texts) { if (texts == null) { return null; } for (I18NText text: texts) { if ("en-UK".equals(text.getLanguage())) { return text.getText(); } } return null; } private static Status getStatus(org.kie.api.task.model.Status status) { switch (status) { case Completed: return Status.Completed; case Ready: case Created: return Status.Created; case Error: case Exited: case Failed: case Obsolete: return Status.Aborted; case Suspended: case InProgress: return Status.InProgress; case Reserved: return Status.Reserved; default: return null; } } private static String getActors(Task task) { User actualOwner = task.getTaskData().getActualOwner(); if (actualOwner != null) { return actualOwner.getId(); } else { String result = ""; for (OrganizationalEntity o: task.getPeopleAssignments().getPotentialOwners()) { if (result.length() != 0) { result += ","; } result += o.getId(); } return result; } } public static Collection<ChecklistItem> getPendingChecklistItems(WorkflowProcess process) { List<ChecklistItem> result = new ArrayList<ChecklistItem>(); getPendingChecklistItems(process, result, process.getId()); return result; } private static void getPendingChecklistItems(NodeContainer container, List<ChecklistItem> result, String processId) { for (Node node: container.getNodes()) { if (node instanceof HumanTaskNode) { Work workItem = ((HumanTaskNode) node).getWork(); int priority = 0; String priorityString = (String) workItem.getParameter("Priority"); if (priorityString != null) { try { priority = new Integer(priorityString); } catch (NumberFormatException e) { // Do nothing } } String actorId = (String) workItem.getParameter("ActorId"); if (actorId != null && actorId.trim().length() == 0) { actorId = null; } String groupId = (String) workItem.getParameter("GroupId"); if (groupId != null && groupId.trim().length() == 0) { groupId = null; } String actors = null; if (actorId == null) { if (groupId == null) { actors = ""; } else { actors = groupId; } } else { if (groupId == null) { actors = actorId; } else { actors = actorId + "," + groupId; } } Status status = Status.Pending; if (((HumanTaskNode) node).getDefaultIncomingConnections().size() == 0) { status = Status.Optional; } result.add( createChecklistItem( (String) workItem.getParameter("TaskName"), "HumanTaskNode", actors, (String) workItem.getParameter("Comment"), priority, processId, status)); } else if (node instanceof NodeContainer) { getPendingChecklistItems((NodeContainer) node, result, processId); } else { String docs = (String) node.getMetaData().get("Documentation"); if (docs != null) { int position = docs.indexOf("OrderingNb="); if (position >= 0) { int end = docs.indexOf(";", position + 1); String orderingNumber = docs.substring(position + 11, end); Status status = Status.Pending; if (((NodeImpl) node).getDefaultIncomingConnections().size() == 0 && !(node instanceof StartNode)) { status = Status.Optional; } result.add( createChecklistItem( node.getName(), node.getClass().getSimpleName(), "", orderingNumber, 0, processId, status)); } } } } } public static Collection<ChecklistItem> getLoggedChecklistItems(WorkflowProcess process, List<NodeInstanceLog> nodeInstances) { Map<String, ChecklistItem> result = new HashMap<String, ChecklistItem>(); Map<String, String> relevantNodes = new HashMap<String, String>(); getRelevantNodes(process, relevantNodes); for (NodeInstanceLog log: nodeInstances) { String orderingNb = relevantNodes.get(log.getNodeId()); if (orderingNb != null) { if (log.getType() == NodeInstanceLog.TYPE_EXIT) { result.put(orderingNb, createChecklistItem(log.getNodeName(), log.getNodeType(), "", orderingNb, 0, log.getProcessId(), Status.Completed)); } else { if (result.get(orderingNb) == null) { result.put(orderingNb, createChecklistItem(log.getNodeName(), log.getNodeType(), "", orderingNb, 0, log.getProcessId(), Status.InProgress)); } } } } return result.values(); } private static void getRelevantNodes(NodeContainer container, Map<String, String> result) { for (Node node: container.getNodes()) { if (node instanceof NodeContainer) { getRelevantNodes((NodeContainer) node, result); } String docs = (String) node.getMetaData().get("Documentation"); if (docs != null) { int position = docs.indexOf("OrderingNb="); if (position >= 0) { int end = docs.indexOf(";", position + 1); String orderingNumber = docs.substring(position + 11, end); String nodeId = (String)node.getMetaData().get("UniqueId"); if (nodeId == null) { nodeId = ((NodeImpl) node).getUniqueId(); } result.put(nodeId, orderingNumber); } } } } private static ChecklistItem createChecklistItem(String name, String type, String actors, String orderingNb, long priority, String processId, Status status) { return new DefaultChecklistItem( name == null ? "" : name, status, null, type, actors == null ? "" : actors, priority, processId, null, orderingNb); } }