/*
* 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.HashMap;
import java.util.Map;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.manager.RuntimeManager;
import org.kie.api.task.TaskEvent;
import org.kie.api.task.TaskLifeCycleEventListener;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.Task;
import org.kie.internal.runtime.manager.RuntimeManagerRegistry;
import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExternalTaskEventListener implements TaskLifeCycleEventListener {
private RuntimeManagerRegistry registry = RuntimeManagerRegistry.get();
private static final Logger logger = LoggerFactory.getLogger(ExternalTaskEventListener.class);
public ExternalTaskEventListener() {
}
public void processTaskState(Task task) {
long workItemId = task.getTaskData().getWorkItemId();
long processInstanceId = task.getTaskData().getProcessInstanceId();
RuntimeManager manager = getManager(task);
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId));
KieSession session = runtime.getKieSession();
if (task.getTaskData().getStatus() == Status.Completed) {
String userId = task.getTaskData().getActualOwner().getId();
Map<String, Object> results = new HashMap<String, Object>();
Map<String, Object> taskOutcome = task.getTaskData().getTaskOutputVariables();
if (taskOutcome != null) {
results.putAll(taskOutcome);
// results.put("Result", taskOutcome);
}
results.put("ActorId", userId);
session.getWorkItemManager().completeWorkItem(workItemId, results);
} else {
session.getWorkItemManager().abortWorkItem(workItemId);
}
}
public void afterTaskActivatedEvent(Task ti) {
// DO NOTHING
}
public void afterTaskClaimedEvent(Task ti) {
// DO NOTHING
}
public void afterTaskSkippedEvent(TaskEvent event) {
Task task = event.getTask();
long processInstanceId = task.getTaskData().getProcessInstanceId();
if (processInstanceId <= 0) {
return;
}
processTaskState(task);
}
public void afterTaskStartedEvent(Task ti) {
// DO NOTHING
}
public void afterTaskStoppedEvent(Task ti) {
// DO NOTHING
}
public void afterTaskCompletedEvent(TaskEvent event) {
Task task = event.getTask();
long processInstanceId = task.getTaskData().getProcessInstanceId();
if (processInstanceId <= 0) {
return;
}
RuntimeManager manager = getManager(task);
if (manager == null) {
throw new RuntimeException("No RuntimeManager registered with identifier: " + task.getTaskData().getDeploymentId());
}
RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId));
KieSession session = runtime.getKieSession();
if (session != null) {
logger.debug(">> I've recieved an event for a known session (" + task.getTaskData().getProcessSessionId()+")");
processTaskState(task);
} else {
logger.error("EE: I've recieved an event but the session is not known by this handler ( "+task.getTaskData().getProcessSessionId()+")");
}
}
public void afterTaskFailedEvent(TaskEvent event) {
Task task = event.getTask();
long processInstanceId = task.getTaskData().getProcessInstanceId();
if (processInstanceId <= 0) {
return;
}
processTaskState(task);
}
public void afterTaskAddedEvent(TaskEvent event) {
// DO NOTHING
}
public void afterTaskExitedEvent(TaskEvent event) {
// DO NOTHING
}
public RuntimeManager getManager(Task task) {
return registry.getManager(task.getTaskData().getDeploymentId());
}
@Override
public void afterTaskReleasedEvent(TaskEvent event) {
}
@Override
public void afterTaskResumedEvent(TaskEvent event) {
}
@Override
public void afterTaskSuspendedEvent(TaskEvent event) {
}
@Override
public void afterTaskForwardedEvent(TaskEvent event) {
}
@Override
public void afterTaskDelegatedEvent(TaskEvent event) {
}
@Override
public void beforeTaskActivatedEvent(TaskEvent event) {
}
@Override
public void beforeTaskClaimedEvent(TaskEvent event) {
}
@Override
public void beforeTaskSkippedEvent(TaskEvent event) {
}
@Override
public void beforeTaskStartedEvent(TaskEvent event) {
}
@Override
public void beforeTaskStoppedEvent(TaskEvent event) {
}
@Override
public void beforeTaskCompletedEvent(TaskEvent event) {
}
@Override
public void beforeTaskFailedEvent(TaskEvent event) {
}
@Override
public void beforeTaskAddedEvent(TaskEvent event) {
}
@Override
public void beforeTaskExitedEvent(TaskEvent event) {
}
@Override
public void beforeTaskReleasedEvent(TaskEvent event) {
}
@Override
public void beforeTaskResumedEvent(TaskEvent event) {
}
@Override
public void beforeTaskSuspendedEvent(TaskEvent event) {
}
@Override
public void beforeTaskForwardedEvent(TaskEvent event) {
}
@Override
public void beforeTaskDelegatedEvent(TaskEvent event) {
}
@Override
public void afterTaskActivatedEvent(TaskEvent event) {
}
@Override
public void afterTaskClaimedEvent(TaskEvent event) {
}
@Override
public void afterTaskStartedEvent(TaskEvent event) {
}
@Override
public void afterTaskStoppedEvent(TaskEvent event) {
}
@Override
public void beforeTaskNominatedEvent(TaskEvent event) {
}
@Override
public void afterTaskNominatedEvent(TaskEvent event) {
}
@Override
public boolean equals(Object obj) {
if ( this == obj )
return true;
if ( obj == null )
return false;
if ( (obj instanceof ExternalTaskEventListener) )
return true;
return false;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.getClass().getName().hashCode();
return result;
}
}