Skip to content

Commit

Permalink
feat(core): add taskState to runtime and history task API (#4218)
Browse files Browse the repository at this point in the history
* introduce new column in both task tables
* expose `taskState` field in Java API
* populated the field during the task's lifecycle changes and persist it
* adjust REST API and OpenAPI
* test coverage

---------

Signed-off-by: Sahu, Jyoti <Jyoti.Sahu@fmr.com>
  • Loading branch information
jyotisahu9 authored Jun 12, 2024
1 parent 95b869d commit a63ef7e
Show file tree
Hide file tree
Showing 45 changed files with 198 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@
"followUp:":"2013-01-23T13:44:42.000+0200",
"tenantId":null,
"removalTime":"2018-02-10T14:33:19.000+0200",
"rootProcessInstanceId":"aRootProcessInstanceId"
"rootProcessInstanceId":"aRootProcessInstanceId",
"taskState": "aTaskState"
}
]
}']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@
"followUp:":"2013-01-23T13:44:42.000+0200",
"tenantId":null,
"removalTime":"2018-02-10T14:33:19.000+0200",
"rootProcessInstanceId":"aRootProcessInstanceId"
"rootProcessInstanceId":"aRootProcessInstanceId",
"taskState":"aTaskState"
}
]
}']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@
"binding": "version",
"version": 2
},
"tenantId": "aTenantId"
"tenantId": "aTenantId",
"taskState": "aTaskState"
}
]
}'] />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@
"binding": "version",
"version": 2
},
"tenantId":"aTenantId"
"tenantId":"aTenantId",
"taskState": "aTaskState"
}
]
}',
Expand Down Expand Up @@ -148,7 +149,8 @@
"caseDefinitionId": null,
"suspended": false,
"formKey": "embedded:app:develop/invoice-forms/approve-invoice.html",
"tenantId": null
"tenantId": null,
"taskState": "aTaskState"
}
]
}'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@
"binding": "version",
"version": 2
},
"tenantId":"aTenantId"
"tenantId":"aTenantId",
"taskState": "aTaskState"
}
}'] />

Expand All @@ -68,4 +69,4 @@
}
}

