提交 a413b6aa 编写于 作者: J Joram Barrez

Various fixes in all kinds of places.

上级 dcb5a65a
......@@ -204,7 +204,7 @@ public class RuntimeServiceImpl extends ServiceImpl implements RuntimeService {
}
public void removeVariable(String executionId, String variableName) {
Collection<String> variableNames = new ArrayList<String>();
Collection<String> variableNames = new ArrayList<String>(1);
variableNames.add(variableName);
commandExecutor.execute(new RemoveExecutionVariablesCmd(executionId, variableNames, false));
}
......
......@@ -136,6 +136,7 @@ public class TakeOutgoingSequenceFlowsOperation extends AbstractOperation {
ExecutionEntity outgoingExecutionEntity = new ExecutionEntity();
outgoingExecutionEntity.setProcessDefinitionId(execution.getProcessDefinitionId());
outgoingExecutionEntity.setProcessInstanceId(execution.getProcessInstanceId());
outgoingExecutionEntity.setTenantId(execution.getTenantId());
outgoingExecutionEntity.setScope(false);
outgoingExecutionEntity.setActive(true);
......
......@@ -37,14 +37,15 @@ public class DeleteProcessInstanceCmd implements Command<Void>, Serializable {
if (processInstanceId == null) {
throw new ActivitiIllegalArgumentException("processInstanceId is null");
}
// fill default reason if none provided
if (deleteReason == null) {
deleteReason = "ACTIVITI_DELETED";
}
if (commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createCancelledEvent(this.processInstanceId, this.processInstanceId, null, deleteReason));
commandContext.getProcessEngineConfiguration().getEventDispatcher()
.dispatchEvent(ActivitiEventBuilder.createCancelledEvent(this.processInstanceId, this.processInstanceId, null, deleteReason));
}
commandContext.getExecutionEntityManager().deleteProcessInstanceExecutionEntity(processInstanceId, null, deleteReason);
......
......@@ -19,6 +19,7 @@ import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.impl.util.FormHandlerUtil;
/**
* Command for retrieving start or task form keys.
......@@ -61,7 +62,7 @@ public class GetFormKeyCmd implements Command<String> {
if (taskDefinitionKey == null) {
// TODO: Maybe add getFormKey() to FormHandler interface to avoid
// the following cast
formHandler = (DefaultFormHandler) processDefinition.getStartFormHandler();
formHandler = (DefaultFormHandler) FormHandlerUtil.getStartFormHandler(commandContext, processDefinition);
} else {
TaskDefinition taskDefinition = processDefinition.getTaskDefinitions().get(taskDefinitionKey);
// TODO: Maybe add getFormKey() to FormHandler interface to avoid
......
......@@ -22,6 +22,7 @@ import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.repository.ProcessDefinition;
/**
......@@ -44,7 +45,7 @@ public class GetRenderedStartFormCmd implements Command<Object>, Serializable {
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("Process Definition '" + processDefinitionId + "' not found", ProcessDefinition.class);
}
StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
StartFormHandler startFormHandler = FormHandlerUtil.getStartFormHandler(commandContext, processDefinition);
if (startFormHandler == null) {
return null;
}
......
......@@ -14,14 +14,22 @@
package org.activiti.engine.impl.cmd;
import java.io.Serializable;
import java.util.List;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.impl.form.DefaultStartFormHandler;
import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.DeploymentEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.repository.ProcessDefinition;
/**
......@@ -37,16 +45,17 @@ public class GetStartFormCmd implements Command<StartFormData>, Serializable {
}
public StartFormData execute(CommandContext commandContext) {
ProcessDefinitionEntity processDefinition = commandContext.getProcessEngineConfiguration().getDeploymentManager().findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition == null) {
ProcessDefinitionEntity processDefinitionEntity = commandContext.getProcessEngineConfiguration().getDeploymentManager().findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinitionEntity == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
StartFormHandler startFormHandler = FormHandlerUtil.getStartFormHandler(commandContext, processDefinitionEntity);
if (startFormHandler == null) {
throw new ActivitiException("No startFormHandler defined in process '" + processDefinitionId + "'");
}
return startFormHandler.createStartFormData(processDefinition);
return startFormHandler.createStartFormData(processDefinitionEntity);
}
}
......@@ -19,6 +19,8 @@ import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.util.FormHandlerUtil;
import org.activiti.engine.impl.util.ProcessInstanceUtil;
import org.activiti.engine.runtime.ProcessInstance;
/**
......@@ -40,18 +42,20 @@ public class SubmitStartFormCmd extends NeedsActiveProcessDefinitionCmd<ProcessI
protected ProcessInstance execute(CommandContext commandContext, ProcessDefinitionEntity processDefinition) {
ExecutionEntity processInstance = null;
// TODO: backwards compatibility? Only create the process instance and not start it? How?
if (businessKey != null) {
processInstance = processDefinition.createProcessInstance(businessKey);
processInstance = (ExecutionEntity) ProcessInstanceUtil.createProcessInstance(processDefinition, businessKey, null, null);
} else {
processInstance = processDefinition.createProcessInstance();
processInstance = (ExecutionEntity) ProcessInstanceUtil.createProcessInstance(processDefinition, null, null, null);
}
commandContext.getHistoryManager().reportFormPropertiesSubmitted(processInstance, properties, null);
StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
StartFormHandler startFormHandler = FormHandlerUtil.getStartFormHandler(commandContext, processDefinition);
startFormHandler.submitFormProperties(properties, processInstance);
processInstance.start();
commandContext.getAgenda().planContinueProcessOperation(processInstance.getExecutions().get(0)); // There will always be one child execution created
return processInstance;
}
......
......@@ -849,8 +849,21 @@ public class DefaultHistoryManager extends AbstractManager implements HistoryMan
@Override
public void recordVariableRemoved(VariableInstanceEntity variable) {
// TODO Auto-generated method stub
if (isHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) {
HistoricVariableInstanceEntity historicProcessVariable = getDbSqlSession()
.findInCache(HistoricVariableInstanceEntity.class, variable.getId());
if (historicProcessVariable == null) {
historicProcessVariable = Context.getCommandContext()
.getHistoricVariableInstanceEntityManager()
.findHistoricVariableInstanceByVariableInstanceId(variable.getId());
}
if (historicProcessVariable != null) {
Context.getCommandContext()
.getHistoricVariableInstanceEntityManager()
.delete(historicProcessVariable);
}
}
}
protected String parseActivityType(FlowElement element) {
......
......@@ -43,7 +43,8 @@ public class AbstractEntityManager<Entity extends PersistentObject> extends Abst
getDbSqlSession().delete(entity);
if (fireDeleteEvent && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_DELETED, entity));
Context.getProcessEngineConfiguration().getEventDispatcher()
.dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_DELETED, entity));
}
}
......
......@@ -162,7 +162,7 @@ public class ExecutionEntity extends VariableScopeImpl implements ActivityExecut
protected boolean deleteRoot;
protected String deleteReason;
// replaced by
// //////////////////////////////////////////////////////////////
......
......@@ -199,15 +199,16 @@ public class ExecutionEntityManager extends AbstractEntityManager<ExecutionEntit
processInstanceExecution.setTenantId(tenantId);
}
String authenticatedUserId = Authentication.getAuthenticatedUserId();
if (initiatorVariableName != null) {
processInstanceExecution.setVariable(initiatorVariableName, authenticatedUserId);
}
// Store in database
Context.getCommandContext().getExecutionEntityManager().insert(processInstanceExecution, false);
// Need to be after insert, cause we need the id
String authenticatedUserId = Authentication.getAuthenticatedUserId();
if (initiatorVariableName != null) {
processInstanceExecution.setVariable(initiatorVariableName, authenticatedUserId);
}
processInstanceExecution.setProcessInstanceId(processInstanceExecution.getId());
if (authenticatedUserId != null) {
processInstanceExecution.addIdentityLink(authenticatedUserId, null, IdentityLinkType.STARTER);
......@@ -280,19 +281,29 @@ public class ExecutionEntityManager extends AbstractEntityManager<ExecutionEntit
commandContext.getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceById(execution.getId());
}
}
public void deleteExecutionAndRelatedData(ExecutionEntity executionEntity) {
deleteDataRelatedToExecution(executionEntity);
delete(executionEntity); // TODO: what about delete reason?
deleteExecutionAndRelatedData(executionEntity, null);
}
public void deleteExecutionAndRelatedData(ExecutionEntity executionEntity, String deleteReason) {
deleteDataRelatedToExecution(executionEntity, deleteReason);
delete(executionEntity);
}
public void deleteProcessInstanceExecutionEntity(String processInstanceId, String currentFlowElementId, String deleteReason) {
deleteProcessInstanceExecutionEntity(processInstanceId, currentFlowElementId, deleteReason, false);
}
public void deleteProcessInstanceExecutionEntity(String processInstanceId, String currentFlowElementId, String deleteReason, boolean cascade) {
public void deleteProcessInstanceExecutionEntity(String processInstanceId,
String currentFlowElementId, String deleteReason, boolean cascade) {
ExecutionEntity processInstanceEntity = findExecutionById(processInstanceId);
if (processInstanceEntity == null) {
throw new ActivitiObjectNotFoundException("No process instance found for id '" + processInstanceId + "'", ProcessInstance.class);
}
for (ExecutionEntity subExecutionEntity : processInstanceEntity.getExecutions()) {
if (subExecutionEntity.getSubProcessInstance() != null) {
deleteProcessInstanceCascade(subExecutionEntity.getSubProcessInstance(), deleteReason, cascade);
......@@ -305,14 +316,18 @@ public class ExecutionEntityManager extends AbstractEntityManager<ExecutionEntit
identityLinkEntityManager.delete(identityLinkEntity);
}
deleteChildExecutions(processInstanceEntity);
deleteExecutionAndRelatedData(processInstanceEntity);
deleteChildExecutions(processInstanceEntity, deleteReason);
deleteExecutionAndRelatedData(processInstanceEntity, deleteReason);
// TODO: what about delete reason?
Context.getCommandContext().getHistoryManager().recordProcessInstanceEnd(processInstanceId, deleteReason, currentFlowElementId);
}
public void deleteChildExecutions(ExecutionEntity executionEntity) {
deleteChildExecutions(executionEntity, null);
}
public void deleteChildExecutions(ExecutionEntity executionEntity, String deleteReason) {
// The children of an execution for a tree. For correct deletions
// (taking care of foreign keys between child-parent)
......@@ -331,13 +346,17 @@ public class ExecutionEntityManager extends AbstractEntityManager<ExecutionEntit
for (int i = childExecutionEntities.size() - 1; i >= 0; i--) {
ExecutionEntity childExecutionEntity = childExecutionEntities.get(i);
if (childExecutionEntity.isActive() && !childExecutionEntity.isEnded()) {
deleteExecutionAndRelatedData(childExecutionEntity);
deleteExecutionAndRelatedData(childExecutionEntity, deleteReason);
}
}
}
public void deleteDataRelatedToExecution(ExecutionEntity executionEntity) {
deleteDataRelatedToExecution(executionEntity, null);
}
public void deleteDataRelatedToExecution(ExecutionEntity executionEntity, String deleteReason) {
// To start, deactivate the current incoming execution
executionEntity.setEnded(true);
......@@ -359,7 +378,7 @@ public class ExecutionEntityManager extends AbstractEntityManager<ExecutionEntit
TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
Collection<TaskEntity> tasksForExecution = taskEntityManager.findTasksByExecutionId(executionEntity.getId());
for (TaskEntity taskEntity : tasksForExecution) {
taskEntityManager.deleteTask(taskEntity, null, false);
taskEntityManager.deleteTask(taskEntity, deleteReason, false);
}
// Delete jobs
......
......@@ -55,7 +55,6 @@ public class ProcessDefinitionEntity extends ProcessDefinitionImpl implements Pr
protected String resourceName;
protected String tenantId = ProcessEngineConfiguration.NO_TENANT_ID;
protected Integer historyLevel;
protected StartFormHandler startFormHandler;
protected String diagramResourceName;
protected boolean isGraphicalNotationDefined;
protected Map<String, TaskDefinition> taskDefinitions;
......@@ -250,14 +249,6 @@ public class ProcessDefinitionEntity extends ProcessDefinitionImpl implements Pr
this.historyLevel = historyLevel;
}
public StartFormHandler getStartFormHandler() {
return startFormHandler;
}
public void setStartFormHandler(StartFormHandler startFormHandler) {
this.startFormHandler = startFormHandler;
}
public Map<String, TaskDefinition> getTaskDefinitions() {
return taskDefinitions;
}
......
/* 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.activiti.engine.impl.util;
import java.util.List;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.engine.impl.form.DefaultStartFormHandler;
import org.activiti.engine.impl.form.StartFormHandler;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.DeploymentEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
/**
* @author Joram Barrez
*/
public class FormHandlerUtil {
public static StartFormHandler getStartFormHandler(CommandContext commandContext, ProcessDefinitionEntity processDefinitionEntity) {
StartFormHandler startFormHandler = new DefaultStartFormHandler();
org.activiti.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(processDefinitionEntity.getId());
FlowElement initialFlowElement = process.getInitialFlowElement();
if (initialFlowElement instanceof StartEvent) {
StartEvent startEvent = (StartEvent) initialFlowElement;
List<FormProperty> formProperties = startEvent.getFormProperties();
String formKey = startEvent.getFormKey();
DeploymentEntity deploymentEntity = commandContext.getDeploymentEntityManager().findDeploymentById(processDefinitionEntity.getDeploymentId());
startFormHandler.parseConfiguration(formProperties, formKey, deploymentEntity, processDefinitionEntity);
return startFormHandler;
}
return null;
}
}
/* 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.activiti.engine.impl.util;
import java.util.Collection;
......@@ -18,9 +30,25 @@ import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.commons.collections.CollectionUtils;
/**
* @author Tijs Rademakers
* @author Joram Barrez
*/
public class ProcessInstanceUtil {
public static ProcessInstance createAndStartProcessInstance(ProcessDefinitionEntity processDefinition, String businessKey, String processInstanceName, Map<String, Object> variables) {
public static ProcessInstance createProcessInstance(ProcessDefinitionEntity processDefinition,
String businessKey, String processInstanceName, Map<String, Object> variables) {
return createAndStartProcessInstance(processDefinition, businessKey, processInstanceName, variables, false);
}
public static ProcessInstance createAndStartProcessInstance(ProcessDefinitionEntity processDefinition,
String businessKey, String processInstanceName, Map<String, Object> variables) {
return createAndStartProcessInstance(processDefinition, businessKey, processInstanceName, variables, true);
}
protected static ProcessInstance createAndStartProcessInstance(ProcessDefinitionEntity processDefinition,
String businessKey, String processInstanceName, Map<String, Object> variables, boolean startProcessInstance) {
CommandContext commandContext = Context.getCommandContext();
if (processDefinition.getEngineVersion() != null) {
if (Activiti5CompatibilityHandler.ACTIVITI_5_ENGINE_TAG.equals(processDefinition.getEngineVersion())) {
......@@ -52,7 +80,8 @@ public class ProcessInstanceUtil {
throw new ActivitiException("No start element found for process definition " + processDefinition.getId());
}
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, businessKey, processInstanceName, initialFlowElement, process, variables);
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, businessKey,
processInstanceName, initialFlowElement, process, variables, startProcessInstance);
}
public static ProcessInstance createAndStartProcessInstanceByMessage(ProcessDefinitionEntity processDefinition, String messageName, Map<String, Object> variables) {
......@@ -100,11 +129,12 @@ public class ProcessInstanceUtil {
throw new ActivitiException("No message start event found for process definition " + processDefinition.getId() + " and message name " + messageName);
}
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, null, null, initialFlowElement, process, variables);
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, null, null, initialFlowElement, process, variables, true);
}
public static ProcessInstance createAndStartProcessInstanceWithInitialFlowElement(ProcessDefinitionEntity processDefinition, String businessKey, String processInstanceName,
FlowElement initialFlowElement, Process process, Map<String, Object> variables) {
protected static ProcessInstance createAndStartProcessInstanceWithInitialFlowElement(ProcessDefinitionEntity processDefinition,
String businessKey, String processInstanceName, FlowElement initialFlowElement,
Process process, Map<String, Object> variables, boolean startProcessInstance) {
CommandContext commandContext = Context.getCommandContext();
......@@ -137,7 +167,10 @@ public class ProcessInstanceUtil {
// Create the first execution that will visit all the process definition elements
ExecutionEntity execution = processInstance.createExecution();
execution.setCurrentFlowElement(initialFlowElement);
commandContext.getAgenda().planContinueProcessOperation(execution);
if (startProcessInstance) {
commandContext.getAgenda().planContinueProcessOperation(execution);
}
return processInstance;
}
......
......@@ -183,7 +183,7 @@ public class FormServiceTest extends PluggableActivitiTestCase {
address.setStreet("broadway");
runtimeService.setVariable(processInstanceId, "address", address);
runtimeService.signal(runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult().getId());
runtimeService.trigger(runtimeService.createExecutionQuery().processInstanceId(processInstanceId).onlyChildExecutions().singleResult().getId());
String taskId = taskService.createTaskQuery().singleResult().getId();
TaskFormData taskFormData = formService.getTaskFormData(taskId);
......
......@@ -407,7 +407,8 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
processVariables.put("variable", "value");
// signal the execution while passing in the variables
runtimeService.signal(processInstance.getId(), processVariables);
Execution execution = runtimeService.createExecutionQuery().activityId("receiveMessage").singleResult();
runtimeService.trigger(execution.getId(), processVariables);
Map<String, Object> variables = runtimeService.getVariables(processInstance.getId());
assertEquals(variables, processVariables);
......@@ -764,13 +765,11 @@ public class RuntimeServiceTest extends PluggableActivitiTestCase {
"org/activiti/engine/test/api/runtime/RuntimeServiceTest.catchPanicSignal.bpmn20.xml" })
public void testSignalEventReceived() {
// //// test signalEventReceived(String)
startSignalCatchProcesses();
// 12, because the signal catch is a scope
assertEquals(12, runtimeService.createExecutionQuery().count());
// 15, because the signal catch is a scope
assertEquals(15, runtimeService.createExecutionQuery().count());
runtimeService.signalEventReceived("alert");
assertEquals(6, runtimeService.createExecutionQuery().count());
assertEquals(9, runtimeService.createExecutionQuery().count());
runtimeService.signalEventReceived("panic");
assertEquals(0, runtimeService.createExecutionQuery().count());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册