Skip to content

Commit 08c6c6d

Browse files
authored
save taskId in ACT_HI_VARINST table for task & input variables
1 parent 772ae85 commit 08c6c6d

File tree

4 files changed

+93
-2
lines changed

4 files changed

+93
-2
lines changed

engine/src/main/java/org/finos/fluxnova/bpm/engine/impl/history/producer/DefaultHistoryEventProducer.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.ExecutionEntity;
6666
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.ExternalTaskEntity;
6767
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.HistoricJobLogEventEntity;
68+
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.HistoricVariableInstanceEntity;
6869
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.IncidentEntity;
6970
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.JobEntity;
7071
import org.finos.fluxnova.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
@@ -422,6 +423,7 @@ protected void initHistoricIncidentEvent(HistoricIncidentEventEntity evt, Incide
422423
protected HistoryEvent createHistoricVariableEvent(VariableInstanceEntity variableInstance, VariableScope sourceVariableScope, HistoryEventType eventType) {
423424
String scopeActivityInstanceId = null;
424425
String sourceActivityInstanceId = null;
426+
String taskId = null;
425427

426428
if(variableInstance.getExecutionId() != null) {
427429
ExecutionEntity scopeExecution = Context.getCommandContext()
@@ -449,6 +451,12 @@ else if (variableInstance.getCaseExecutionId() != null) {
449451
} else if (sourceVariableScope instanceof TaskEntity) {
450452
sourceExecution = ((TaskEntity) sourceVariableScope).getExecution();
451453
if (sourceExecution != null) {
454+
//this block when executed for task listener variables, gets task id from source execution
455+
List<TaskEntity> taskEntityList = sourceExecution.getTasks();
456+
if(taskEntityList!=null && !taskEntityList.isEmpty()){
457+
taskId = taskEntityList.get(0).getId();
458+
}
459+
452460
sourceActivityInstanceId = sourceExecution.getActivityInstanceId();
453461
}
454462
else {
@@ -476,6 +484,11 @@ else if (sourceVariableScope instanceof CaseExecutionEntity) {
476484
// set source activity instance id
477485
evt.setActivityInstanceId(sourceActivityInstanceId);
478486

487+
// set task id for task listener variables
488+
if(taskId!=null && evt.getTaskId()==null) {
489+
evt.setTaskId(taskId);
490+
}
491+
479492
// mark initial variables on process start
480493
if (sourceExecution != null && sourceExecution.isProcessInstanceStarting()
481494
&& HistoryEventTypes.VARIABLE_INSTANCE_CREATE.equals(eventType)) {
@@ -727,6 +740,23 @@ public HistoryEvent createActivityInstanceUpdateEvt(DelegateExecution execution,
727740
if(task != null) {
728741
evt.setTaskId(task.getId());
729742
evt.setTaskAssignee(task.getAssignee());
743+
744+
/*
745+
* this code is required for input variables of the task as the historic variable instance is created first
746+
* and then task entity is created
747+
* get historic variable instances from the cache as the transaction is still not committed
748+
*/
749+
List <HistoricVariableInstanceEntity> cachedHistoricVariableInstances = Context.getCommandContext().getDbEntityManager().getCachedEntitiesByType(HistoricVariableInstanceEntity.class);
750+
String executionActivityInstanceId = executionEntity.getActivityInstanceId();
751+
for (HistoricVariableInstanceEntity historicVariableInstance : cachedHistoricVariableInstances) {
752+
String historicActivityInstanceId = historicVariableInstance.getActivityInstanceId();
753+
//update task id for historic variable instances only specific to that task
754+
if(executionActivityInstanceId!=null && historicActivityInstanceId!=null) {
755+
if (historicActivityInstanceId.equals(executionActivityInstanceId)) {
756+
historicVariableInstance.setTaskId(task.getId());
757+
}
758+
}
759+
}
730760
}
731761

732762
return evt;

engine/src/test/java/org/finos/fluxnova/bpm/engine/test/history/HistoricVariableInstanceScopeTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static org.junit.Assert.assertEquals;
2020
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertNull;
2122

2223
import java.util.HashMap;
2324
import java.util.List;
@@ -86,6 +87,7 @@ public void testSetVariableLocalOnUserTask() {
8687

8788
HistoricVariableInstance variable = query.singleResult();
8889
assertNotNull(variable);
90+
assertEquals(task.getId(),variable.getTaskId());
8991

9092
// the variable is in the task scope
9193
assertEquals(taskExecution.getActivityInstanceId(), variable.getActivityInstanceId());
@@ -118,12 +120,14 @@ public void testSetVariableOnProcessIntanceStartAndSetVariableLocalOnUserTask()
118120
assertEquals("testValue", firstVar.getValue());
119121
// the variable is in the process instance scope
120122
assertEquals(pi.getId(), firstVar.getActivityInstanceId());
123+
assertNull(firstVar.getTaskId());
121124

122125
HistoricVariableInstance secondVar = result.get(1);
123126
assertEquals("testVar", secondVar.getVariableName());
124127
assertEquals("anotherTestValue", secondVar.getValue());
125128
// the variable is in the task scope
126129
assertEquals(taskExecution.getActivityInstanceId(), secondVar.getActivityInstanceId());
130+
assertEquals(task.getId(),secondVar.getTaskId());
127131

128132
taskService.complete(task.getId());
129133
testRule.assertProcessEnded(pi.getId());
@@ -145,6 +149,7 @@ public void testSetVariableOnUserTaskInsideSubProcess() {
145149
HistoricVariableInstance variable = query.singleResult();
146150
// the variable is in the process instance scope
147151
assertEquals(pi.getId(), variable.getActivityInstanceId());
152+
assertEquals(task.getId(),variable.getTaskId());
148153

149154
taskService.complete(task.getId());
150155
testRule.assertProcessEnded(pi.getId());
@@ -161,6 +166,7 @@ public void testSetVariableOnServiceTaskInsideSubProcess() {
161166
HistoricVariableInstance variable = query.singleResult();
162167
// the variable is in the process instance scope
163168
assertEquals(pi.getId(), variable.getActivityInstanceId());
169+
assertNull(variable.getTaskId());
164170

165171
testRule.assertProcessEnded(pi.getId());
166172
}
@@ -205,6 +211,7 @@ public void testSetVariableLocalOnTaskInsideParallelBranch() {
205211
HistoricVariableInstance variable = query.singleResult();
206212
// the variable is in the user task scope
207213
assertEquals(taskExecution.getActivityInstanceId(), variable.getActivityInstanceId());
214+
assertEquals(task.getId(),variable.getTaskId());
208215

209216
taskService.complete(task.getId());
210217

@@ -227,6 +234,7 @@ public void testSetVariableOnTaskInsideParallelBranch() {
227234
HistoricVariableInstance variable = query.singleResult();
228235
// the variable is in the process instance scope
229236
assertEquals(pi.getId(), variable.getActivityInstanceId());
237+
assertEquals(task.getId(),variable.getTaskId());
230238

231239
taskService.complete(task.getId());
232240

@@ -244,6 +252,7 @@ public void testSetVariableOnServiceTaskInsideParallelBranch() {
244252
HistoricVariableInstance variable = query.singleResult();
245253
// the variable is in the process instance scope
246254
assertEquals(pi.getId(), variable.getActivityInstanceId());
255+
assertNull(variable.getTaskId());
247256

248257
testRule.assertProcessEnded(pi.getId());
249258
}

engine/src/test/java/org/finos/fluxnova/bpm/engine/test/history/HistoricVariableInstanceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,24 @@ public void testBinaryFetchingEnabled() {
671671
taskService.deleteTask(newTask.getId(), true);
672672
}
673673

674+
@Test
675+
public void testTaskIdInHistoricVariableInstance() {
676+
677+
Task newTask = taskService.newTask();
678+
taskService.saveTask(newTask);
679+
680+
String variableName = "varName";
681+
taskService.setVariable(newTask.getId(), variableName, "varValue");
682+
683+
HistoricVariableInstance variableInstance = historyService.createHistoricVariableInstanceQuery()
684+
.variableName(variableName)
685+
.singleResult();
686+
687+
assertEquals(newTask.getId(),variableInstance.getTaskId());
688+
689+
taskService.deleteTask(newTask.getId(), true);
690+
}
691+
674692
@Test
675693
public void testBinaryFetchingDisabled() {
676694

@@ -797,6 +815,7 @@ public void testDisableCustomObjectDeserializationNativeQuery() {
797815

798816
for (HistoricVariableInstance variableInstance : variableInstances) {
799817
assertNull(variableInstance.getErrorMessage());
818+
assertEquals(newTask.getId(),variableInstance.getTaskId());
800819

801820
ObjectValue typedValue = (ObjectValue) variableInstance.getTypedValue();
802821
assertNotNull(typedValue);
@@ -828,6 +847,7 @@ public void testErrorMessage() {
828847
.singleResult();
829848

830849
assertNull(variableInstance.getValue());
850+
assertEquals(newTask.getId(),variableInstance.getTaskId());
831851
assertNotNull(variableInstance.getErrorMessage());
832852

833853
taskService.deleteTask(newTask.getId(), true);
@@ -1314,6 +1334,7 @@ public void testTaskVariableUpdateOrder() {
13141334
.createHistoricVariableInstanceQuery()
13151335
.singleResult();
13161336
assertNotNull(variable);
1337+
assertEquals(taskId, variable.getTaskId());
13171338

13181339
String variableInstanceId = variable.getId();
13191340

@@ -1348,6 +1369,7 @@ public void testTaskVariableUpdateOrder() {
13481369
.createHistoricVariableInstanceQuery()
13491370
.singleResult();
13501371
assertNotNull(variable);
1372+
assertEquals(taskId, variable.getTaskId());
13511373

13521374
if (isFullHistoryEnabled()) {
13531375

@@ -1556,6 +1578,7 @@ public void testSetSameVariableUpdateOrder() {
15561578
.createHistoricVariableInstanceQuery()
15571579
.singleResult();
15581580
assertNotNull(variable);
1581+
assertEquals(taskId,variable.getTaskId());
15591582

15601583
String variableInstanceId = variable.getId();
15611584

@@ -1625,6 +1648,8 @@ public void testProcessDefinitionProperty() {
16251648
assertNotNull(instance.getProcessDefinitionKey());
16261649
assertEquals(key, instance.getProcessDefinitionKey());
16271650

1651+
assertEquals(taskId,instance.getTaskId());
1652+
16281653
assertNotNull(instance.getProcessDefinitionId());
16291654
assertEquals(processInstance.getProcessDefinitionId(), instance.getProcessDefinitionId());
16301655

@@ -1672,6 +1697,7 @@ public void testCaseDefinitionProperty() {
16721697

16731698
// then (2)
16741699
assertCaseVariable(key, caseInstance, instance);
1700+
assertEquals(taskId,instance.getTaskId());
16751701

16761702
// when (3)
16771703
instance = historyService
@@ -2311,6 +2337,7 @@ public void testSetDifferentStates() {
23112337
createdCounter += 1;
23122338
} else if (variable.getName().equals("bar")) {
23132339
Assert.assertEquals(HistoricVariableInstance.STATE_DELETED, variable.getState());
2340+
assertEquals(task.getId(),variable.getTaskId());
23142341
deletedCounter += 1;
23152342
}
23162343
}

engine/src/test/java/org/finos/fluxnova/bpm/engine/test/history/useroperationlog/UserOperationLogQueryTest.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,7 @@ public void testQueryDeleteVariableHistoryOperationOnTaskOfRunningInstance() {
14091409
historyService.deleteHistoricVariableInstance(variableInstanceId);
14101410

14111411
// then
1412-
verifyHistoricVariableOperationAsserts(1, UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
1412+
verifyHistoricVariableOperationAssertsWithTaskId(1, UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
14131413
verifySingleVariableOperationPropertyChange("name", "testVariable", UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
14141414
}
14151415

@@ -1427,7 +1427,7 @@ public void testQueryDeleteVariableHistoryOperationOnTaskOfHistoricInstance() {
14271427
historyService.deleteHistoricVariableInstance(variableInstanceId);
14281428

14291429
// then
1430-
verifyHistoricVariableOperationAsserts(1, UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
1430+
verifyHistoricVariableOperationAssertsWithTaskId(1, UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
14311431
verifySingleVariableOperationPropertyChange("name", "testVariable", UserOperationLogEntry.OPERATION_TYPE_DELETE_HISTORY);
14321432
}
14331433

@@ -1814,6 +1814,31 @@ private void verifyHistoricVariableOperationAsserts(int countAssertValue, String
18141814
}
18151815
}
18161816

1817+
private void verifyHistoricVariableOperationAssertsWithTaskId(int countAssertValue, String operationType) {
1818+
String deploymentId = repositoryService.createDeploymentQuery().singleResult().getId();
1819+
UserOperationLogQuery logQuery = query().entityType(EntityTypes.VARIABLE).operationType(operationType);
1820+
assertEquals(countAssertValue, logQuery.count());
1821+
1822+
if(countAssertValue > 1) {
1823+
List<UserOperationLogEntry> logEntryList = logQuery.list();
1824+
1825+
for (UserOperationLogEntry logEntry : logEntryList) {
1826+
assertEquals(process.getProcessDefinitionId(), logEntry.getProcessDefinitionId());
1827+
assertEquals(process.getProcessInstanceId(), logEntry.getProcessInstanceId());
1828+
assertEquals(deploymentId, logEntry.getDeploymentId());
1829+
assertNotNull(logEntry.getTaskId());
1830+
assertEquals(UserOperationLogEntry.CATEGORY_OPERATOR, logEntry.getCategory());
1831+
}
1832+
} else {
1833+
UserOperationLogEntry logEntry = logQuery.singleResult();
1834+
assertEquals(process.getProcessDefinitionId(), logEntry.getProcessDefinitionId());
1835+
assertEquals(process.getProcessInstanceId(), logEntry.getProcessInstanceId());
1836+
assertEquals(deploymentId, logEntry.getDeploymentId());
1837+
assertNotNull(logEntry.getTaskId());
1838+
assertEquals(UserOperationLogEntry.CATEGORY_OPERATOR, logEntry.getCategory());
1839+
}
1840+
}
1841+
18171842
private void verifySingleVariableOperationPropertyChange(String property, String newValue, String operationType) {
18181843
UserOperationLogQuery logQuery = query().entityType(EntityTypes.VARIABLE).operationType(operationType);
18191844
assertEquals(1, logQuery.count());

0 commit comments

Comments
 (0)