</#macro>
</#macro>
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ public class HistoricTaskInstanceDto {
private String tenantId;
protected Date removalTime;
protected String rootProcessInstanceId;
/**
* Returns task State of history tasks
*/
protected String taskState;

public String getId() {
return id;
Expand Down Expand Up @@ -157,6 +161,11 @@ public String getRootProcessInstanceId() {
return rootProcessInstanceId;
}

/**
* Returns task State of history tasks
*/
public String getTaskState() { return taskState; }

public static HistoricTaskInstanceDto fromHistoricTaskInstance(HistoricTaskInstance taskInstance) {

HistoricTaskInstanceDto dto = new HistoricTaskInstanceDto();
Expand Down Expand Up @@ -187,6 +196,7 @@ public static HistoricTaskInstanceDto fromHistoricTaskInstance(HistoricTaskInsta
dto.tenantId = taskInstance.getTenantId();
dto.removalTime = taskInstance.getRemovalTime();
dto.rootProcessInstanceId = taskInstance.getRootProcessInstanceId();
dto.taskState = taskInstance.getTaskState();

return dto;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public class TaskDto {
private String formKey;
private CamundaFormRef camundaFormRef;
private String tenantId;
/**
* Returns task State of task
*/
private String taskState;

public String getId() {
return id;
Expand Down Expand Up @@ -194,6 +198,13 @@ public void setTenantId(String tenantId) {
this.tenantId = tenantId;
}

public String getTaskState() {
return taskState;
}
public void setTaskState(String taskState) {
this.taskState = taskState;
}

public static TaskDto fromEntity(Task task) {
TaskDto dto = new TaskDto();
dto.id = task.getId();
Expand Down Expand Up @@ -221,6 +232,7 @@ public static TaskDto fromEntity(Task task) {
dto.caseInstanceId = task.getCaseInstanceId();
dto.suspended = task.isSuspended();
dto.tenantId = task.getTenantId();
dto.taskState = task.getTaskState();

try {
dto.formKey = task.getFormKey();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ public void testGetSingleTask() {
.body("caseDefinitionId", equalTo(MockProvider.EXAMPLE_CASE_DEFINITION_ID))
.body("tenantId", equalTo(MockProvider.EXAMPLE_TENANT_ID))
.body("lastUpdated", equalTo(MockProvider.EXAMPLE_TASK_LAST_UPDATED))
.body("taskState", equalTo(MockProvider.EXAMPLE_HISTORIC_TASK_STATE))
.when().get(SINGLE_TASK_URL);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,9 @@ public abstract class MockProvider {
public static final String ANOTHER_EXAMPLE_TENANT_ID = "anotherTenantId";
public static final String EXAMPLE_TENANT_ID_LIST = EXAMPLE_TENANT_ID + "," + ANOTHER_EXAMPLE_TENANT_ID;

// task State
public static final String EXAMPLE_HISTORIC_TASK_STATE = "aTaskState";

public static final String EXAMPLE_TENANT_NAME = "aTenantName";

// case activity ids
Expand Down Expand Up @@ -1055,7 +1058,7 @@ public static MockTaskBuilder mockTask() {
.caseExecutionId(EXAMPLE_CASE_EXECUTION_ID)
.formKey(EXAMPLE_FORM_KEY)
.camundaFormRef(EXAMPLE_FORM_KEY, EXAMPLE_FORM_REF_BINDING, EXAMPLE_FORM_REF_VERSION)
.tenantId(EXAMPLE_TENANT_ID);
.tenantId(EXAMPLE_TENANT_ID).taskState(EXAMPLE_HISTORIC_TASK_STATE);
}

public static List<Task> createMockTasks() {
Expand Down Expand Up @@ -2574,6 +2577,7 @@ public static HistoricTaskInstance createMockHistoricTaskInstance(String tenantI
when(taskInstance.getTenantId()).thenReturn(tenantId);
when(taskInstance.getRemovalTime()).thenReturn(DateTimeUtil.parseDate(EXAMPLE_HISTORIC_TASK_INST_REMOVAL_TIME));
when(taskInstance.getRootProcessInstanceId()).thenReturn(EXAMPLE_HISTORIC_TASK_INST_ROOT_PROC_INST_ID);
when(taskInstance.getTaskState()).thenReturn(EXAMPLE_HISTORIC_TASK_STATE);

return taskInstance;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public class MockTaskBuilder {
private CamundaFormRef camundaFormRef;
private String tenantId;

private String taskState;

public MockTaskBuilder id(String id) {
this.id = id;
return this;
Expand Down Expand Up @@ -163,6 +165,11 @@ public MockTaskBuilder tenantId(String tenantId) {
return this;
}

public MockTaskBuilder taskState(String taskState) {
this.taskState = taskState;
return this;
}

public Task build() {
Task mockTask = mock(Task.class);
when(mockTask.getId()).thenReturn(id);
Expand All @@ -187,6 +194,7 @@ public Task build() {
when(mockTask.getFormKey()).thenReturn(formKey);
when(mockTask.getCamundaFormRef()).thenReturn(camundaFormRef);
when(mockTask.getTenantId()).thenReturn(tenantId);
when(mockTask.getTaskState()).thenReturn(taskState);
return mockTask;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2571,6 +2571,7 @@ protected void verifyHistoricTaskInstanceEntries(String content) {
String returnedCaseInstanceId = from(content).getString("[0].caseInstanceId");
String returnedCaseExecutionId = from(content).getString("[0].caseExecutionId");
String returnedTenantId = from(content).getString("[0].tenantId");
String returnedTaskState = from(content).getString("[0].taskState");
Date returnedRemovalTime = DateTimeUtil.parseDate(from(content).getString("[0].removalTime"));
String returnedRootProcessInstanceId = from(content).getString("[0].rootProcessInstanceId");

Expand Down Expand Up @@ -2600,6 +2601,7 @@ protected void verifyHistoricTaskInstanceEntries(String content) {
Assert.assertEquals(MockProvider.EXAMPLE_TENANT_ID, returnedTenantId);
Assert.assertEquals(DateTimeUtil.parseDate(MockProvider.EXAMPLE_HISTORIC_TASK_INST_REMOVAL_TIME), returnedRemovalTime);
Assert.assertEquals(MockProvider.EXAMPLE_HISTORIC_TASK_INST_ROOT_PROC_INST_ID, returnedRootProcessInstanceId);
Assert.assertEquals(MockProvider.EXAMPLE_HISTORIC_TASK_STATE,returnedTaskState);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,8 @@ public interface HistoricTaskInstance {
/** The time the historic task instance will be removed. */
Date getRemovalTime();

/**
* Task State also referred as lifeCycleState
*/
String getTaskState();
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ public class HistoricTaskInstanceEventEntity extends HistoricScopeInstanceEvent
protected String activityInstanceId;
protected String tenantId;

/**
* Returns task State of history tasks
*/
protected String taskState;

// getters and setters //////////////////////////////////////////////////////

public String getDeleteReason() {
Expand Down Expand Up @@ -145,6 +150,14 @@ public void setTenantId(String tenantId) {
this.tenantId = tenantId;
}

public String getTaskState() {
return taskState;
}

public void setTaskState(String taskState) {
this.taskState = taskState;
}

public String getRootProcessInstanceId() {
return rootProcessInstanceId;
}
Expand Down Expand Up @@ -178,6 +191,7 @@ public String toString() {
+ ", processInstanceId=" + processInstanceId
+ ", activityInstanceId=" + activityInstanceId
+ ", tenantId=" + tenantId
+ ", taskState=" + taskState
+ "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,10 @@ protected void initTaskInstanceEvent(HistoricTaskInstanceEventEntity evt, TaskEn
evt.setPriority(taskEntity.getPriority());
evt.setTaskDefinitionKey(taskEntity.getTaskDefinitionKey());
evt.setTenantId(tenantId);
/**
* Sets task State for the task
*/
evt.setTaskState(taskEntity.getTaskState());

ExecutionEntity execution = taskEntity.getExecution();
if (execution != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ public class TaskEntity extends AbstractVariableScope implements Task, DelegateT
protected int suspensionState = SuspensionState.ACTIVE.getStateCode();
protected TaskState lifecycleState = TaskState.STATE_INIT;
protected String tenantId;
/**
* Task State of task
*/
protected String taskState;

protected boolean isIdentityLinksInitialized = false;
protected transient List<IdentityLinkEntity> taskIdentityLinkEntities = new ArrayList<>();
Expand Down Expand Up @@ -188,12 +192,12 @@ public class TaskEntity extends AbstractVariableScope implements Task, DelegateT
public static final String PRIORITY = "priority";
public static final String CASE_INSTANCE_ID = "caseInstanceId";


/**
* Mybatis constructor
*/
public TaskEntity() {
this.lifecycleState = TaskState.STATE_CREATED;
this.taskState = TaskState.STATE_CREATED.taskState;
}

/**
Expand All @@ -202,12 +206,14 @@ public TaskEntity() {
public TaskEntity(String id) {
this(TaskState.STATE_INIT);
this.id = id;
this.taskState = TaskState.STATE_INIT.taskState;
}

protected TaskEntity(TaskState initialState) {
this.isIdentityLinksInitialized = true;
this.setCreateTime(ClockUtil.getCurrentTime());
this.lifecycleState = initialState;
this.taskState = this.lifecycleState.taskState;
}

/**
Expand Down Expand Up @@ -441,6 +447,9 @@ public Object getPersistentState() {
if (tenantId != null) {
persistentState.put("tenantId", this.tenantId);
}
if (taskState != null) {
persistentState.put("taskState", this.taskState);
}

persistentState.put("suspensionState", this.suspensionState);

Expand Down Expand Up @@ -1168,6 +1177,7 @@ public void fireAuthorizationProvider() {

public boolean transitionTo(TaskState state) {
this.lifecycleState = state;
this.taskState = this.lifecycleState.taskState;

switch (state) {
case STATE_CREATED:
Expand All @@ -1193,6 +1203,7 @@ public boolean triggerUpdateEvent() {
if (lifecycleState == TaskState.STATE_CREATED) {
registerCommandContextCloseListener();
setLastUpdated(ClockUtil.getCurrentTime());
setTaskState(TaskState.STATE_UPDATED.taskState);
return fireEvent(TaskListener.EVENTNAME_UPDATE) && fireAssignmentEvent();
}
else {
Expand Down Expand Up @@ -1584,6 +1595,17 @@ public void setTenantId(String tenantId) {
this.tenantId = tenantId;
}

@Override
public String getTaskState() {
return taskState;
}

@Override
public void setTaskState(String taskState) {
this.taskState = taskState;
}


@Override
public void setFollowUpDate(Date followUpDate) {
registerCommandContextCloseListener();
Expand Down Expand Up @@ -1771,10 +1793,17 @@ public void escalation(String escalationCode, Map<String, Object> variables) {

public static enum TaskState {

STATE_INIT,
STATE_CREATED,
STATE_COMPLETED,
STATE_DELETED
STATE_INIT ("Init"),
STATE_CREATED ("Created"),
STATE_COMPLETED ("Completed"),
STATE_DELETED ("Deleted"),
STATE_UPDATED ("Updated");

private String taskState;

private TaskState(String taskState) {
this.taskState = taskState;
}
}

}
13 changes: 13 additions & 0 deletions engine/src/main/java/org/camunda/bpm/engine/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,4 +189,17 @@ public interface Task {
*/
void setTenantId(String tenantId);

/**
* Returns the task's state.
*
* @return the task's state
*/
String getTaskState();

/**
* Sets the task state for this task.
*
* @param taskState the taskState to set
*/
void setTaskState(String taskState);
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ create table ACT_RU_TASK (
FOLLOW_UP_DATE_ timestamp,
SUSPENSION_STATE_ integer,
TENANT_ID_ varchar(64),
TASK_STATE_ varchar(64),
primary key (ID_)
);

Expand Down
Loading

0 comments on commit a63ef7e

Please sign in to comment.