提交 1851a55e 编写于 作者: T Tijs Rademakers

Refactoring for Activiti 5 compatibility + Spring, CXF and Camel unit testing

上级 321b3342
......@@ -15,6 +15,7 @@ package org.activiti.camel;
import java.util.Map;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
......@@ -33,6 +34,8 @@ public class ActivitiComponent extends DefaultComponent {
protected IdentityService identityService;
protected RuntimeService runtimeService;
protected RepositoryService repositoryService;
protected boolean copyVariablesToProperties;
......@@ -48,6 +51,7 @@ public class ActivitiComponent extends DefaultComponent {
super.setCamelContext(context);
identityService = getByType(context, IdentityService.class);
runtimeService = getByType(context, RuntimeService.class);
repositoryService = getByType(context, RepositoryService.class);
}
private <T> T getByType(CamelContext ctx, Class<T> kls) {
......@@ -64,6 +68,7 @@ public class ActivitiComponent extends DefaultComponent {
ActivitiEndpoint ae = new ActivitiEndpoint(s, getCamelContext());
ae.setIdentityService(identityService);
ae.setRuntimeService(runtimeService);
ae.setRepositoryService(repositoryService);
ae.setCopyVariablesToProperties(this.copyVariablesToProperties);
ae.setCopyVariablesToBodyAsMap(this.copyVariablesToBodyAsMap);
......
......@@ -18,6 +18,7 @@ import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.apache.camel.CamelContext;
import org.apache.camel.Consumer;
......@@ -40,6 +41,8 @@ public class ActivitiEndpoint extends DefaultEndpoint {
protected IdentityService identityService;
protected RuntimeService runtimeService;
protected RepositoryService repositoryService;
protected ActivitiConsumer activitiConsumer;
......@@ -80,6 +83,7 @@ public class ActivitiEndpoint extends DefaultEndpoint {
ActivitiProducer producer = new ActivitiProducer(this, getTimeout(), getTimeResolution());
producer.setRuntimeService(runtimeService);
producer.setIdentityService(identityService);
producer.setRepositoryService(repositoryService);
return producer;
}
......@@ -109,6 +113,10 @@ public class ActivitiEndpoint extends DefaultEndpoint {
public void setRuntimeService(RuntimeService runtimeService) {
this.runtimeService = runtimeService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
public boolean isCopyVariablesToProperties() {
return copyVariablesToProperties;
......@@ -134,7 +142,6 @@ public class ActivitiEndpoint extends DefaultEndpoint {
this.copyVariablesToBodyAsMap = copyVariablesToBodyAsMap;
}
public String getCopyVariablesFromProperties() {
return copyVariablesFromProperties ;
}
......@@ -144,13 +151,11 @@ public class ActivitiEndpoint extends DefaultEndpoint {
this.copyVariablesFromProperties = copyVariablesFromProperties;
}
public String getCopyVariablesFromHeader() {
return copyVariablesFromHeader;
}
public void setCopyVariablesFromHeader(String copyVariablesFromHeader) {
public void setCopyVariablesFromHeader(String copyVariablesFromHeader) {
this.copyVariablesFromHeader = copyVariablesFromHeader;
}
......@@ -163,7 +168,7 @@ public class ActivitiEndpoint extends DefaultEndpoint {
}
public boolean isSetProcessInitiator() {
return StringUtils.isNotEmpty(getProcessInitiatorHeaderName());
return StringUtils.isNotEmpty(getProcessInitiatorHeaderName());
}
public Map<String, Object> getReturnVarMap() {
......@@ -175,11 +180,11 @@ public class ActivitiEndpoint extends DefaultEndpoint {
}
public String getProcessInitiatorHeaderName() {
return processInitiatorHeaderName;
return processInitiatorHeaderName;
}
public void setProcessInitiatorHeaderName(String processInitiatorHeaderName) {
this.processInitiatorHeaderName = processInitiatorHeaderName;
this.processInitiatorHeaderName = processInitiatorHeaderName;
}
@Override
......
......@@ -22,8 +22,11 @@ import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.util.Activiti5Util;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.camel.Exchange;
......@@ -34,6 +37,8 @@ public class ActivitiProducer extends DefaultProducer {
protected IdentityService identityService;
protected RuntimeService runtimeService;
protected RepositoryService repositoryService;
public static final String PROCESS_KEY_PROPERTY = "PROCESS_KEY_PROPERTY";
......@@ -69,14 +74,6 @@ public class ActivitiProducer extends DefaultProducer {
}
}
public void setIdentityService(IdentityService identityService) {
this.identityService = identityService;
}
public void setRuntimeService(RuntimeService runtimeService) {
this.runtimeService = runtimeService;
}
protected void copyResultToCamel(Exchange exchange, ProcessInstance pi) {
exchange.setProperty(PROCESS_ID_PROPERTY, pi.getProcessInstanceId());
......@@ -84,7 +81,14 @@ public class ActivitiProducer extends DefaultProducer {
if (returnVars != null && returnVars.size() > 0) {
Map<String, Object> processVariables = ((ExecutionEntity) pi).getVariableValues();
Map<String, Object> processVariables = null;
if (repositoryService.isActiviti5ProcessDefinition(pi.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
processVariables = activiti5CompatibilityHandler.getVariableValues(pi);
} else {
processVariables = ((ExecutionEntity) pi).getVariableValues();
}
if (processVariables != null) {
for (String variableName : returnVars.keySet()) {
if (processVariables.containsKey(variableName)) {
......@@ -186,4 +190,16 @@ public class ActivitiProducer extends DefaultProducer {
protected ActivitiEndpoint getActivitiEndpoint() {
return (ActivitiEndpoint) getEndpoint();
}
public void setIdentityService(IdentityService identityService) {
this.identityService = identityService;
}
public void setRuntimeService(RuntimeService runtimeService) {
this.runtimeService = runtimeService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
}
......@@ -22,6 +22,7 @@ import org.activiti.bpmn.model.MapExceptionEntry;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.delegate.BpmnError;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
......@@ -30,6 +31,7 @@ import org.activiti.engine.impl.bpmn.helper.ErrorPropagation;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.delegate.ActivityBehavior;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.util.Activiti5Util;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.apache.camel.CamelContext;
......@@ -63,7 +65,6 @@ public abstract class CamelBehavior extends AbstractBpmnActivityBehavior impleme
private static final long serialVersionUID = 1L;
protected Expression camelContext;
protected CamelContext camelContextObj;
protected SpringProcessEngineConfiguration springConfiguration;
protected List<MapExceptionEntry> mapExceptions;
protected abstract void setPropertTargetVariable(ActivitiEndpoint endpoint);
......@@ -114,8 +115,22 @@ public abstract class CamelBehavior extends AbstractBpmnActivityBehavior impleme
throw new ActivitiException("Exception while processing exchange", e);
}
execution.setVariables(ExchangeUtils.prepareVariables(exchange, endpoint));
if (!handleCamelException(exchange, execution))
boolean isActiviti5Execution = false;
if ((Context.getCommandContext() != null && Activiti5Util.isActiviti5ProcessDefinitionId(Context.getCommandContext(), execution.getProcessDefinitionId())) ||
(Context.getCommandContext() == null && Activiti5Util.getActiviti5CompatibilityHandler() != null)) {
isActiviti5Execution = true;
}
if (!handleCamelException(exchange, execution, isActiviti5Execution)) {
if (isActiviti5Execution) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.leaveExecution(execution);
return;
}
leave(execution);
}
}
protected ActivitiEndpoint createEndpoint(DelegateExecution execution) {
......@@ -142,18 +157,33 @@ public abstract class CamelBehavior extends AbstractBpmnActivityBehavior impleme
return ex;
}
protected boolean handleCamelException(Exchange exchange, DelegateExecution execution) {
protected boolean handleCamelException(Exchange exchange, DelegateExecution execution, boolean isActiviti5Execution) {
Exception camelException = exchange.getException();
boolean notHandledByCamel = exchange.isFailed() && camelException != null;
if (notHandledByCamel) {
if (camelException instanceof BpmnError) {
if (isActiviti5Execution) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.propagateError((BpmnError) camelException, execution);
return true;
}
ErrorPropagation.propagateError((BpmnError) camelException, execution);
return true;
} else {
if (ErrorPropagation.mapException(camelException, (ExecutionEntity) execution, mapExceptions))
if (isActiviti5Execution) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
if (activiti5CompatibilityHandler.mapException(camelException, execution, mapExceptions)) {
return true;
} else {
throw new ActivitiException("Unhandled exception on camel route", camelException);
}
}
if (ErrorPropagation.mapException(camelException, (ExecutionEntity) execution, mapExceptions)) {
return true;
else
} else {
throw new ActivitiException("Unhandled exception on camel route", camelException);
}
}
}
return false;
......@@ -190,41 +220,42 @@ public abstract class CamelBehavior extends AbstractBpmnActivityBehavior impleme
}
protected void setAppropriateCamelContext(DelegateExecution execution) {
// Check to see if the springConfiguration has been set. If not, set it.
if (springConfiguration == null) {
// Get the ProcessEngineConfiguration object.
ProcessEngineConfiguration engineConfiguration = Context.getProcessEngineConfiguration();
// Convert it to a SpringProcessEngineConfiguration. If this doesn't
// work, throw a RuntimeException.
// (ActivitiException extends RuntimeException.)
try {
springConfiguration = (SpringProcessEngineConfiguration) engineConfiguration;
} catch (Exception e) {
throw new ActivitiException("Expecting a SpringProcessEngineConfiguration for the Activiti Camel module.", e);
}
}
// Get the appropriate String representation of the CamelContext object
// from ActivityExecution (if available).
String camelContextValue = getStringFromField(camelContext, execution);
// If the String representation of the CamelContext object from
// ActivityExecution is empty, use the default.
// If the String representation of the CamelContext object from ActivityExecution is empty, use the default.
if (StringUtils.isEmpty(camelContextValue) && camelContextObj != null) {
// No processing required. No custom CamelContext & the default is
// already set.
// No processing required. No custom CamelContext & the default is already set.
} else {
if (StringUtils.isEmpty(camelContextValue) && camelContextObj == null) {
camelContextValue = springConfiguration.getDefaultCamelContext();
}
// Get the CamelContext object and set the super's member variable.
Object ctx = springConfiguration.getApplicationContext().getBean(camelContextValue);
if (ctx == null || ctx instanceof CamelContext == false) {
throw new ActivitiException("Could not find CamelContext named " + camelContextValue + ".");
// Get the ProcessEngineConfiguration object.
ProcessEngineConfiguration engineConfiguration = Context.getProcessEngineConfiguration();
if ((Context.getCommandContext() != null && Activiti5Util.isActiviti5ProcessDefinitionId(Context.getCommandContext(), execution.getProcessDefinitionId())) ||
(Context.getCommandContext() == null && Activiti5Util.getActiviti5CompatibilityHandler() != null)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
camelContextObj = (CamelContext) activiti5CompatibilityHandler.getCamelContextObject(camelContextValue);
} else {
// Convert it to a SpringProcessEngineConfiguration. If this doesn't work, throw a RuntimeException. (ActivitiException extends RuntimeException.)
try {
SpringProcessEngineConfiguration springConfiguration = (SpringProcessEngineConfiguration) engineConfiguration;
if (StringUtils.isEmpty(camelContextValue) && camelContextObj == null) {
camelContextValue = springConfiguration.getDefaultCamelContext();
}
// Get the CamelContext object and set the super's member variable.
Object ctx = springConfiguration.getApplicationContext().getBean(camelContextValue);
if (ctx == null || ctx instanceof CamelContext == false) {
throw new ActivitiException("Could not find CamelContext named " + camelContextValue + ".");
}
camelContextObj = (CamelContext) ctx;
} catch (Exception e) {
throw new ActivitiException("Expecting a SpringProcessEngineConfiguration for the Activiti Camel module.", e);
}
}
camelContextObj = (CamelContext) ctx;
}
}
......
......@@ -50,7 +50,7 @@ public class AsyncPingTest extends SpringActivitiTestCase {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("asyncPingProcess");
List<Execution> executionList = runtimeService.createExecutionQuery().list();
Assert.assertEquals(1, executionList.size());
Assert.assertEquals(2, executionList.size());
managementService.executeJob(managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult().getId());
Thread.sleep(1500);
......
......@@ -41,7 +41,8 @@
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="asyncExecutor" class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
<property name="defaultAsyncJobAcquireWaitTimeInMillis" value="1000" />
......
......@@ -33,7 +33,7 @@ import org.activiti.bpmn.model.Import;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.bpmn.data.SimpleStructureDefinition;
import org.activiti.engine.impl.bpmn.data.StructureDefinition;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.BpmnParseXMLImportHandler;
import org.activiti.engine.impl.bpmn.parser.XMLImporter;
import org.activiti.engine.impl.util.ReflectUtil;
import org.apache.cxf.Bus;
......@@ -76,10 +76,10 @@ public class CxfWSDLImporter implements XMLImporter {
this.namespace = "";
}
public void importFrom(Import theImport, BpmnParse parse) {
public void importFrom(Import theImport, BpmnParseXMLImportHandler parseHandler) {
this.namespace = theImport.getNamespace() == null ? "" : theImport.getNamespace() + ":";
try {
final URIResolver uriResolver = new URIResolver(parse.getSourceSystemId(), theImport.getLocation());
final URIResolver uriResolver = new URIResolver(parseHandler.getSourceSystemId(), theImport.getLocation());
if (uriResolver.isResolved()) {
if (uriResolver.getURI() != null) {
this.importFrom(uriResolver.getURI().toString());
......@@ -89,24 +89,24 @@ public class CxfWSDLImporter implements XMLImporter {
this.importFrom(uriResolver.getURL().toString());
}
} else {
throw new UncheckedException(new Exception("Unresolved import against " + parse.getSourceSystemId()));
throw new UncheckedException(new Exception("Unresolved import against " + parseHandler.getSourceSystemId()));
}
this.transferImportsToParse(parse);
this.transferImportsToParse(parseHandler);
} catch (final IOException e) {
throw new UncheckedException(e);
}
}
private void transferImportsToParse(BpmnParse parse) {
if (parse != null) {
private void transferImportsToParse(BpmnParseXMLImportHandler parseHandler) {
if (parseHandler != null) {
for (StructureDefinition structure : this.structures.values()) {
parse.addStructure(structure);
parseHandler.addStructure(structure);
}
for (WSService service : this.wsServices.values()) {
parse.addService(service);
parseHandler.addService(service);
}
for (WSOperation operation : this.wsOperations.values()) {
parse.addOperation(operation);
parseHandler.addOperation(operation);
}
}
}
......
......@@ -39,7 +39,7 @@ import org.activiti.bpmn.model.Import;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.bpmn.data.SimpleStructureDefinition;
import org.activiti.engine.impl.bpmn.data.StructureDefinition;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.BpmnParseXMLImportHandler;
import org.activiti.engine.impl.bpmn.parser.XMLImporter;
import org.activiti.engine.impl.util.ReflectUtil;
import org.w3c.dom.Document;
......@@ -77,10 +77,10 @@ public class WSDLImporter implements XMLImporter {
this.namespace = "";
}
public void importFrom(Import theImport, BpmnParse parse) {
public void importFrom(Import theImport, BpmnParseXMLImportHandler parseHandler) {
this.namespace = theImport.getNamespace() == null ? "" : theImport.getNamespace() + ":";
this.importFrom(theImport.getLocation());
this.transferImportsToParse(parse);
this.transferImportsToParse(parseHandler);
}
public void importFrom(String url) {
......@@ -222,16 +222,16 @@ public class WSDLImporter implements XMLImporter {
}
}
private void transferImportsToParse(BpmnParse parse) {
if (parse != null) {
private void transferImportsToParse(BpmnParseXMLImportHandler parseHandler) {
if (parseHandler != null) {
for (StructureDefinition structure : this.structures.values()) {
parse.addStructure(structure);
parseHandler.addStructure(structure);
}
for (WSService service : this.wsServices.values()) {
parse.addService(service);
parseHandler.addService(service);
}
for (WSOperation operation : this.wsOperations.values()) {
parse.addOperation(operation);
parseHandler.addOperation(operation);
}
}
}
......
......@@ -42,7 +42,7 @@ import org.activiti.image.ProcessDiagramGenerator;
* </p>
*
* <p>
* To create a process engine programatic, without a configuration file, the first option is {@link #createStandaloneProcessEngineConfiguration()}
* To create a process engine programmatic, without a configuration file, the first option is {@link #createStandaloneProcessEngineConfiguration()}
*
* <pre>
* ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration().buildProcessEngine();
......
......@@ -290,6 +290,11 @@ public interface RepositoryService {
* Returns the {@link ProcessDefinition} including all BPMN information like additional Properties (e.g. documentation).
*/
ProcessDefinition getProcessDefinition(String processDefinitionId);
/**
* Checks if the process definition should be executed by the Activiti 5 engine.
*/
Boolean isActiviti5ProcessDefinition(String processDefinitionId);
/**
* Returns the {@link BpmnModel} corresponding with the process definition with the provided process definition id. The {@link BpmnModel} is a pojo versions of the BPMN 2.0 xml and can be used to
......
......@@ -15,8 +15,13 @@ package org.activiti.engine.compatibility;
import java.io.InputStream;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.MapExceptionEntry;
import org.activiti.engine.delegate.BpmnError;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.impl.persistence.entity.JobEntity;
import org.activiti.engine.impl.persistence.entity.SignalEventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
......@@ -41,6 +46,10 @@ public interface Activiti5CompatibilityHandler {
ProcessDefinition getProcessDefinitionByKey(String processDefinitionKey);
org.activiti.bpmn.model.Process getProcessDefinitionProcessObject(String processDefinitionId);
BpmnModel getProcessDefinitionBpmnModel(String processDefinitionId);
void addCandidateStarter(String processDefinitionId, String userId, String groupId);
void deleteCandidateStarter(String processDefinitionId, String userId, String groupId);
......@@ -139,6 +148,14 @@ public interface Activiti5CompatibilityHandler {
void setJobRetries(String jobId, int retries);
void leaveExecution(DelegateExecution execution);
void propagateError(BpmnError bpmnError, DelegateExecution execution);
boolean mapException(Exception camelException, DelegateExecution execution, List<MapExceptionEntry> mapExceptions);
Map<String, Object> getVariableValues(ProcessInstance processInstance);
void addEventListener(Object listener);
void removeEventListener(Object listener);
......@@ -152,4 +169,6 @@ public interface Activiti5CompatibilityHandler {
Object getRawProcessConfiguration();
Object getRawCommandExecutor();
Object getCamelContextObject(String camelContextValue);
}
......@@ -40,6 +40,7 @@ import org.activiti.engine.impl.cmd.GetIdentityLinksForProcessDefinitionCmd;
import org.activiti.engine.impl.cmd.GetModelCmd;
import org.activiti.engine.impl.cmd.GetModelEditorSourceCmd;
import org.activiti.engine.impl.cmd.GetModelEditorSourceExtraCmd;
import org.activiti.engine.impl.cmd.IsActiviti5ProcessDefinitionCmd;
import org.activiti.engine.impl.cmd.SaveModelCmd;
import org.activiti.engine.impl.cmd.SetDeploymentCategoryCmd;
import org.activiti.engine.impl.cmd.SetProcessDefinitionCategoryCmd;
......@@ -127,6 +128,10 @@ public class RepositoryServiceImpl extends ServiceImpl implements RepositoryServ
public ProcessDefinition getProcessDefinition(String processDefinitionId) {
return commandExecutor.execute(new GetDeploymentProcessDefinitionCmd(processDefinitionId));
}
public Boolean isActiviti5ProcessDefinition(String processDefinitionId) {
return commandExecutor.execute(new IsActiviti5ProcessDefinitionCmd(processDefinitionId));
}
public BpmnModel getBpmnModel(String processDefinitionId) {
return commandExecutor.execute(new GetBpmnModelCmd(processDefinitionId));
......
......@@ -132,7 +132,7 @@ public class ExecuteAsyncRunnable implements Runnable {
@Override
public Void execute(CommandContext commandContext) {
if (job.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, job.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.handleFailedJob(job, exception);
return null;
}
......
......@@ -73,7 +73,7 @@ import org.slf4j.LoggerFactory;
* @author Tijs Rademakers
* @author Joram Barrez
*/
public class BpmnParse implements BpmnXMLConstants {
public class BpmnParse implements BpmnParseXMLImportHandler, BpmnXMLConstants {
protected static final Logger LOGGER = LoggerFactory.getLogger(BpmnParse.class);
......
package org.activiti.engine.impl.bpmn.parser;
import org.activiti.engine.impl.bpmn.data.StructureDefinition;
import org.activiti.engine.impl.bpmn.webservice.BpmnInterfaceImplementation;
import org.activiti.engine.impl.bpmn.webservice.OperationImplementation;
public interface BpmnParseXMLImportHandler {
String getSourceSystemId();
void addStructure(StructureDefinition structure);
void addService(BpmnInterfaceImplementation bpmnInterfaceImplementation);
void addOperation(OperationImplementation operationImplementation);
}
......@@ -29,5 +29,5 @@ public interface XMLImporter {
* @param parse
* the parse who called this importer
*/
void importFrom(Import theImport, BpmnParse parse);
void importFrom(Import theImport, BpmnParseXMLImportHandler parseHandler);
}
......@@ -108,6 +108,7 @@ import org.activiti.engine.impl.calendar.DueDateBusinessCalendar;
import org.activiti.engine.impl.calendar.DurationBusinessCalendar;
import org.activiti.engine.impl.calendar.MapBusinessCalendarManager;
import org.activiti.engine.impl.cfg.standalone.StandaloneMybatisTransactionContextFactory;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.db.DbIdGenerator;
import org.activiti.engine.impl.db.DbSqlSessionFactory;
import org.activiti.engine.impl.db.IbatisVariableTypeHandler;
......@@ -450,7 +451,13 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig
public ProcessEngine buildProcessEngine() {
init();
return new ProcessEngineImpl(this);
ProcessEngineImpl processEngine = new ProcessEngineImpl(this);
if (isActiviti5CompatibilityEnabled && activiti5CompatibilityHandler != null) {
// trigger build of Activiti 5 Engine
Context.setProcessEngineConfiguration(processEngine.getProcessEngineConfiguration());
activiti5CompatibilityHandler.getRawProcessEngine();
}
return processEngine;
}
// init
......
......@@ -77,7 +77,7 @@ public abstract class AbstractSetProcessDefinitionStateCmd implements Command<Vo
}
if (hasActiviti5ProcessDefinitions) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
if (getProcessDefinitionSuspensionState() == SuspensionState.ACTIVE) {
activiti5CompatibilityHandler.activateProcessDefinition(processDefinitionId, processDefinitionKey, includeProcessInstances, executionDate, tenantId);
} else if (getProcessDefinitionSuspensionState() == SuspensionState.SUSPENDED) {
......
......@@ -88,7 +88,7 @@ public class AddCommentCmd implements Command<Comment> {
}
if (processDefinitionId != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, processDefinitionId)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.addComment(taskId, processInstanceId, type, message);
}
......
......@@ -67,7 +67,7 @@ public class AddIdentityLinkCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.addIdentityLink(taskId, identityId, identityIdType, identityType);
return null;
}
......
......@@ -61,7 +61,7 @@ public class AddIdentityLinkForProcessDefinitionCmd implements Command<Void>, Se
}
if (Activiti5Util.isActiviti5ProcessDefinition(commandContext, processDefinition)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.addCandidateStarter(processDefinitionId, userId, groupId);
return null;
}
......
......@@ -75,7 +75,7 @@ public class AddIdentityLinkForProcessInstanceCmd implements Command<Void>, Seri
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, processInstance.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.addIdentityLinkForProcessInstance(processInstanceId, userId, groupId, type);
return null;
}
......
......@@ -34,7 +34,7 @@ public class ClaimTaskCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.claimTask(taskId, userId);
return null;
}
......
......@@ -43,7 +43,7 @@ public class CompleteTaskCmd extends AbstractCompleteTaskCmd {
// Backwards compatibility
if (task.getProcessDefinitionId() != null) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.completeTask(task, variables, localScope);
return null;
}
......
......@@ -64,7 +64,7 @@ public class CreateAttachmentCmd implements Command<Attachment> {
if (taskId != null) {
TaskEntity task = verifyTaskParameters(commandContext);
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, content, url);
}
}
......@@ -72,7 +72,7 @@ public class CreateAttachmentCmd implements Command<Attachment> {
if (processInstanceId != null) {
ExecutionEntity execution = verifyExecutionParameters(commandContext);
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, content, url);
}
}
......
......@@ -47,7 +47,7 @@ public class DeleteAttachmentCmd implements Command<Object>, Serializable {
if (process != null) {
processDefinitionId = process.getProcessDefinitionId();
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, process.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteAttachment(attachmentId);
return null;
}
......
......@@ -55,7 +55,7 @@ public class DeleteCommentCmd implements Command<Void>, Serializable {
if (comment.getProcessInstanceId() != null) {
ExecutionEntity execution = (ExecutionEntity) commandContext.getExecutionEntityManager().findExecutionById(comment.getProcessInstanceId());
if (execution != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteComment(commentId, taskId, processInstanceId);
return null;
}
......@@ -63,7 +63,7 @@ public class DeleteCommentCmd implements Command<Void>, Serializable {
} else if (comment.getTaskId() != null) {
Task task = commandContext.getTaskEntityManager().findTaskById(comment.getTaskId());
if (task != null && task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteComment(commentId, taskId, processInstanceId);
return null;
}
......@@ -78,7 +78,7 @@ public class DeleteCommentCmd implements Command<Void>, Serializable {
ExecutionEntity execution = (ExecutionEntity) commandContext.getExecutionEntityManager().findExecutionById(processInstanceId);
if (execution != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteComment(commentId, taskId, processInstanceId);
return null;
}
......@@ -89,7 +89,7 @@ public class DeleteCommentCmd implements Command<Void>, Serializable {
Task task = commandContext.getTaskEntityManager().findTaskById(taskId);
if (task != null && task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteComment(commentId, taskId, processInstanceId);
return null;
}
......
......@@ -51,7 +51,7 @@ public class DeleteHistoricProcessInstanceCmd implements Command<Object>, Serial
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, instance.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteHistoricProcessInstance(processInstanceId);
return null;
}
......
......@@ -71,7 +71,7 @@ public class DeleteIdentityLinkCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteIdentityLink(taskId, userId, groupId, type);
return null;
}
......
......@@ -62,7 +62,7 @@ public class DeleteIdentityLinkForProcessDefinitionCmd implements Command<Object
}
if (Activiti5Util.isActiviti5ProcessDefinition(commandContext, processDefinition)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteCandidateStarter(processDefinitionId, userId, groupId);
return null;
}
......
......@@ -69,7 +69,7 @@ public class DeleteIdentityLinkForProcessInstanceCmd implements Command<Object>,
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, processInstance.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteIdentityLinkForProcessInstance(processInstanceId, userId, groupId, type);
return null;
}
......
......@@ -37,7 +37,7 @@ public class DeleteJobCmd implements Command<Object>, Serializable {
JobEntity jobToDelete = getJobToDelete(commandContext);
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, jobToDelete.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteJob(jobToDelete.getId());
return null;
}
......
......@@ -60,7 +60,7 @@ public class DeleteProcessInstanceCmd implements Command<Void>, Serializable {
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, processInstanceEntity.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteProcessInstance(processInstanceId, deleteReason);
} else {
commandContext.getExecutionEntityManager().deleteProcessInstanceExecutionEntity(processInstanceEntity.getId(),
......
......@@ -70,7 +70,7 @@ public class ExecuteJobsCmd implements Command<Object>, Serializable {
}
if (job.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, job.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.executeJob(job);
return null;
}
......
......@@ -55,7 +55,7 @@ public class GetExecutionVariableCmd implements Command<Object>, Serializable {
}
if (execution != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.getExecutionVariable(executionId, variableName, isLocal);
}
......
......@@ -56,7 +56,7 @@ public class GetExecutionVariablesCmd implements Command<Map<String, Object>>, S
}
if (execution != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.getExecutionVariables(executionId, variableNames, isLocal);
}
......
......@@ -10,50 +10,47 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti5.engine.impl.bpmn.data;
package org.activiti.engine.impl.cmd;
import java.io.Serializable;
import org.activiti.engine.delegate.Expression;
import org.activiti5.engine.impl.pvm.delegate.ActivityExecution;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
/**
* A data association (Input or Output) between a source and a target
*
* @author Esteban Robles Luna
* @author Tom Baeyens
*/
public abstract class AbstractDataAssociation implements Serializable {
public class IsActiviti5ProcessDefinitionCmd implements Command<Boolean>, Serializable {
private static final long serialVersionUID = 1L;
protected String source;
protected Expression sourceExpression;
protected String target;
protected AbstractDataAssociation(String source, String target) {
this.source = source;
this.target = target;
}
protected AbstractDataAssociation(Expression sourceExpression, String target) {
this.sourceExpression = sourceExpression;
this.target = target;
}
protected String processDefinitionId;
public abstract void evaluate(ActivityExecution execution);
public String getSource() {
return source;
}
public String getTarget() {
return target;
public IsActiviti5ProcessDefinitionCmd(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public Expression getSourceExpression() {
return sourceExpression;
public Boolean execute(CommandContext commandContext) {
if (!commandContext.getProcessEngineConfiguration().isActiviti5CompatibilityEnabled()) {
return false;
}
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition.getEngineVersion() != null) {
if (Activiti5CompatibilityHandler.ACTIVITI_5_ENGINE_TAG.equals(processDefinition.getEngineVersion())) {
if (commandContext.getProcessEngineConfiguration().isActiviti5CompatibilityEnabled()) {
return true;
}
} else {
throw new ActivitiException("Invalid 'engine' for process definition " + processDefinition.getId() + " : " + processDefinition.getEngineVersion());
}
}
return false;
}
}
......@@ -65,7 +65,7 @@ public class MessageEventReceivedCmd extends NeedsActiveExecutionCmd<Void> {
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.messageEventReceived(messageName, executionId, payload, async);
return null;
}
......
......@@ -26,7 +26,7 @@ public class RemoveExecutionVariablesCmd extends NeedsActiveExecutionCmd<Void> {
protected Void execute(CommandContext commandContext, ExecutionEntity execution) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.removeExecutionVariables(executionId, variableNames, isLocal);
return null;
}
......
......@@ -27,7 +27,7 @@ public class RemoveTaskVariablesCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.removeTaskVariables(taskId, variableNames, isLocal);
return null;
}
......
......@@ -47,7 +47,7 @@ public class SaveAttachmentCmd implements Command<Object>, Serializable {
if (process != null) {
processDefinitionId = process.getProcessDefinitionId();
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, process.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.saveAttachment(attachment);
return null;
}
......
......@@ -44,7 +44,7 @@ public class SaveTaskCmd implements Command<Void>, Serializable {
}
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.saveTask(task);
return null;
}
......
......@@ -39,7 +39,7 @@ public class SetExecutionVariablesCmd extends NeedsActiveExecutionCmd<Object> {
protected Object execute(CommandContext commandContext, ExecutionEntity execution) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setExecutionVariables(executionId, variables, isLocal);
return null;
}
......
......@@ -52,7 +52,7 @@ public class SetJobRetriesCmd implements Command<Void>, Serializable {
if (job != null) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, job.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setJobRetries(job.getId(), retries);
return null;
}
......
......@@ -51,7 +51,7 @@ public class SetProcessDefinitionCategoryCmd implements Command<Void> {
}
if (Activiti5Util.isActiviti5ProcessDefinition(commandContext, processDefinition)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setProcessDefinitionCategory(processDefinitionId, category);
return null;
}
......
......@@ -12,13 +12,13 @@
*/
package org.activiti.engine.impl.cmd;
import java.util.Date;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.util.Activiti5Util;
import java.util.Date;
/**
* @author Brian Showers
*/
......@@ -35,7 +35,7 @@ public class SetTaskDueDateCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setTaskDueDate(taskId, dueDate);
return null;
}
......
......@@ -33,7 +33,7 @@ public class SetTaskPriorityCmd extends NeedsActiveTaskCmd<Void> {
protected Void execute(CommandContext commandContext, TaskEntity task) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setTaskPriority(taskId, priority);
return null;
}
......
......@@ -41,7 +41,7 @@ public class SetTaskVariablesCmd extends NeedsActiveTaskCmd<Object> {
protected Object execute(CommandContext commandContext, TaskEntity task) {
if (task.getProcessDefinitionId() != null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.setTaskVariables(taskId, variables, isLocal);
return null;
}
......
......@@ -84,7 +84,7 @@ public class SignalEventReceivedCmd implements Command<Void> {
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.signalEventReceived(eventName, executionId, payload, async, tenantId);
return null;
}
......@@ -102,7 +102,7 @@ public class SignalEventReceivedCmd implements Command<Void> {
if (signalEventSubscriptionEntity.isGlobalScoped()) {
if (executionId == null && Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, signalEventSubscriptionEntity.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.signalEventReceived(signalEventSubscriptionEntity, payload, async);
} else {
......
......@@ -45,7 +45,7 @@ public class SubmitStartFormCmd extends NeedsActiveProcessDefinitionCmd<ProcessI
protected ProcessInstance execute(CommandContext commandContext, ProcessDefinitionEntity processDefinition) {
if (Activiti5Util.isActiviti5ProcessDefinition(commandContext, processDefinition)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.submitStartFormData(processDefinition.getId(), businessKey, properties);
}
......
......@@ -45,7 +45,7 @@ public class SubmitTaskFormCmd extends AbstractCompleteTaskCmd {
// Backwards compatibility
if (task.getProcessDefinitionId() != null) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.submitTaskFormData(taskId, properties, completeTask);
return null;
}
......
......@@ -40,7 +40,7 @@ public class TriggerCmd extends NeedsActiveExecutionCmd<Object> {
protected Object execute(CommandContext commandContext, ExecutionEntity execution) {
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, execution.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.trigger(executionId, processVariables);
return null;
}
......
......@@ -15,6 +15,7 @@ package org.activiti.engine.impl.context;
import java.util.Stack;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.agenda.Agenda;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.interceptor.CommandContext;
......@@ -32,7 +33,9 @@ public class Context {
protected static ThreadLocal<Stack<ProcessEngineConfigurationImpl>> processEngineConfigurationStackThreadLocal = new ThreadLocal<Stack<ProcessEngineConfigurationImpl>>();
protected static ThreadLocal<Stack<ExecutionContext>> executionContextStackThreadLocal = new ThreadLocal<Stack<ExecutionContext>>();
protected static ThreadLocal<JobExecutorContext> jobExecutorContextThreadLocal = new ThreadLocal<JobExecutorContext>();
protected static ThreadLocal<Activiti5CompatibilityHandler> activiti5CompatibilityHandlerThreadLocal = new ThreadLocal<Activiti5CompatibilityHandler>();
protected static ThreadLocal<Activiti5CompatibilityHandler> fallbackActiviti5CompatibilityHandlerThreadLocal = new ThreadLocal<Activiti5CompatibilityHandler>();
public static CommandContext getCommandContext() {
Stack<CommandContext> stack = getStack(commandContextThreadLocal);
if (stack.isEmpty()) {
......@@ -106,4 +109,28 @@ public class Context {
public static void removeJobExecutorContext() {
jobExecutorContextThreadLocal.remove();
}
public static Activiti5CompatibilityHandler getActiviti5CompatibilityHandler() {
return activiti5CompatibilityHandlerThreadLocal.get();
}
public static void setActiviti5CompatibilityHandler(Activiti5CompatibilityHandler activiti5CompatibilityHandler) {
activiti5CompatibilityHandlerThreadLocal.set(activiti5CompatibilityHandler);
}
public static void removeActiviti5CompatibilityHandler() {
activiti5CompatibilityHandlerThreadLocal.remove();
}
public static Activiti5CompatibilityHandler getFallbackActiviti5CompatibilityHandler() {
return fallbackActiviti5CompatibilityHandlerThreadLocal.get();
}
public static void setFallbackActiviti5CompatibilityHandler(Activiti5CompatibilityHandler activiti5CompatibilityHandler) {
fallbackActiviti5CompatibilityHandlerThreadLocal.set(activiti5CompatibilityHandler);
}
public static void removeFallbackActiviti5CompatibilityHandler() {
fallbackActiviti5CompatibilityHandlerThreadLocal.remove();
}
}
......@@ -52,6 +52,9 @@ public class CommandContextInterceptor extends AbstractCommandInterceptor {
// Push on stack
Context.setCommandContext(context);
Context.setProcessEngineConfiguration(processEngineConfiguration);
if (processEngineConfiguration.getActiviti5CompatibilityHandler() != null) {
Context.setActiviti5CompatibilityHandler(processEngineConfiguration.getActiviti5CompatibilityHandler());
}
return next.execute(config, command);
......@@ -69,6 +72,7 @@ public class CommandContextInterceptor extends AbstractCommandInterceptor {
// Pop from stack
Context.removeCommandContext();
Context.removeProcessEngineConfiguration();
Context.removeActiviti5CompatibilityHandler();
}
}
......
......@@ -118,7 +118,7 @@ public class HistoricTaskInstanceEntityManagerImpl extends AbstractEntityManager
if (historicTaskInstance.getProcessDefinitionId() != null
&& Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, historicTaskInstance.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteHistoricTask(taskId);
return;
}
......
......@@ -281,7 +281,7 @@ public class TaskEntityManagerImpl extends AbstractEntityManager<TaskEntity> imp
}
if (Activiti5Util.isActiviti5ProcessDefinitionId(commandContext, task.getProcessDefinitionId())) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
activiti5CompatibilityHandler.deleteTask(taskId, deleteReason, cascade);
return;
}
......
......@@ -14,6 +14,7 @@ package org.activiti.engine.impl.util;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.compatibility.Activiti5CompatibilityHandler;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
......@@ -23,7 +24,7 @@ import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
*/
public class Activiti5Util {
public static boolean isActiviti5ProcessDefinitionId(CommandContext commandContext, String processDefinitionId) {
public static boolean isActiviti5ProcessDefinitionId(CommandContext commandContext, final String processDefinitionId) {
if (processDefinitionId == null) {
return false;
......@@ -55,8 +56,12 @@ public class Activiti5Util {
return false;
}
public static Activiti5CompatibilityHandler getActiviti5CompatibilityHandler(CommandContext commandContext) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = commandContext.getProcessEngineConfiguration().getActiviti5CompatibilityHandler();
public static Activiti5CompatibilityHandler getActiviti5CompatibilityHandler() {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Context.getActiviti5CompatibilityHandler();
if (activiti5CompatibilityHandler == null) {
activiti5CompatibilityHandler = Context.getFallbackActiviti5CompatibilityHandler();
}
if (activiti5CompatibilityHandler == null) {
throw new ActivitiException("Found Activiti 5 process definition, but no compatibility handler on the classpath");
}
......
......@@ -44,17 +44,24 @@ public class ProcessDefinitionUtil {
}
public static Process getProcess(String processDefinitionId) {
return getCacheEntry(processDefinitionId).getProcess();
if (Context.getProcessEngineConfiguration() == null) {
return Activiti5Util.getActiviti5CompatibilityHandler().getProcessDefinitionProcessObject(processDefinitionId);
} else {
DeploymentManager deploymentManager = Context.getProcessEngineConfiguration().getDeploymentManager();
ProcessDefinitionEntity processDefinitionEntity = deploymentManager.findDeployedProcessDefinitionById(processDefinitionId);
return deploymentManager.resolveProcessDefinition(processDefinitionEntity).getProcess();
}
}
public static BpmnModel getBpmnModel(String processDefinitionId) {
return getCacheEntry(processDefinitionId).getBpmnModel();
}
public static ProcessDefinitionCacheEntry getCacheEntry(String processDefinitionId) {
DeploymentManager deploymentManager = Context.getProcessEngineConfiguration().getDeploymentManager();
ProcessDefinitionEntity processDefinitionEntity = deploymentManager.findDeployedProcessDefinitionById(processDefinitionId);
return deploymentManager.resolveProcessDefinition(processDefinitionEntity);
if (Context.getProcessEngineConfiguration() == null) {
return Activiti5Util.getActiviti5CompatibilityHandler().getProcessDefinitionBpmnModel(processDefinitionId);
} else {
DeploymentManager deploymentManager = Context.getProcessEngineConfiguration().getDeploymentManager();
ProcessDefinitionEntity processDefinitionEntity = deploymentManager.findDeployedProcessDefinitionById(processDefinitionId);
return deploymentManager.resolveProcessDefinition(processDefinitionEntity).getBpmnModel();
}
}
}
......@@ -58,7 +58,7 @@ public class ProcessInstanceUtil {
CommandContext commandContext = Context.getCommandContext(); // Todo: ideally, context should be passed here
if (Activiti5Util.isActiviti5ProcessDefinition(commandContext, processDefinition)) {
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler(commandContext);
Activiti5CompatibilityHandler activiti5CompatibilityHandler = Activiti5Util.getActiviti5CompatibilityHandler();
return activiti5CompatibilityHandler.startProcessInstance(processDefinition.getKey(), processDefinition.getId(),
variables, businessKey, processDefinition.getTenantId(), processInstanceName);
}
......
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>Activiti 5 - Camel - Compatability tests</name>
<artifactId>activiti5-camel-test</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>org.activiti</groupId>
<artifactId>activiti-root</artifactId>
<relativePath>../..</relativePath>
<version>6.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti5-engine</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-camel</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti5-spring</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti5-compatibility</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti5-spring-compatibility</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti5-spring-test</artifactId>
<version>6.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mvel</artifactId>
<scope>test</scope>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>distro</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
package org.activiti5.camel;
/**
* @author Saeid Mirzaei
*/
import java.util.List;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.junit.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class AsyncPingTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
@Autowired
protected RuntimeService runtimeService;
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:asyncPingProcess:serviceAsyncPing").to("seda:continueAsync");
from("seda:continueAsync").to("activiti:asyncPingProcess:receiveAsyncPing");
}
});
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/asyncPing.bpmn20.xml" })
public void testRunProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("asyncPingProcess");
List<Execution> executionList = runtimeService.createExecutionQuery().list();
Assert.assertEquals(1, executionList.size());
managementService.executeJob(managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult().getId());
Thread.sleep(1500);
executionList = runtimeService.createExecutionQuery().list();
Assert.assertEquals(0, executionList.size());
Assert.assertEquals(0, runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
}
}
/* 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.activiti5.camel;
/**
* @author Saeid Mirzaei
*/
import java.util.List;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class AsyncProcessTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:asyncCamelProcess:serviceTaskAsync1").setHeader("destination", constant("activiti:asyncCamelProcess:receive1")).to("seda:asyncQueue");
from("activiti:asyncCamelProcess:serviceTaskAsync2").setHeader("destination", constant("activiti:asyncCamelProcess:receive2")).to("seda:asyncQueue2");
from("seda:asyncQueue").to("bean:sleepBean?method=sleep").to("seda:receiveQueue");
from("seda:asyncQueue2").to("bean:sleepBean?method=sleep").to("seda:receiveQueue");
from("seda:receiveQueue").recipientList(header("destination"));
}
});
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/async.bpmn20.xml" })
public void testRunProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("asyncCamelProcess");
List<Execution> executionList = runtimeService.createExecutionQuery().list();
assertEquals(3, executionList.size());
Thread.sleep(4000);
assertEquals(0, runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
}
}
package org.activiti5.camel;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.LoggingLevel;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class CamelVariableBodyMapTest extends SpringActivitiTestCase {
protected MockEndpoint service1;
@Autowired
protected CamelContext camelContext;
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:HelloCamel:serviceTask1").log(LoggingLevel.INFO, "Received message on service task").to("mock:serviceBehavior");
}
});
service1 = (MockEndpoint) camelContext.getEndpoint("mock:serviceBehavior");
service1.reset();
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/HelloCamelBodyMap.bpmn20.xml" })
public void testCamelBody() throws Exception {
Map<String, Object> varMap = new HashMap<String, Object>();
varMap.put("camelBody", "hello world");
service1.expectedBodiesReceived(varMap);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HelloCamel", varMap);
// Ensure that the variable is equal to the expected value.
assertEquals("hello world", runtimeService.getVariable(processInstance.getId(), "camelBody"));
service1.assertIsSatisfied();
Task task = taskService.createTaskQuery().singleResult();
// Ensure that the name of the task is correct.
assertEquals("Hello Task", task.getName());
// Complete the task.
taskService.complete(task.getId());
}
}
package org.activiti5.camel;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.LoggingLevel;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class CamelVariableBodyTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
protected MockEndpoint service1;
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:HelloCamel:serviceTask1").log(LoggingLevel.INFO, "Received message on service task").to("mock:serviceBehavior");
}
});
service1 = (MockEndpoint) camelContext.getEndpoint("mock:serviceBehavior");
service1.reset();
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/HelloCamelBody.bpmn20.xml" })
public void testCamelBody() throws Exception {
service1.expectedBodiesReceived("hello world");
Map<String, Object> varMap = new HashMap<String, Object>();
varMap.put("camelBody", "hello world");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HelloCamel", varMap);
// Ensure that the variable is equal to the expected value.
assertEquals("hello world", runtimeService.getVariable(processInstance.getId(), "camelBody"));
service1.assertIsSatisfied();
Task task = taskService.createTaskQuery().singleResult();
// Ensure that the name of the task is correct.
assertEquals("Hello Task", task.getName());
// Complete the task.
taskService.complete(task.getId());
}
}
/* 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.activiti5.camel;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.activiti.camel.ActivitiProducer;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class CustomContextTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
protected MockEndpoint service1;
protected MockEndpoint service2;
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("activiti:camelProcess");
from("activiti:camelProcess:serviceTask1").setBody().property("var1").to("mock:service1").setProperty("var2").constant("var2").setBody().properties();
from("activiti:camelProcess:serviceTask2?copyVariablesToBodyAsMap=true").to("mock:service2");
from("direct:receive").to("activiti:camelProcess:receive");
}
});
service1 = (MockEndpoint) camelContext.getEndpoint("mock:service1");
service1.reset();
service2 = (MockEndpoint) camelContext.getEndpoint("mock:service2");
service2.reset();
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/custom.bpmn20.xml" })
public void testRunProcess() throws Exception {
CamelContext ctx = applicationContext.getBean(CamelContext.class);
ProducerTemplate tpl = ctx.createProducerTemplate();
service1.expectedBodiesReceived("ala");
Exchange exchange = ctx.getEndpoint("direct:start").createExchange();
exchange.getIn().setBody(Collections.singletonMap("var1", "ala"));
tpl.send("direct:start", exchange);
String instanceId = (String) exchange.getProperty("PROCESS_ID_PROPERTY");
tpl.sendBodyAndProperty("direct:receive", null, ActivitiProducer.PROCESS_ID_PROPERTY, instanceId);
assertProcessEnded(instanceId);
service1.assertIsSatisfied();
@SuppressWarnings("rawtypes")
Map m = service2.getExchanges().get(0).getIn().getBody(Map.class);
assertEquals("ala", m.get("var1"));
assertEquals("var2", m.get("var2"));
}
}
/* 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.activiti5.camel;
import java.util.List;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.junit.BeforeClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class EmptyProcessTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
@BeforeClass
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:startEmpty").to("activiti:emptyProcess");
from("direct:startEmptyWithHeader").setHeader("MyVar", constant("Foo")).to("activiti:emptyProcess?copyVariablesFromHeader=true");
from("direct:startEmptyBodyAsString").to("activiti:emptyProcess?copyBodyToCamelBodyAsString=true");
}
});
}
public void tearDown() throws Exception {
List<Route> routes = camelContext.getRoutes();
for (Route r : routes) {
camelContext.stopRoute(r.getId());
camelContext.removeRoute(r.getId());
}
}
@Deployment(resources = { "process/empty.bpmn20.xml" })
public void testRunProcessWithHeader() throws Exception {
ProducerTemplate tpl = camelContext.createProducerTemplate();
String body = "body text";
String instanceId = (String) tpl.requestBody("direct:startEmptyWithHeader", body);
assertProcessEnded(instanceId);
HistoricVariableInstance var = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("camelBody").singleResult();
assertNotNull(var);
assertEquals(body, var.getValue());
var = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("MyVar").singleResult();
assertNotNull(var);
assertEquals("Foo", var.getValue());
}
@Deployment(resources = { "process/empty.bpmn20.xml" })
public void testObjectAsVariable() throws Exception {
CamelContext ctx = applicationContext.getBean(CamelContext.class);
ProducerTemplate tpl = ctx.createProducerTemplate();
Object expectedObj = new Long(99);
Exchange exchange = ctx.getEndpoint("direct:startEmpty").createExchange();
exchange.getIn().setBody(expectedObj);
tpl.send("direct:startEmpty", exchange);
String instanceId = (String) exchange.getProperty("PROCESS_ID_PROPERTY");
assertProcessEnded(instanceId);
HistoricVariableInstance var = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("camelBody").singleResult();
assertNotNull(var);
assertEquals(expectedObj, var.getValue());
}
@Deployment(resources = { "process/empty.bpmn20.xml" })
public void testObjectAsStringVariable() throws Exception {
CamelContext ctx = applicationContext.getBean(CamelContext.class);
ProducerTemplate tpl = ctx.createProducerTemplate();
Object expectedObj = new Long(99);
Exchange exchange = ctx.getEndpoint("direct:startEmptyBodyAsString").createExchange();
exchange.getIn().setBody(expectedObj);
tpl.send("direct:startEmptyBodyAsString", exchange);
String instanceId = (String) exchange.getProperty("PROCESS_ID_PROPERTY");
assertProcessEnded(instanceId);
HistoricVariableInstance var = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("camelBody").singleResult();
assertNotNull(var);
assertEquals(expectedObj.toString(), var.getValue().toString());
}
}
/* 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.activiti5.camel;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.activiti5.camel.util.Routing;
import org.springframework.test.context.ContextConfiguration;
/**
* Demonstrates an issue in Activiti 5.12. Exception on Camel routes will be lost, if default error handling is used.
*
* @author stefan.schulze@accelsis.biz
*
*/
@ContextConfiguration("classpath:error-camel-activiti-context.xml")
public class ErrorHandlingTest extends SpringActivitiTestCase {
private static final int WAIT = 3000;
private static final String PREVIOUS_WAIT_STATE = "LogProcessStart";
private static final String NEXT_WAIT_STATE = "ReceiveResult";
/**
* Process instance should be removed after completion. Works as intended, if no exception interrupts the Camel route.
*
* @throws Exception
*/
@Deployment(resources = { "process/errorHandling.bpmn20.xml" })
public void testCamelRouteWorksAsIntended() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("routing", Routing.DEFAULT);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ErrorHandling", variables);
Job job = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(job);
managementService.executeJob(job.getId());
Thread.sleep(WAIT);
assertEquals("Process instance not completed", 0, runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).count());
}
/**
* Expected behavior, with default error handling in Camel: Roll-back to previous wait state. Fails with Activiti 5.12.
*
* @throws Exception
*/
@Deployment(resources = { "process/errorHandling.bpmn20.xml" })
public void testRollbackOnException() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("routing", Routing.PROVOKE_ERROR);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ErrorHandling", variables);
assertEquals("No roll-back to previous wait state", 1, runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId(PREVIOUS_WAIT_STATE).count());
assertEquals("Process instance advanced to next wait state", 0, runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId(NEXT_WAIT_STATE).count());
}
/**
* Exception caught and processed by Camel dead letter queue handler. Process instance proceeds to ReceiveTask as expected.
*
* @throws Exception
*/
@Deployment(resources = { "process/errorHandling.bpmn20.xml" })
public void testErrorHandledByCamel() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("routing", Routing.HANDLE_ERROR);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ErrorHandling", variables);
Job job = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(job);
managementService.executeJob(job.getId());
Thread.sleep(WAIT);
assertEquals("Process instance did not reach next wait state", 1, runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId(NEXT_WAIT_STATE).count());
}
}
/* 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.activiti5.camel;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.test.Deployment;
import org.activiti5.camel.util.FlagJavaDelegate;
import org.activiti5.spring.impl.test.SpringActivitiTestCase;
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
/**
* @author Saeid Mirzaei
*/
@ContextConfiguration("classpath:generic-camel-activiti-context.xml")
public class ErrorMapExceptionTest extends SpringActivitiTestCase {
@Autowired
protected CamelContext camelContext;
@Deployment(resources = { "process/mapExceptionSingleMap.bpmn20.xml" })
public void testCamelSingleDirectMap() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:mapExceptionProcess:exceptionRoute").throwException(new MapExceptionParent("test exception"));
}
});
FlagJavaDelegate.reset();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("mapExceptionProcess");
assertTrue(FlagJavaDelegate.isFlagSet());
}
@Deployment(resources = { "process/mapExceptionDefaultMap.bpmn20.xml" })
public void testCamelDefaultMap() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:mapExceptionDefaultProcess:exceptionRoute").throwException(new NullPointerException("test exception"));
}
});
FlagJavaDelegate.reset();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("mapExceptionDefaultProcess");
assertTrue(FlagJavaDelegate.isFlagSet());
}
@Deployment(resources = { "process/mapExceptionParentMap.bpmn20.xml" })
public void testCamelParentMap() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("activiti:mapExceptionParentProcess:exceptionRoute").throwException(new MapExceptionChild("test exception"));
}
});
FlagJavaDelegate.reset();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("mapExceptionParentProcess");
assertTrue(FlagJavaDelegate.isFlagSet());
}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册