/* * 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.process.workitem; import java.util.Collection; import org.drools.core.process.instance.impl.WorkItemImpl; import org.jbpm.workflow.instance.node.WorkItemNodeInstance; import org.kie.api.runtime.process.NodeInstance; import org.kie.api.runtime.process.NodeInstanceContainer; import org.kie.api.runtime.process.ProcessInstance; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemHandler; import org.kie.api.runtime.process.WorkflowProcessInstance; import org.kie.internal.runtime.StatefulKnowledgeSession; public abstract class AbstractWorkItemHandler implements WorkItemHandler { private StatefulKnowledgeSession ksession; public AbstractWorkItemHandler(StatefulKnowledgeSession ksession) { if (ksession == null) { throw new IllegalArgumentException("ksession cannot be null"); } this.ksession = ksession; } public StatefulKnowledgeSession getSession() { return ksession; } public long getProcessInstanceId(WorkItem workItem) { return ((WorkItemImpl) workItem).getProcessInstanceId(); } public ProcessInstance getProcessInstance(WorkItem workItem) { ProcessInstance processInstance = ksession.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<NodeInstance> nodeInstances) { for (NodeInstance nodeInstance: nodeInstances) { if (nodeInstance instanceof WorkItemNodeInstance) { WorkItemNodeInstance workItemNodeInstance = (WorkItemNodeInstance) nodeInstance; WorkItem workItem = workItemNodeInstance.getWorkItem(); if (workItem != null && workItemId == workItem.getId()) { return workItemNodeInstance; } } if (nodeInstance instanceof NodeInstanceContainer) { WorkItemNodeInstance result = findWorkItemNodeInstance(workItemId, ((NodeInstanceContainer) nodeInstance).getNodeInstances()); if (result != null) { return result; } } } return null; } }