/* * Copyright 2012 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. * 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.services.task.wih; import java.util.Date; import java.util.Map; import org.jbpm.services.task.exception.PermissionDeniedException; import org.jbpm.services.task.utils.OnErrorAction; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.manager.RuntimeEngine; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemManager; import org.kie.api.task.model.Task; import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext; import org.kie.internal.task.api.InternalTaskService; import org.kie.internal.task.api.model.ContentData; import org.kie.internal.task.exception.TaskException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LocalHTWorkItemHandler extends AbstractHTWorkItemHandler { private static final Logger logger = LoggerFactory.getLogger(LocalHTWorkItemHandler.class); private RuntimeManager runtimeManager; public RuntimeManager getRuntimeManager() { return runtimeManager; } public void setRuntimeManager(RuntimeManager runtimeManager) { this.runtimeManager = runtimeManager; } public LocalHTWorkItemHandler() { } @Override public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { RuntimeEngine runtime = runtimeManager.getRuntimeEngine(ProcessInstanceIdContext.get(workItem.getProcessInstanceId())); KieSession ksessionById = runtime.getKieSession(); Task task = createTaskBasedOnWorkItemParams(ksessionById, workItem); // ContentData content = createTaskContentBasedOnWorkItemParams(ksessionById, workItem); Map<String, Object> content = createTaskDataBasedOnWorkItemParams(ksessionById, workItem); try { long taskId = ((InternalTaskService) runtime.getTaskService()).addTask(task, content); if (isAutoClaim(workItem, task)) { try { runtime.getTaskService().claim(taskId, (String) workItem.getParameter("SwimlaneActorId")); } catch (PermissionDeniedException e) { logger.warn("User {} is not allowed to auto claim task due to permission violation", workItem.getParameter("SwimlaneActorId")); } } } catch (Exception e) { if (action.equals(OnErrorAction.ABORT)) { manager.abortWorkItem(workItem.getId()); } else if (action.equals(OnErrorAction.RETHROW)) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } else { throw new RuntimeException(e); } } else if (action.equals(OnErrorAction.LOG)) { StringBuilder logMsg = new StringBuilder(); logMsg.append(new Date()).append(": Error when creating task on task server for work item id ").append(workItem.getId()); logMsg.append(". Error reported by task server: ").append(e.getMessage()); logger.error(logMsg.toString(), e); // rethrow to cancel processing if the exception is not recoverable if (!(e instanceof TaskException) || ((e instanceof TaskException) && !((TaskException) e).isRecoverable())) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } else { throw new RuntimeException(e); } } } } } @Override public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { RuntimeEngine runtime = runtimeManager.getRuntimeEngine(ProcessInstanceIdContext.get(workItem.getProcessInstanceId())); Task task = runtime.getTaskService().getTaskByWorkItemId(workItem.getId()); if (task != null) { try { runtime.getTaskService().exit(task.getId(), "Administrator"); } catch (PermissionDeniedException e) { logger.info(e.getMessage()); } } } }