TSK-1160 - terminate/cancel task Holger's comments
This commit is contained in:
parent
2ce7f86456
commit
d6505284f7
|
@ -64,6 +64,7 @@ public class TaskanaEngineConfiguration {
|
|||
"taskana.classification.types";
|
||||
private static final String TASKANA_CLASSIFICATION_CATEGORIES_PROPERTY =
|
||||
"taskana.classification.categories";
|
||||
private static final String TASKANA_GERMAN_HOLIDAYS_ENABLED = "taskana.german.holidays.enabled";
|
||||
// TASKANA_SCHEMA_VERSION
|
||||
private static final String DEFAULT_SCHEMA_NAME = "TASKANA";
|
||||
|
||||
|
@ -135,8 +136,6 @@ public class TaskanaEngineConfiguration {
|
|||
this.rolesSeparator = rolesSeparator;
|
||||
}
|
||||
|
||||
setGermanPublicHolidaysEnabled(true);
|
||||
|
||||
if (dataSource != null) {
|
||||
this.dataSource = dataSource;
|
||||
} else {
|
||||
|
@ -168,6 +167,17 @@ public class TaskanaEngineConfiguration {
|
|||
initDomains(props);
|
||||
initClassificationTypes(props);
|
||||
initClassificationCategories(props);
|
||||
initGermanHolidaysEnabled(props);
|
||||
}
|
||||
|
||||
private void initGermanHolidaysEnabled(Properties props) {
|
||||
String enabled = props.getProperty(TASKANA_GERMAN_HOLIDAYS_ENABLED);
|
||||
if (enabled != null && ! enabled.isEmpty()) {
|
||||
germanPublicHolidaysEnabled = Boolean.parseBoolean(enabled);
|
||||
} else {
|
||||
germanPublicHolidaysEnabled = false;
|
||||
}
|
||||
LOGGER.debug("GermanPublicHolidaysEnabled = {}", germanPublicHolidaysEnabled);
|
||||
}
|
||||
|
||||
public static DataSource createDefaultDataSource() {
|
||||
|
|
|
@ -46,6 +46,7 @@ import pro.taskana.common.internal.persistence.InstantTypeHandler;
|
|||
import pro.taskana.common.internal.persistence.MapTypeHandler;
|
||||
import pro.taskana.common.internal.security.CurrentUserContext;
|
||||
import pro.taskana.common.internal.security.GroupPrincipal;
|
||||
import pro.taskana.common.internal.util.WorkingDaysToDaysConverter;
|
||||
import pro.taskana.monitor.api.MonitorService;
|
||||
import pro.taskana.monitor.internal.MonitorMapper;
|
||||
import pro.taskana.monitor.internal.MonitorServiceImpl;
|
||||
|
@ -87,6 +88,8 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
|||
historyEventProducer = HistoryEventProducer.getInstance(taskanaEngineConfiguration);
|
||||
taskRoutingManager = TaskRoutingManager.getInstance(this);
|
||||
this.internalTaskanaEngineImpl = new InternalTaskanaEngineImpl();
|
||||
WorkingDaysToDaysConverter.setGermanPublicHolidaysEnabled(
|
||||
taskanaEngineConfiguration.isGermanPublicHolidaysEnabled());
|
||||
}
|
||||
|
||||
public static TaskanaEngine createTaskanaEngine(
|
||||
|
@ -251,7 +254,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
|||
// register type handlers
|
||||
configuration.getTypeHandlerRegistry().register(new MapTypeHandler());
|
||||
configuration.getTypeHandlerRegistry().register(Instant.class, new InstantTypeHandler());
|
||||
configuration.getTypeHandlerRegistry().register(JdbcType.TIMESTAMP,new InstantTypeHandler());
|
||||
configuration.getTypeHandlerRegistry().register(JdbcType.TIMESTAMP, new InstantTypeHandler());
|
||||
// add mappers
|
||||
configuration.addMapper(TaskMapper.class);
|
||||
configuration.addMapper(MonitorMapper.class);
|
||||
|
|
|
@ -492,7 +492,8 @@ public interface TaskService {
|
|||
Instant planned, List<String> taskIds);
|
||||
|
||||
/**
|
||||
* Cancels a task.
|
||||
* Cancels a task. Cancellation means a task is obsolete from a business perspective an does not
|
||||
* need to be completed anymore.
|
||||
*
|
||||
* @param taskId the id of the task to cancel.
|
||||
* @return the updated task.
|
||||
|
@ -504,7 +505,8 @@ public interface TaskService {
|
|||
throws TaskNotFoundException, InvalidStateException, NotAuthorizedException;
|
||||
|
||||
/**
|
||||
* Terminates a task.
|
||||
* Terminates a task. Termination is a administrative action to complete a task. This is typically
|
||||
* done by an administration to correct any technical issue.
|
||||
*
|
||||
* @param taskId the id of the task to cancel.
|
||||
* @return the updated task.
|
||||
|
|
|
@ -47,9 +47,6 @@ class ServiceLevelHandler {
|
|||
this.taskMapper = taskMapper;
|
||||
this.attachmentMapper = attachmentMapper;
|
||||
this.converter = WorkingDaysToDaysConverter.initialize();
|
||||
if (taskanaEngine.getEngine().getConfiguration().isGermanPublicHolidaysEnabled()) {
|
||||
WorkingDaysToDaysConverter.setGermanPublicHolidaysEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
// use the same algorithm as setPlannedPropertyOfTasksImpl to refresh
|
||||
|
|
|
@ -994,8 +994,6 @@ public class TaskServiceImpl implements TaskService {
|
|||
task.setOwner(null);
|
||||
task.setModified(now);
|
||||
task.setCompleted(now);
|
||||
task.setClaimed(null);
|
||||
task.setRead(true);
|
||||
task.setState(targetState);
|
||||
taskMapper.update(task);
|
||||
LOGGER.debug("Task '{}' cancelled by user '{}'.", taskId, CurrentUserContext.getUserid());
|
||||
|
|
|
@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|||
|
||||
import acceptance.AbstractAccTest;
|
||||
import java.util.List;
|
||||
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
@ -16,10 +17,8 @@ import pro.taskana.task.api.TaskService;
|
|||
import pro.taskana.task.api.TaskState;
|
||||
import pro.taskana.task.api.exceptions.InvalidStateException;
|
||||
import pro.taskana.task.api.exceptions.TaskNotFoundException;
|
||||
import pro.taskana.task.api.models.Task;
|
||||
import pro.taskana.task.api.models.TaskSummary;
|
||||
|
||||
|
||||
/** Acceptance tests for all claim and complete scenarios. */
|
||||
@ExtendWith(JaasExtension.class)
|
||||
class CancelTaskAccTest extends AbstractAccTest {
|
||||
|
@ -31,7 +30,7 @@ class CancelTaskAccTest extends AbstractAccTest {
|
|||
}
|
||||
|
||||
@BeforeEach
|
||||
public static void setupTest() throws Exception {
|
||||
public void setupIndividualTest() throws Exception {
|
||||
resetDb(false);
|
||||
}
|
||||
|
||||
|
@ -53,7 +52,6 @@ class CancelTaskAccTest extends AbstractAccTest {
|
|||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries = taskService.createTaskQuery().stateIn(TaskState.READY).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(47);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
long numTasks = taskService.createTaskQuery().stateIn(TaskState.READY).count();
|
||||
assertThat(numTasks).isEqualTo(46);
|
||||
|
@ -62,20 +60,23 @@ class CancelTaskAccTest extends AbstractAccTest {
|
|||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testCancelClaimedTask()
|
||||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.CLAIMED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(19);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThat(taskSummaries.size()).isEqualTo(16);
|
||||
|
||||
long numTasksCancelled = taskService.createTaskQuery().stateIn(TaskState.CANCELLED).count();
|
||||
assertThat(numTasksCancelled).isEqualTo(5);
|
||||
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
long numTasks = taskService.createTaskQuery().stateIn(TaskState.CLAIMED).count();
|
||||
assertThat(numTasks).isEqualTo(18);
|
||||
numTasks = taskService.createTaskQuery().stateIn(TaskState.CANCELLED).count();
|
||||
assertThat(numTasks).isEqualTo(6);
|
||||
long numTasksClaimed = taskService.createTaskQuery().stateIn(TaskState.CLAIMED).count();
|
||||
assertThat(numTasksClaimed).isEqualTo(15);
|
||||
numTasksCancelled = taskService.createTaskQuery().stateIn(TaskState.CANCELLED).count();
|
||||
assertThat(numTasksCancelled).isEqualTo(6);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
|
@ -87,15 +88,17 @@ class CancelTaskAccTest extends AbstractAccTest {
|
|||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.COMPLETED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(7);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThatThrownBy(
|
||||
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
}).isInstanceOf(InvalidStateException.class);
|
||||
};
|
||||
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testCancelTerminatedTask()
|
||||
|
@ -103,26 +106,27 @@ class CancelTaskAccTest extends AbstractAccTest {
|
|||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.TERMINATED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(5);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThatThrownBy(
|
||||
() -> {
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
}).isInstanceOf(InvalidStateException.class);
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
};
|
||||
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testCancelCancelledTask()
|
||||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.CANCELLED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(6);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThatThrownBy(
|
||||
assertThat(taskSummaries.size()).isEqualTo(5);
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.cancelTask(taskSummaries.get(0).getId());
|
||||
}).isInstanceOf(InvalidStateException.class);
|
||||
};
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|||
|
||||
import acceptance.AbstractAccTest;
|
||||
import java.util.List;
|
||||
import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
@ -16,7 +17,6 @@ import pro.taskana.task.api.TaskService;
|
|||
import pro.taskana.task.api.TaskState;
|
||||
import pro.taskana.task.api.exceptions.InvalidStateException;
|
||||
import pro.taskana.task.api.exceptions.TaskNotFoundException;
|
||||
import pro.taskana.task.api.models.Task;
|
||||
import pro.taskana.task.api.models.TaskSummary;
|
||||
|
||||
/** Acceptance tests for all claim and complete scenarios. */
|
||||
|
@ -30,7 +30,7 @@ class TerminateTaskAccTest extends AbstractAccTest {
|
|||
}
|
||||
|
||||
@BeforeEach
|
||||
public static void setupTest() throws Exception {
|
||||
public void setupIndividualTest() throws Exception {
|
||||
resetDb(false);
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,6 @@ class TerminateTaskAccTest extends AbstractAccTest {
|
|||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries = taskService.createTaskQuery().stateIn(TaskState.READY).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(47);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
long numTasks = taskService.createTaskQuery().stateIn(TaskState.READY).count();
|
||||
assertThat(numTasks).isEqualTo(46);
|
||||
|
@ -61,40 +60,44 @@ class TerminateTaskAccTest extends AbstractAccTest {
|
|||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testTerminateClaimedTask()
|
||||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.CLAIMED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(19);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThat(taskSummaries.size()).isEqualTo(16);
|
||||
|
||||
long numTasksTerminated = taskService.createTaskQuery().stateIn(TaskState.TERMINATED).count();
|
||||
assertThat(numTasksTerminated).isEqualTo(5);
|
||||
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
long numTasks = taskService.createTaskQuery().stateIn(TaskState.CLAIMED).count();
|
||||
assertThat(numTasks).isEqualTo(18);
|
||||
numTasks = taskService.createTaskQuery().stateIn(TaskState.TERMINATED).count();
|
||||
assertThat(numTasks).isEqualTo(7);
|
||||
long numTasksClaimed = taskService.createTaskQuery().stateIn(TaskState.CLAIMED).count();
|
||||
assertThat(numTasksClaimed).isEqualTo(15);
|
||||
numTasksTerminated = taskService.createTaskQuery().stateIn(TaskState.TERMINATED).count();
|
||||
assertThat(numTasksTerminated).isEqualTo(6);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testTerminateCompletedTask()
|
||||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.COMPLETED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(7);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThatThrownBy(
|
||||
() -> {
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
}).isInstanceOf(InvalidStateException.class);
|
||||
assertThat(taskSummaries.size()).isEqualTo(6);
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
};
|
||||
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "admin",
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testTerminateTerminatedTask()
|
||||
|
@ -102,10 +105,27 @@ class TerminateTaskAccTest extends AbstractAccTest {
|
|||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.TERMINATED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(5);
|
||||
Task task = taskService.getTask(taskSummaries.get(0).getId());
|
||||
assertThatThrownBy(
|
||||
() -> {
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
}).isInstanceOf(InvalidStateException.class);
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
};
|
||||
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
|
||||
@WithAccessId(
|
||||
userName = "user_1_2",
|
||||
groupNames = {"group_1"})
|
||||
@Test
|
||||
void testTerminateCancelledTask()
|
||||
throws NotAuthorizedException, TaskNotFoundException, InvalidStateException {
|
||||
List<TaskSummary> taskSummaries =
|
||||
taskService.createTaskQuery().stateIn(TaskState.CANCELLED).list();
|
||||
assertThat(taskSummaries.size()).isEqualTo(5);
|
||||
ThrowingCallable taskanaCall =
|
||||
() -> {
|
||||
taskService.terminateTask(taskSummaries.get(0).getId());
|
||||
};
|
||||
assertThatThrownBy(taskanaCall).isInstanceOf(InvalidStateException.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,5 +11,5 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
|
||||
taskana.german.holidays.enabled=true
|
||||
|
||||
|
|
|
@ -12,4 +12,4 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
|
||||
taskana.german.holidays.enabled=true
|
||||
|
|
|
@ -12,3 +12,4 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
taskana.german.holidays.enabled=true
|
||||
|
|
|
@ -12,3 +12,4 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
taskana.german.holidays.enabled=true
|
||||
|
|
|
@ -12,4 +12,4 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
|
||||
taskana.german.holidays.enabled=true
|
||||
|
|
|
@ -12,3 +12,4 @@ taskana.jobs.batchSize=50
|
|||
taskana.jobs.cleanup.runEvery=P1D
|
||||
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z
|
||||
taskana.jobs.cleanup.minimumAge=P14D
|
||||
taskana.german.holidays.enabled=true
|
||||
|
|
Loading…
Reference in New Issue