/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.component.jbpm;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.impl.DefaultProducer;
import org.apache.camel.util.ExchangeHelper;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.task.TaskService;
import org.kie.api.task.model.Attachment;
import org.kie.api.task.model.Content;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.Task;
import org.kie.api.task.model.TaskSummary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JBPMProducer extends DefaultProducer {
private static final transient Logger LOGGER = LoggerFactory.getLogger(JBPMProducer.class);
private KieSession kieSession;
private TaskService taskService;
private JBPMConfiguration configuration;
private RuntimeEngine runtimeEngine;
public JBPMProducer(JBPMEndpoint endpoint, RuntimeEngine runtimeEngine) {
super(endpoint);
this.configuration = endpoint.getConfiguration();
this.runtimeEngine = runtimeEngine;
}
@Override
protected void doStart() throws Exception {
LOGGER.trace("starting producer");
kieSession = runtimeEngine.getKieSession();
taskService = runtimeEngine.getTaskService();
super.doStart();
LOGGER.trace("started producer");
}
@Override
protected void doStop() throws Exception {
super.doStop();
if (kieSession != null) {
kieSession = null;
}
if (taskService != null) {
taskService = null;
}
}
public void process(Exchange exchange) throws Exception {
getOperation(exchange).execute(kieSession, taskService, configuration, exchange);
}
Operation getOperation(Exchange exchange) {
String operation = exchange.getIn().getHeader(JBPMConstants.OPERATION, String.class);
if (operation == null && configuration.getOperation() != null) {
operation = JBPMConstants.OPERATION + configuration.getOperation();
}
if (operation == null) {
operation = JBPMConstants.OPERATION + Operation.startProcess;
}
LOGGER.trace("Operation: [{}]", operation);
return Operation.valueOf(operation.substring(JBPMConstants.OPERATION.length()));
}
enum Operation {
//PROCESS OPERATIONS
startProcess {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
ProcessInstance processInstance = kieSession.startProcess(getProcessId(configuration, exchange), getParameters(configuration, exchange));
setResult(exchange, processInstance);
}
}, abortProcessInstance {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
kieSession.abortProcessInstance(safe(getProcessInstanceId(configuration, exchange)));
}
}, signalEvent {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Long processInstanceId = getProcessInstanceId(configuration, exchange);
if (processInstanceId != null) {
kieSession.signalEvent(getEventType(configuration, exchange), getEvent(configuration, exchange), processInstanceId);
} else {
kieSession.signalEvent(getEventType(configuration, exchange), getEvent(configuration, exchange));
}
}
}, getProcessInstance {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
ProcessInstance processInstance = kieSession.getProcessInstance(safe(getProcessInstanceId(configuration, exchange)));
setResult(exchange, processInstance);
}
}, getProcessInstances {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Collection<ProcessInstance> processInstances = kieSession.getProcessInstances();
setResult(exchange, processInstances);
}
},
//RULE OPERATIONS
fireAllRules {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Integer max = getMaxNumber(configuration, exchange);
int rulesFired;
if (max != null) {
rulesFired = kieSession.fireAllRules(max);
} else {
rulesFired = kieSession.fireAllRules();
}
setResult(exchange, rulesFired);
}
}, getFactCount {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
long factCount = kieSession.getFactCount();
setResult(exchange, factCount);
}
}, getGlobal {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Object global = kieSession.getGlobal(getIdentifier(configuration, exchange));
setResult(exchange, global);
}
}, setGlobal {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
kieSession.setGlobal(getIdentifier(configuration, exchange), getValue(configuration, exchange));
}
},
//WORK ITEM OPERATIONS
abortWorkItem {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
kieSession.getWorkItemManager().abortWorkItem(safe(getWorkItemId(configuration, exchange)));
}
}, completeWorkItem {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
kieSession.getWorkItemManager().completeWorkItem(safe(getWorkItemId(configuration, exchange)), getParameters(configuration, exchange));
}
},
//TASK OPERATIONS
activateTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.activate(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, addTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
long taskId = taskService.addTask(getTask(configuration, exchange), getParameters(configuration, exchange));
setResult(exchange, taskId);
}
}, claimNextAvailableTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.claimNextAvailable(getUserId(configuration, exchange), getLanguage(configuration, exchange));
}
}, claimTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.claim(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, completeTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.complete(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange), getParameters(configuration, exchange));
}
}, delegateTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.delegate(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange), getTargetUserId(configuration, exchange));
}
}, exitTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.exit(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, failTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.fail(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange), getParameters(configuration, exchange));
}
}, getAttachment {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Attachment attachment = taskService.getAttachmentById(safe(getAttachmentId(configuration, exchange)));
setResult(exchange, attachment);
}
}, getContent {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Content content = taskService.getContentById(safe(getContentId(configuration, exchange)));
setResult(exchange, content);
}
}, getTasksAssignedAsBusinessAdministrator {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
List<TaskSummary> taskSummaries = taskService.getTasksAssignedAsBusinessAdministrator(getUserId(configuration, exchange), getLanguage(configuration, exchange));
setResult(exchange, taskSummaries);
}
}, getTasksAssignedAsPotentialOwnerByStatus {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.getTasksAssignedAsPotentialOwnerByStatus(getUserId(configuration, exchange), getStatuses(configuration, exchange), getLanguage(configuration, exchange));
}
}, getTaskByWorkItem {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Task task = taskService.getTaskByWorkItemId(safe(getWorkItemId(configuration, exchange)));
setResult(exchange, task);
}
}, getTaskBy {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Task task = taskService.getTaskById(safe(getTaskId(configuration, exchange)));
setResult(exchange, task);
}
}, getTaskContent {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
Map<String, Object> taskContent = taskService.getTaskContent(safe(getTaskId(configuration, exchange)));
setResult(exchange, taskContent);
}
}, getTasksByProcessInstance {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
List<Long> processInstanceIds = taskService.getTasksByProcessInstanceId(safe(getProcessInstanceId(configuration, exchange)));
setResult(exchange, processInstanceIds);
}
}, getTasksByStatusByProcessInstance {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
List<TaskSummary> taskSummaryList = taskService.getTasksByStatusByProcessInstanceId(
safe(getProcessInstanceId(configuration, exchange)), getStatuses(configuration, exchange),
getLanguage(configuration, exchange));
setResult(exchange, taskSummaryList);
}
}, getTasksOwned {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
List<TaskSummary> summaryList = taskService.getTasksOwned(getUserId(configuration, exchange), getLanguage(configuration, exchange));
setResult(exchange, summaryList);
}
}, nominateTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.nominate(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange), getEntities(configuration, exchange));
}
}, releaseTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.release(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, resumeTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.resume(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, skipTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.skip(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, startTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.start(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, stopTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.stop(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
}, suspendTask {
@Override
void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange) {
taskService.suspend(safe(getTaskId(configuration, exchange)), getUserId(configuration, exchange));
}
};
List<Status> getStatuses(JBPMConfiguration configuration, Exchange exchange) {
List<Status> statusList = exchange.getIn().getHeader(JBPMConstants.STATUS_LIST, List.class);
if (statusList == null) {
statusList = configuration.getStatuses();
}
return statusList;
}
List<OrganizationalEntity> getEntities(JBPMConfiguration configuration, Exchange exchange) {
List<OrganizationalEntity> entityList = exchange.getIn().getHeader(JBPMConstants.ENTITY_LIST, List.class);
if (entityList == null) {
entityList = configuration.getEntities();
}
return entityList;
}
Long getAttachmentId(JBPMConfiguration configuration, Exchange exchange) {
Long attachmentId = exchange.getIn().getHeader(JBPMConstants.ATTACHMENT_ID, Long.class);
if (attachmentId == null) {
attachmentId = configuration.getAttachmentId();
}
return attachmentId;
}
Long getContentId(JBPMConfiguration configuration, Exchange exchange) {
Long contentId = exchange.getIn().getHeader(JBPMConstants.CONTENT_ID, Long.class);
if (contentId == null) {
contentId = configuration.getContentId();
}
return contentId;
}
String getTargetUserId(JBPMConfiguration configuration, Exchange exchange) {
String userId = exchange.getIn().getHeader(JBPMConstants.TARGET_USER_ID, String.class);
if (userId == null) {
userId = configuration.getTargetUserId();
}
return userId;
}
String getLanguage(JBPMConfiguration configuration, Exchange exchange) {
String language = exchange.getIn().getHeader(JBPMConstants.LANGUAGE, String.class);
if (language == null) {
language = configuration.getLanguage();
}
return language;
}
Task getTask(JBPMConfiguration configuration, Exchange exchange) {
Task task = exchange.getIn().getHeader(JBPMConstants.TASK, Task.class);
if (task == null) {
task = configuration.getTask();
}
return task;
}
String getUserId(JBPMConfiguration configuration, Exchange exchange) {
String userId = exchange.getIn().getHeader(JBPMConstants.USER_ID, String.class);
if (userId == null) {
userId = configuration.getUserId();
}
return userId;
}
Long getTaskId(JBPMConfiguration configuration, Exchange exchange) {
Long taskId = exchange.getIn().getHeader(JBPMConstants.TASK_ID, Long.class);
if (taskId == null) {
taskId = configuration.getTaskId();
}
return taskId;
}
Long getWorkItemId(JBPMConfiguration configuration, Exchange exchange) {
Long workItemId = exchange.getIn().getHeader(JBPMConstants.WORK_ITEM_ID, Long.class);
if (workItemId == null) {
workItemId = configuration.getWorkItemId();
}
return workItemId;
}
String getIdentifier(JBPMConfiguration configuration, Exchange exchange) {
String identifier = exchange.getIn().getHeader(JBPMConstants.IDENTIFIER, String.class);
if (identifier == null) {
identifier = configuration.getIdentifier();
}
return identifier;
}
Integer getMaxNumber(JBPMConfiguration configuration, Exchange exchange) {
Integer max = exchange.getIn().getHeader(JBPMConstants.MAX_NUMBER, Integer.class);
if (max == null) {
max = configuration.getMaxNumber();
}
return max;
}
Object getEvent(JBPMConfiguration configuration, Exchange exchange) {
Object event = exchange.getIn().getHeader(JBPMConstants.EVENT);
if (event == null) {
event = configuration.getEvent();
}
return event;
}
String getEventType(JBPMConfiguration configuration, Exchange exchange) {
String eventType = exchange.getIn().getHeader(JBPMConstants.EVENT_TYPE, String.class);
if (eventType == null) {
eventType = configuration.getEventType();
}
return eventType;
}
String getProcessId(JBPMConfiguration configuration, Exchange exchange) {
String processId = exchange.getIn().getHeader(JBPMConstants.PROCESS_ID, String.class);
if (processId == null) {
processId = configuration.getProcessId();
}
return processId;
}
Long getProcessInstanceId(JBPMConfiguration configuration, Exchange exchange) {
Long processInstanceId = exchange.getIn().getHeader(JBPMConstants.PROCESS_INSTANCE_ID, Long.class);
if (processInstanceId == null) {
processInstanceId = configuration.getProcessInstanceId();
}
return processInstanceId;
}
Map<String, Object> getParameters(JBPMConfiguration configuration, Exchange exchange) {
Map<String, Object> parameters = exchange.getIn().getHeader(JBPMConstants.PARAMETERS, Map.class);
if (parameters == null) {
parameters = configuration.getParameters();
}
return parameters;
}
Object getValue(JBPMConfiguration configuration, Exchange exchange) {
Object value = exchange.getIn().getHeader(JBPMConstants.VALUE);
if (value == null) {
value = configuration.getValue();
}
return value;
}
Message getResultMessage(Exchange exchange) {
return ExchangeHelper.isOutCapable(exchange) ? exchange.getOut() : exchange.getIn();
}
long safe(Long aLong) {
return aLong != null ? aLong : 0;
}
void setResult(Exchange exchange, Object result) {
getResultMessage(exchange).setBody(result);
}
abstract void execute(KieSession kieSession, TaskService taskService, JBPMConfiguration configuration, Exchange exchange);
}
}