提交 3ceb36a1 编写于 作者: J Joram Barrez

Cmmn: fix end time of historic task not always set + identitylinks not cleaned...

Cmmn: fix end time of historic task not always set + identitylinks not cleaned up after test + sql server upgrade fix
上级 ea842503
......@@ -25,6 +25,7 @@ import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntityMa
import org.flowable.engine.common.impl.context.Context;
import org.flowable.engine.common.impl.db.DbSqlSession;
import org.flowable.engine.common.impl.interceptor.CommandContext;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntityManager;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntityManager;
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntityManager;
......@@ -90,6 +91,10 @@ public abstract class AbstractCmmnManager {
protected HistoricVariableInstanceEntityManager getHistoricVariableInstanceEntityManager() {
return cmmnEngineConfiguration.getVariableServiceConfiguration().getHistoricVariableInstanceEntityManager();
}
protected HistoricTaskInstanceEntityManager getHistoricTaskInstanceEntityManager() {
return cmmnEngineConfiguration.getTaskServiceConfiguration().getHistoricTaskInstanceEntityManager();
}
protected CmmnEngineConfiguration getCmmnEngineConfiguration() {
return cmmnEngineConfiguration;
......
......@@ -56,7 +56,9 @@ public abstract class AbstractDeleteCaseInstanceOperation extends AbstractChange
}
}
}
CommandContextUtil.getCaseInstanceEntityManager(commandContext).deleteCaseInstanceAndRelatedData(caseInstanceEntity.getId());
CommandContextUtil.getCaseInstanceEntityManager(commandContext).deleteCaseInstanceAndRelatedData(caseInstanceEntity.getId(), getDeleteReason());
}
protected abstract String getDeleteReason();
}
......@@ -40,5 +40,10 @@ public class CompleteCaseInstanceOperation extends AbstractDeleteCaseInstanceOpe
protected void changeStateForChildPlanItemInstance(PlanItemInstanceEntity planItemInstanceEntity) {
CommandContextUtil.getAgenda(commandContext).planCompletePlanItemInstance(planItemInstanceEntity);
}
@Override
protected String getDeleteReason() {
return "cmmn-state-transition-complete-case";
}
}
......@@ -42,5 +42,10 @@ public class TerminateCaseInstanceOperation extends AbstractDeleteCaseInstanceOp
CommandContextUtil.getAgenda(commandContext).planExitPlanItemInstance(planItemInstanceEntity);
}
}
@Override
protected String getDeleteReason() {
return "cmmn-state-transition-terminate-case";
}
}
......@@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import org.flowable.cmmn.engine.delegate.DelegatePlanItemInstance;
import org.flowable.cmmn.engine.impl.behavior.PlanItemActivityBehavior;
import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntity;
import org.flowable.cmmn.engine.impl.task.TaskHelper;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.cmmn.engine.runtime.PlanItemInstanceState;
import org.flowable.cmmn.model.HumanTask;
......@@ -285,8 +286,7 @@ public class HumanTaskActivityBehavior extends TaskActivityBehavior implements P
// Should be only one
for (TaskEntity taskEntity : taskEntities) {
if (!taskEntity.isDeleted()) {
taskService.deleteTask(taskEntity, true);
CommandContextUtil.getCmmnHistoryManager(commandContext).recordTaskEnd(taskEntity, null);
TaskHelper.deleteTask(taskEntity, null, false, true);
}
}
......@@ -299,7 +299,7 @@ public class HumanTaskActivityBehavior extends TaskActivityBehavior implements P
TaskService taskService = CommandContextUtil.getTaskService(commandContext);
List<TaskEntity> taskEntities = taskService.findTasksBySubScopeIdScopeType(planItemInstance.getId(), VariableScopeType.CMMN);
for (TaskEntity taskEntity : taskEntities) {
taskService.deleteTask(taskEntity, true);
TaskHelper.deleteTask(taskEntity, "cmmn-state-transition-" + transition, false, true);
}
}
}
......
......@@ -18,11 +18,14 @@ import java.util.List;
import org.flowable.cmmn.engine.CmmnEngineConfiguration;
import org.flowable.cmmn.engine.impl.persistence.entity.data.CaseDefinitionDataManager;
import org.flowable.cmmn.engine.impl.repository.CaseDefinitionQueryImpl;
import org.flowable.cmmn.engine.impl.runtime.CaseInstanceQueryImpl;
import org.flowable.cmmn.engine.repository.CaseDefinition;
import org.flowable.cmmn.engine.repository.CaseDefinitionQuery;
import org.flowable.cmmn.engine.runtime.CaseInstance;
import org.flowable.engine.common.impl.persistence.entity.data.DataManager;
import org.flowable.task.service.history.HistoricTaskInstance;
import org.flowable.task.service.impl.HistoricTaskInstanceQueryImpl;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntityManager;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntityManager;
import org.flowable.variable.service.type.VariableScopeType;
......@@ -83,12 +86,19 @@ public class CaseDefinitionEntityManagerImpl extends AbstractCmmnEntityManager<C
List<CaseInstanceEntity> caseInstances = caseInstanceEntityManager.findCaseInstancesByCaseDefinitionId(caseDefinitionId);
for (CaseInstance caseInstance : caseInstances) {
caseInstanceEntityManager.deleteCaseInstanceAndRelatedData(caseInstance.getId());
caseInstanceEntityManager.deleteCaseInstanceAndRelatedData(caseInstance.getId(), null);
}
if (cascadeHistory) {
getHistoricMilestoneInstanceEntityManager().deleteByCaseDefinitionId(caseDefinitionId);
HistoricTaskInstanceEntityManager historicTaskInstanceEntityManager = getHistoricTaskInstanceEntityManager();
List<HistoricTaskInstance> historicTaskInstances = historicTaskInstanceEntityManager
.findHistoricTaskInstancesByQueryCriteria(new HistoricTaskInstanceQueryImpl().scopeDefinitionId(caseDefinitionId).scopeType(VariableScopeType.CMMN));
for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
historicTaskInstanceEntityManager.delete((HistoricTaskInstanceEntity) historicTaskInstance);
}
HistoricCaseInstanceEntityManager historicCaseInstanceEntityManager = getHistoricCaseInstanceEntityManager();
List<HistoricCaseInstanceEntity> historicCaseInstanceEntities = historicCaseInstanceEntityManager.findHistoricCaseInstancesByCaseDefinitionId(caseDefinitionId);
for (HistoricCaseInstanceEntity historicCaseInstanceEntity : historicCaseInstanceEntities) {
......
......@@ -33,6 +33,6 @@ public interface CaseInstanceEntityManager extends EntityManager<CaseInstanceEnt
void deleteByCaseDefinitionId(String caseDefinitionId);
void deleteCaseInstanceAndRelatedData(String caseInstanceId);
void deleteCaseInstanceAndRelatedData(String caseInstanceId, String deleteReason);
}
\ No newline at end of file
......@@ -18,6 +18,7 @@ import java.util.List;
import org.flowable.cmmn.engine.CmmnEngineConfiguration;
import org.flowable.cmmn.engine.impl.persistence.entity.data.CaseInstanceDataManager;
import org.flowable.cmmn.engine.impl.runtime.CaseInstanceQueryImpl;
import org.flowable.cmmn.engine.impl.task.TaskHelper;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.cmmn.engine.runtime.CaseInstance;
import org.flowable.cmmn.engine.runtime.CaseInstanceQuery;
......@@ -72,11 +73,11 @@ public class CaseInstanceEntityManagerImpl extends AbstractCmmnEntityManager<Cas
}
@Override
public void deleteCaseInstanceAndRelatedData(String caseInstanceId) {
public void deleteCaseInstanceAndRelatedData(String caseInstanceId, String deleteReason) {
CaseInstanceEntity caseInstanceEntity = caseInstanceDataManager.findById(caseInstanceId);
CommandContext commandContext = CommandContextUtil.getCommandContext();
// Variables
VariableInstanceEntityManager variableInstanceEntityManager
= CommandContextUtil.getVariableServiceConfiguration(commandContext).getVariableInstanceEntityManager();
......@@ -90,7 +91,7 @@ public class CaseInstanceEntityManagerImpl extends AbstractCmmnEntityManager<Cas
TaskEntityManager taskEntityManager = CommandContextUtil.getTaskServiceConfiguration(commandContext).getTaskEntityManager();
List<TaskEntity> taskEntities = taskEntityManager.findTasksByScopeIdAndScopeType(caseInstanceId, VariableScopeType.CMMN);
for (TaskEntity taskEntity : taskEntities) {
taskEntityManager.delete(taskEntity);
TaskHelper.deleteTask(taskEntity, deleteReason, false, true);
}
// Sentry part instances
......
......@@ -28,6 +28,10 @@ import org.flowable.cmmn.engine.impl.persistence.entity.SentryPartInstanceEntity
import org.flowable.cmmn.engine.impl.persistence.entity.data.TableDataManager;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.engine.common.impl.persistence.entity.Entity;
import org.flowable.identitylink.service.impl.persistence.entity.HistoricIdentityLinkEntity;
import org.flowable.identitylink.service.impl.persistence.entity.IdentityLinkEntity;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity;
import org.flowable.variable.service.impl.persistence.entity.VariableInstanceEntity;
......@@ -48,8 +52,13 @@ public class TableDataManagerImpl implements TableDataManager {
entityToTableNameMap.put(MilestoneInstanceEntity.class, "ACT_CMMN_RU_MIL_INST");
entityToTableNameMap.put(HistoricCaseInstanceEntity.class, "ACT_CMMN_HI_CASE_INST");
entityToTableNameMap.put(HistoricMilestoneInstanceEntity.class, "ACT_CMMN_HI_MIL_INST");
entityToTableNameMap.put(VariableInstanceEntity.class, "ACT_RU_VARIABLE");
entityToTableNameMap.put(HistoricVariableInstanceEntity.class, "ACT_HI_VARINST");
entityToTableNameMap.put(TaskEntity.class, "ACT_RU_TASK");
entityToTableNameMap.put(HistoricTaskInstanceEntity.class, "ACT_HI_TASKINST");
entityToTableNameMap.put(IdentityLinkEntity.class, "ACT_RU_IDENTITYLINK");
entityToTableNameMap.put(HistoricIdentityLinkEntity.class, "ACT_HI_IDENTITYLINK");
}
public TableDataManagerImpl() {
......
/* 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.flowable.cmmn.engine.impl.task;
import java.util.List;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.engine.common.impl.interceptor.CommandContext;
import org.flowable.task.service.Task;
import org.flowable.task.service.TaskService;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
/**
* @author Joram Barrez
*/
public class TaskHelper {
public static void deleteTask(TaskEntity task, String deleteReason, boolean cascade, boolean fireEvents) {
if (!task.isDeleted()) {
task.setDeleted(true);
CommandContext commandContext = CommandContextUtil.getCommandContext();
TaskService taskService = CommandContextUtil.getTaskService(commandContext);
List<Task> subTasks = taskService.findTasksByParentTaskId(task.getId());
for (Task subTask : subTasks) {
deleteTask((TaskEntity) subTask, deleteReason, cascade, fireEvents);
}
CommandContextUtil.getIdentityLinkService(commandContext).deleteIdentityLinksByTaskId(task.getId());
CommandContextUtil.getVariableService(commandContext).deleteVariableInstanceMap(task.getVariableInstanceEntities());
CommandContextUtil.getCmmnHistoryManager(commandContext).recordTaskEnd(task, deleteReason);
CommandContextUtil.getTaskService().deleteTask(task, fireEvents);
}
}
}
......@@ -23,6 +23,7 @@ import org.flowable.cmmn.engine.test.CmmnDeployment;
import org.flowable.cmmn.engine.test.FlowableCmmnTestCase;
import org.flowable.engine.common.impl.identity.Authentication;
import org.flowable.task.service.Task;
import org.flowable.task.service.history.HistoricTaskInstance;
import org.junit.Test;
/**
......@@ -87,6 +88,16 @@ public class HumanTaskTest extends FlowableCmmnTestCase {
assertEquals(0, cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).count());
assertCaseInstanceEnded(caseInstance);
List<HistoricTaskInstance> historicTaskInstances = cmmnHistoryService.createHistoricTaskInstanceQuery().list();
assertEquals(3, historicTaskInstances.size());
for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
assertNotNull(historicTaskInstance.getStartTime());
assertNotNull(historicTaskInstance.getEndTime());
if (!historicTaskInstance.getName().equals("A")) {
assertEquals("cmmn-state-transition-terminate-case", historicTaskInstance.getDeleteReason());
}
}
// Completing C should delete B
CaseInstance caseInstance2 = cmmnRuntimeService.createCaseInstanceBuilder()
.caseDefinitionKey("humanTaskCompletionExits")
......@@ -100,6 +111,15 @@ public class HumanTaskTest extends FlowableCmmnTestCase {
cmmnTaskService.complete(taskA.getId());
assertCaseInstanceEnded(caseInstance2);
historicTaskInstances = cmmnHistoryService.createHistoricTaskInstanceQuery().caseInstanceId(caseInstance2.getId()).list();
assertEquals(3, historicTaskInstances.size());
for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
assertNotNull(historicTaskInstance.getStartTime());
assertNotNull(historicTaskInstance.getEndTime());
if (historicTaskInstance.getName().equals("B")) {
assertEquals("cmmn-state-transition-exit", historicTaskInstance.getDeleteReason());
}
}
}
}
alter table ACT_HI_PROCINST add column CALLBACK_ID_ nvarchar(255);
alter table ACT_HI_PROCINST add column CALLBACK_TYPE_ nvarchar(255);
\ No newline at end of file
alter table ACT_HI_PROCINST add CALLBACK_ID_ nvarchar(255);
alter table ACT_HI_PROCINST add CALLBACK_TYPE_ nvarchar(255);
\ No newline at end of file
......@@ -18,6 +18,7 @@ import java.util.Collection;
import java.util.List;
import org.flowable.engine.common.api.delegate.event.FlowableEngineEventType;
import org.flowable.engine.common.api.delegate.event.FlowableEventDispatcher;
import org.flowable.engine.common.impl.persistence.entity.data.DataManager;
import org.flowable.identitylink.service.IdentityLinkServiceConfiguration;
import org.flowable.identitylink.service.IdentityLinkType;
......@@ -47,7 +48,8 @@ public class IdentityLinkEntityManagerImpl extends AbstractEntityManager<Identit
public void deleteIdentityLink(IdentityLinkEntity identityLink) {
delete(identityLink, false);
if (getEventDispatcher().isEnabled()) {
FlowableEventDispatcher eventDispatcher = getEventDispatcher();
if (eventDispatcher != null && eventDispatcher.isEnabled()) {
getEventDispatcher().dispatchEvent(FlowableIdentityLinkEventBuilder.createEntityEvent(FlowableEngineEventType.ENTITY_DELETED, identityLink));
}
}
......@@ -81,7 +83,7 @@ public class IdentityLinkEntityManagerImpl extends AbstractEntityManager<Identit
public List<IdentityLinkEntity> findIdentityLinkByProcessDefinitionUserAndGroup(String processDefinitionId, String userId, String groupId) {
return identityLinkDataManager.findIdentityLinkByProcessDefinitionUserAndGroup(processDefinitionId, userId, groupId);
}
@Override
public IdentityLinkEntity addProcessInstanceIdentityLink(String processInstanceId, String userId, String groupId, String type) {
IdentityLinkEntity identityLinkEntity = identityLinkDataManager.create();
......
alter table ACT_HI_VARINST add column SCOPE_ID_ nvarchar(255);
alter table ACT_HI_VARINST add column SUB_SCOPE_ID_ nvarchar(255);
alter table ACT_HI_VARINST add column SCOPE_TYPE_ nvarchar(255);
alter table ACT_HI_VARINST add SCOPE_ID_ nvarchar(255);
alter table ACT_HI_VARINST add SUB_SCOPE_ID_ nvarchar(255);
alter table ACT_HI_VARINST add SCOPE_TYPE_ nvarchar(255);
create index ACT_IDX_HI_VAR_SCOPE_ID_TYPE on ACT_HI_VARINST(SCOPE_ID_, SCOPE_TYPE_);
create index ACT_IDX_HI_VAR_SUB_ID_TYPE on ACT_HI_VARINST(SUB_SCOPE_ID_, SCOPE_TYPE_);
\ No newline at end of file
alter table ACT_RU_VARIABLE add column SCOPE_ID_ nvarchar(255);
alter table ACT_RU_VARIABLE add column SUB_SCOPE_ID_ nvarchar(255);
alter table ACT_RU_VARIABLE add column SCOPE_TYPE_ nvarchar(255);
alter table ACT_RU_VARIABLE add SCOPE_ID_ nvarchar(255);
alter table ACT_RU_VARIABLE add SUB_SCOPE_ID_ nvarchar(255);
alter table ACT_RU_VARIABLE add SCOPE_TYPE_ nvarchar(255);
create index ACT_IDX_RU_VAR_SCOPE_ID_TYPE on ACT_RU_VARIABLE(SCOPE_ID_, SCOPE_TYPE_);
create index ACT_IDX_RU_VAR_SUB_ID_TYPE on ACT_RU_VARIABLE(SUB_SCOPE_ID_, SCOPE_TYPE_);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册