TSK-1160 - terminate/cancel task Holger's comments

This commit is contained in:
BerndBreier 2020-03-26 18:29:37 +01:00
parent 2ce7f86456
commit d6505284f7
13 changed files with 98 additions and 61 deletions

View File

@ -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() {

View File

@ -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);

View File

@ -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.

View File

@ -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

View File

@ -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());

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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