TSK-1987 immutable TaskanaEngineConfiguration

This commit is contained in:
arolfes 2023-02-02 15:02:02 +01:00 committed by Mustapha Zorgati
parent 53f9dce1db
commit 61a5e32865
72 changed files with 1620 additions and 1071 deletions

View File

@ -14,7 +14,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.UnaryOperator; import java.util.function.UnaryOperator;
@ -54,7 +53,8 @@ public class TaskanaConfigurationInitializer {
throw new IllegalStateException("utility class"); throw new IllegalStateException("utility class");
} }
public static void configureAnnotatedFields(Object instance, String separator, Properties props) { public static void configureAnnotatedFields(
Object instance, String separator, Map<String, String> props) {
final List<Field> fields = ReflectionUtil.retrieveAllFields(instance.getClass()); final List<Field> fields = ReflectionUtil.retrieveAllFields(instance.getClass());
for (Field field : fields) { for (Field field : fields) {
Optional.ofNullable(field.getAnnotation(TaskanaProperty.class)) Optional.ofNullable(field.getAnnotation(TaskanaProperty.class))
@ -73,7 +73,7 @@ public class TaskanaConfigurationInitializer {
} }
public static Map<String, List<String>> configureClassificationCategoriesForType( public static Map<String, List<String>> configureClassificationCategoriesForType(
Properties props, List<String> classificationTypes) { Map<String, String> props, List<String> classificationTypes) {
Function<String, List<String>> getClassificationCategoriesForType = Function<String, List<String>> getClassificationCategoriesForType =
type -> type ->
parseProperty( parseProperty(
@ -87,12 +87,12 @@ public class TaskanaConfigurationInitializer {
} }
public static Map<TaskanaRole, Set<String>> configureRoles( public static Map<TaskanaRole, Set<String>> configureRoles(
String separator, Properties props, boolean shouldUseLowerCaseForAccessIds) { String separator, Map<String, String> props, boolean shouldUseLowerCaseForAccessIds) {
Function<TaskanaRole, Set<String>> getAccessIdsForRole = Function<TaskanaRole, Set<String>> getAccessIdsForRole =
role -> role ->
new HashSet<>( new HashSet<>(
splitStringAndTrimElements( splitStringAndTrimElements(
props.getProperty(role.getPropertyName().toLowerCase(), ""), props.getOrDefault(role.getPropertyName().toLowerCase(), ""),
separator, separator,
shouldUseLowerCaseForAccessIds shouldUseLowerCaseForAccessIds
? String::toLowerCase ? String::toLowerCase
@ -137,8 +137,8 @@ public class TaskanaConfigurationInitializer {
} }
private static <T> Optional<T> parseProperty( private static <T> Optional<T> parseProperty(
Properties props, String key, CheckedFunction<String, T, Exception> function) { Map<String, String> props, String key, CheckedFunction<String, T, Exception> function) {
String property = props.getProperty(key, ""); String property = props.getOrDefault(key, "");
if (!property.isEmpty()) { if (!property.isEmpty()) {
try { try {
return Optional.ofNullable(function.apply(property)); return Optional.ofNullable(function.apply(property));
@ -155,13 +155,19 @@ public class TaskanaConfigurationInitializer {
interface PropertyParser<T> { interface PropertyParser<T> {
Optional<T> initialize( Optional<T> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty); Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty);
} }
static class ListPropertyParser implements PropertyParser<List<?>> { static class ListPropertyParser implements PropertyParser<List<?>> {
@Override @Override
public Optional<List<?>> initialize( public Optional<List<?>> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
if (!List.class.isAssignableFrom(field.getType())) { if (!List.class.isAssignableFrom(field.getType())) {
throw new SystemException( throw new SystemException(
String.format( String.format(
@ -215,7 +221,10 @@ public class TaskanaConfigurationInitializer {
static class InstantPropertyParser implements PropertyParser<Instant> { static class InstantPropertyParser implements PropertyParser<Instant> {
@Override @Override
public Optional<Instant> initialize( public Optional<Instant> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
return parseProperty(properties, taskanaProperty.value(), Instant::parse); return parseProperty(properties, taskanaProperty.value(), Instant::parse);
} }
} }
@ -223,7 +232,10 @@ public class TaskanaConfigurationInitializer {
static class DurationPropertyParser implements PropertyParser<Duration> { static class DurationPropertyParser implements PropertyParser<Duration> {
@Override @Override
public Optional<Duration> initialize( public Optional<Duration> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
return parseProperty(properties, taskanaProperty.value(), Duration::parse); return parseProperty(properties, taskanaProperty.value(), Duration::parse);
} }
} }
@ -231,7 +243,10 @@ public class TaskanaConfigurationInitializer {
static class StringPropertyParser implements PropertyParser<String> { static class StringPropertyParser implements PropertyParser<String> {
@Override @Override
public Optional<String> initialize( public Optional<String> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
return parseProperty(properties, taskanaProperty.value(), String::new); return parseProperty(properties, taskanaProperty.value(), String::new);
} }
} }
@ -239,7 +254,10 @@ public class TaskanaConfigurationInitializer {
static class IntegerPropertyParser implements PropertyParser<Integer> { static class IntegerPropertyParser implements PropertyParser<Integer> {
@Override @Override
public Optional<Integer> initialize( public Optional<Integer> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
return parseProperty(properties, taskanaProperty.value(), Integer::parseInt); return parseProperty(properties, taskanaProperty.value(), Integer::parseInt);
} }
} }
@ -247,7 +265,10 @@ public class TaskanaConfigurationInitializer {
static class BooleanPropertyParser implements PropertyParser<Boolean> { static class BooleanPropertyParser implements PropertyParser<Boolean> {
@Override @Override
public Optional<Boolean> initialize( public Optional<Boolean> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) { Map<String, String> properties,
String separator,
Field field,
TaskanaProperty taskanaProperty) {
return parseProperty(properties, taskanaProperty.value(), Boolean::parseBoolean); return parseProperty(properties, taskanaProperty.value(), Boolean::parseBoolean);
} }
} }

View File

@ -29,10 +29,7 @@ public class LogfileHistoryServiceImpl implements TaskanaHistory {
objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
String historyLoggerName = String historyLoggerName =
taskanaEngine taskanaEngine.getConfiguration().getProperties().get(TASKANA_HISTORY_LOGGER_NAME);
.getConfiguration()
.readPropertiesFromFile()
.getProperty(TASKANA_HISTORY_LOGGER_NAME);
if (historyLoggerName != null) { if (historyLoggerName != null) {
historyLogger = LoggerFactory.getLogger(historyLoggerName); historyLogger = LoggerFactory.getLogger(historyLoggerName);

View File

@ -5,7 +5,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.Instant; import java.time.Instant;
import java.util.Properties; import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -13,7 +14,7 @@ import org.mockito.Mockito;
import uk.org.lidalia.slf4jtest.TestLogger; import uk.org.lidalia.slf4jtest.TestLogger;
import uk.org.lidalia.slf4jtest.TestLoggerFactory; import uk.org.lidalia.slf4jtest.TestLoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEvent; import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEvent;
import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEventType; import pro.taskana.spi.history.api.events.classification.ClassificationHistoryEventType;
@ -37,13 +38,12 @@ class LogfileHistoryServiceImplTest {
@BeforeAll @BeforeAll
public static void setupObjectMapper() { public static void setupObjectMapper() {
TaskanaEngineConfiguration taskanaEngineConfiguration = TaskanaConfiguration taskanaEngineConfiguration = Mockito.mock(TaskanaConfiguration.class);
Mockito.mock(TaskanaEngineConfiguration.class);
taskanaEngineMock = Mockito.mock(TaskanaEngine.class); taskanaEngineMock = Mockito.mock(TaskanaEngine.class);
Mockito.when(taskanaEngineMock.getConfiguration()).thenReturn(taskanaEngineConfiguration); Mockito.when(taskanaEngineMock.getConfiguration()).thenReturn(taskanaEngineConfiguration);
Properties mockProperties = new Properties(); Map<String, String> mockProperties = new HashMap<>();
mockProperties.put(LogfileHistoryServiceImpl.TASKANA_HISTORY_LOGGER_NAME, "AUDIT"); mockProperties.put(LogfileHistoryServiceImpl.TASKANA_HISTORY_LOGGER_NAME, "AUDIT");
Mockito.when(taskanaEngineConfiguration.readPropertiesFromFile()).thenReturn(mockProperties); Mockito.when(taskanaEngineConfiguration.getProperties()).thenReturn(mockProperties);
} }
@Test @Test

View File

@ -131,7 +131,7 @@ public class SimpleHistoryServiceImpl implements TaskanaHistory {
throw new TaskanaHistoryEventNotFoundException(historyEventId); throw new TaskanaHistoryEventNotFoundException(historyEventId);
} }
if (taskanaHistoryEngine.getConfiguration().getAddAdditionalUserInfo()) { if (taskanaHistoryEngine.getConfiguration().isAddAdditionalUserInfo()) {
User user = userMapper.findById(resultEvent.getUserId()); User user = userMapper.findById(resultEvent.getUserId());
if (user != null) { if (user != null) {
resultEvent.setUserLongName(user.getLongName()); resultEvent.setUserLongName(user.getLongName());

View File

@ -86,7 +86,7 @@ public class TaskHistoryQueryImpl implements TaskHistoryQuery {
this.taskanaHistoryEngine = taskanaHistoryEngine; this.taskanaHistoryEngine = taskanaHistoryEngine;
this.orderBy = new ArrayList<>(); this.orderBy = new ArrayList<>();
this.orderColumns = new ArrayList<>(); this.orderColumns = new ArrayList<>();
this.joinWithUserInfo = taskanaHistoryEngine.getConfiguration().getAddAdditionalUserInfo(); this.joinWithUserInfo = taskanaHistoryEngine.getConfiguration().isAddAdditionalUserInfo();
} }
public String[] getIdIn() { public String[] getIdIn() {

View File

@ -21,7 +21,7 @@ import org.apache.ibatis.type.JdbcType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.MismatchedRoleException; import pro.taskana.common.api.exceptions.MismatchedRoleException;
@ -49,7 +49,7 @@ public class TaskanaHistoryEngineImpl implements TaskanaHistoryEngine {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskanaHistoryEngineImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(TaskanaHistoryEngineImpl.class);
private static final String DEFAULT = "default"; private static final String DEFAULT = "default";
private final SqlSessionManager sessionManager; private final SqlSessionManager sessionManager;
private final TaskanaEngineConfiguration taskanaEngineConfiguration; private final TaskanaConfiguration taskanaEngineConfiguration;
private final TaskanaEngine taskanaEngine; private final TaskanaEngine taskanaEngine;
private TransactionFactory transactionFactory; private TransactionFactory transactionFactory;
private TaskanaHistory taskanaHistoryService; private TaskanaHistory taskanaHistoryService;
@ -58,7 +58,7 @@ public class TaskanaHistoryEngineImpl implements TaskanaHistoryEngine {
this.taskanaEngineConfiguration = taskanaEngine.getConfiguration(); this.taskanaEngineConfiguration = taskanaEngine.getConfiguration();
this.taskanaEngine = taskanaEngine; this.taskanaEngine = taskanaEngine;
createTransactionFactory(taskanaEngineConfiguration.getUseManagedTransactions()); createTransactionFactory(taskanaEngineConfiguration.isUseManagedTransactions());
sessionManager = createSqlSessionManager(); sessionManager = createSqlSessionManager();
} }
@ -102,7 +102,7 @@ public class TaskanaHistoryEngineImpl implements TaskanaHistoryEngine {
} }
} }
public TaskanaEngineConfiguration getConfiguration() { public TaskanaConfiguration getConfiguration() {
return this.taskanaEngineConfiguration; return this.taskanaEngineConfiguration;
} }

View File

@ -10,7 +10,6 @@ import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -56,8 +55,7 @@ public class HistoryCleanupJob extends AbstractTaskanaJob {
super(taskanaEngine, txProvider, scheduledJob, true); super(taskanaEngine, txProvider, scheduledJob, true);
allCompletedSameParentBusiness = allCompletedSameParentBusiness =
taskanaEngine.getConfiguration().isTaskCleanupJobAllCompletedSameParentBusiness(); taskanaEngine.getConfiguration().isTaskCleanupJobAllCompletedSameParentBusiness();
Properties props = taskanaEngine.getConfiguration().readPropertiesFromFile(); initJobParameters(taskanaEngine.getConfiguration().getProperties());
initJobParameters(props);
} }
@Override @Override
@ -218,9 +216,9 @@ public class HistoryCleanupJob extends AbstractTaskanaJob {
return deletedTasksCount; return deletedTasksCount;
} }
private void initJobParameters(Properties props) { private void initJobParameters(Map<String, String> props) {
String jobBatchSizeProperty = props.getProperty(TASKANA_JOB_HISTORY_BATCH_SIZE); String jobBatchSizeProperty = props.get(TASKANA_JOB_HISTORY_BATCH_SIZE);
if (jobBatchSizeProperty != null && !jobBatchSizeProperty.isEmpty()) { if (jobBatchSizeProperty != null && !jobBatchSizeProperty.isEmpty()) {
try { try {
batchSize = Integer.parseInt(jobBatchSizeProperty); batchSize = Integer.parseInt(jobBatchSizeProperty);
@ -233,7 +231,7 @@ public class HistoryCleanupJob extends AbstractTaskanaJob {
} }
String historyEventCleanupJobMinimumAgeProperty = String historyEventCleanupJobMinimumAgeProperty =
props.getProperty(TASKANA_JOB_HISTORY_CLEANUP_MINIMUM_AGE); props.get(TASKANA_JOB_HISTORY_CLEANUP_MINIMUM_AGE);
if (historyEventCleanupJobMinimumAgeProperty != null if (historyEventCleanupJobMinimumAgeProperty != null
&& !historyEventCleanupJobMinimumAgeProperty.isEmpty()) { && !historyEventCleanupJobMinimumAgeProperty.isEmpty()) {
try { try {

View File

@ -4,12 +4,13 @@ import static pro.taskana.common.test.OracleSchemaHelper.initOracleSchema;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionManager; import org.apache.ibatis.session.SqlSessionManager;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.JUnitException;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode; import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode;
import pro.taskana.common.internal.JobMapper; import pro.taskana.common.internal.JobMapper;
@ -25,16 +26,19 @@ import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper;
import pro.taskana.simplehistory.impl.workbasket.WorkbasketHistoryEventMapper; import pro.taskana.simplehistory.impl.workbasket.WorkbasketHistoryEventMapper;
import pro.taskana.spi.history.api.events.task.TaskHistoryEvent; import pro.taskana.spi.history.api.events.task.TaskHistoryEvent;
import pro.taskana.spi.history.api.events.workbasket.WorkbasketHistoryEvent; import pro.taskana.spi.history.api.events.workbasket.WorkbasketHistoryEvent;
import pro.taskana.task.api.TaskService;
import pro.taskana.task.api.models.ObjectReference; import pro.taskana.task.api.models.ObjectReference;
import pro.taskana.task.internal.models.ObjectReferenceImpl; import pro.taskana.task.internal.models.ObjectReferenceImpl;
/** Set up database for tests. */ /** Set up database for tests. */
public abstract class AbstractAccTest { public abstract class AbstractAccTest {
protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaConfiguration taskanaEngineConfiguration;
protected static TaskanaHistoryEngineImpl taskanaHistoryEngine; protected static TaskanaHistoryEngineImpl taskanaHistoryEngine;
protected static TaskanaEngine taskanaEngine; protected static TaskanaEngine taskanaEngine;
private static SimpleHistoryServiceImpl historyService; protected static SimpleHistoryServiceImpl historyService;
protected static TaskService taskService;
/** /**
* create taskHistoryEvent object. * create taskHistoryEvent object.
@ -97,19 +101,25 @@ public abstract class AbstractAccTest {
initOracleSchema(dataSource, schemaNameTmp); initOracleSchema(dataSource, schemaNameTmp);
} }
} }
TaskanaConfiguration tec =
new TaskanaConfiguration.Builder(dataSource, false, schemaNameTmp).build();
initTaskanaEngine(tec);
taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, schemaNameTmp); SampleDataGenerator sampleDataGenerator =
new SampleDataGenerator(dataSource, tec.getSchemaName());
sampleDataGenerator.clearDb();
sampleDataGenerator.generateTestData();
}
protected static void initTaskanaEngine(TaskanaConfiguration tec) throws SQLException {
taskanaEngineConfiguration = tec;
taskanaEngine = taskanaEngine =
TaskanaEngine.buildTaskanaEngine( TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT); taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
taskanaHistoryEngine = TaskanaHistoryEngineImpl.createTaskanaEngine(taskanaEngine); taskanaHistoryEngine = TaskanaHistoryEngineImpl.createTaskanaEngine(taskanaEngine);
taskService = taskanaEngine.getTaskService();
historyService = new SimpleHistoryServiceImpl(); historyService = new SimpleHistoryServiceImpl();
historyService.initialize(taskanaEngine); historyService.initialize(taskanaEngine);
SampleDataGenerator sampleDataGenerator =
new SampleDataGenerator(dataSource, taskanaEngineConfiguration.getSchemaName());
sampleDataGenerator.clearDb();
sampleDataGenerator.generateTestData();
} }
protected static SimpleHistoryServiceImpl getHistoryService() { protected static SimpleHistoryServiceImpl getHistoryService() {

View File

@ -4,32 +4,29 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import acceptance.AbstractAccTest; import acceptance.AbstractAccTest;
import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId; import pro.taskana.common.test.security.WithAccessId;
import pro.taskana.simplehistory.impl.SimpleHistoryServiceImpl;
import pro.taskana.simplehistory.impl.TaskHistoryQueryImpl; import pro.taskana.simplehistory.impl.TaskHistoryQueryImpl;
import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper; import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper;
import pro.taskana.spi.history.api.events.task.TaskHistoryEvent; import pro.taskana.spi.history.api.events.task.TaskHistoryEvent;
import pro.taskana.task.api.TaskService;
import pro.taskana.task.api.exceptions.TaskNotFoundException; import pro.taskana.task.api.exceptions.TaskNotFoundException;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest { class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest {
private final TaskService taskService = taskanaEngine.getTaskService();
private final SimpleHistoryServiceImpl historyService = getHistoryService();
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_DeleteHistoryEvents_When_TaskIsDeletedWithHistoryDeletionEnabled() throws Exception { void should_DeleteHistoryEvents_When_TaskIsDeletedWithHistoryDeletionEnabled() throws Exception {
final String taskid = "TKI:000000000000000000000000000000000036"; final String taskid = "TKI:000000000000000000000000000000000036";
taskanaEngineConfiguration.setDeleteHistoryOnTaskDeletionEnabled(true); createTaskanaEngineWithNewConfig(true);
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
@ -62,7 +59,7 @@ class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest {
final String taskId_1 = "TKI:000000000000000000000000000000000037"; final String taskId_1 = "TKI:000000000000000000000000000000000037";
final String taskId_2 = "TKI:000000000000000000000000000000000038"; final String taskId_2 = "TKI:000000000000000000000000000000000038";
taskanaEngineConfiguration.setDeleteHistoryOnTaskDeletionEnabled(true); createTaskanaEngineWithNewConfig(true);
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
@ -101,7 +98,7 @@ class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest {
final String taskId = "TKI:000000000000000000000000000000000039"; final String taskId = "TKI:000000000000000000000000000000000039";
taskanaEngineConfiguration.setDeleteHistoryOnTaskDeletionEnabled(false); createTaskanaEngineWithNewConfig(false);
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
@ -133,7 +130,7 @@ class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest {
final String taskId_1 = "TKI:000000000000000000000000000000000040"; final String taskId_1 = "TKI:000000000000000000000000000000000040";
final String taskId_2 = "TKI:000000000000000000000000000000000068"; final String taskId_2 = "TKI:000000000000000000000000000000000068";
taskanaEngineConfiguration.setDeleteHistoryOnTaskDeletionEnabled(false); createTaskanaEngineWithNewConfig(false);
TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper(); TaskHistoryQueryMapper taskHistoryQueryMapper = getHistoryQueryMapper();
@ -158,4 +155,14 @@ class DeleteHistoryEventsOnTaskDeletionAccTest extends AbstractAccTest {
historyService.createTaskHistoryQuery().taskIdIn(taskId_1, taskId_2)); historyService.createTaskHistoryQuery().taskIdIn(taskId_1, taskId_2));
assertThat(listEvents).hasSize(2); assertThat(listEvents).hasSize(2);
} }
private void createTaskanaEngineWithNewConfig(boolean deleteHistoryOnTaskDeletionEnabled)
throws SQLException {
TaskanaConfiguration tec =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.deleteHistoryOnTaskDeletionEnabled(deleteHistoryOnTaskDeletionEnabled)
.build();
initTaskanaEngine(tec);
}
} }

View File

@ -3,8 +3,10 @@ package acceptance.events.task;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import acceptance.AbstractAccTest; import acceptance.AbstractAccTest;
import java.sql.SQLException;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.spi.history.api.events.task.TaskHistoryEvent; import pro.taskana.spi.history.api.events.task.TaskHistoryEvent;
import pro.taskana.spi.history.api.events.task.TaskHistoryEventType; import pro.taskana.spi.history.api.events.task.TaskHistoryEventType;
@ -33,7 +35,7 @@ class GetTaskHistoryEventAccTest extends AbstractAccTest {
@Test @Test
void should_SetTaskOwnerLongNameOfTask_When_PropertyEnabled() throws Exception { void should_SetTaskOwnerLongNameOfTask_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); createTaskanaEngineWithNewConfig(true);
TaskHistoryEvent taskHistoryEvent = TaskHistoryEvent taskHistoryEvent =
getHistoryService().getTaskHistoryEvent("THI:000000000000000000000000000000000000"); getHistoryService().getTaskHistoryEvent("THI:000000000000000000000000000000000000");
@ -49,7 +51,7 @@ class GetTaskHistoryEventAccTest extends AbstractAccTest {
@Test @Test
void should_NotSetTaskOwnerLongNameOfTask_When_PropertyDisabled() throws Exception { void should_NotSetTaskOwnerLongNameOfTask_When_PropertyDisabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); createTaskanaEngineWithNewConfig(false);
TaskHistoryEvent taskHistoryEvent = TaskHistoryEvent taskHistoryEvent =
getHistoryService().getTaskHistoryEvent("THI:000000000000000000000000000000000000"); getHistoryService().getTaskHistoryEvent("THI:000000000000000000000000000000000000");
@ -58,4 +60,13 @@ class GetTaskHistoryEventAccTest extends AbstractAccTest {
assertThat(taskHistoryEvent).extracting(TaskHistoryEvent::getUserLongName).isNull(); assertThat(taskHistoryEvent).extracting(TaskHistoryEvent::getUserLongName).isNull();
} }
private void createTaskanaEngineWithNewConfig(boolean addAdditionalUserInfo) throws SQLException {
TaskanaConfiguration tec =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(addAdditionalUserInfo)
.build();
initTaskanaEngine(tec);
}
} }

View File

@ -3,6 +3,7 @@ package acceptance.jobs;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import acceptance.AbstractAccTest; import acceptance.AbstractAccTest;
import java.sql.SQLException;
import java.time.Instant; import java.time.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Arrays; import java.util.Arrays;
@ -17,6 +18,7 @@ import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.function.ThrowingConsumer; import org.junit.jupiter.api.function.ThrowingConsumer;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.internal.jobs.ClassificationChangedJob; import pro.taskana.classification.internal.jobs.ClassificationChangedJob;
import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.ScheduledJob;
import pro.taskana.common.internal.util.Pair; import pro.taskana.common.internal.util.Pair;
@ -118,7 +120,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(20); assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(20);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); createTaskanaEngineWithNewConfig(true);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -211,7 +213,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(17); assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(17);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); createTaskanaEngineWithNewConfig(true);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -277,7 +279,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(18); assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(18);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); createTaskanaEngineWithNewConfig(true);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -366,7 +368,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(20); assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(20);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(false); createTaskanaEngineWithNewConfig(false);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -419,7 +421,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(17); assertThat(getHistoryService().createTaskHistoryQuery().count()).isEqualTo(17);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); createTaskanaEngineWithNewConfig(true);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -461,16 +463,16 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@TestFactory @TestFactory
Stream<DynamicTest> Stream<DynamicTest>
should_CleanTaskHistoryEventsWithParentProcessIdEmptyOrNull_When_TaskCompleted() { should_CleanTaskHistoryEventsWithParentProcessIdEmptyOrNull_When_TaskCompleted()
throws SQLException {
Iterator<String> iterator = Arrays.asList("", null).iterator(); Iterator<String> iterator = Arrays.asList("", null).iterator();
String taskId1 = "taskId1"; String taskId1 = "taskId1";
String taskId2 = "taskId2"; String taskId2 = "taskId2";
List<TaskHistoryEvent> events = List<TaskHistoryEvent> events =
List.of( Stream.of(
Pair.of(taskId1, TaskHistoryEventType.CREATED), Pair.of(taskId1, TaskHistoryEventType.CREATED),
Pair.of(taskId1, TaskHistoryEventType.COMPLETED), Pair.of(taskId1, TaskHistoryEventType.COMPLETED),
Pair.of(taskId2, TaskHistoryEventType.CREATED)) Pair.of(taskId2, TaskHistoryEventType.CREATED))
.stream()
.map( .map(
pair -> pair ->
createTaskHistoryEvent( createTaskHistoryEvent(
@ -482,7 +484,7 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
"someDetails")) "someDetails"))
.collect(Collectors.toList()); .collect(Collectors.toList());
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); createTaskanaEngineWithNewConfig(true);
HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null); HistoryCleanupJob job = new HistoryCleanupJob(taskanaEngine, null, null);
ThrowingConsumer<String> test = ThrowingConsumer<String> test =
@ -503,4 +505,15 @@ class HistoryCleanupJobAccTest extends AbstractAccTest {
return DynamicTest.stream(iterator, c -> "for parentBusinessProcessId = '" + c + "'", test); return DynamicTest.stream(iterator, c -> "for parentBusinessProcessId = '" + c + "'", test);
} }
private void createTaskanaEngineWithNewConfig(
boolean taskCleanupJobAllCompletedSameParentBusiness) throws SQLException {
TaskanaConfiguration tec =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.taskCleanupJobAllCompletedSameParentBusiness(
taskCleanupJobAllCompletedSameParentBusiness)
.build();
initTaskanaEngine(tec);
}
} }

View File

@ -5,6 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import acceptance.AbstractAccTest; import acceptance.AbstractAccTest;
import java.sql.SQLException;
import java.time.Instant; import java.time.Instant;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -12,6 +13,7 @@ import org.apache.ibatis.exceptions.TooManyResultsException;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.BaseQuery.SortDirection; import pro.taskana.common.api.BaseQuery.SortDirection;
import pro.taskana.common.api.TimeInterval; import pro.taskana.common.api.TimeInterval;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
@ -446,7 +448,7 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetUserLongNameOfTask_When_PropertyEnabled() throws Exception { void should_SetUserLongNameOfTask_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); createTaskanaEngineWithNewConfig(true);
List<TaskHistoryEvent> taskHistoryEvents = List<TaskHistoryEvent> taskHistoryEvents =
getHistoryService() getHistoryService()
.createTaskHistoryQuery() .createTaskHistoryQuery()
@ -464,7 +466,7 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetTaskOwnerLongNameOfTaskHistoryEvent_When_PropertyEnabled() throws Exception { void should_SetTaskOwnerLongNameOfTaskHistoryEvent_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); createTaskanaEngineWithNewConfig(true);
List<TaskHistoryEvent> taskHistoryEvents = List<TaskHistoryEvent> taskHistoryEvents =
getHistoryService() getHistoryService()
.createTaskHistoryQuery() .createTaskHistoryQuery()
@ -489,8 +491,8 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_NotSetUserLongNameOfTaskHistoryEvent_When_PropertyDisabled() { void should_NotSetUserLongNameOfTaskHistoryEvent_When_PropertyDisabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); createTaskanaEngineWithNewConfig(false);
List<TaskHistoryEvent> taskHistoryEvents = List<TaskHistoryEvent> taskHistoryEvents =
getHistoryService() getHistoryService()
.createTaskHistoryQuery() .createTaskHistoryQuery()
@ -503,8 +505,8 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_NotSetTaskOwnerLongNameOfTaskHistoryEvent_When_PropertyDisabled() { void should_NotSetTaskOwnerLongNameOfTaskHistoryEvent_When_PropertyDisabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); createTaskanaEngineWithNewConfig(false);
List<TaskHistoryEvent> taskHistoryEvents = List<TaskHistoryEvent> taskHistoryEvents =
getHistoryService() getHistoryService()
.createTaskHistoryQuery() .createTaskHistoryQuery()
@ -519,8 +521,9 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetUserLongNameOfTaskHistoryEventToNull_When_NotExistingAsUserInDatabase() { void should_SetUserLongNameOfTaskHistoryEventToNull_When_NotExistingAsUserInDatabase()
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); throws Exception {
createTaskanaEngineWithNewConfig(true);
List<TaskHistoryEvent> taskHistoryEvents = List<TaskHistoryEvent> taskHistoryEvents =
getHistoryService() getHistoryService()
.createTaskHistoryQuery() .createTaskHistoryQuery()
@ -530,4 +533,13 @@ class QueryTaskHistoryAccTest extends AbstractAccTest {
assertThat(taskHistoryEvents).hasSize(1); assertThat(taskHistoryEvents).hasSize(1);
assertThat(taskHistoryEvents.get(0)).extracting(TaskHistoryEvent::getUserLongName).isNull(); assertThat(taskHistoryEvents.get(0)).extracting(TaskHistoryEvent::getUserLongName).isNull();
} }
private void createTaskanaEngineWithNewConfig(boolean addAdditionalUserInfo) throws SQLException {
TaskanaConfiguration tec =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(addAdditionalUserInfo)
.build();
initTaskanaEngine(tec);
}
} }

View File

@ -6,7 +6,7 @@ import acceptance.AbstractAccTest;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.test.config.DataSourceGenerator; import pro.taskana.common.test.config.DataSourceGenerator;
@ -16,8 +16,9 @@ class TaskanaEngineConfigurationTest extends AbstractAccTest {
@Test @Test
void testCreateTaskanaEngine() throws Exception { void testCreateTaskanaEngine() throws Exception {
DataSource ds = DataSourceGenerator.getDataSource(); DataSource ds = DataSourceGenerator.getDataSource();
TaskanaEngineConfiguration taskEngineConfiguration = TaskanaConfiguration taskEngineConfiguration =
new TaskanaEngineConfiguration(ds, false, false, DataSourceGenerator.getSchemaName()); new TaskanaConfiguration.Builder(ds, false, DataSourceGenerator.getSchemaName(), false)
.build();
TaskanaEngine te = TaskanaEngine.buildTaskanaEngine(taskEngineConfiguration); TaskanaEngine te = TaskanaEngine.buildTaskanaEngine(taskEngineConfiguration);

View File

@ -18,7 +18,7 @@ import org.mockito.Mock;
import org.mockito.Spy; import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.simplehistory.impl.task.TaskHistoryEventMapper; import pro.taskana.simplehistory.impl.task.TaskHistoryEventMapper;
import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper; import pro.taskana.simplehistory.impl.task.TaskHistoryQueryMapper;
@ -44,7 +44,7 @@ class SimpleHistoryServiceImplTest {
@Mock private TaskanaHistoryEngineImpl taskanaHistoryEngineMock; @Mock private TaskanaHistoryEngineImpl taskanaHistoryEngineMock;
@Mock private TaskanaEngineConfiguration taskanaEngineConfiguration; @Mock private TaskanaConfiguration taskanaEngineConfiguration;
@Mock private TaskanaEngine taskanaEngine; @Mock private TaskanaEngine taskanaEngine;
@ -86,7 +86,7 @@ class SimpleHistoryServiceImplTest {
"wbKey1", "taskId1", "type1", "wbKey2", "someUserId", "someDetails")); "wbKey1", "taskId1", "type1", "wbKey2", "someUserId", "someDetails"));
when(taskanaHistoryEngineMock.getConfiguration()).thenReturn(taskanaEngineConfiguration); when(taskanaHistoryEngineMock.getConfiguration()).thenReturn(taskanaEngineConfiguration);
when(taskanaEngineConfiguration.getAddAdditionalUserInfo()).thenReturn(false); when(taskanaEngineConfiguration.isAddAdditionalUserInfo()).thenReturn(false);
when(taskanaHistoryEngineMock.getSqlSession()).thenReturn(sqlSessionMock); when(taskanaHistoryEngineMock.getSqlSession()).thenReturn(sqlSessionMock);
when(sqlSessionMock.selectList(any(), any())).thenReturn(new ArrayList<>(returnList)); when(sqlSessionMock.selectList(any(), any())).thenReturn(new ArrayList<>(returnList));

View File

@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.BaseQuery.SortDirection; import pro.taskana.common.api.BaseQuery.SortDirection;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
@ -42,7 +42,7 @@ public class TaskHistoryEventController {
@Autowired @Autowired
public TaskHistoryEventController( public TaskHistoryEventController(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
SimpleHistoryServiceImpl simpleHistoryServiceImpl, SimpleHistoryServiceImpl simpleHistoryServiceImpl,
TaskHistoryEventRepresentationModelAssembler assembler) TaskHistoryEventRepresentationModelAssembler assembler)
throws SQLException { throws SQLException {

View File

@ -17,7 +17,7 @@ import javax.sql.DataSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.task.api.TaskService; import pro.taskana.task.api.TaskService;
@ -33,7 +33,7 @@ public class TaskanaProducers {
@Inject private TaskanaEngine taskanaEngine; @Inject private TaskanaEngine taskanaEngine;
private TaskanaEngineConfiguration taskanaEngineConfiguration; private TaskanaConfiguration taskanaEngineConfiguration;
@PostConstruct @PostConstruct
public void init() { public void init() {
@ -54,7 +54,7 @@ public class TaskanaProducers {
} }
} }
this.taskanaEngineConfiguration = this.taskanaEngineConfiguration =
new TaskanaEngineConfiguration(dataSource, true, false, "TASKANA"); new TaskanaConfiguration.Builder(dataSource, true, "TASKANA", false).build();
} catch (NamingException | SQLException | IOException e) { } catch (NamingException | SQLException | IOException e) {
LOGGER.error("Could not start Taskana: ", e); LOGGER.error("Could not start Taskana: ", e);
} }

View File

@ -60,7 +60,7 @@ import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.function.ThrowingConsumer; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.junit.platform.commons.support.AnnotationSupport; import org.junit.platform.commons.support.AnnotationSupport;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.ErrorCode; import pro.taskana.common.api.exceptions.ErrorCode;
import pro.taskana.common.api.exceptions.TaskanaException; import pro.taskana.common.api.exceptions.TaskanaException;
@ -77,7 +77,6 @@ import pro.taskana.testapi.TaskanaIntegrationTest;
class ArchitectureTest { class ArchitectureTest {
// region Test setup // region Test setup
private static final List<String> TASKANA_ROOT_PACKAGES = private static final List<String> TASKANA_ROOT_PACKAGES =
List.of( List.of(
"pro.taskana.classification", "pro.taskana.classification",
@ -455,7 +454,7 @@ class ArchitectureTest {
.resideInAnyPackage(dependentModulesList.toArray(new String[0])) .resideInAnyPackage(dependentModulesList.toArray(new String[0]))
.orShould() .orShould()
.dependOnClassesThat() .dependOnClassesThat()
.areAssignableTo(TaskanaEngineConfiguration.class) .areAssignableTo(TaskanaConfiguration.class)
.check(importedClasses); .check(importedClasses);
} }

View File

@ -0,0 +1,70 @@
package acceptance;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.ThrowingConsumer;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.internal.util.ReflectionUtil;
import pro.taskana.testapi.extensions.TestContainerExtension;
class TaskanaConfigurationTest {
@TestFactory
Stream<DynamicTest> should_SaveUnmodifiableCollections() {
TaskanaConfiguration configuration =
new TaskanaConfiguration.Builder(
TestContainerExtension.createDataSourceForH2(), false, "TASKANA")
.build();
Stream<Field> fields =
ReflectionUtil.retrieveAllFields(TaskanaConfiguration.class).stream()
.filter(f -> Collection.class.isAssignableFrom(f.getType()));
ThrowingConsumer<Field> testCase =
field -> {
field.setAccessible(true);
Collection<?> o = (Collection<?>) field.get(configuration);
// PLEASE do not change this to the _assertThatThrownBy_ syntax.
// That syntax does not respect the given description and thus might confuse future devs.
assertThatExceptionOfType(UnsupportedOperationException.class)
.as("Field '%s' should be an unmodifiable Collection", field.getName())
.isThrownBy(() -> o.add(null));
};
return DynamicTest.stream(fields, Field::getName, testCase);
}
@TestFactory
Stream<DynamicTest> should_SaveUnmodifiableMaps() {
TaskanaConfiguration configuration =
new TaskanaConfiguration.Builder(
TestContainerExtension.createDataSourceForH2(), false, "TASKANA")
.build();
Stream<Field> fields =
ReflectionUtil.retrieveAllFields(TaskanaConfiguration.class).stream()
.filter(f -> Map.class.isAssignableFrom(f.getType()));
ThrowingConsumer<Field> testCase =
field -> {
field.setAccessible(true);
Map<?, ?> o = (Map<?, ?>) field.get(configuration);
// PLEASE do not change this to the _assertThatThrownBy_ syntax.
// That syntax does not respect the given description and thus might confuse future devs.
assertThatExceptionOfType(UnsupportedOperationException.class)
.as("Field '%s' should be an unmodifiable Collection", field.getName())
.isThrownBy(() -> o.put(null, null));
};
return DynamicTest.stream(fields, Field::getName, testCase);
}
}

View File

@ -16,6 +16,7 @@ import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.TestTemplate;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
import pro.taskana.common.api.BulkOperationResults; import pro.taskana.common.api.BulkOperationResults;
@ -33,6 +34,7 @@ import pro.taskana.task.api.exceptions.TaskNotFoundException;
import pro.taskana.task.api.models.ObjectReference; import pro.taskana.task.api.models.ObjectReference;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
import pro.taskana.testapi.DefaultTestEntities; import pro.taskana.testapi.DefaultTestEntities;
import pro.taskana.testapi.TaskanaEngineConfigurationModifier;
import pro.taskana.testapi.TaskanaInject; import pro.taskana.testapi.TaskanaInject;
import pro.taskana.testapi.TaskanaIntegrationTest; import pro.taskana.testapi.TaskanaIntegrationTest;
import pro.taskana.testapi.builder.TaskBuilder; import pro.taskana.testapi.builder.TaskBuilder;
@ -46,7 +48,7 @@ import pro.taskana.workbasket.api.exceptions.MismatchedWorkbasketPermissionExcep
import pro.taskana.workbasket.api.models.WorkbasketSummary; import pro.taskana.workbasket.api.models.WorkbasketSummary;
@TaskanaIntegrationTest @TaskanaIntegrationTest
class CompleteTaskAccTest { class CompleteTaskAccTest implements TaskanaEngineConfigurationModifier {
@TaskanaInject TaskService taskService; @TaskanaInject TaskService taskService;
@TaskanaInject CurrentUserContext currentUserContext; @TaskanaInject CurrentUserContext currentUserContext;
@ -59,6 +61,12 @@ class CompleteTaskAccTest {
WorkbasketSummary defaultWorkbasketSummary; WorkbasketSummary defaultWorkbasketSummary;
ObjectReference defaultObjectReference; ObjectReference defaultObjectReference;
@Override
public TaskanaConfiguration.Builder modify(
TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.addAdditionalUserInfo(true);
}
@WithAccessId(user = "businessadmin") @WithAccessId(user = "businessadmin")
@BeforeAll @BeforeAll
void setup(ClassificationService classificationService, WorkbasketService workbasketService) void setup(ClassificationService classificationService, WorkbasketService workbasketService)
@ -76,7 +84,6 @@ class CompleteTaskAccTest {
defaultObjectReference = DefaultTestEntities.defaultTestObjectReference().build(); defaultObjectReference = DefaultTestEntities.defaultTestObjectReference().build();
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(true);
UserBuilder user11 = UserBuilder.newUser().id("user-1-1") UserBuilder user11 = UserBuilder.newUser().id("user-1-1")
.longName("Mustermann, Max - (user-1-1)").firstName("Max").lastName("Mustermann"); .longName("Mustermann, Max - (user-1-1)").firstName("Max").lastName("Mustermann");
user11.buildAndStore(userService); user11.buildAndStore(userService);

View File

@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
@ -247,7 +247,7 @@ public class RequestChangesWithAfterSpiAccTest {
PlainJavaTransactionProvider transactionProvider; PlainJavaTransactionProvider transactionProvider;
@BeforeAll @BeforeAll
void setup(TaskanaEngineConfiguration taskanaEngineConfiguration) { void setup(TaskanaConfiguration taskanaEngineConfiguration) {
transactionProvider = transactionProvider =
new PlainJavaTransactionProvider( new PlainJavaTransactionProvider(
taskanaEngine, taskanaEngineConfiguration.getDatasource()); taskanaEngine, taskanaEngineConfiguration.getDatasource());

View File

@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
@ -282,7 +282,7 @@ public class RequestChangesWithBeforeSpiAccTest {
PlainJavaTransactionProvider transactionProvider; PlainJavaTransactionProvider transactionProvider;
@BeforeAll @BeforeAll
void setup(TaskanaEngineConfiguration taskanaEngineConfiguration) { void setup(TaskanaConfiguration taskanaEngineConfiguration) {
transactionProvider = transactionProvider =
new PlainJavaTransactionProvider( new PlainJavaTransactionProvider(
taskanaEngine, taskanaEngineConfiguration.getDatasource()); taskanaEngine, taskanaEngineConfiguration.getDatasource());

View File

@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
@ -248,7 +248,7 @@ public class RequestReviewWithAfterSpiAccTest {
PlainJavaTransactionProvider transactionProvider; PlainJavaTransactionProvider transactionProvider;
@BeforeAll @BeforeAll
void setup(TaskanaEngineConfiguration taskanaEngineConfiguration) { void setup(TaskanaConfiguration taskanaEngineConfiguration) {
transactionProvider = transactionProvider =
new PlainJavaTransactionProvider( new PlainJavaTransactionProvider(
taskanaEngine, taskanaEngineConfiguration.getDatasource()); taskanaEngine, taskanaEngineConfiguration.getDatasource());

View File

@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
@ -283,7 +283,7 @@ public class RequestReviewWithBeforeSpiAccTest {
PlainJavaTransactionProvider transactionProvider; PlainJavaTransactionProvider transactionProvider;
@BeforeAll @BeforeAll
void setup(TaskanaEngineConfiguration taskanaEngineConfiguration) { void setup(TaskanaConfiguration taskanaEngineConfiguration) {
transactionProvider = transactionProvider =
new PlainJavaTransactionProvider( new PlainJavaTransactionProvider(
taskanaEngine, taskanaEngineConfiguration.getDatasource()); taskanaEngine, taskanaEngineConfiguration.getDatasource());

View File

@ -8,8 +8,12 @@ import java.time.Instant;
import java.util.List; import java.util.List;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
@ -18,12 +22,14 @@ import pro.taskana.task.api.exceptions.TaskCommentNotFoundException;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
import pro.taskana.task.api.models.TaskComment; import pro.taskana.task.api.models.TaskComment;
import pro.taskana.testapi.DefaultTestEntities; import pro.taskana.testapi.DefaultTestEntities;
import pro.taskana.testapi.TaskanaEngineConfigurationModifier;
import pro.taskana.testapi.TaskanaInject; import pro.taskana.testapi.TaskanaInject;
import pro.taskana.testapi.TaskanaIntegrationTest; import pro.taskana.testapi.TaskanaIntegrationTest;
import pro.taskana.testapi.builder.TaskBuilder; import pro.taskana.testapi.builder.TaskBuilder;
import pro.taskana.testapi.builder.TaskCommentBuilder; import pro.taskana.testapi.builder.TaskCommentBuilder;
import pro.taskana.testapi.builder.WorkbasketAccessItemBuilder; import pro.taskana.testapi.builder.WorkbasketAccessItemBuilder;
import pro.taskana.testapi.security.WithAccessId; import pro.taskana.testapi.security.WithAccessId;
import pro.taskana.user.api.UserService;
import pro.taskana.user.api.models.User; import pro.taskana.user.api.models.User;
import pro.taskana.workbasket.api.WorkbasketPermission; import pro.taskana.workbasket.api.WorkbasketPermission;
import pro.taskana.workbasket.api.WorkbasketService; import pro.taskana.workbasket.api.WorkbasketService;
@ -180,82 +186,105 @@ class GetTaskCommentAccTest {
assertThat(e.getTaskCommentId()).isEqualTo(nonExistingId); assertThat(e.getTaskCommentId()).isEqualTo(nonExistingId);
} }
@WithAccessId(user = "user-1-1") @Nested
@Test @TestInstance(Lifecycle.PER_CLASS)
void should_SetCreatorFullNameOfTaskComment_When_PropertyEnabled() throws Exception { class WithAdditionalUserInfoEnabled implements TaskanaEngineConfigurationModifier {
TaskComment comment =
TaskCommentBuilder.newTaskComment()
.taskId(task1.getId())
.textField("Text1")
.created(Instant.now())
.modified(Instant.now())
.buildAndStore(taskService);
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(true); @TaskanaInject TaskService taskService;
TaskComment taskComment = taskService.getTaskComment(comment.getId());
String creatorFullName = @TaskanaInject UserService userService;
taskanaEngine.getUserService().getUser(taskComment.getCreator()).getFullName();
assertThat(taskComment).extracting(TaskComment::getCreatorFullName).isEqualTo(creatorFullName); @Override
public TaskanaConfiguration.Builder modify(
TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.addAdditionalUserInfo(true);
}
@WithAccessId(user = "user-1-1")
@Test
void should_SetCreatorFullNameOfTaskComment_When_PropertyEnabled() throws Exception {
TaskComment comment =
TaskCommentBuilder.newTaskComment()
.taskId(task1.getId())
.textField("Text1")
.created(Instant.now())
.modified(Instant.now())
.buildAndStore(taskService);
TaskComment taskComment = taskService.getTaskComment(comment.getId());
String creatorFullName = userService.getUser(taskComment.getCreator()).getFullName();
assertThat(taskComment)
.extracting(TaskComment::getCreatorFullName)
.isEqualTo(creatorFullName);
}
@WithAccessId(user = "user-1-1")
@Test
void should_SetCreatorFullNameOfTaskComments_When_PropertyEnabled() throws Exception {
TaskCommentBuilder.newTaskComment()
.taskId(task1.getId())
.textField("Text1")
.created(Instant.now())
.modified(Instant.now())
.buildAndStore(taskService);
List<TaskComment> taskComments = taskService.getTaskComments(task1.getId());
taskComments.forEach(
wrap(
taskComment -> {
String creatorFullName =
userService.getUser(taskComment.getCreator()).getFullName();
assertThat(taskComment)
.extracting(TaskComment::getCreatorFullName)
.isEqualTo(creatorFullName);
}));
}
} }
@WithAccessId(user = "user-1-1") @Nested
@Test @TestInstance(Lifecycle.PER_CLASS)
void should_NotSetCreatorFullNameOfTaskComment_When_PropertyDisabled() throws Exception { class WithAdditionalUserInfoDisabled implements TaskanaEngineConfigurationModifier {
TaskComment comment =
TaskCommentBuilder.newTaskComment()
.taskId(task1.getId())
.textField("Text1")
.created(Instant.now())
.modified(Instant.now())
.buildAndStore(taskService);
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(false); @TaskanaInject TaskService taskService;
TaskComment taskComment = taskService.getTaskComment(comment.getId());
assertThat(taskComment).extracting(TaskComment::getCreatorFullName).isNull(); @Override
} public TaskanaConfiguration.Builder modify(
TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.addAdditionalUserInfo(false);
}
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetCreatorFullNameOfTaskComments_When_PropertyEnabled() throws Exception { void should_NotSetCreatorFullNameOfTaskComment_When_PropertyDisabled() throws Exception {
TaskCommentBuilder.newTaskComment() TaskComment comment =
.taskId(task1.getId()) TaskCommentBuilder.newTaskComment()
.textField("Text1") .taskId(task1.getId())
.created(Instant.now()) .textField("Text1")
.modified(Instant.now()) .created(Instant.now())
.buildAndStore(taskService); .modified(Instant.now())
.buildAndStore(taskService);
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(true); TaskComment taskComment = taskService.getTaskComment(comment.getId());
List<TaskComment> taskComments = taskService.getTaskComments(task1.getId()); assertThat(taskComment).extracting(TaskComment::getCreatorFullName).isNull();
}
taskComments.forEach( @WithAccessId(user = "user-1-1")
wrap( @Test
taskComment -> { void should_NotSetCreatorFullNameOfTaskComments_When_PropertyDisabled() throws Exception {
String creatorFullName = TaskCommentBuilder.newTaskComment()
taskanaEngine.getUserService().getUser(taskComment.getCreator()).getFullName(); .taskId(task1.getId())
assertThat(taskComment) .textField("Text1")
.extracting(TaskComment::getCreatorFullName) .created(Instant.now())
.isEqualTo(creatorFullName); .modified(Instant.now())
})); .buildAndStore(taskService);
}
@WithAccessId(user = "user-1-1") List<TaskComment> taskComments = taskService.getTaskComments(task1.getId());
@Test
void should_NotSetCreatorFullNameOfTaskComments_When_PropertyDisabled() throws Exception {
TaskCommentBuilder.newTaskComment()
.taskId(task1.getId())
.textField("Text1")
.created(Instant.now())
.modified(Instant.now())
.buildAndStore(taskService);
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(false); taskComments.forEach(
taskComment ->
List<TaskComment> taskComments = taskService.getTaskComments(task1.getId()); assertThat(taskComment).extracting(TaskComment::getCreatorFullName).isNull());
}
taskComments.forEach(
taskComment ->
assertThat(taskComment).extracting(TaskComment::getCreatorFullName).isNull());
} }
} }

View File

@ -8,6 +8,7 @@ import static pro.taskana.testapi.DefaultTestEntities.defaultTestWorkbasket;
import static pro.taskana.testapi.DefaultTestEntities.randomTestUser; import static pro.taskana.testapi.DefaultTestEntities.randomTestUser;
import static pro.taskana.testapi.builder.UserBuilder.newUser; import static pro.taskana.testapi.builder.UserBuilder.newUser;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -25,7 +26,7 @@ import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.function.ThrowingConsumer; import org.junit.jupiter.api.function.ThrowingConsumer;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
@ -1016,8 +1017,9 @@ class UserServiceAccTest {
@TaskanaInject WorkbasketService workbasketService; @TaskanaInject WorkbasketService workbasketService;
@Override @Override
public void modify(TaskanaEngineConfiguration taskanaEngineConfiguration) { public TaskanaConfiguration.Builder modify(
taskanaEngineConfiguration.setMinimalPermissionsToAssignDomains( TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.minimalPermissionsToAssignDomains(
List.of(WorkbasketPermission.APPEND)); List.of(WorkbasketPermission.APPEND));
} }
@ -1094,8 +1096,10 @@ class UserServiceAccTest {
@TaskanaInject WorkbasketService workbasketService; @TaskanaInject WorkbasketService workbasketService;
@Override @Override
public void modify(TaskanaEngineConfiguration taskanaEngineConfiguration) { public TaskanaConfiguration.Builder modify(
taskanaEngineConfiguration.setMinimalPermissionsToAssignDomains(null); TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.minimalPermissionsToAssignDomains(
new ArrayList<>());
} }
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")

View File

@ -0,0 +1,685 @@
package pro.taskana;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureAnnotatedFields;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureClassificationCategoriesForType;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureRoles;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.CustomHoliday;
import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.internal.configuration.DB;
import pro.taskana.common.internal.configuration.TaskanaProperty;
import pro.taskana.common.internal.util.FileLoaderUtil;
import pro.taskana.workbasket.api.WorkbasketPermission;
/**
* This central class creates the TaskanaEngine and holds all the information about DB and Security.
* <br>
* Security is enabled by default. <br>
* All members are immutable, also Lists and Maps and Sets.
*/
public class TaskanaConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskanaConfiguration.class);
private final DataSource dataSource;
private final String schemaName;
private final Map<String, String> properties;
// Taskana role configuration
private final Map<TaskanaRole, Set<String>> roleMap;
private final boolean securityEnabled;
private final boolean useManagedTransactions;
private final List<String> domains;
private final List<String> classificationTypes;
private final Map<String, List<String>> classificationCategoriesByTypeMap;
private final List<CustomHoliday> customHolidays;
// Properties for the monitor
private final boolean deleteHistoryOnTaskDeletionEnabled;
private final boolean germanPublicHolidaysEnabled;
private final boolean corpusChristiEnabled;
private final int jobBatchSize;
private final int maxNumberOfJobRetries;
private final Instant cleanupJobFirstRun;
private final Duration cleanupJobRunEvery;
private final Duration cleanupJobMinimumAge;
private final boolean taskCleanupJobAllCompletedSameParentBusiness;
private final boolean validationAllowTimestampServiceLevelMismatch;
private final boolean addAdditionalUserInfo;
private final int priorityJobBatchSize;
private final Instant priorityJobFirstRun;
private final Duration priorityJobRunEvery;
private final boolean priorityJobActive;
private final Duration userRefreshJobRunEvery;
private final Instant userRefreshJobFirstRun;
private final List<WorkbasketPermission> minimalPermissionsToAssignDomains;
protected TaskanaConfiguration(Builder builder) {
this.dataSource = builder.dataSource;
this.schemaName = builder.schemaName;
this.properties = Collections.unmodifiableMap(builder.properties);
this.roleMap =
builder.roleMap.entrySet().stream()
.collect(
Collectors.toUnmodifiableMap(
Entry::getKey, e -> Collections.unmodifiableSet(e.getValue())));
this.securityEnabled = builder.securityEnabled;
this.useManagedTransactions = builder.useManagedTransactions;
this.domains = Collections.unmodifiableList(builder.domains);
this.classificationTypes = Collections.unmodifiableList(builder.classificationTypes);
this.classificationCategoriesByTypeMap =
builder.classificationCategoriesByTypeMap.entrySet().stream()
.collect(
Collectors.toUnmodifiableMap(
Entry::getKey, e -> Collections.unmodifiableList(e.getValue())));
this.customHolidays = Collections.unmodifiableList(builder.customHolidays);
this.deleteHistoryOnTaskDeletionEnabled = builder.deleteHistoryOnTaskDeletionEnabled;
this.germanPublicHolidaysEnabled = builder.germanPublicHolidaysEnabled;
this.corpusChristiEnabled = builder.corpusChristiEnabled;
this.jobBatchSize = builder.jobBatchSize;
this.maxNumberOfJobRetries = builder.maxNumberOfJobRetries;
this.cleanupJobFirstRun = builder.cleanupJobFirstRun;
this.cleanupJobRunEvery = builder.cleanupJobRunEvery;
this.cleanupJobMinimumAge = builder.cleanupJobMinimumAge;
this.taskCleanupJobAllCompletedSameParentBusiness =
builder.taskCleanupJobAllCompletedSameParentBusiness;
this.validationAllowTimestampServiceLevelMismatch =
builder.validationAllowTimestampServiceLevelMismatch;
this.addAdditionalUserInfo = builder.addAdditionalUserInfo;
this.priorityJobBatchSize = builder.priorityJobBatchSize;
this.priorityJobFirstRun = builder.priorityJobFirstRun;
this.priorityJobRunEvery = builder.priorityJobRunEvery;
this.priorityJobActive = builder.priorityJobActive;
this.userRefreshJobRunEvery = builder.userRefreshJobRunEvery;
this.userRefreshJobFirstRun = builder.userRefreshJobFirstRun;
this.minimalPermissionsToAssignDomains =
Collections.unmodifiableList(builder.minimalPermissionsToAssignDomains);
if (LOGGER.isDebugEnabled()) {
// TODO remove the reflection magic when introducing lombok toString magic :-)
StringBuilder result = new StringBuilder();
String newLine = System.getProperty("line.separator");
Field[] fields = this.getClass().getDeclaredFields();
result.append("TaskanaConfiguration:").append(newLine);
// print field names paired with their values
for (Field field : fields) {
try {
result.append(field.getName());
result.append(": ");
// requires access to private field:
result.append(field.get(this));
} catch (IllegalAccessException ex) {
// ignore this error
}
result.append(newLine);
}
LOGGER.debug(result.toString());
}
}
public boolean isSecurityEnabled() {
return this.securityEnabled;
}
public DataSource getDatasource() {
return this.dataSource;
}
/**
* return all properties loaded from taskana properties file. Per Design the normal Properties are
* not immutable, so we return here an ImmutableMap, because we don't want direct changes in the
* configuration.
*
* @return all properties loaded from taskana properties file
*/
public Map<String, String> getProperties() {
return this.properties;
}
public boolean isUseManagedTransactions() {
return this.useManagedTransactions;
}
public int getMaxNumberOfUpdatesPerTransaction() {
return jobBatchSize;
}
public int getMaxNumberOfJobRetries() {
return maxNumberOfJobRetries;
}
public boolean isCorpusChristiEnabled() {
return corpusChristiEnabled;
}
public boolean isGermanPublicHolidaysEnabled() {
return this.germanPublicHolidaysEnabled;
}
public boolean isValidationAllowTimestampServiceLevelMismatch() {
return validationAllowTimestampServiceLevelMismatch;
}
public boolean isDeleteHistoryOnTaskDeletionEnabled() {
return deleteHistoryOnTaskDeletionEnabled;
}
public List<CustomHoliday> getCustomHolidays() {
return customHolidays;
}
public Map<TaskanaRole, Set<String>> getRoleMap() {
return roleMap;
}
public List<String> getDomains() {
return domains;
}
public boolean isAddAdditionalUserInfo() {
return addAdditionalUserInfo;
}
public List<String> getClassificationTypes() {
return classificationTypes;
}
public List<String> getAllClassificationCategories() {
List<String> classificationCategories = new ArrayList<>();
for (Map.Entry<String, List<String>> type : this.classificationCategoriesByTypeMap.entrySet()) {
classificationCategories.addAll(type.getValue());
}
return classificationCategories;
}
public Map<String, List<String>> getClassificationCategoriesByTypeMap() {
return this.classificationCategoriesByTypeMap.entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, e -> new ArrayList<>(e.getValue())));
}
public List<String> getClassificationCategoriesByType(String type) {
return classificationCategoriesByTypeMap.getOrDefault(type, Collections.emptyList());
}
public Instant getCleanupJobFirstRun() {
return cleanupJobFirstRun;
}
public Duration getCleanupJobRunEvery() {
return cleanupJobRunEvery;
}
public Duration getCleanupJobMinimumAge() {
return cleanupJobMinimumAge;
}
public boolean isTaskCleanupJobAllCompletedSameParentBusiness() {
return taskCleanupJobAllCompletedSameParentBusiness;
}
public int getPriorityJobBatchSize() {
return priorityJobBatchSize;
}
public Instant getPriorityJobFirstRun() {
return priorityJobFirstRun;
}
public Duration getPriorityJobRunEvery() {
return priorityJobRunEvery;
}
public Duration getUserRefreshJobRunEvery() {
return userRefreshJobRunEvery;
}
public List<WorkbasketPermission> getMinimalPermissionsToAssignDomains() {
return minimalPermissionsToAssignDomains;
}
public Instant getUserRefreshJobFirstRun() {
return userRefreshJobFirstRun;
}
public boolean isPriorityJobActive() {
return priorityJobActive;
}
public String getSchemaName() {
return schemaName;
}
/**
* Helper method to determine whether all access ids (user Id and group ids) should be used in
* lower case.
*
* @return true if all access ids should be used in lower case, false otherwise
*/
public static boolean shouldUseLowerCaseForAccessIds() {
return true;
}
public static class Builder {
private static final Logger LOGGER = LoggerFactory.getLogger(Builder.class);
private static final String TASKANA_PROPERTIES = "/taskana.properties";
private static final String TASKANA_PROPERTY_SEPARATOR = "|";
private final DataSource dataSource;
private final boolean securityEnabled;
private final boolean useManagedTransactions;
private String schemaName;
private Map<String, String> properties;
private Map<TaskanaRole, Set<String>> roleMap = new EnumMap<>(TaskanaRole.class);
// List of configured domain names
@TaskanaProperty("taskana.domains")
private List<String> domains = new ArrayList<>();
@TaskanaProperty("taskana.classification.types")
private List<String> classificationTypes = new ArrayList<>();
private Map<String, List<String>> classificationCategoriesByTypeMap = new HashMap<>();
@TaskanaProperty("taskana.custom.holidays")
private List<CustomHoliday> customHolidays = new ArrayList<>();
// Properties for the monitor
@TaskanaProperty("taskana.history.deletion.on.task.deletion.enabled")
private boolean deleteHistoryOnTaskDeletionEnabled;
@TaskanaProperty("taskana.german.holidays.enabled")
private boolean germanPublicHolidaysEnabled;
@TaskanaProperty("taskana.german.holidays.corpus-christi.enabled")
private boolean corpusChristiEnabled;
// Properties for general job execution
@TaskanaProperty("taskana.jobs.batchSize")
private int jobBatchSize = 100;
@TaskanaProperty("taskana.jobs.maxRetries")
private int maxNumberOfJobRetries = 3;
// Properties for the cleanup job
@TaskanaProperty("taskana.jobs.cleanup.firstRunAt")
private Instant cleanupJobFirstRun = Instant.parse("2018-01-01T00:00:00Z");
@TaskanaProperty("taskana.jobs.cleanup.runEvery")
private Duration cleanupJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.cleanup.minimumAge")
private Duration cleanupJobMinimumAge = Duration.parse("P14D");
// TASKANA behavior
@TaskanaProperty("taskana.jobs.cleanup.allCompletedSameParentBusiness")
private boolean taskCleanupJobAllCompletedSameParentBusiness = true;
@TaskanaProperty("taskana.validation.allowTimestampServiceLevelMismatch")
private boolean validationAllowTimestampServiceLevelMismatch = false;
// Property to enable/disable the addition of user full/long name through joins
@TaskanaProperty("taskana.addAdditionalUserInfo")
private boolean addAdditionalUserInfo = false;
@TaskanaProperty("taskana.jobs.priority.batchSize")
private int priorityJobBatchSize = 100;
@TaskanaProperty("taskana.jobs.priority.firstRunAt")
private Instant priorityJobFirstRun = Instant.parse("2018-01-01T00:00:00Z");
@TaskanaProperty("taskana.jobs.priority.runEvery")
private Duration priorityJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.priority.active")
private boolean priorityJobActive = false;
@TaskanaProperty("taskana.jobs.user.refresh.runEvery")
private Duration userRefreshJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.user.refresh.firstRunAt")
private Instant userRefreshJobFirstRun = Instant.parse("2018-01-01T23:00:00Z");
@TaskanaProperty("taskana.user.minimalPermissionsToAssignDomains")
private List<WorkbasketPermission> minimalPermissionsToAssignDomains = new ArrayList<>();
public Builder(TaskanaConfiguration tec) {
this.dataSource = tec.getDatasource();
this.schemaName = tec.getSchemaName();
this.properties = tec.getProperties();
this.roleMap = tec.getRoleMap();
this.securityEnabled = tec.isSecurityEnabled();
this.useManagedTransactions = tec.isUseManagedTransactions();
this.domains = tec.getDomains();
this.classificationTypes = tec.getClassificationTypes();
this.classificationCategoriesByTypeMap = tec.getClassificationCategoriesByTypeMap();
this.customHolidays = tec.getCustomHolidays();
this.deleteHistoryOnTaskDeletionEnabled = tec.isDeleteHistoryOnTaskDeletionEnabled();
this.germanPublicHolidaysEnabled = tec.isGermanPublicHolidaysEnabled();
this.corpusChristiEnabled = tec.isCorpusChristiEnabled();
this.jobBatchSize = tec.getMaxNumberOfUpdatesPerTransaction();
this.maxNumberOfJobRetries = tec.getMaxNumberOfJobRetries();
this.cleanupJobFirstRun = tec.getCleanupJobFirstRun();
this.cleanupJobRunEvery = tec.getCleanupJobRunEvery();
this.cleanupJobMinimumAge = tec.getCleanupJobMinimumAge();
this.taskCleanupJobAllCompletedSameParentBusiness =
tec.isTaskCleanupJobAllCompletedSameParentBusiness();
this.validationAllowTimestampServiceLevelMismatch =
tec.isValidationAllowTimestampServiceLevelMismatch();
this.addAdditionalUserInfo = tec.isAddAdditionalUserInfo();
this.priorityJobBatchSize = tec.getPriorityJobBatchSize();
this.priorityJobFirstRun = tec.getPriorityJobFirstRun();
this.priorityJobRunEvery = tec.getPriorityJobRunEvery();
this.priorityJobActive = tec.isPriorityJobActive();
this.userRefreshJobRunEvery = tec.getUserRefreshJobRunEvery();
this.userRefreshJobFirstRun = tec.getUserRefreshJobFirstRun();
this.minimalPermissionsToAssignDomains = tec.getMinimalPermissionsToAssignDomains();
}
public Builder(DataSource dataSource, boolean useManagedTransactions, String schemaName) {
this(dataSource, useManagedTransactions, schemaName, true);
}
public Builder(
DataSource dataSource,
boolean useManagedTransactions,
String schemaName,
boolean securityEnabled) {
this(
dataSource,
useManagedTransactions,
schemaName,
securityEnabled,
TASKANA_PROPERTIES,
TASKANA_PROPERTY_SEPARATOR);
}
public Builder(
DataSource dataSource,
boolean useManagedTransactions,
String schemaName,
boolean securityEnabled,
String propertiesFileName,
String propertySeparator) {
this.useManagedTransactions = useManagedTransactions;
this.securityEnabled = securityEnabled;
if (dataSource != null) {
this.dataSource = dataSource;
} else {
throw new SystemException("DataSource can't be null");
}
this.schemaName = initSchemaName(schemaName);
this.initTaskanaProperties(propertiesFileName, propertySeparator);
}
@SuppressWarnings("unused")
public Builder schemaName(String schemaName) {
this.schemaName = initSchemaName(schemaName);
return this;
}
@SuppressWarnings("unused")
public Builder roleMap(Map<TaskanaRole, Set<String>> roleMap) {
this.roleMap = roleMap;
return this;
}
@SuppressWarnings("unused")
public Builder domains(List<String> domains) {
this.domains = domains;
return this;
}
@SuppressWarnings("unused")
public Builder classificationTypes(List<String> classificationTypes) {
this.classificationTypes = classificationTypes;
return this;
}
@SuppressWarnings("unused")
public Builder classificationCategoriesByTypeMap(
Map<String, List<String>> classificationCategoriesByTypeMap) {
this.classificationCategoriesByTypeMap = classificationCategoriesByTypeMap;
return this;
}
@SuppressWarnings("unused")
public Builder customHolidays(List<CustomHoliday> customHolidays) {
this.customHolidays = customHolidays;
return this;
}
@SuppressWarnings("unused")
public Builder deleteHistoryOnTaskDeletionEnabled(boolean deleteHistoryOnTaskDeletionEnabled) {
this.deleteHistoryOnTaskDeletionEnabled = deleteHistoryOnTaskDeletionEnabled;
return this;
}
@SuppressWarnings("unused")
public Builder germanPublicHolidaysEnabled(boolean germanPublicHolidaysEnabled) {
this.germanPublicHolidaysEnabled = germanPublicHolidaysEnabled;
return this;
}
@SuppressWarnings("unused")
public Builder corpusChristiEnabled(boolean corpusChristiEnabled) {
this.corpusChristiEnabled = corpusChristiEnabled;
return this;
}
@SuppressWarnings("unused")
public Builder jobBatchSize(int jobBatchSize) {
this.jobBatchSize = jobBatchSize;
return this;
}
@SuppressWarnings("unused")
public Builder maxNumberOfJobRetries(int maxNumberOfJobRetries) {
this.maxNumberOfJobRetries = maxNumberOfJobRetries;
return this;
}
@SuppressWarnings("unused")
public Builder cleanupJobFirstRun(Instant cleanupJobFirstRun) {
this.cleanupJobFirstRun = cleanupJobFirstRun;
return this;
}
@SuppressWarnings("unused")
public Builder cleanupJobRunEvery(Duration cleanupJobRunEvery) {
this.cleanupJobRunEvery = cleanupJobRunEvery;
return this;
}
@SuppressWarnings("unused")
public Builder cleanupJobMinimumAge(Duration cleanupJobMinimumAge) {
this.cleanupJobMinimumAge = cleanupJobMinimumAge;
return this;
}
@SuppressWarnings("unused")
public Builder taskCleanupJobAllCompletedSameParentBusiness(
boolean taskCleanupJobAllCompletedSameParentBusiness) {
this.taskCleanupJobAllCompletedSameParentBusiness =
taskCleanupJobAllCompletedSameParentBusiness;
return this;
}
@SuppressWarnings("unused")
public Builder validationAllowTimestampServiceLevelMismatch(
boolean validationAllowTimestampServiceLevelMismatch) {
this.validationAllowTimestampServiceLevelMismatch =
validationAllowTimestampServiceLevelMismatch;
return this;
}
@SuppressWarnings("unused")
public Builder addAdditionalUserInfo(boolean addAdditionalUserInfo) {
this.addAdditionalUserInfo = addAdditionalUserInfo;
return this;
}
@SuppressWarnings("unused")
public Builder priorityJobBatchSize(int priorityJobBatchSize) {
this.priorityJobBatchSize = priorityJobBatchSize;
return this;
}
@SuppressWarnings("unused")
public Builder priorityJobFirstRun(Instant priorityJobFirstRun) {
this.priorityJobFirstRun = priorityJobFirstRun;
return this;
}
@SuppressWarnings("unused")
public Builder priorityJobRunEvery(Duration priorityJobRunEvery) {
this.priorityJobRunEvery = priorityJobRunEvery;
return this;
}
@SuppressWarnings("unused")
public Builder priorityJobActive(boolean priorityJobActive) {
this.priorityJobActive = priorityJobActive;
return this;
}
@SuppressWarnings("unused")
public Builder userRefreshJobRunEvery(Duration userRefreshJobRunEvery) {
this.userRefreshJobRunEvery = userRefreshJobRunEvery;
return this;
}
@SuppressWarnings("unused")
public Builder userRefreshJobFirstRun(Instant userRefreshJobFirstRun) {
this.userRefreshJobFirstRun = userRefreshJobFirstRun;
return this;
}
@SuppressWarnings("unused")
public Builder minimalPermissionsToAssignDomains(
List<WorkbasketPermission> minimalPermissionsToAssignDomains) {
this.minimalPermissionsToAssignDomains = minimalPermissionsToAssignDomains;
return this;
}
public TaskanaConfiguration build() {
return new TaskanaConfiguration(this);
}
@SuppressWarnings("unused")
public Builder initTaskanaProperties() {
return this.initTaskanaProperties(TASKANA_PROPERTIES, TASKANA_PROPERTY_SEPARATOR);
}
@SuppressWarnings("unused")
public Builder initTaskanaProperties(String propertiesFile) {
return this.initTaskanaProperties(propertiesFile, TASKANA_PROPERTY_SEPARATOR);
}
public Builder initTaskanaProperties(String propertiesFile, String separator) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(
"Reading taskana configuration from {} with separator {}", propertiesFile, separator);
}
loadProperties(propertiesFile);
configureAnnotatedFields(this, separator, properties);
roleMap = configureRoles(separator, properties, shouldUseLowerCaseForAccessIds());
classificationCategoriesByTypeMap =
configureClassificationCategoriesForType(properties, classificationTypes);
return this;
}
private String initSchemaName(String schemaName) {
String schemaNameTmp;
if (schemaName != null && !schemaName.isEmpty()) {
schemaNameTmp = schemaName;
} else {
throw new SystemException("SchemaName can't be null or empty");
}
try (Connection connection = dataSource.getConnection()) {
String databaseProductId = DB.getDatabaseProductId(connection);
if (DB.isPostgres(databaseProductId)) {
schemaNameTmp = schemaNameTmp.toLowerCase();
} else {
schemaNameTmp = schemaNameTmp.toUpperCase();
}
} catch (SQLException ex) {
LOGGER.error("Caught exception when attempting to initialize the schema name", ex);
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Using schema name {}", schemaNameTmp);
}
return schemaNameTmp;
}
private void loadProperties(String propertiesFile) {
Properties props = new Properties();
try (InputStream stream =
FileLoaderUtil.openFileFromClasspathOrSystem(
propertiesFile, TaskanaConfiguration.class)) {
props.load(stream);
} catch (IOException e) {
throw new SystemException(
"internal System error when processing properties file " + propertiesFile, e);
}
this.properties =
props.entrySet().stream()
.collect(
Collectors.toUnmodifiableMap(
e -> e.getKey().toString(), e -> e.getValue().toString()));
}
}
}

View File

@ -1,518 +0,0 @@
package pro.taskana;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureAnnotatedFields;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureClassificationCategoriesForType;
import static pro.taskana.common.internal.configuration.TaskanaConfigurationInitializer.configureRoles;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.CustomHoliday;
import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.internal.configuration.DB;
import pro.taskana.common.internal.configuration.TaskanaProperty;
import pro.taskana.common.internal.util.FileLoaderUtil;
import pro.taskana.workbasket.api.WorkbasketPermission;
/**
* This central class creates the TaskanaEngine and holds all the information about DB and Security.
* <br>
* Security is enabled by default.
*/
@SuppressWarnings("checkstyle:OverloadMethodsDeclarationOrder")
public class TaskanaEngineConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskanaEngineConfiguration.class);
private static final String TASKANA_PROPERTIES = "/taskana.properties";
private static final String TASKANA_PROPERTY_SEPARATOR = "|";
// TASKANA_SCHEMA_VERSION
private static final String DEFAULT_SCHEMA_NAME = "TASKANA";
// Taskana properties file
protected String propertiesFileName = TASKANA_PROPERTIES;
// Taskana datasource configuration
protected DataSource dataSource;
protected String schemaName;
// Taskana role configuration
protected String propertiesSeparator = TASKANA_PROPERTY_SEPARATOR;
protected Map<TaskanaRole, Set<String>> roleMap;
// global switch to enable JAAS based authentication and Taskana
// authorizations
protected boolean securityEnabled;
protected boolean useManagedTransactions;
// List of configured domain names
@TaskanaProperty("taskana.domains")
protected List<String> domains = new ArrayList<>();
// List of configured classification types
@TaskanaProperty("taskana.classification.types")
protected List<String> classificationTypes = new ArrayList<>();
protected Map<String, List<String>> classificationCategoriesByTypeMap = new HashMap<>();
@TaskanaProperty("taskana.custom.holidays")
private List<CustomHoliday> customHolidays = new ArrayList<>();
// Properties for the monitor
@TaskanaProperty("taskana.history.deletion.on.task.deletion.enabled")
private boolean deleteHistoryOnTaskDeletionEnabled;
@TaskanaProperty("taskana.german.holidays.enabled")
private boolean germanPublicHolidaysEnabled;
@TaskanaProperty("taskana.german.holidays.corpus-christi.enabled")
private boolean corpusChristiEnabled;
// Properties for general job execution
@TaskanaProperty("taskana.jobs.batchSize")
private int jobBatchSize = 100;
@TaskanaProperty("taskana.jobs.maxRetries")
private int maxNumberOfJobRetries = 3;
// Properties for the cleanup job
@TaskanaProperty("taskana.jobs.cleanup.firstRunAt")
private Instant cleanupJobFirstRun = Instant.parse("2018-01-01T00:00:00Z");
@TaskanaProperty("taskana.jobs.cleanup.runEvery")
private Duration cleanupJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.cleanup.minimumAge")
private Duration cleanupJobMinimumAge = Duration.parse("P14D");
// TASKANA behavior
@TaskanaProperty("taskana.jobs.cleanup.allCompletedSameParentBusiness")
private boolean taskCleanupJobAllCompletedSameParentBusiness = true;
@TaskanaProperty("taskana.validation.allowTimestampServiceLevelMismatch")
private boolean validationAllowTimestampServiceLevelMismatch = false;
// Property to enable/disable the addition of user full/long name through joins
@TaskanaProperty("taskana.addAdditionalUserInfo")
private boolean addAdditionalUserInfo = false;
@TaskanaProperty("taskana.jobs.priority.batchSize")
private int priorityJobBatchSize = 100;
@TaskanaProperty("taskana.jobs.priority.firstRunAt")
private Instant priorityJobFirstRun = Instant.parse("2018-01-01T00:00:00Z");
@TaskanaProperty("taskana.jobs.priority.runEvery")
private Duration priorityJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.priority.active")
private boolean priorityJobActive = false;
@TaskanaProperty("taskana.jobs.user.refresh.runEvery")
private Duration userRefreshJobRunEvery = Duration.parse("P1D");
@TaskanaProperty("taskana.jobs.user.refresh.firstRunAt")
private Instant userRefreshJobFirstRun = Instant.parse("2018-01-01T23:00:00Z");
@TaskanaProperty("taskana.user.minimalPermissionsToAssignDomains")
private List<WorkbasketPermission> minimalPermissionsToAssignDomains;
public TaskanaEngineConfiguration(
DataSource dataSource, boolean useManagedTransactions, String schemaName) {
this(dataSource, useManagedTransactions, true, schemaName);
}
public TaskanaEngineConfiguration(
DataSource dataSource,
boolean useManagedTransactions,
boolean securityEnabled,
String schemaName) {
this(dataSource, useManagedTransactions, securityEnabled, null, null, schemaName);
}
public TaskanaEngineConfiguration(
DataSource dataSource,
boolean useManagedTransactions,
boolean securityEnabled,
String propertiesFileName,
String propertySeparator,
String schemaName) {
this.useManagedTransactions = useManagedTransactions;
this.securityEnabled = securityEnabled;
if (propertiesFileName != null) {
this.propertiesFileName = propertiesFileName;
}
if (propertySeparator != null) {
this.propertiesSeparator = propertySeparator;
}
if (dataSource != null) {
this.dataSource = dataSource;
} else {
// use default In Memory datasource
this.dataSource = createDefaultDataSource();
}
initSchemaName(schemaName);
initTaskanaProperties(this.propertiesFileName, this.propertiesSeparator);
}
public static Properties loadProperties(String propertiesFile) {
Properties props = new Properties();
try (InputStream stream =
FileLoaderUtil.openFileFromClasspathOrSystem(
propertiesFile, TaskanaEngineConfiguration.class)) {
props.load(stream);
} catch (IOException e) {
LOGGER.error("caught IOException when processing properties file {}.", propertiesFile);
throw new SystemException(
"internal System error when processing properties file " + propertiesFile, e.getCause());
}
return props;
}
public void initTaskanaProperties(String propertiesFile, String separator) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(
"Reading taskana configuration from {} with separator {}", propertiesFile, separator);
}
Properties props = loadProperties(propertiesFile);
configureAnnotatedFields(this, separator, props);
roleMap = configureRoles(separator, props, shouldUseLowerCaseForAccessIds());
classificationCategoriesByTypeMap =
configureClassificationCategoriesForType(props, classificationTypes);
if (LOGGER.isDebugEnabled()) {
roleMap.forEach((k, v) -> LOGGER.debug("Found Taskana RoleConfig {} : {} ", k, v));
LOGGER.debug(
"Configured number of task and workbasket updates per transaction: {}", jobBatchSize);
LOGGER.debug("Number of retries of failed task updates: {}", maxNumberOfJobRetries);
LOGGER.debug("CleanupJob configuration: first run at {}", cleanupJobFirstRun);
LOGGER.debug("CleanupJob configuration: runs every {}", cleanupJobRunEvery);
LOGGER.debug(
"CleanupJob configuration: minimum age of tasks to be cleanup up is {}",
cleanupJobMinimumAge);
LOGGER.debug(
"TaskCleanupJob configuration: all completed task with the "
+ "same parent business property id {}",
taskCleanupJobAllCompletedSameParentBusiness);
LOGGER.debug("Configured classification categories : {}", classificationCategoriesByTypeMap);
LOGGER.debug("Configured domains: {}", domains);
LOGGER.debug("Configured classificationTypes: {}", classificationTypes);
LOGGER.debug("Configured custom Holidays : {}", customHolidays);
LOGGER.debug(
"Configured minimalPermissionsToAssignDomains : {}", minimalPermissionsToAssignDomains);
}
}
public static DataSource createDefaultDataSource() {
String driverClass = "org.h2.Driver";
String jdbcUrl =
"jdbc:h2:mem:taskana;NON_KEYWORDS=KEY,VALUE;"
+ "IGNORECASE=TRUE;LOCK_MODE=0;"
+ "INIT=CREATE SCHEMA IF NOT EXISTS TASKANA\\;"
+ "SET COLLATION DEFAULT_de_DE";
String username = "sa";
String password = "sa";
LOGGER.info(
"No datasource is provided. An in-memory db is used: " + "'{}', '{}', '{}', '{}'",
driverClass,
jdbcUrl,
username,
password);
return createDatasource(driverClass, jdbcUrl, username, password);
}
/**
* This method creates a PooledDataSource, if the needed properties are provided.
*
* @param driver the name of the jdbc driver
* @param jdbcUrl the url to which the jdbc driver connects
* @param username the user name for database access
* @param password the password for database access
* @return DataSource
*/
public static DataSource createDatasource(
String driver, String jdbcUrl, String username, String password) {
return new PooledDataSource(driver, jdbcUrl, username, password);
}
public boolean isSecurityEnabled() {
return this.securityEnabled;
}
public DataSource getDatasource() {
return this.dataSource;
}
public boolean getUseManagedTransactions() {
return this.useManagedTransactions;
}
public int getMaxNumberOfUpdatesPerTransaction() {
return jobBatchSize;
}
public void setMaxNumberOfUpdatesPerTransaction(int jobBatchSize) {
this.jobBatchSize = jobBatchSize;
}
public int getMaxNumberOfJobRetries() {
return maxNumberOfJobRetries;
}
public void setMaxNumberOfJobRetries(int maxNumberOfJobRetries) {
this.maxNumberOfJobRetries = maxNumberOfJobRetries;
}
public boolean isCorpusChristiEnabled() {
return corpusChristiEnabled;
}
public void setCorpusChristiEnabled(boolean corpusChristiEnabled) {
this.corpusChristiEnabled = corpusChristiEnabled;
}
public boolean isGermanPublicHolidaysEnabled() {
return this.germanPublicHolidaysEnabled;
}
public void setGermanPublicHolidaysEnabled(boolean germanPublicHolidaysEnabled) {
this.germanPublicHolidaysEnabled = germanPublicHolidaysEnabled;
}
public boolean isValidationAllowTimestampServiceLevelMismatch() {
return validationAllowTimestampServiceLevelMismatch;
}
public void setValidationAllowTimestampServiceLevelMismatch(
boolean validationAllowTimestampServiceLevelMismatch) {
this.validationAllowTimestampServiceLevelMismatch =
validationAllowTimestampServiceLevelMismatch;
}
public boolean isDeleteHistoryOnTaskDeletionEnabled() {
return deleteHistoryOnTaskDeletionEnabled;
}
public void setDeleteHistoryOnTaskDeletionEnabled(boolean deleteHistoryOnTaskDeletionEnabled) {
this.deleteHistoryOnTaskDeletionEnabled = deleteHistoryOnTaskDeletionEnabled;
}
public List<CustomHoliday> getCustomHolidays() {
return customHolidays;
}
public void setCustomHolidays(List<CustomHoliday> customHolidays) {
this.customHolidays = new ArrayList<>(customHolidays);
}
public void addCustomHolidays(List<CustomHoliday> customHolidays) {
this.customHolidays.addAll(customHolidays);
}
public Map<TaskanaRole, Set<String>> getRoleMap() {
return roleMap;
}
public void setRoleMap(Map<TaskanaRole, Set<String>> roleMap) {
this.roleMap = roleMap;
}
public List<String> getDomains() {
return domains;
}
public void setDomains(List<String> domains) {
this.domains = domains;
}
public boolean getAddAdditionalUserInfo() {
return addAdditionalUserInfo;
}
public void setAddAdditionalUserInfo(boolean addAdditionalUserInfo) {
this.addAdditionalUserInfo = addAdditionalUserInfo;
}
public List<String> getClassificationTypes() {
return classificationTypes;
}
public void setClassificationTypes(List<String> classificationTypes) {
this.classificationTypes = classificationTypes;
}
public List<String> getAllClassificationCategories() {
List<String> classificationCategories = new ArrayList<>();
for (Map.Entry<String, List<String>> type : this.classificationCategoriesByTypeMap.entrySet()) {
classificationCategories.addAll(type.getValue());
}
return classificationCategories;
}
public Map<String, List<String>> getClassificationCategoriesByTypeMap() {
return this.classificationCategoriesByTypeMap.entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, e -> new ArrayList<>(e.getValue())));
}
public List<String> getClassificationCategoriesByType(String type) {
return classificationCategoriesByTypeMap.getOrDefault(type, Collections.emptyList());
}
public void setClassificationCategoriesByType(
Map<String, List<String>> classificationCategoriesByType) {
this.classificationCategoriesByTypeMap = classificationCategoriesByType;
}
public Instant getCleanupJobFirstRun() {
return cleanupJobFirstRun;
}
public void setCleanupJobFirstRun(Instant cleanupJobFirstRun) {
this.cleanupJobFirstRun = cleanupJobFirstRun;
}
public Duration getCleanupJobRunEvery() {
return cleanupJobRunEvery;
}
public void setCleanupJobRunEvery(Duration cleanupJobRunEvery) {
this.cleanupJobRunEvery = cleanupJobRunEvery;
}
public Duration getCleanupJobMinimumAge() {
return cleanupJobMinimumAge;
}
public void setCleanupJobMinimumAge(Duration cleanupJobMinimumAge) {
this.cleanupJobMinimumAge = cleanupJobMinimumAge;
}
public boolean isTaskCleanupJobAllCompletedSameParentBusiness() {
return taskCleanupJobAllCompletedSameParentBusiness;
}
public void setTaskCleanupJobAllCompletedSameParentBusiness(
boolean taskCleanupJobAllCompletedSameParentBusiness) {
this.taskCleanupJobAllCompletedSameParentBusiness =
taskCleanupJobAllCompletedSameParentBusiness;
}
public int getPriorityJobBatchSize() {
return priorityJobBatchSize;
}
public void setPriorityJobBatchSize(int priorityJobBatchSize) {
this.priorityJobBatchSize = priorityJobBatchSize;
}
public Instant getPriorityJobFirstRun() {
return priorityJobFirstRun;
}
public void setPriorityJobFirstRun(Instant priorityJobFirstRun) {
this.priorityJobFirstRun = priorityJobFirstRun;
}
public Duration getPriorityJobRunEvery() {
return priorityJobRunEvery;
}
public void setPriorityJobRunEvery(Duration priorityJobRunEvery) {
this.priorityJobRunEvery = priorityJobRunEvery;
}
public Duration getUserRefreshJobRunEvery() {
return userRefreshJobRunEvery;
}
public void setUserRefreshJobRunEvery(Duration userRefreshJobRunEvery) {
this.userRefreshJobRunEvery = userRefreshJobRunEvery;
}
public List<WorkbasketPermission> getMinimalPermissionsToAssignDomains() {
return minimalPermissionsToAssignDomains;
}
public void setMinimalPermissionsToAssignDomains(
List<WorkbasketPermission> minimalPermissionsToAssignDomains) {
this.minimalPermissionsToAssignDomains = minimalPermissionsToAssignDomains;
}
public Instant getUserRefreshJobFirstRun() {
return userRefreshJobFirstRun;
}
public void setUserRefreshJobFirstRun(Instant userRefreshJobFirstRun) {
this.userRefreshJobFirstRun = userRefreshJobFirstRun;
}
public boolean isPriorityJobActive() {
return priorityJobActive;
}
public void setPriorityJobActive(boolean priorityJobActive) {
this.priorityJobActive = priorityJobActive;
}
public String getSchemaName() {
return schemaName;
}
public void setSchemaName(String schemaName) {
this.schemaName = schemaName;
}
/**
* Helper method to determine whether all access ids (user Id and group ids) should be used in
* lower case.
*
* @return true if all access ids should be used in lower case, false otherwise
*/
public static boolean shouldUseLowerCaseForAccessIds() {
return true;
}
public Properties readPropertiesFromFile() {
return loadProperties(this.propertiesFileName);
}
private void initSchemaName(String schemaName) {
if (schemaName != null && !schemaName.isEmpty()) {
this.setSchemaName(schemaName);
} else {
this.setSchemaName(DEFAULT_SCHEMA_NAME);
}
try (Connection connection = dataSource.getConnection()) {
String databaseProductId = DB.getDatabaseProductId(connection);
if (DB.isPostgres(databaseProductId)) {
this.schemaName = this.schemaName.toLowerCase();
} else {
this.schemaName = this.schemaName.toUpperCase();
}
} catch (SQLException ex) {
LOGGER.error("Caught exception when attempting to initialize the schema name", ex);
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Using schema name {}", this.getSchemaName());
}
}
}

View File

@ -3,7 +3,7 @@ package pro.taskana.common.api;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.function.Supplier; import java.util.function.Supplier;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.api.security.CurrentUserContext; import pro.taskana.common.api.security.CurrentUserContext;
@ -78,26 +78,25 @@ public interface TaskanaEngine {
ConfigurationService getConfigurationService(); ConfigurationService getConfigurationService();
/** /**
* Returns the {@linkplain TaskanaEngineConfiguration configuration} of the TaskanaEngine. * Returns the {@linkplain TaskanaConfiguration configuration} of the TaskanaEngine.
* *
* @return {@linkplain TaskanaEngineConfiguration configuration} * @return {@linkplain TaskanaConfiguration configuration}
*/ */
TaskanaEngineConfiguration getConfiguration(); TaskanaConfiguration getConfiguration();
/** /**
* This method creates the {@linkplain TaskanaEngine} with {@linkplain * This method creates the {@linkplain TaskanaEngine} with {@linkplain
* ConnectionManagementMode#PARTICIPATE }. * ConnectionManagementMode#PARTICIPATE }.
* *
* @see TaskanaEngine#buildTaskanaEngine(TaskanaEngineConfiguration, ConnectionManagementMode) * @see TaskanaEngine#buildTaskanaEngine(TaskanaConfiguration, ConnectionManagementMode)
*/ */
@SuppressWarnings("checkstyle:JavadocMethod") @SuppressWarnings("checkstyle:JavadocMethod")
static TaskanaEngine buildTaskanaEngine(TaskanaEngineConfiguration configuration) static TaskanaEngine buildTaskanaEngine(TaskanaConfiguration configuration) throws SQLException {
throws SQLException {
return buildTaskanaEngine(configuration, ConnectionManagementMode.PARTICIPATE); return buildTaskanaEngine(configuration, ConnectionManagementMode.PARTICIPATE);
} }
/** /**
* Builds an {@linkplain TaskanaEngine} based on {@linkplain TaskanaEngineConfiguration} and * Builds an {@linkplain TaskanaEngine} based on {@linkplain TaskanaConfiguration} and
* SqlConnectionMode. * SqlConnectionMode.
* *
* @param configuration complete taskanaEngineConfig to build the engine * @param configuration complete taskanaEngineConfig to build the engine
@ -106,7 +105,7 @@ public interface TaskanaEngine {
* @throws SQLException when the db schema could not be initialized * @throws SQLException when the db schema could not be initialized
*/ */
static TaskanaEngine buildTaskanaEngine( static TaskanaEngine buildTaskanaEngine(
TaskanaEngineConfiguration configuration, ConnectionManagementMode connectionManagementMode) TaskanaConfiguration configuration, ConnectionManagementMode connectionManagementMode)
throws SQLException { throws SQLException {
return TaskanaEngineImpl.createTaskanaEngine(configuration, connectionManagementMode); return TaskanaEngineImpl.createTaskanaEngine(configuration, connectionManagementMode);
} }

View File

@ -25,7 +25,7 @@ import org.apache.ibatis.type.JdbcType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.internal.ClassificationMapper; import pro.taskana.classification.internal.ClassificationMapper;
import pro.taskana.classification.internal.ClassificationQueryMapper; import pro.taskana.classification.internal.ClassificationQueryMapper;
@ -98,14 +98,14 @@ public class TaskanaEngineImpl implements TaskanaEngine {
private final WorkingDaysToDaysConverter workingDaysToDaysConverter; private final WorkingDaysToDaysConverter workingDaysToDaysConverter;
private final HistoryEventManager historyEventManager; private final HistoryEventManager historyEventManager;
private final CurrentUserContext currentUserContext; private final CurrentUserContext currentUserContext;
protected TaskanaEngineConfiguration taskanaEngineConfiguration; protected TaskanaConfiguration taskanaEngineConfiguration;
protected TransactionFactory transactionFactory; protected TransactionFactory transactionFactory;
protected SqlSessionManager sessionManager; protected SqlSessionManager sessionManager;
protected ConnectionManagementMode mode; protected ConnectionManagementMode mode;
protected Connection connection; protected Connection connection;
protected TaskanaEngineImpl( protected TaskanaEngineImpl(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
ConnectionManagementMode connectionManagementMode) ConnectionManagementMode connectionManagementMode)
throws SQLException { throws SQLException {
this.taskanaEngineConfiguration = taskanaEngineConfiguration; this.taskanaEngineConfiguration = taskanaEngineConfiguration;
@ -117,8 +117,8 @@ public class TaskanaEngineImpl implements TaskanaEngine {
taskanaEngineConfiguration.isCorpusChristiEnabled(), taskanaEngineConfiguration.isCorpusChristiEnabled(),
taskanaEngineConfiguration.getCustomHolidays()); taskanaEngineConfiguration.getCustomHolidays());
currentUserContext = currentUserContext =
new CurrentUserContextImpl(TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()); new CurrentUserContextImpl(TaskanaConfiguration.shouldUseLowerCaseForAccessIds());
createTransactionFactory(taskanaEngineConfiguration.getUseManagedTransactions()); createTransactionFactory(taskanaEngineConfiguration.isUseManagedTransactions());
sessionManager = createSqlSessionManager(); sessionManager = createSqlSessionManager();
initializeDbSchema(taskanaEngineConfiguration); initializeDbSchema(taskanaEngineConfiguration);
@ -137,7 +137,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
} }
public static TaskanaEngine createTaskanaEngine( public static TaskanaEngine createTaskanaEngine(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
ConnectionManagementMode connectionManagementMode) ConnectionManagementMode connectionManagementMode)
throws SQLException { throws SQLException {
return new TaskanaEngineImpl(taskanaEngineConfiguration, connectionManagementMode); return new TaskanaEngineImpl(taskanaEngineConfiguration, connectionManagementMode);
@ -204,7 +204,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
} }
@Override @Override
public TaskanaEngineConfiguration getConfiguration() { public TaskanaConfiguration getConfiguration() {
return this.taskanaEngineConfiguration; return this.taskanaEngineConfiguration;
} }
@ -388,7 +388,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
return SqlSessionManager.newInstance(localSessionFactory); return SqlSessionManager.newInstance(localSessionFactory);
} }
private void initializeDbSchema(TaskanaEngineConfiguration taskanaEngineConfiguration) private void initializeDbSchema(TaskanaConfiguration taskanaEngineConfiguration)
throws SQLException { throws SQLException {
DbSchemaCreator dbSchemaCreator = DbSchemaCreator dbSchemaCreator =
new DbSchemaCreator( new DbSchemaCreator(

View File

@ -61,7 +61,7 @@ public class TaskCommentQueryImpl implements TaskCommentQuery {
this.taskService = (TaskServiceImpl) taskanaEngine.getEngine().getTaskService(); this.taskService = (TaskServiceImpl) taskanaEngine.getEngine().getTaskService();
this.orderBy = new ArrayList<>(); this.orderBy = new ArrayList<>();
this.orderColumns = new ArrayList<>(); this.orderColumns = new ArrayList<>();
this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo(); this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo();
} }
@Override @Override

View File

@ -187,7 +187,7 @@ class TaskCommentServiceImpl {
taskService.getTask(result.getTaskId()); taskService.getTask(result.getTaskId());
if (taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo()) { if (taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo()) {
User creator = userMapper.findById(result.getCreator()); User creator = userMapper.findById(result.getCreator());
if (creator != null) { if (creator != null) {
result.setCreatorFullName(creator.getFullName()); result.setCreatorFullName(creator.getFullName());

View File

@ -340,7 +340,7 @@ public class TaskQueryImpl implements TaskQuery {
this.orderBy = new ArrayList<>(); this.orderBy = new ArrayList<>();
this.filterByAccessIdIn = true; this.filterByAccessIdIn = true;
this.withoutAttachment = false; this.withoutAttachment = false;
this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo(); this.joinWithUserInfo = taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo();
} }
@Override @Override

View File

@ -393,7 +393,7 @@ public class TaskServiceImpl implements TaskService {
if (resultTask.getOwner() != null if (resultTask.getOwner() != null
&& !resultTask.getOwner().isEmpty() && !resultTask.getOwner().isEmpty()
&& taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo()) { && taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo()) {
User owner = userMapper.findById(resultTask.getOwner()); User owner = userMapper.findById(resultTask.getOwner());
if (owner != null) { if (owner != null) {
resultTask.setOwnerLongName(owner.getLongName()); resultTask.setOwnerLongName(owner.getLongName());
@ -1111,7 +1111,7 @@ public class TaskServiceImpl implements TaskService {
} else { } else {
String userId = taskanaEngine.getEngine().getCurrentUserContext().getUserid(); String userId = taskanaEngine.getEngine().getCurrentUserContext().getUserid();
String userLongName; String userLongName;
if (taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo()) { if (taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo()) {
User user = userMapper.findById(userId); User user = userMapper.findById(userId);
if (user != null) { if (user != null) {
userLongName = user.getLongName(); userLongName = user.getLongName();
@ -1220,7 +1220,7 @@ public class TaskServiceImpl implements TaskService {
NotAuthorizedException { NotAuthorizedException {
String userId = taskanaEngine.getEngine().getCurrentUserContext().getUserid(); String userId = taskanaEngine.getEngine().getCurrentUserContext().getUserid();
String userLongName = null; String userLongName = null;
if (taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo()) { if (taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo()) {
User user = userMapper.findById(userId); User user = userMapper.findById(userId);
if (user != null) { if (user != null) {
userLongName = user.getLongName(); userLongName = user.getLongName();
@ -1274,8 +1274,8 @@ public class TaskServiceImpl implements TaskService {
task.getId(), task.getState(), EnumUtil.allValuesExceptFor(TaskState.END_STATES)); task.getId(), task.getState(), EnumUtil.allValuesExceptFor(TaskState.END_STATES));
} }
if (!force && taskIsNotClaimed(task)) { if (!force && taskIsNotClaimed(task)) {
throw new InvalidTaskStateException(task.getId(), task.getState(), TaskState.CLAIMED, throw new InvalidTaskStateException(
TaskState.IN_REVIEW); task.getId(), task.getState(), TaskState.CLAIMED, TaskState.IN_REVIEW);
} }
if (!force && !task.getOwner().equals(userId)) { if (!force && !task.getOwner().equals(userId)) {
throw new InvalidOwnerException(userId, task.getId()); throw new InvalidOwnerException(userId, task.getId());
@ -1717,7 +1717,7 @@ public class TaskServiceImpl implements TaskService {
task.setDescription(classification.getDescription()); task.setDescription(classification.getDescription());
} }
if (task.getOwner() != null if (task.getOwner() != null
&& taskanaEngine.getEngine().getConfiguration().getAddAdditionalUserInfo()) { && taskanaEngine.getEngine().getConfiguration().isAddAdditionalUserInfo()) {
User user = userMapper.findById(task.getOwner()); User user = userMapper.findById(task.getOwner());
if (user != null) { if (user != null) {
task.setOwnerLongName(user.getLongName()); task.setOwnerLongName(user.getLongName());

View File

@ -2,7 +2,7 @@ package pro.taskana.user.api.models;
import java.util.Set; import java.util.Set;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
/** The User holds some relevant information about the TASKANA users. */ /** The User holds some relevant information about the TASKANA users. */
public interface User { public interface User {
@ -208,7 +208,7 @@ public interface User {
* *
* <p>The domains are derived from the {@linkplain pro.taskana.workbasket.api.WorkbasketPermission * <p>The domains are derived from the {@linkplain pro.taskana.workbasket.api.WorkbasketPermission
* WorkbasketPermissions} and the according TASKANA property {@linkplain * WorkbasketPermissions} and the according TASKANA property {@linkplain
* TaskanaEngineConfiguration#getMinimalPermissionsToAssignDomains()}. * TaskanaConfiguration#getMinimalPermissionsToAssignDomains()}.
* *
* @return domains * @return domains
*/ */

View File

@ -11,7 +11,7 @@ import org.apache.ibatis.exceptions.PersistenceException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.BaseQuery.SortDirection; import pro.taskana.common.api.BaseQuery.SortDirection;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
@ -52,7 +52,7 @@ public class UserServiceImpl implements UserService {
throw new InvalidArgumentException("UserId can't be used as NULL-Parameter."); throw new InvalidArgumentException("UserId can't be used as NULL-Parameter.");
} }
String finalUserId; String finalUserId;
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
finalUserId = userId.toLowerCase(); finalUserId = userId.toLowerCase();
} else { } else {
finalUserId = userId; finalUserId = userId;
@ -74,7 +74,7 @@ public class UserServiceImpl implements UserService {
throw new InvalidArgumentException("UserIds can't be used as NULL-Parameter."); throw new InvalidArgumentException("UserIds can't be used as NULL-Parameter.");
} }
Set<String> finalUserIds; Set<String> finalUserIds;
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
finalUserIds = userIds.stream().map(String::toLowerCase).collect(Collectors.toSet()); finalUserIds = userIds.stream().map(String::toLowerCase).collect(Collectors.toSet());
} else { } else {
finalUserIds = userIds; finalUserIds = userIds;
@ -202,7 +202,7 @@ public class UserServiceImpl implements UserService {
if (user.getLongName() == null || user.getLongName().isEmpty()) { if (user.getLongName() == null || user.getLongName().isEmpty()) {
user.setLongName(user.getFullName() + " - (" + user.getId() + ")"); user.setLongName(user.getFullName() + " - (" + user.getId() + ")");
} }
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
user.setId(user.getId().toLowerCase()); user.setId(user.getId().toLowerCase());
user.setGroups( user.setGroups(
user.getGroups().stream().map((String::toLowerCase)).collect(Collectors.toSet())); user.getGroups().stream().map((String::toLowerCase)).collect(Collectors.toSet()));
@ -223,7 +223,7 @@ public class UserServiceImpl implements UserService {
newUser.setLongName(newUser.getFullName() + " - (" + newUser.getId() + ")"); newUser.setLongName(newUser.getFullName() + " - (" + newUser.getId() + ")");
} }
} }
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
newUser.setId(newUser.getId().toLowerCase()); newUser.setId(newUser.getId().toLowerCase());
newUser.setGroups( newUser.setGroups(
newUser.getGroups().stream().map((String::toLowerCase)).collect(Collectors.toSet())); newUser.getGroups().stream().map((String::toLowerCase)).collect(Collectors.toSet()));

View File

@ -6,7 +6,7 @@ import java.util.List;
import org.apache.ibatis.exceptions.PersistenceException; import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.RowBounds;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.TimeInterval; import pro.taskana.common.api.TimeInterval;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
@ -65,9 +65,9 @@ public class WorkbasketQueryImpl implements WorkbasketQuery {
private String[] orgLevel4Like; private String[] orgLevel4Like;
private Boolean markedForDeletion; private Boolean markedForDeletion;
private InternalTaskanaEngine taskanaEngine; private final InternalTaskanaEngine taskanaEngine;
private List<String> orderBy; private final List<String> orderBy;
private List<String> orderColumns; private final List<String> orderColumns;
private boolean joinWithAccessList; private boolean joinWithAccessList;
private boolean checkReadPermission; private boolean checkReadPermission;
private boolean usedToAugmentTasks; private boolean usedToAugmentTasks;
@ -581,7 +581,7 @@ public class WorkbasketQueryImpl implements WorkbasketQuery {
} }
public static void lowercaseAccessIds(String[] accessIdArray) { public static void lowercaseAccessIds(String[] accessIdArray) {
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
for (int i = 0; i < accessIdArray.length; i++) { for (int i = 0; i < accessIdArray.length; i++) {
String id = accessIdArray[i]; String id = accessIdArray[i];
if (id != null) { if (id != null) {

View File

@ -15,7 +15,7 @@ import org.apache.ibatis.exceptions.PersistenceException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.BulkOperationResults; import pro.taskana.common.api.BulkOperationResults;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.ConcurrencyException; import pro.taskana.common.api.exceptions.ConcurrencyException;
@ -241,7 +241,7 @@ public class WorkbasketServiceImpl implements WorkbasketService {
public WorkbasketAccessItem newWorkbasketAccessItem(String workbasketId, String accessId) { public WorkbasketAccessItem newWorkbasketAccessItem(String workbasketId, String accessId) {
WorkbasketAccessItemImpl accessItem = new WorkbasketAccessItemImpl(); WorkbasketAccessItemImpl accessItem = new WorkbasketAccessItemImpl();
accessItem.setWorkbasketId(workbasketId); accessItem.setWorkbasketId(workbasketId);
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds()) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds()) {
accessItem.setAccessId(accessId != null ? accessId.toLowerCase() : null); accessItem.setAccessId(accessId != null ? accessId.toLowerCase() : null);
} else { } else {
accessItem.setAccessId(accessId); accessItem.setAccessId(accessId);
@ -919,7 +919,7 @@ public class WorkbasketServiceImpl implements WorkbasketService {
taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.BUSINESS_ADMIN, TaskanaRole.ADMIN); taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.BUSINESS_ADMIN, TaskanaRole.ADMIN);
try { try {
taskanaEngine.openConnection(); taskanaEngine.openConnection();
if (TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds() && accessId != null) { if (TaskanaConfiguration.shouldUseLowerCaseForAccessIds() && accessId != null) {
accessId = accessId.toLowerCase(); accessId = accessId.toLowerCase();
} }

View File

@ -15,7 +15,7 @@ import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionManager; import org.apache.ibatis.session.SqlSessionManager;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode; import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode;
import pro.taskana.common.api.TimeInterval; import pro.taskana.common.api.TimeInterval;
@ -37,7 +37,7 @@ public abstract class AbstractAccTest {
public static final String GROUP_2_DN = public static final String GROUP_2_DN =
"cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA"; "cn=Organisationseinheit KSC 2,cn=Organisationseinheit KSC,cn=organisation,OU=Test,O=TASKANA";
protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaConfiguration taskanaEngineConfiguration;
protected static TaskanaEngine taskanaEngine; protected static TaskanaEngine taskanaEngine;
protected static TaskServiceImpl taskService; protected static TaskServiceImpl taskService;
@ -52,8 +52,11 @@ public abstract class AbstractAccTest {
DataSource dataSource = DataSourceGenerator.getDataSource(); DataSource dataSource = DataSourceGenerator.getDataSource();
String schemaName = DataSourceGenerator.getSchemaName(); String schemaName = DataSourceGenerator.getSchemaName();
taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, schemaName);
taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(true); taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(dataSource, false, schemaName)
.germanPublicHolidaysEnabled(true)
.build();
SampleDataGenerator sampleDataGenerator = SampleDataGenerator sampleDataGenerator =
new SampleDataGenerator(dataSource, taskanaEngineConfiguration.getSchemaName()); new SampleDataGenerator(dataSource, taskanaEngineConfiguration.getSchemaName());
if (dropTables) { if (dropTables) {
@ -69,7 +72,8 @@ public abstract class AbstractAccTest {
sampleDataGenerator.generateTestData(); sampleDataGenerator.generateTestData();
} }
protected JobMapper getJobMapper() throws NoSuchFieldException, IllegalAccessException { protected JobMapper getJobMapper(TaskanaEngine taskanaEngine)
throws NoSuchFieldException, IllegalAccessException {
Field sessionManagerField = TaskanaEngineImpl.class.getDeclaredField("sessionManager"); Field sessionManagerField = TaskanaEngineImpl.class.getDeclaredField("sessionManager");
sessionManagerField.setAccessible(true); sessionManagerField.setAccessible(true);

View File

@ -14,7 +14,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.test.config.DataSourceGenerator; import pro.taskana.common.test.config.DataSourceGenerator;
import pro.taskana.workbasket.api.WorkbasketPermission; import pro.taskana.workbasket.api.WorkbasketPermission;
@ -22,13 +22,14 @@ import pro.taskana.workbasket.api.WorkbasketPermission;
class TaskanaConfigAccTest { class TaskanaConfigAccTest {
@TempDir Path tempDir; @TempDir Path tempDir;
private TaskanaEngineConfiguration taskanaEngineConfiguration; private TaskanaConfiguration taskanaEngineConfiguration;
@BeforeEach @BeforeEach
void setup() { void setup() {
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), true, DataSourceGenerator.getSchemaName()); DataSourceGenerator.getDataSource(), true, DataSourceGenerator.getSchemaName())
.build();
} }
@Test @Test
@ -60,13 +61,14 @@ class TaskanaConfigAccTest {
String propertiesFileName = createNewConfigFile("dummyTestConfig1.properties", false, true); String propertiesFileName = createNewConfigFile("dummyTestConfig1.properties", false, true);
String delimiter = ";"; String delimiter = ";";
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
true, true,
true, DataSourceGenerator.getSchemaName(),
propertiesFileName, true,
delimiter, propertiesFileName,
DataSourceGenerator.getSchemaName()); delimiter)
.build();
assertThat(taskanaEngineConfiguration.getClassificationTypes()).isEmpty(); assertThat(taskanaEngineConfiguration.getClassificationTypes()).isEmpty();
} }
@ -75,13 +77,14 @@ class TaskanaConfigAccTest {
String propertiesFileName = createNewConfigFile("dummyTestConfig2.properties", true, false); String propertiesFileName = createNewConfigFile("dummyTestConfig2.properties", true, false);
String delimiter = ";"; String delimiter = ";";
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
true, true,
true, DataSourceGenerator.getSchemaName(),
propertiesFileName, true,
delimiter, propertiesFileName,
DataSourceGenerator.getSchemaName()); delimiter)
.build();
assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap()) assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap())
.containsExactly( .containsExactly(
Map.entry("TASK", Collections.emptyList()), Map.entry("TASK", Collections.emptyList()),
@ -93,13 +96,14 @@ class TaskanaConfigAccTest {
String propertiesFileName = createNewConfigFile("dummyTestConfig3.properties", true, true); String propertiesFileName = createNewConfigFile("dummyTestConfig3.properties", true, true);
String delimiter = ";"; String delimiter = ";";
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
true, true,
true, DataSourceGenerator.getSchemaName(),
propertiesFileName, true,
delimiter, propertiesFileName,
DataSourceGenerator.getSchemaName()); delimiter)
.build();
assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap()) assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap())
.containsExactly( .containsExactly(
Map.entry("TASK", List.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")), Map.entry("TASK", List.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")),

View File

@ -5,7 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.CustomHoliday; import pro.taskana.common.api.CustomHoliday;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.test.config.DataSourceGenerator; import pro.taskana.common.test.config.DataSourceGenerator;
@ -16,8 +16,8 @@ class TaskanaEngineConfigTest {
@Test @Test
void should_ReturnTaskanaEngine_When_BuildingWithConfiguration() throws Exception { void should_ReturnTaskanaEngine_When_BuildingWithConfiguration() throws Exception {
DataSource ds = DataSourceGenerator.getDataSource(); DataSource ds = DataSourceGenerator.getDataSource();
TaskanaEngineConfiguration taskEngineConfiguration = TaskanaConfiguration taskEngineConfiguration =
new TaskanaEngineConfiguration(ds, false, DataSourceGenerator.getSchemaName()); new TaskanaConfiguration.Builder(ds, false, DataSourceGenerator.getSchemaName()).build();
TaskanaEngine te = TaskanaEngine.buildTaskanaEngine(taskEngineConfiguration); TaskanaEngine te = TaskanaEngine.buildTaskanaEngine(taskEngineConfiguration);
@ -27,14 +27,15 @@ class TaskanaEngineConfigTest {
@Test @Test
void should_SetCorpusChristiEnabled_When_PropertyIsSet() throws Exception { void should_SetCorpusChristiEnabled_When_PropertyIsSet() throws Exception {
DataSource ds = DataSourceGenerator.getDataSource(); DataSource ds = DataSourceGenerator.getDataSource();
TaskanaEngineConfiguration taskEngineConfiguration = TaskanaConfiguration taskEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
ds, ds,
false, false,
true, DataSourceGenerator.getSchemaName(),
"/corpusChristiEnabled.properties", true,
"|", "/corpusChristiEnabled.properties",
DataSourceGenerator.getSchemaName()); "|")
.build();
assertThat(taskEngineConfiguration.isCorpusChristiEnabled()).isTrue(); assertThat(taskEngineConfiguration.isCorpusChristiEnabled()).isTrue();
} }
@ -43,14 +44,15 @@ class TaskanaEngineConfigTest {
void should_ReturnTheTwoCustomHolidays_When_TwoCustomHolidaysAreConfiguredInThePropertiesFile() void should_ReturnTheTwoCustomHolidays_When_TwoCustomHolidaysAreConfiguredInThePropertiesFile()
throws Exception { throws Exception {
DataSource ds = DataSourceGenerator.getDataSource(); DataSource ds = DataSourceGenerator.getDataSource();
TaskanaEngineConfiguration taskEngineConfiguration = TaskanaConfiguration taskEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
ds, ds,
false, false,
true, DataSourceGenerator.getSchemaName(),
"/custom_holiday_taskana.properties", true,
"|", "/custom_holiday_taskana.properties",
DataSourceGenerator.getSchemaName()); "|")
.build();
assertThat(taskEngineConfiguration.getCustomHolidays()).contains(CustomHoliday.of(31, 7)); assertThat(taskEngineConfiguration.getCustomHolidays()).contains(CustomHoliday.of(31, 7));
assertThat(taskEngineConfiguration.getCustomHolidays()).contains(CustomHoliday.of(16, 12)); assertThat(taskEngineConfiguration.getCustomHolidays()).contains(CustomHoliday.of(16, 12));
} }
@ -59,14 +61,15 @@ class TaskanaEngineConfigTest {
void should_ReturnEmptyCustomHolidaysList_When_AllCustomHolidaysAreInWrongFormatInPropertiesFile() void should_ReturnEmptyCustomHolidaysList_When_AllCustomHolidaysAreInWrongFormatInPropertiesFile()
throws Exception { throws Exception {
DataSource ds = DataSourceGenerator.getDataSource(); DataSource ds = DataSourceGenerator.getDataSource();
TaskanaEngineConfiguration taskEngineConfiguration = TaskanaConfiguration taskEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
ds, ds,
false, false,
true, DataSourceGenerator.getSchemaName(),
"/custom_holiday_with_wrong_format_taskana.properties", true,
"|", "/custom_holiday_with_wrong_format_taskana.properties",
DataSourceGenerator.getSchemaName()); "|")
.build();
assertThat(taskEngineConfiguration.getCustomHolidays()).isEmpty(); assertThat(taskEngineConfiguration.getCustomHolidays()).isEmpty();
} }
} }

View File

@ -11,7 +11,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.test.config.DataSourceGenerator; import pro.taskana.common.test.config.DataSourceGenerator;
@ -19,13 +19,14 @@ import pro.taskana.common.test.config.DataSourceGenerator;
class TaskanaRoleConfigAccTest { class TaskanaRoleConfigAccTest {
@TempDir Path tempDir; @TempDir Path tempDir;
private TaskanaEngineConfiguration taskanaEngineConfiguration; private TaskanaConfiguration taskanaEngineConfiguration;
@BeforeEach @BeforeEach
void setup() { void setup() {
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), true, DataSourceGenerator.getSchemaName()); DataSourceGenerator.getDataSource(), true, DataSourceGenerator.getSchemaName())
.build();
} }
@Test @Test
@ -72,13 +73,14 @@ class TaskanaRoleConfigAccTest {
String propertiesFileName = createNewConfigFileWithSameDelimiter("dummyTestConfig.properties"); String propertiesFileName = createNewConfigFileWithSameDelimiter("dummyTestConfig.properties");
String delimiter = "|"; String delimiter = "|";
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
true, true,
true, DataSourceGenerator.getSchemaName(),
propertiesFileName, true,
delimiter, propertiesFileName,
DataSourceGenerator.getSchemaName()); delimiter)
.build();
Set<TaskanaRole> rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet(); Set<TaskanaRole> rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet();
assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values()); assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values());
@ -104,13 +106,14 @@ class TaskanaRoleConfigAccTest {
createNewConfigFileWithDifferentDelimiter("dummyTestConfig.properties", delimiter); createNewConfigFileWithDifferentDelimiter("dummyTestConfig.properties", delimiter);
taskanaEngineConfiguration = taskanaEngineConfiguration =
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
true, true,
true, DataSourceGenerator.getSchemaName(),
propertiesFileName, true,
delimiter, propertiesFileName,
DataSourceGenerator.getSchemaName()); delimiter)
.build();
Set<TaskanaRole> rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet(); Set<TaskanaRole> rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet();
assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values()); assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values());

View File

@ -12,7 +12,7 @@ import javax.sql.DataSource;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.internal.configuration.DB; import pro.taskana.common.internal.configuration.DB;
@ -77,11 +77,12 @@ class TaskanaSecurityConfigAccTest {
private void createTaskanaEngine(boolean securityEnabled) throws SQLException { private void createTaskanaEngine(boolean securityEnabled) throws SQLException {
TaskanaEngine.buildTaskanaEngine( TaskanaEngine.buildTaskanaEngine(
new TaskanaEngineConfiguration( new TaskanaConfiguration.Builder(
DataSourceGenerator.getDataSource(), DataSourceGenerator.getDataSource(),
false, false,
securityEnabled, DataSourceGenerator.getSchemaName(),
DataSourceGenerator.getSchemaName())); securityEnabled)
.build());
} }
private Boolean retrieveSecurityFlag() throws Exception { private Boolean retrieveSecurityFlag() throws Exception {

View File

@ -66,7 +66,7 @@ class JobRunnerAccTest extends AbstractAccTest {
// runEvery is set to P1D Therefore we need to check which jobs run tomorrow. // runEvery is set to P1D Therefore we need to check which jobs run tomorrow.
// Just to be sure the jobs are found we will look for any job scheduled in the next 2 days. // Just to be sure the jobs are found we will look for any job scheduled in the next 2 days.
List<ScheduledJob> jobsToRun = List<ScheduledJob> jobsToRun =
getJobMapper().findJobsToRun(Instant.now().plus(2, ChronoUnit.DAYS)); getJobMapper(taskanaEngine).findJobsToRun(Instant.now().plus(2, ChronoUnit.DAYS));
assertThat(jobsToRun).hasSize(1).doesNotContain(job); assertThat(jobsToRun).hasSize(1).doesNotContain(job);
} }

View File

@ -19,13 +19,17 @@ import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.function.ThrowingConsumer; import org.junit.jupiter.api.function.ThrowingConsumer;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.internal.jobs.ClassificationChangedJob; import pro.taskana.classification.internal.jobs.ClassificationChangedJob;
import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.ScheduledJob;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode;
import pro.taskana.common.internal.JobMapper; import pro.taskana.common.internal.JobMapper;
import pro.taskana.common.internal.JobServiceImpl; import pro.taskana.common.internal.JobServiceImpl;
import pro.taskana.common.internal.jobs.JobRunner; import pro.taskana.common.internal.jobs.JobRunner;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId; import pro.taskana.common.test.security.WithAccessId;
import pro.taskana.task.api.TaskService;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
import pro.taskana.task.api.models.TaskSummary; import pro.taskana.task.api.models.TaskSummary;
import pro.taskana.task.internal.jobs.TaskCleanupJob; import pro.taskana.task.internal.jobs.TaskCleanupJob;
@ -45,15 +49,21 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_CleanCompletedTasksUntilDate() throws Exception { void should_CleanCompletedTasksUntilDate() throws Exception {
String taskId = createAndInsertTask(null); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.taskCleanupJobAllCompletedSameParentBusiness(false)
.build();
TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
TaskService taskService = taskanaEngine.getTaskService();
String taskId = createAndInsertTask(taskService, null);
taskService.claim(taskId); taskService.claim(taskId);
taskService.completeTask(taskId); taskService.completeTask(taskId);
long totalTasksCount = taskService.createTaskQuery().count(); long totalTasksCount = taskService.createTaskQuery().count();
assertThat(totalTasksCount).isEqualTo(100); assertThat(totalTasksCount).isEqualTo(100);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(false);
TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null); TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
@ -67,10 +77,20 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
long totalTasksCount = taskService.createTaskQuery().count(); long totalTasksCount = taskService.createTaskQuery().count();
assertThat(totalTasksCount).isEqualTo(99); assertThat(totalTasksCount).isEqualTo(99);
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngine.getConfiguration())
.taskCleanupJobAllCompletedSameParentBusiness(true)
.build();
TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService.createTaskQuery().parentBusinessProcessIdIn("DOC_0000000000000000006").list(); taskanaEngine
.getTaskService()
.createTaskQuery()
.parentBusinessProcessIdIn("DOC_0000000000000000006")
.list();
List<String> ids = new ArrayList<>(); List<String> ids = new ArrayList<>();
tasks.forEach( tasks.forEach(
item -> { item -> {
@ -78,19 +98,19 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
ids.add(item.getId()); ids.add(item.getId());
} }
}); });
taskService.deleteTasks(ids); taskanaEngine.getTaskService().deleteTasks(ids);
TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null); TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null);
job.run(); job.run();
totalTasksCount = taskService.createTaskQuery().count(); totalTasksCount = taskanaEngine.getTaskService().createTaskQuery().count();
assertThat(totalTasksCount).isEqualTo(79); assertThat(totalTasksCount).isEqualTo(79);
} }
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void shouldNotCleanCompleteTasksAfterDefinedDay() throws Exception { void shouldNotCleanCompleteTasksAfterDefinedDay() throws Exception {
String taskId = createAndInsertTask(null); String taskId = createAndInsertTask(taskService, null);
taskService.claim(taskId); taskService.claim(taskId);
taskService.completeTask(taskId); taskService.completeTask(taskId);
@ -115,7 +135,7 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
taskanaEngine.getJobService().createJob(job); taskanaEngine.getJobService().createJob(job);
} }
List<ScheduledJob> jobsToRun = getJobMapper().findJobsToRun(Instant.now()); List<ScheduledJob> jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).hasSize(30); assertThat(jobsToRun).hasSize(30);
@ -126,7 +146,7 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
TaskCleanupJob.initializeSchedule(taskanaEngine); TaskCleanupJob.initializeSchedule(taskanaEngine);
jobsToRun = getJobMapper().findJobsToRun(Instant.now()); jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).doesNotContainAnyElementsOf(taskCleanupJobs); assertThat(jobsToRun).doesNotContainAnyElementsOf(taskCleanupJobs);
} }
@ -134,19 +154,27 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@TestFactory @TestFactory
Stream<DynamicTest> Stream<DynamicTest>
should_DeleteCompletedTaskWithParentBusinessEmptyOrNull_When_RunningCleanupJob() { should_DeleteCompletedTaskWithParentBusinessEmptyOrNull_When_RunningCleanupJob()
throws Exception {
Iterator<String> iterator = Arrays.asList("", null).iterator(); Iterator<String> iterator = Arrays.asList("", null).iterator();
taskanaEngine.getConfiguration().setTaskCleanupJobAllCompletedSameParentBusiness(true); TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngine.getConfiguration().setCleanupJobMinimumAge(Duration.ZERO); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngine.getConfiguration())
.taskCleanupJobAllCompletedSameParentBusiness(true)
.cleanupJobMinimumAge(Duration.ZERO)
.build();
TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null); TaskCleanupJob job = new TaskCleanupJob(taskanaEngine, null, null);
TaskService taskService = taskanaEngine.getTaskService();
ThrowingConsumer<String> test = ThrowingConsumer<String> test =
parentBusinessId -> { parentBusinessId -> {
String taskId1 = createAndInsertTask(parentBusinessId); String taskId1 = createAndInsertTask(taskService, parentBusinessId);
taskService.claim(taskId1); taskService.claim(taskId1);
taskService.completeTask(taskId1); taskService.completeTask(taskId1);
String taskId2 = createAndInsertTask(parentBusinessId); String taskId2 = createAndInsertTask(taskService, parentBusinessId);
taskService.claim(taskId2); taskService.claim(taskId2);
job.run(); job.run();
@ -163,7 +191,7 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
@Test @Test
void should_SetNextScheduledJobBasedOnDueDateOfPredecessor_When_RunningTaskCleanupJob() void should_SetNextScheduledJobBasedOnDueDateOfPredecessor_When_RunningTaskCleanupJob()
throws Exception { throws Exception {
JobMapper jobMapper = getJobMapper(); JobMapper jobMapper = getJobMapper(AbstractAccTest.taskanaEngine);
List<ScheduledJob> jobsToRun = jobMapper.findJobsToRun(Instant.now()); List<ScheduledJob> jobsToRun = jobMapper.findJobsToRun(Instant.now());
assertThat(jobsToRun).isEmpty(); assertThat(jobsToRun).isEmpty();
@ -191,12 +219,19 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
void should_ScheduleNextJobAccordingToFirstRun_When_PreviousJobNotExisting() throws Exception { void should_ScheduleNextJobAccordingToFirstRun_When_PreviousJobNotExisting() throws Exception {
Instant firstRun = Instant.now().minus(2, ChronoUnit.MINUTES).truncatedTo(ChronoUnit.MILLIS); Instant firstRun = Instant.now().minus(2, ChronoUnit.MINUTES).truncatedTo(ChronoUnit.MILLIS);
Duration runEvery = Duration.ofMinutes(5); Duration runEvery = Duration.ofMinutes(5);
taskanaEngineConfiguration.setCleanupJobRunEvery(runEvery); TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setCleanupJobFirstRun(firstRun); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.cleanupJobRunEvery(runEvery)
.cleanupJobFirstRun(firstRun)
.build();
TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
TaskCleanupJob.initializeSchedule(taskanaEngine); TaskCleanupJob.initializeSchedule(taskanaEngine);
List<ScheduledJob> nextJobs = getJobMapper().findJobsToRun(Instant.now().plus(runEvery)); List<ScheduledJob> nextJobs =
getJobMapper(taskanaEngine).findJobsToRun(Instant.now().plus(runEvery));
assertThat(nextJobs).extracting(ScheduledJob::getDue).containsExactly(firstRun.plus(runEvery)); assertThat(nextJobs).extracting(ScheduledJob::getDue).containsExactly(firstRun.plus(runEvery));
} }
@ -204,16 +239,21 @@ class TaskCleanupJobAccTest extends AbstractAccTest {
@Test @Test
void should_FindNoJobsToRunUntilFirstRunIsReached_When_CleanupScheduleIsInitialized() void should_FindNoJobsToRunUntilFirstRunIsReached_When_CleanupScheduleIsInitialized()
throws Exception { throws Exception {
taskanaEngineConfiguration.setCleanupJobRunEvery(Duration.ZERO); TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setCleanupJobFirstRun(Instant.now().plus(5, ChronoUnit.MINUTES)); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngine.getConfiguration())
.cleanupJobRunEvery(Duration.ZERO)
.cleanupJobFirstRun(Instant.now().plus(5, ChronoUnit.MINUTES))
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
TaskCleanupJob.initializeSchedule(taskanaEngine); TaskCleanupJob.initializeSchedule(taskanaEngine);
List<ScheduledJob> nextJobs = getJobMapper().findJobsToRun(Instant.now()); List<ScheduledJob> nextJobs = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(nextJobs).isEmpty(); assertThat(nextJobs).isEmpty();
} }
private String createAndInsertTask(String parentBusinessProcessId) throws Exception { private String createAndInsertTask(TaskService taskService, String parentBusinessProcessId)
throws Exception {
Task newTask = taskService.newTask("user-1-1", "DOMAIN_A"); Task newTask = taskService.newTask("user-1-1", "DOMAIN_A");
newTask.setClassificationKey("T2100"); newTask.setClassificationKey("T2100");
newTask.setPrimaryObjRef( newTask.setPrimaryObjRef(

View File

@ -13,8 +13,11 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.BaseQuery.SortDirection; import pro.taskana.common.api.BaseQuery.SortDirection;
import pro.taskana.common.api.ScheduledJob; import pro.taskana.common.api.ScheduledJob;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode;
import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId; import pro.taskana.common.test.security.WithAccessId;
@ -31,10 +34,14 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
// TODO split test class into readOnly & modifying tests to improve performance // TODO split test class into readOnly & modifying tests to improve performance
resetDb(true); resetDb(true);
taskanaEngineConfiguration.setPriorityJobActive(true); taskanaEngineConfiguration =
taskanaEngineConfiguration.setPriorityJobBatchSize(20); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
taskanaEngineConfiguration.setPriorityJobRunEvery(Duration.ofMinutes(30)); .priorityJobActive(true)
taskanaEngineConfiguration.setPriorityJobFirstRun(Instant.parse("2007-12-03T10:15:30.00Z")); .priorityJobBatchSize(20)
.priorityJobRunEvery(Duration.ofMinutes(30))
.priorityJobFirstRun(Instant.parse("2007-12-03T10:15:30.00Z"))
.build();
taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
} }
@Test @Test
@ -49,10 +56,14 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_catchException_When_executedWithWrongSettings() { void should_catchException_When_executedWithWrongSettings() throws Exception {
// given // given
taskanaEngineConfiguration.setPriorityJobBatchSize(0); TaskanaConfiguration taskanaEngineConfiguration =
TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.priorityJobBatchSize(0)
.build();
TaskUpdatePriorityJob job =
new TaskUpdatePriorityJob(TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration));
// then // then
assertThatThrownBy(job::execute).isInstanceOf(SystemException.class); assertThatThrownBy(job::execute).isInstanceOf(SystemException.class);
@ -60,9 +71,13 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_doNothing_When_NotActive() { void should_doNothing_When_NotActive() throws Exception {
// given // given
taskanaEngineConfiguration.setPriorityJobActive(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.priorityJobActive(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine); TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine);
List<String> priorities = List<String> priorities =
taskanaEngine taskanaEngine
@ -85,15 +100,19 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_ScheduleNextJob() throws NoSuchFieldException, IllegalAccessException { void should_ScheduleNextJob() throws Exception {
// given // given
final Instant someTimeInTheFuture = Instant.now().plus(10, ChronoUnit.DAYS); final Instant someTimeInTheFuture = Instant.now().plus(10, ChronoUnit.DAYS);
TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration).build();
TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT);
// when // when
TaskUpdatePriorityJob.initializeSchedule(taskanaEngine); TaskUpdatePriorityJob.initializeSchedule(taskanaEngine);
// then // then
assertThat(getJobMapper().findJobsToRun(someTimeInTheFuture)) assertThat(getJobMapper(taskanaEngine).findJobsToRun(someTimeInTheFuture))
.hasSizeGreaterThanOrEqualTo(1) .hasSizeGreaterThanOrEqualTo(1)
.extracting(ScheduledJob::getType) .extracting(ScheduledJob::getType)
.contains(TaskUpdatePriorityJob.class.getName()); .contains(TaskUpdatePriorityJob.class.getName());
@ -101,12 +120,16 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_readConfigurationForBatchSize() { void should_readConfigurationForBatchSize() throws Exception {
// given // given
taskanaEngineConfiguration.setPriorityJobBatchSize(20); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.priorityJobBatchSize(20)
.build();
// when // when
final TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine); final TaskUpdatePriorityJob job =
new TaskUpdatePriorityJob(TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration));
// then // then
assertThat(job.getBatchSize()).isEqualTo(20); assertThat(job.getBatchSize()).isEqualTo(20);
@ -114,25 +137,33 @@ class TaskUpdatePriorityJobAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
void should_readConfigurationForIsActive() { void should_readConfigurationForIsActive() throws Exception {
// given // given
taskanaEngineConfiguration.setPriorityJobActive(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.priorityJobActive(false)
.build();
// when // when
final TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine); final TaskUpdatePriorityJob job =
new TaskUpdatePriorityJob(TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration));
// then // then
assertThat(job.isJobActive()).isFalse(); assertThat(job.isJobActive()).isFalse();
} }
@Test @Test
void should_containInformation_When_convertedToString() { void should_containInformation_When_convertedToString() throws Exception {
// given // given
taskanaEngineConfiguration.setPriorityJobBatchSize(543); TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setPriorityJobRunEvery(Duration.ofMinutes(30)); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.priorityJobBatchSize(543)
.priorityJobRunEvery(Duration.ofMinutes(30))
.build();
// when // when
final TaskUpdatePriorityJob job = new TaskUpdatePriorityJob(taskanaEngine); final TaskUpdatePriorityJob job =
new TaskUpdatePriorityJob(TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration));
// then // then
assertThat(job).asString().contains("543").contains(Duration.ofMinutes(30).toString()); assertThat(job).asString().contains("543").contains(Duration.ofMinutes(30).toString());

View File

@ -102,7 +102,7 @@ class WorkbasketCleanupJobAccTest extends AbstractAccTest {
taskanaEngine.getJobService().createJob(job); taskanaEngine.getJobService().createJob(job);
} }
List<ScheduledJob> jobsToRun = getJobMapper().findJobsToRun(Instant.now()); List<ScheduledJob> jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).hasSize(30); assertThat(jobsToRun).hasSize(30);
@ -114,7 +114,7 @@ class WorkbasketCleanupJobAccTest extends AbstractAccTest {
WorkbasketCleanupJob.initializeSchedule(taskanaEngine); WorkbasketCleanupJob.initializeSchedule(taskanaEngine);
jobsToRun = getJobMapper().findJobsToRun(Instant.now()); jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).doesNotContainAnyElementsOf(workbasketCleanupJobs); assertThat(jobsToRun).doesNotContainAnyElementsOf(workbasketCleanupJobs);
} }

View File

@ -8,9 +8,12 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.api.exceptions.SystemException;
import pro.taskana.common.api.exceptions.TaskanaRuntimeException; import pro.taskana.common.api.exceptions.TaskanaRuntimeException;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
@ -64,9 +67,14 @@ class SqlConnectionRunnerAccTest extends AbstractAccTest {
@Test @Test
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Disabled("This Test does not make sense anymore")
void should_SetOriginalSchema_When_ExceptionThrown() throws Exception { void should_SetOriginalSchema_When_ExceptionThrown() throws Exception {
taskanaEngine.getConfiguration().setSchemaName("NotExisting"); TaskanaEngine taskanaEngine =
TaskanaEngine.buildTaskanaEngine(
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngine.getConfiguration())
.schemaName("NotExisting")
.build());
SqlConnectionRunner runner = new SqlConnectionRunner(taskanaEngine); SqlConnectionRunner runner = new SqlConnectionRunner(taskanaEngine);
// TSK-1749 // TSK-1749

View File

@ -83,12 +83,12 @@ class PriorityServiceAccTest extends AbstractAccTest {
classification.setPriority(10); classification.setPriority(10);
classificationService.updateClassification(classification); classificationService.updateClassification(classification);
List<ScheduledJob> jobsToRun = getJobMapper().findJobsToRun(Instant.now()); List<ScheduledJob> jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).isEmpty(); assertThat(jobsToRun).isEmpty();
classification.setServiceLevel("P4D"); classification.setServiceLevel("P4D");
classificationService.updateClassification(classification); classificationService.updateClassification(classification);
jobsToRun = getJobMapper().findJobsToRun(Instant.now()); jobsToRun = getJobMapper(taskanaEngine).findJobsToRun(Instant.now());
assertThat(jobsToRun).isEmpty(); assertThat(jobsToRun).isEmpty();
} }
} }

View File

@ -3,7 +3,7 @@ package acceptance.report;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.test.config.DataSourceGenerator; import pro.taskana.common.test.config.DataSourceGenerator;
import pro.taskana.sampledata.SampleDataGenerator; import pro.taskana.sampledata.SampleDataGenerator;
@ -11,14 +11,16 @@ import pro.taskana.sampledata.SampleDataGenerator;
/** Abstract test class for all report building tests. */ /** Abstract test class for all report building tests. */
public abstract class AbstractReportAccTest { public abstract class AbstractReportAccTest {
protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaConfiguration taskanaEngineConfiguration;
protected static TaskanaEngine taskanaEngine; protected static TaskanaEngine taskanaEngine;
protected static void resetDb() throws Exception { protected static void resetDb() throws Exception {
DataSource dataSource = DataSourceGenerator.getDataSource(); DataSource dataSource = DataSourceGenerator.getDataSource();
String schemaName = DataSourceGenerator.getSchemaName(); String schemaName = DataSourceGenerator.getSchemaName();
taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, schemaName); taskanaEngineConfiguration =
taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); new TaskanaConfiguration.Builder(dataSource, false, schemaName)
.germanPublicHolidaysEnabled(false)
.build();
taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration); taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
taskanaEngine.setConnectionManagementMode(TaskanaEngine.ConnectionManagementMode.AUTOCOMMIT); taskanaEngine.setConnectionManagementMode(TaskanaEngine.ConnectionManagementMode.AUTOCOMMIT);
SampleDataGenerator sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); SampleDataGenerator sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName);

View File

@ -20,10 +20,12 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.api.exceptions.ClassificationNotFoundException; import pro.taskana.classification.api.exceptions.ClassificationNotFoundException;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
import pro.taskana.classification.internal.models.ClassificationSummaryImpl; import pro.taskana.classification.internal.models.ClassificationSummaryImpl;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
@ -146,7 +148,13 @@ class CreateTaskAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_CreateTaskWithAdditionalUserInfo() throws Exception { void should_CreateTaskWithAdditionalUserInfo() throws Exception {
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(true); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
TaskService taskService = taskanaEngine.getTaskService();
Task newTask = taskService.newTask("USER-1-1", "DOMAIN_A"); Task newTask = taskService.newTask("USER-1-1", "DOMAIN_A");
newTask.setClassificationKey("T2100"); newTask.setClassificationKey("T2100");
ObjectReferenceImpl objectReference = ObjectReferenceImpl objectReference =
@ -160,8 +168,6 @@ class CreateTaskAccTest extends AbstractAccTest {
assertThat(createdTask).isNotNull(); assertThat(createdTask).isNotNull();
assertThat(createdTask.getOwner()).isEqualTo("user-1-1"); assertThat(createdTask.getOwner()).isEqualTo("user-1-1");
assertThat(createdTask.getOwnerLongName()).isEqualTo("Mustermann, Max - (user-1-1)"); assertThat(createdTask.getOwnerLongName()).isEqualTo("Mustermann, Max - (user-1-1)");
taskanaEngine.getConfiguration().setAddAdditionalUserInfo(false);
} }
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@ -191,28 +197,28 @@ class CreateTaskAccTest extends AbstractAccTest {
@Test @Test
void should_AllowTimestampServiceLevelMismatch_When_ConfigurationAllowsIt() throws Exception { void should_AllowTimestampServiceLevelMismatch_When_ConfigurationAllowsIt() throws Exception {
// Given // Given
try { TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setValidationAllowTimestampServiceLevelMismatch(true); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
Task newTask = taskService.newTask("USER-1-1", "DOMAIN_A"); .validationAllowTimestampServiceLevelMismatch(true)
newTask.setClassificationKey("T6310"); .build();
ObjectReference objectReference = TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567"); Task newTask = taskanaEngine.getTaskService().newTask("USER-1-1", "DOMAIN_A");
newTask.setPrimaryObjRef(objectReference); newTask.setClassificationKey("T6310");
newTask.setOwner("user-1-1"); ObjectReference objectReference =
createObjectReference("COMPANY_A", "SYSTEM_A", "INSTANCE_A", "VNR", "1234567");
newTask.setPrimaryObjRef(objectReference);
newTask.setOwner("user-1-1");
// When // When
Instant planned = Instant.parse("2018-01-02T00:00:00Z"); Instant planned = Instant.parse("2018-01-02T00:00:00Z");
newTask.setPlanned(planned); newTask.setPlanned(planned);
Instant due = Instant.parse("2018-02-15T00:00:00Z"); Instant due = Instant.parse("2018-02-15T00:00:00Z");
newTask.setDue(due); newTask.setDue(due);
Task createdTask = taskService.createTask(newTask); Task createdTask = taskanaEngine.getTaskService().createTask(newTask);
// Then // Then
assertThat(createdTask.getPlanned()).isEqualTo(planned); assertThat(createdTask.getPlanned()).isEqualTo(planned);
assertThat(createdTask.getDue()).isEqualTo(due); assertThat(createdTask.getDue()).isEqualTo(due);
} finally {
taskanaEngineConfiguration.setValidationAllowTimestampServiceLevelMismatch(false);
}
} }
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")

View File

@ -11,6 +11,8 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId; import pro.taskana.common.test.security.WithAccessId;
@ -95,7 +97,11 @@ class GetTaskAccTest extends AbstractAccTest {
@Test @Test
void should_SetTaskOwnerLongNameOfTask_When_PropertyEnabled() throws Exception { void should_SetTaskOwnerLongNameOfTask_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
TaskService taskService = taskanaEngine.getTaskService(); TaskService taskService = taskanaEngine.getTaskService();
Task task = taskService.getTask("TKI:000000000000000000000000000000000000"); Task task = taskService.getTask("TKI:000000000000000000000000000000000000");
@ -107,8 +113,11 @@ class GetTaskAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_NotSetTaskOwnerLongNameOfTask_When_PropertyDisabled() throws Exception { void should_NotSetTaskOwnerLongNameOfTask_When_PropertyDisabled() throws Exception {
TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
TaskService taskService = taskanaEngine.getTaskService(); TaskService taskService = taskanaEngine.getTaskService();
Task task = taskService.getTask("TKI:000000000000000000000000000000000000"); Task task = taskService.getTask("TKI:000000000000000000000000000000000000");

View File

@ -32,6 +32,8 @@ import org.mockito.MockedStatic;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.internal.stubbing.answers.CallsRealMethods; import org.mockito.internal.stubbing.answers.CallsRealMethods;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.internal.util.CollectionUtil; import pro.taskana.common.internal.util.CollectionUtil;
import pro.taskana.common.internal.util.Triplet; import pro.taskana.common.internal.util.Triplet;
@ -59,9 +61,18 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetOwnerLongNameOfTask_When_PropertyEnabled() throws Exception { void should_SetOwnerLongNameOfTask_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService.createTaskQuery().idIn("TKI:000000000000000000000000000000000000").list(); taskanaEngine
.getTaskService()
.createTaskQuery()
.idIn("TKI:000000000000000000000000000000000000")
.list();
assertThat(tasks).hasSize(1); assertThat(tasks).hasSize(1);
String longName = taskanaEngine.getUserService().getUser(tasks.get(0).getOwner()).getLongName(); String longName = taskanaEngine.getUserService().getUser(tasks.get(0).getOwner()).getLongName();
@ -70,10 +81,19 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_NotSetOwnerLongNameOfTask_When_PropertyDisabled() { void should_NotSetOwnerLongNameOfTask_When_PropertyDisabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService.createTaskQuery().idIn("TKI:000000000000000000000000000000000000").list(); taskanaEngine
.getTaskService()
.createTaskQuery()
.idIn("TKI:000000000000000000000000000000000000")
.list();
assertThat(tasks).hasSize(1); assertThat(tasks).hasSize(1);
assertThat(tasks.get(0)).extracting(TaskSummary::getOwnerLongName).isNull(); assertThat(tasks.get(0)).extracting(TaskSummary::getOwnerLongName).isNull();
@ -81,10 +101,16 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-2") @WithAccessId(user = "user-1-2")
@Test @Test
void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameIn() { void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameIn() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
String longName = "Eifrig, Elena - (user-1-2)"; String longName = "Eifrig, Elena - (user-1-2)";
List<TaskSummary> tasks = taskService.createTaskQuery().ownerLongNameIn(longName).list(); List<TaskSummary> tasks =
taskanaEngine.getTaskService().createTaskQuery().ownerLongNameIn(longName).list();
assertThat(tasks) assertThat(tasks)
.hasSize(25) .hasSize(25)
@ -95,10 +121,15 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameNotIn() { void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameNotIn() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.idIn( .idIn(
"TKI:000000000000000000000000000000000000", "TKI:000000000000000000000000000000000000",
@ -114,9 +145,15 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-2") @WithAccessId(user = "user-1-2")
@Test @Test
void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameLike() { void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameLike() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
List<TaskSummary> tasks = taskService.createTaskQuery().ownerLongNameLike("%1-2%").list(); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks =
taskanaEngine.getTaskService().createTaskQuery().ownerLongNameLike("%1-2%").list();
assertThat(tasks) assertThat(tasks)
.hasSize(25) .hasSize(25)
@ -127,9 +164,15 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-2") @WithAccessId(user = "user-1-2")
@Test @Test
void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameNotLike() { void should_SetOwnerLongNameOfTask_When_FilteringWithOwnerLongNameNotLike() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
List<TaskSummary> tasks = taskService.createTaskQuery().ownerLongNameNotLike("%1-1%").list(); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks =
taskanaEngine.getTaskService().createTaskQuery().ownerLongNameNotLike("%1-1%").list();
assertThat(tasks) assertThat(tasks)
.hasSize(25) .hasSize(25)
@ -140,10 +183,20 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_SetOwnerLongNameOfTaskToNull_When_OwnerNotExistingAsUserInDatabase() { void should_SetOwnerLongNameOfTaskToNull_When_OwnerNotExistingAsUserInDatabase()
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); throws Exception {
TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService.createTaskQuery().idIn("TKI:000000000000000000000000000000000041").list(); taskanaEngine
.getTaskService()
.createTaskQuery()
.idIn("TKI:000000000000000000000000000000000041")
.list();
assertThat(tasks).hasSize(1); assertThat(tasks).hasSize(1);
ThrowingCallable call = ThrowingCallable call =
@ -154,10 +207,15 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_OrderByOwnerLongName_When_QueryingTask() { void should_OrderByOwnerLongName_When_QueryingTask() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskSummary> tasks = List<TaskSummary> tasks =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.stateIn(TaskState.CLAIMED) .stateIn(TaskState.CLAIMED)
.ownerNotIn("user-b-1") .ownerNotIn("user-b-1")
@ -166,7 +224,8 @@ class QueryTasksAccTest extends AbstractAccTest {
assertThat(tasks).extracting(TaskSummary::getOwnerLongName).hasSize(18).isSorted(); assertThat(tasks).extracting(TaskSummary::getOwnerLongName).hasSize(18).isSorted();
tasks = tasks =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.stateIn(TaskState.CLAIMED) .stateIn(TaskState.CLAIMED)
.ownerNotIn("user-b-1") .ownerNotIn("user-b-1")
@ -180,10 +239,15 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_ListValues_For_OwnerLongName() { void should_ListValues_For_OwnerLongName() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<String> longNames = List<String> longNames =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.listValues(TaskQueryColumnName.OWNER_LONG_NAME, ASCENDING) .listValues(TaskQueryColumnName.OWNER_LONG_NAME, ASCENDING)
.stream() .stream()
@ -195,7 +259,8 @@ class QueryTasksAccTest extends AbstractAccTest {
.containsExactly("Eifrig, Elena - (user-1-2)", "Mustermann, Max - (user-1-1)"); .containsExactly("Eifrig, Elena - (user-1-2)", "Mustermann, Max - (user-1-1)");
longNames = longNames =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.listValues(TaskQueryColumnName.OWNER_LONG_NAME, DESCENDING) .listValues(TaskQueryColumnName.OWNER_LONG_NAME, DESCENDING)
.stream() .stream()
@ -209,11 +274,16 @@ class QueryTasksAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-2") @WithAccessId(user = "user-1-2")
@Test @Test
void should_ListValuesCorrectly_When_FilteringWithOwnerLongName() { void should_ListValuesCorrectly_When_FilteringWithOwnerLongName() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
String longName = "Eifrig, Elena - (user-1-2)"; String longName = "Eifrig, Elena - (user-1-2)";
List<String> listedValues = List<String> listedValues =
taskService taskanaEngine
.getTaskService()
.createTaskQuery() .createTaskQuery()
.ownerLongNameIn(longName) .ownerLongNameIn(longName)
.orderByTaskId(null) .orderByTaskId(null)
@ -221,19 +291,29 @@ class QueryTasksAccTest extends AbstractAccTest {
assertThat(listedValues).hasSize(25); assertThat(listedValues).hasSize(25);
List<TaskSummary> query = List<TaskSummary> query =
taskService.createTaskQuery().ownerLongNameIn(longName).orderByTaskId(null).list(); taskanaEngine
.getTaskService()
.createTaskQuery()
.ownerLongNameIn(longName)
.orderByTaskId(null)
.list();
assertThat(query).hasSize(25).extracting(TaskSummary::getId).isEqualTo(listedValues); assertThat(query).hasSize(25).extracting(TaskSummary::getId).isEqualTo(listedValues);
} }
@WithAccessId(user = "user-1-2") @WithAccessId(user = "user-1-2")
@Test @Test
void should_CountCorrectly_When_FilteringWithOwnerLongName() { void should_CountCorrectly_When_FilteringWithOwnerLongName() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
String longName = "Eifrig, Elena - (user-1-2)"; String longName = "Eifrig, Elena - (user-1-2)";
long count = taskService.createTaskQuery().ownerLongNameIn(longName).count(); long count = taskanaEngine.getTaskService().createTaskQuery().ownerLongNameIn(longName).count();
assertThat(count).isEqualTo(25); assertThat(count).isEqualTo(25);
List<TaskSummary> query = taskService.createTaskQuery().ownerLongNameIn(longName).list(); List<TaskSummary> query =
taskanaEngine.getTaskService().createTaskQuery().ownerLongNameIn(longName).list();
assertThat(query.size()).isEqualTo(count); assertThat(query.size()).isEqualTo(count);
} }

View File

@ -23,7 +23,9 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.models.ClassificationSummary; import pro.taskana.classification.api.models.ClassificationSummary;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.ConcurrencyException; import pro.taskana.common.api.exceptions.ConcurrencyException;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
@ -70,9 +72,12 @@ class UpdateTaskAccTest extends AbstractAccTest {
@Test @Test
void should_PreventTimestampServiceLevelMismatch_When_ConfigurationPreventsIt() throws Exception { void should_PreventTimestampServiceLevelMismatch_When_ConfigurationPreventsIt() throws Exception {
// Given // Given
TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setValidationAllowTimestampServiceLevelMismatch(false); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
Task task = taskService.getTask("TKI:000000000000000000000000000000000000"); .validationAllowTimestampServiceLevelMismatch(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
Task task = taskanaEngine.getTaskService().getTask("TKI:000000000000000000000000000000000000");
// When // When
Instant planned = Instant.parse("2018-03-02T00:00:00Z"); Instant planned = Instant.parse("2018-03-02T00:00:00Z");
task.setPlanned(planned); task.setPlanned(planned);
@ -80,7 +85,7 @@ class UpdateTaskAccTest extends AbstractAccTest {
task.setDue(due); task.setDue(due);
// Then // Then
assertThatThrownBy(() -> taskService.updateTask(task)) assertThatThrownBy(() -> taskanaEngine.getTaskService().updateTask(task))
.isInstanceOf(InvalidArgumentException.class) .isInstanceOf(InvalidArgumentException.class)
.hasMessageContaining("not matching the service level"); .hasMessageContaining("not matching the service level");
} }
@ -88,24 +93,24 @@ class UpdateTaskAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_AllowTimestampServiceLevelMismatch_When_ConfigurationAllowsIt() throws Exception { void should_AllowTimestampServiceLevelMismatch_When_ConfigurationAllowsIt() throws Exception {
try { // Given
// Given TaskanaConfiguration taskanaEngineConfiguration =
taskanaEngineConfiguration.setValidationAllowTimestampServiceLevelMismatch(true); new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
Task task = taskService.getTask("TKI:000000000000000000000000000000000000"); .validationAllowTimestampServiceLevelMismatch(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
Task task = taskanaEngine.getTaskService().getTask("TKI:000000000000000000000000000000000000");
// When // When
Instant planned = Instant.parse("2018-01-02T00:00:00Z"); Instant planned = Instant.parse("2018-01-02T00:00:00Z");
task.setPlanned(planned); task.setPlanned(planned);
Instant due = Instant.parse("2018-02-15T00:00:00Z"); Instant due = Instant.parse("2018-02-15T00:00:00Z");
task.setDue(due); task.setDue(due);
Task updateTask = taskService.updateTask(task); Task updateTask = taskanaEngine.getTaskService().updateTask(task);
// Then // Then
assertThat(updateTask.getPlanned()).isEqualTo(planned); assertThat(updateTask.getPlanned()).isEqualTo(planned);
assertThat(updateTask.getDue()).isEqualTo(due); assertThat(updateTask.getDue()).isEqualTo(due);
} finally {
taskanaEngineConfiguration.setValidationAllowTimestampServiceLevelMismatch(false);
}
} }
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")

View File

@ -11,6 +11,8 @@ import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TimeInterval; import pro.taskana.common.api.TimeInterval;
import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.JaasExtension;
import pro.taskana.common.test.security.WithAccessId; import pro.taskana.common.test.security.WithAccessId;
@ -206,10 +208,15 @@ class QueryTaskCommentAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_ReturnListedValues_For_QueryColumnCreatorLongName() { void should_ReturnListedValues_For_QueryColumnCreatorLongName() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<String> listedValues = List<String> listedValues =
taskService taskanaEngine
.getTaskService()
.createTaskCommentQuery() .createTaskCommentQuery()
.listValues(TaskCommentQueryColumnName.CREATOR_FULL_NAME, null); .listValues(TaskCommentQueryColumnName.CREATOR_FULL_NAME, null);
assertThat(listedValues).hasSize(3); assertThat(listedValues).hasSize(3);
@ -276,9 +283,14 @@ class QueryTaskCommentAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_SetTaskCreatorFullNameOfTaskComment_When_PropertyEnabled() throws Exception { void should_SetTaskCreatorFullNameOfTaskComment_When_PropertyEnabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskComment> taskComments = List<TaskComment> taskComments =
taskService taskanaEngine
.getTaskService()
.createTaskCommentQuery() .createTaskCommentQuery()
.idIn("TCI:000000000000000000000000000000000000") .idIn("TCI:000000000000000000000000000000000000")
.list(); .list();
@ -293,10 +305,15 @@ class QueryTaskCommentAccTest extends AbstractAccTest {
@WithAccessId(user = "user-1-1") @WithAccessId(user = "user-1-1")
@Test @Test
void should_NotSetTaskCreatorFullNameOfTaskComment_When_PropertyDisabled() { void should_NotSetTaskCreatorFullNameOfTaskComment_When_PropertyDisabled() throws Exception {
taskanaEngineConfiguration.setAddAdditionalUserInfo(false); TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(false)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskComment> taskComments = List<TaskComment> taskComments =
taskService taskanaEngine
.getTaskService()
.createTaskCommentQuery() .createTaskCommentQuery()
.idIn("TCI:000000000000000000000000000000000000") .idIn("TCI:000000000000000000000000000000000000")
.list(); .list();
@ -307,10 +324,16 @@ class QueryTaskCommentAccTest extends AbstractAccTest {
@WithAccessId(user = "admin") @WithAccessId(user = "admin")
@Test @Test
void should_SetTaskCreatorFullNameOfTaskCommentToNull_When_NotExistingAsUserInDatabase() { void should_SetTaskCreatorFullNameOfTaskCommentToNull_When_NotExistingAsUserInDatabase()
taskanaEngineConfiguration.setAddAdditionalUserInfo(true); throws Exception {
TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaConfiguration.Builder(AbstractAccTest.taskanaEngineConfiguration)
.addAdditionalUserInfo(true)
.build();
TaskanaEngine taskanaEngine = TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
List<TaskComment> taskComments = List<TaskComment> taskComments =
taskService taskanaEngine
.getTaskService()
.createTaskCommentQuery() .createTaskCommentQuery()
.idIn("TCI:000000000000000000000000000000000008") .idIn("TCI:000000000000000000000000000000000008")
.list(); .list();

View File

@ -5,26 +5,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import pro.taskana.classification.api.exceptions.ClassificationAlreadyExistException;
import pro.taskana.classification.api.exceptions.ClassificationNotFoundException;
import pro.taskana.classification.api.exceptions.MalformedServiceLevelException;
import pro.taskana.classification.api.models.Classification; import pro.taskana.classification.api.models.Classification;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.exceptions.DomainNotFoundException;
import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.task.api.TaskService; import pro.taskana.task.api.TaskService;
import pro.taskana.task.api.exceptions.AttachmentPersistenceException;
import pro.taskana.task.api.exceptions.InvalidOwnerException;
import pro.taskana.task.api.exceptions.InvalidStateException;
import pro.taskana.task.api.exceptions.ObjectReferencePersistenceException;
import pro.taskana.task.api.exceptions.TaskAlreadyExistException;
import pro.taskana.task.api.exceptions.TaskNotFoundException;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
import pro.taskana.task.internal.models.ObjectReferenceImpl; import pro.taskana.task.internal.models.ObjectReferenceImpl;
import pro.taskana.workbasket.api.WorkbasketType; import pro.taskana.workbasket.api.WorkbasketType;
import pro.taskana.workbasket.api.exceptions.WorkbasketAlreadyExistException;
import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException;
import pro.taskana.workbasket.api.models.Workbasket; import pro.taskana.workbasket.api.models.Workbasket;
/** TODO. */ /** TODO. */
@ -37,12 +23,7 @@ public class ExampleBootstrap {
@Autowired private TaskanaEngine taskanaEngine; @Autowired private TaskanaEngine taskanaEngine;
@PostConstruct @PostConstruct
public void test() public void test() throws Exception {
throws InvalidArgumentException, WorkbasketAlreadyExistException, DomainNotFoundException,
NotAuthorizedException, ClassificationAlreadyExistException,
MalformedServiceLevelException, TaskAlreadyExistException, WorkbasketNotFoundException,
ClassificationNotFoundException, AttachmentPersistenceException, TaskNotFoundException,
InvalidOwnerException, InvalidStateException, ObjectReferencePersistenceException {
System.out.println("---------------------------> Start App"); System.out.println("---------------------------> Start App");
Workbasket wb = taskanaEngine.getWorkbasketService().newWorkbasket("workbasket", "DOMAIN_A"); Workbasket wb = taskanaEngine.getWorkbasketService().newWorkbasket("workbasket", "DOMAIN_A");

View File

@ -13,7 +13,7 @@ import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.SpringTaskanaEngine; import pro.taskana.common.internal.SpringTaskanaEngine;
@ -50,12 +50,12 @@ public class TaskanaConfig {
} }
@Bean @Bean
public TaskanaEngineConfiguration taskanaEngineConfiguration(DataSource dataSource) { public TaskanaConfiguration taskanaEngineConfiguration(DataSource dataSource) {
return new TaskanaEngineConfiguration(dataSource, true, false, schemaName); return new TaskanaConfiguration.Builder(dataSource, true, schemaName, false).build();
} }
@Bean @Bean
public TaskanaEngine taskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) public TaskanaEngine taskanaEngine(TaskanaConfiguration taskanaEngineConfiguration)
throws SQLException { throws SQLException {
return SpringTaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration); return SpringTaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
} }

View File

@ -2,7 +2,7 @@ package pro.taskana.common.internal;
import java.sql.SQLException; import java.sql.SQLException;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
public interface SpringTaskanaEngine extends TaskanaEngine { public interface SpringTaskanaEngine extends TaskanaEngine {
@ -11,18 +11,17 @@ public interface SpringTaskanaEngine extends TaskanaEngine {
* This method creates the {@linkplain SpringTaskanaEngine} with {@linkplain * This method creates the {@linkplain SpringTaskanaEngine} with {@linkplain
* ConnectionManagementMode#PARTICIPATE }. * ConnectionManagementMode#PARTICIPATE }.
* *
* @see SpringTaskanaEngine#buildTaskanaEngine(TaskanaEngineConfiguration, * @see SpringTaskanaEngine#buildTaskanaEngine(TaskanaConfiguration, ConnectionManagementMode)
* ConnectionManagementMode)
*/ */
@SuppressWarnings("checkstyle:JavadocMethod") @SuppressWarnings("checkstyle:JavadocMethod")
static SpringTaskanaEngine buildTaskanaEngine(TaskanaEngineConfiguration configuration) static SpringTaskanaEngine buildTaskanaEngine(TaskanaConfiguration configuration)
throws SQLException { throws SQLException {
return SpringTaskanaEngine.buildTaskanaEngine( return SpringTaskanaEngine.buildTaskanaEngine(
configuration, ConnectionManagementMode.PARTICIPATE); configuration, ConnectionManagementMode.PARTICIPATE);
} }
/** /**
* Builds an {@linkplain SpringTaskanaEngine} based on {@linkplain TaskanaEngineConfiguration} and * Builds an {@linkplain SpringTaskanaEngine} based on {@linkplain TaskanaConfiguration} and
* SqlConnectionMode. * SqlConnectionMode.
* *
* @param configuration complete taskanaEngineConfig to build the engine * @param configuration complete taskanaEngineConfig to build the engine
@ -31,7 +30,7 @@ public interface SpringTaskanaEngine extends TaskanaEngine {
* @throws SQLException when the db schema could not be initialized * @throws SQLException when the db schema could not be initialized
*/ */
static SpringTaskanaEngine buildTaskanaEngine( static SpringTaskanaEngine buildTaskanaEngine(
TaskanaEngineConfiguration configuration, ConnectionManagementMode connectionManagementMode) TaskanaConfiguration configuration, ConnectionManagementMode connectionManagementMode)
throws SQLException { throws SQLException {
return SpringTaskanaEngineImpl.createTaskanaEngine(configuration, connectionManagementMode); return SpringTaskanaEngineImpl.createTaskanaEngine(configuration, connectionManagementMode);
} }

View File

@ -3,13 +3,13 @@ package pro.taskana.common.internal;
import java.sql.SQLException; import java.sql.SQLException;
import org.mybatis.spring.transaction.SpringManagedTransactionFactory; import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
/** This class configures the TaskanaEngine for spring. */ /** This class configures the TaskanaEngine for spring. */
public class SpringTaskanaEngineImpl extends TaskanaEngineImpl implements SpringTaskanaEngine { public class SpringTaskanaEngineImpl extends TaskanaEngineImpl implements SpringTaskanaEngine {
public SpringTaskanaEngineImpl( public SpringTaskanaEngineImpl(
TaskanaEngineConfiguration taskanaEngineConfiguration, ConnectionManagementMode mode) TaskanaConfiguration taskanaEngineConfiguration, ConnectionManagementMode mode)
throws SQLException { throws SQLException {
super(taskanaEngineConfiguration, mode); super(taskanaEngineConfiguration, mode);
this.transactionFactory = new SpringManagedTransactionFactory(); this.transactionFactory = new SpringManagedTransactionFactory();
@ -17,7 +17,7 @@ public class SpringTaskanaEngineImpl extends TaskanaEngineImpl implements Spring
} }
public static SpringTaskanaEngine createTaskanaEngine( public static SpringTaskanaEngine createTaskanaEngine(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
ConnectionManagementMode connectionManagementMode) ConnectionManagementMode connectionManagementMode)
throws SQLException { throws SQLException {
return new SpringTaskanaEngineImpl(taskanaEngineConfiguration, connectionManagementMode); return new SpringTaskanaEngineImpl(taskanaEngineConfiguration, connectionManagementMode);

View File

@ -1,8 +1,9 @@
package pro.taskana.testapi; package pro.taskana.testapi;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
public interface TaskanaEngineConfigurationModifier { public interface TaskanaEngineConfigurationModifier {
void modify(TaskanaEngineConfiguration taskanaEngineConfiguration); TaskanaConfiguration.Builder modify(
TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder);
} }

View File

@ -15,7 +15,7 @@ import org.junit.platform.commons.JUnitException;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
import org.mockito.Mockito; import org.mockito.Mockito;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.internal.ClassificationServiceImpl; import pro.taskana.classification.internal.ClassificationServiceImpl;
import pro.taskana.common.api.ConfigurationService; import pro.taskana.common.api.ConfigurationService;
@ -61,13 +61,13 @@ public class TaskanaInitializationExtension implements TestInstancePostProcessor
|| isAnnotated(testClass, WithServiceProviders.class) || isAnnotated(testClass, WithServiceProviders.class)
|| testInstance instanceof TaskanaEngineConfigurationModifier) { || testInstance instanceof TaskanaEngineConfigurationModifier) {
Store store = getClassLevelStore(context); Store store = getClassLevelStore(context);
TaskanaEngineConfiguration taskanaEngineConfiguration = TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder =
createDefaultTaskanaEngineConfiguration(store); createDefaultTaskanaEngineConfigurationBuilder(store);
if (testInstance instanceof TaskanaEngineConfigurationModifier) { if (testInstance instanceof TaskanaEngineConfigurationModifier) {
TaskanaEngineConfigurationModifier modifier = TaskanaEngineConfigurationModifier modifier =
(TaskanaEngineConfigurationModifier) testInstance; (TaskanaEngineConfigurationModifier) testInstance;
modifier.modify(taskanaEngineConfiguration); taskanaEngineConfigurationBuilder = modifier.modify(taskanaEngineConfigurationBuilder);
} }
TaskanaEngine taskanaEngine; TaskanaEngine taskanaEngine;
@ -79,7 +79,7 @@ public class TaskanaInitializationExtension implements TestInstancePostProcessor
staticMock.when(() -> SpiLoader.load(spi)).thenReturn(serviceProviders)); staticMock.when(() -> SpiLoader.load(spi)).thenReturn(serviceProviders));
taskanaEngine = taskanaEngine =
TaskanaEngine.buildTaskanaEngine( TaskanaEngine.buildTaskanaEngine(
taskanaEngineConfiguration, ConnectionManagementMode.AUTOCOMMIT); taskanaEngineConfigurationBuilder.build(), ConnectionManagementMode.AUTOCOMMIT);
} }
store.put(STORE_TASKANA_ENTITY_MAP, generateTaskanaEntityMap(taskanaEngine)); store.put(STORE_TASKANA_ENTITY_MAP, generateTaskanaEntityMap(taskanaEngine));
@ -95,7 +95,8 @@ public class TaskanaInitializationExtension implements TestInstancePostProcessor
return instanceByClass; return instanceByClass;
} }
private static TaskanaEngineConfiguration createDefaultTaskanaEngineConfiguration(Store store) { private static TaskanaConfiguration.Builder createDefaultTaskanaEngineConfigurationBuilder(
Store store) {
String schemaName = store.get(TestContainerExtension.STORE_SCHEMA_NAME, String.class); String schemaName = store.get(TestContainerExtension.STORE_SCHEMA_NAME, String.class);
if (schemaName == null) { if (schemaName == null) {
throw new JUnitException("Expected schemaName to be defined in store, but it's not."); throw new JUnitException("Expected schemaName to be defined in store, but it's not.");
@ -105,7 +106,7 @@ public class TaskanaInitializationExtension implements TestInstancePostProcessor
throw new JUnitException("Expected dataSource to be defined in store, but it's not."); throw new JUnitException("Expected dataSource to be defined in store, but it's not.");
} }
return new TaskanaEngineConfiguration(dataSource, false, schemaName); return new TaskanaConfiguration.Builder(dataSource, false, schemaName);
} }
private static Map<Class<?>, Object> generateTaskanaEntityMap(TaskanaEngine taskanaEngine) private static Map<Class<?>, Object> generateTaskanaEntityMap(TaskanaEngine taskanaEngine)
@ -121,7 +122,7 @@ public class TaskanaInitializationExtension implements TestInstancePostProcessor
UserService userService = taskanaEngine.getUserService(); UserService userService = taskanaEngine.getUserService();
SqlSession sqlSession = taskanaEngineProxy.getSqlSession(); SqlSession sqlSession = taskanaEngineProxy.getSqlSession();
return Map.ofEntries( return Map.ofEntries(
Map.entry(TaskanaEngineConfiguration.class, taskanaEngine.getConfiguration()), Map.entry(TaskanaConfiguration.class, taskanaEngine.getConfiguration()),
Map.entry(TaskanaEngineImpl.class, taskanaEngine), Map.entry(TaskanaEngineImpl.class, taskanaEngine),
Map.entry(TaskanaEngine.class, taskanaEngine), Map.entry(TaskanaEngine.class, taskanaEngine),
Map.entry(InternalTaskanaEngine.class, taskanaEngineProxy.getEngine()), Map.entry(InternalTaskanaEngine.class, taskanaEngineProxy.getEngine()),

View File

@ -71,6 +71,24 @@ public class TestContainerExtension implements InvocationInterceptor {
return invocation.proceed(); return invocation.proceed();
} }
public static DataSource createDataSourceForH2() {
PooledDataSource ds =
new PooledDataSource(
Thread.currentThread().getContextClassLoader(),
"org.h2.Driver",
"jdbc:h2:mem:"
+ "taskana"
+ ";NON_KEYWORDS=KEY,VALUE;LOCK_MODE=0;"
+ "INIT=CREATE SCHEMA IF NOT EXISTS TASKANA\\;"
+ "SET COLLATION DEFAULT_de_DE ",
"sa",
"sa");
ds.setPoolTimeToWait(50);
ds.forceCloseAll(); // otherwise, the MyBatis pool is not initialized correctly
return ds;
}
private static void copyValue(String key, Store source, Store destination) { private static void copyValue(String key, Store source, Store destination) {
Object value = source.get(key); Object value = source.get(key);
destination.put(key, value); destination.put(key, value);
@ -96,22 +114,4 @@ public class TestContainerExtension implements InvocationInterceptor {
} }
return db; return db;
} }
private static DataSource createDataSourceForH2() {
PooledDataSource ds =
new PooledDataSource(
Thread.currentThread().getContextClassLoader(),
"org.h2.Driver",
"jdbc:h2:mem:"
+ "taskana"
+ ";NON_KEYWORDS=KEY,VALUE;LOCK_MODE=0;"
+ "INIT=CREATE SCHEMA IF NOT EXISTS TASKANA\\;"
+ "SET COLLATION DEFAULT_de_DE ",
"sa",
"sa");
ds.setPoolTimeToWait(50);
ds.forceCloseAll(); // otherwise, the MyBatis pool is not initialized correctly
return ds;
}
} }

View File

@ -4,7 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.classification.internal.ClassificationServiceImpl; import pro.taskana.classification.internal.ClassificationServiceImpl;
import pro.taskana.common.api.ConfigurationService; import pro.taskana.common.api.ConfigurationService;
@ -30,8 +30,8 @@ import pro.taskana.workbasket.internal.WorkbasketServiceImpl;
@TaskanaIntegrationTest @TaskanaIntegrationTest
class TaskanaDependencyInjectionExtensionTest { class TaskanaDependencyInjectionExtensionTest {
TaskanaEngineConfiguration taskanaEngineConfigurationNotAnnotated; TaskanaConfiguration taskanaEngineConfigurationNotAnnotated;
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@TaskanaInject TaskanaEngine taskanaEngine; @TaskanaInject TaskanaEngine taskanaEngine;
@TaskanaInject TaskanaEngine taskanaEngine2; @TaskanaInject TaskanaEngine taskanaEngine2;
@TaskanaInject TaskanaEngineImpl taskanaEngineImpl; @TaskanaInject TaskanaEngineImpl taskanaEngineImpl;
@ -67,7 +67,7 @@ class TaskanaDependencyInjectionExtensionTest {
@Test @Test
void should_InjectTaskanaEngineConfiguration_When_FieldIsAnnotatedOrDeclaredAsParameter( void should_InjectTaskanaEngineConfiguration_When_FieldIsAnnotatedOrDeclaredAsParameter(
TaskanaEngineConfiguration taskanaEngineConfiguration) { TaskanaConfiguration taskanaEngineConfiguration) {
assertThat(taskanaEngineConfiguration).isSameAs(this.taskanaEngineConfiguration).isNotNull(); assertThat(taskanaEngineConfiguration).isSameAs(this.taskanaEngineConfiguration).isNotNull();
} }

View File

@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.spi.priority.api.PriorityServiceProvider; import pro.taskana.spi.priority.api.PriorityServiceProvider;
import pro.taskana.spi.priority.internal.PriorityServiceManager; import pro.taskana.spi.priority.internal.PriorityServiceManager;
@ -19,7 +19,7 @@ import pro.taskana.testapi.TaskanaInitializationExtensionTest.NestedTestClassWit
@TaskanaIntegrationTest @TaskanaIntegrationTest
class TaskanaInitializationExtensionTest { class TaskanaInitializationExtensionTest {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_UseDefaultTaskanaEngine_When_TestIsCreated() { void should_UseDefaultTaskanaEngine_When_TestIsCreated() {
@ -31,7 +31,7 @@ class TaskanaInitializationExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class ReuseTaskana { class ReuseTaskana {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_useTopLevelTaskanaInstance_For_NestedTestClasses() { void should_useTopLevelTaskanaInstance_For_NestedTestClasses() {
@ -44,11 +44,12 @@ class TaskanaInitializationExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class ModifiedTaskanaEngineConfig implements TaskanaEngineConfigurationModifier { class ModifiedTaskanaEngineConfig implements TaskanaEngineConfigurationModifier {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Override @Override
public void modify(TaskanaEngineConfiguration taskanaEngineConfiguration) { public TaskanaConfiguration.Builder modify(
taskanaEngineConfiguration.setDomains(List.of("A", "B")); TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder.domains(List.of("A", "B"));
} }
@Test @Test
@ -68,7 +69,7 @@ class TaskanaInitializationExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassAnnotatedWithCleanTaskanaContext { class NestedTestClassAnnotatedWithCleanTaskanaContext {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_createNewTaskanaInstance_For_NestedTestClassAnnotatedWithCleanTaskanaContext() { void should_createNewTaskanaInstance_For_NestedTestClassAnnotatedWithCleanTaskanaContext() {
@ -89,7 +90,7 @@ class TaskanaInitializationExtensionTest {
@Nested @Nested
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassWithServiceProvider { class NestedTestClassWithServiceProvider {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@TaskanaInject TaskanaEngine taskanaEngine; @TaskanaInject TaskanaEngine taskanaEngine;
@Test @Test
@ -132,7 +133,7 @@ class TaskanaInitializationExtensionTest {
@Nested @Nested
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassWithMultipleServiceProviders { class NestedTestClassWithMultipleServiceProviders {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@TaskanaInject TaskanaEngine taskanaEngine; @TaskanaInject TaskanaEngine taskanaEngine;
@Test @Test

View File

@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.TestInstance.Lifecycle;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.spi.priority.api.PriorityServiceProvider; import pro.taskana.spi.priority.api.PriorityServiceProvider;
import pro.taskana.task.api.models.TaskSummary; import pro.taskana.task.api.models.TaskSummary;
import pro.taskana.testapi.TestContainerExtensionTest.NestedTestClassWithServiceProvider.DummyPriorityServiceProvider; import pro.taskana.testapi.TestContainerExtensionTest.NestedTestClassWithServiceProvider.DummyPriorityServiceProvider;
@ -17,7 +17,7 @@ import pro.taskana.testapi.TestContainerExtensionTest.NestedTestClassWithService
@TaskanaIntegrationTest @TaskanaIntegrationTest
class TestContainerExtensionTest { class TestContainerExtensionTest {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_CreateDataSource_For_TopLevelTestClass() { void should_CreateDataSource_For_TopLevelTestClass() {
@ -37,7 +37,7 @@ class TestContainerExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClass { class NestedTestClass {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_ReuseDataSource_For_NestedTestClass() { void should_ReuseDataSource_For_NestedTestClass() {
@ -62,11 +62,12 @@ class TestContainerExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassWithConfigurationModifier implements TaskanaEngineConfigurationModifier { class NestedTestClassWithConfigurationModifier implements TaskanaEngineConfigurationModifier {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Override @Override
public void modify(TaskanaEngineConfiguration taskanaEngineConfiguration) { public TaskanaConfiguration.Builder modify(
// do nothing TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder;
} }
@Test @Test
@ -93,7 +94,7 @@ class TestContainerExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassAnnotatedWithCleanTaskanaContext { class NestedTestClassAnnotatedWithCleanTaskanaContext {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() { void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
@ -118,7 +119,7 @@ class TestContainerExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedNestedTestClassAnnotatedWithCleanTaskanaContext { class NestedNestedTestClassAnnotatedWithCleanTaskanaContext {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() { void should_ReuseDataSource_For_NestedTestAnnotatedWithCleanTaskanaContext() {
@ -160,11 +161,12 @@ class TestContainerExtensionTest {
class NestedTestClassAnnotatedWithCleanTaskanaContextAndConfigModifier class NestedTestClassAnnotatedWithCleanTaskanaContextAndConfigModifier
implements TaskanaEngineConfigurationModifier { implements TaskanaEngineConfigurationModifier {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Override @Override
public void modify(TaskanaEngineConfiguration taskanaEngineConfiguration) { public TaskanaConfiguration.Builder modify(
// do nothing TaskanaConfiguration.Builder taskanaEngineConfigurationBuilder) {
return taskanaEngineConfigurationBuilder;
} }
@Test @Test
@ -193,7 +195,7 @@ class TestContainerExtensionTest {
@TestInstance(Lifecycle.PER_CLASS) @TestInstance(Lifecycle.PER_CLASS)
class NestedTestClassWithServiceProvider { class NestedTestClassWithServiceProvider {
@TaskanaInject TaskanaEngineConfiguration taskanaEngineConfiguration; @TaskanaInject TaskanaConfiguration taskanaEngineConfiguration;
@Test @Test
void should_ReuseDataSource_For_NestedTestClassWithServiceProvider() { void should_ReuseDataSource_For_NestedTestClassWithServiceProvider() {

View File

@ -10,7 +10,7 @@ import org.springframework.context.annotation.DependsOn;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.configuration.DbSchemaCreator; import pro.taskana.common.internal.configuration.DbSchemaCreator;
import pro.taskana.sampledata.SampleDataGenerator; import pro.taskana.sampledata.SampleDataGenerator;
@ -26,7 +26,7 @@ public class ExampleRestConfiguration {
@Bean @Bean
@DependsOn("taskanaEngineConfiguration") // generate sample data after schema was inserted @DependsOn("taskanaEngineConfiguration") // generate sample data after schema was inserted
public SampleDataGenerator generateSampleData( public SampleDataGenerator generateSampleData(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
DataSource dataSource, DataSource dataSource,
@Value("${generateSampleData:true}") boolean generateSampleData) @Value("${generateSampleData:true}") boolean generateSampleData)
throws SQLException { throws SQLException {
@ -43,7 +43,7 @@ public class ExampleRestConfiguration {
@Bean @Bean
@DependsOn("generateSampleData") @DependsOn("generateSampleData")
public TaskanaEngine getTaskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) public TaskanaEngine getTaskanaEngine(TaskanaConfiguration taskanaEngineConfiguration)
throws SQLException { throws SQLException {
return TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration); return TaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
} }

View File

@ -12,7 +12,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.SpringHandlerInstantiator; import org.springframework.http.converter.json.SpringHandlerInstantiator;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.classification.api.ClassificationService; import pro.taskana.classification.api.ClassificationService;
import pro.taskana.common.api.ConfigurationService; import pro.taskana.common.api.ConfigurationService;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
@ -72,15 +72,15 @@ public class RestConfiguration {
@Bean @Bean
@ConditionalOnMissingBean(TaskanaEngine.class) @ConditionalOnMissingBean(TaskanaEngine.class)
public TaskanaEngine getTaskanaEngine(TaskanaEngineConfiguration taskanaEngineConfiguration) public TaskanaEngine getTaskanaEngine(TaskanaConfiguration taskanaEngineConfiguration)
throws SQLException { throws SQLException {
return SpringTaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration); return SpringTaskanaEngine.buildTaskanaEngine(taskanaEngineConfiguration);
} }
@Bean @Bean
@ConditionalOnMissingBean(TaskanaEngineConfiguration.class) @ConditionalOnMissingBean(TaskanaConfiguration.class)
public TaskanaEngineConfiguration taskanaEngineConfiguration(DataSource dataSource) { public TaskanaConfiguration taskanaEngineConfiguration(DataSource dataSource) {
return new TaskanaEngineConfiguration(dataSource, true, true, schemaName); return new TaskanaConfiguration.Builder(dataSource, true, schemaName).build();
} }
// Needed for injection into jackson deserializer. // Needed for injection into jackson deserializer.

View File

@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.ConfigurationService; import pro.taskana.common.api.ConfigurationService;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.security.CurrentUserContext; import pro.taskana.common.api.security.CurrentUserContext;
@ -25,14 +25,14 @@ import pro.taskana.common.rest.models.VersionRepresentationModel;
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL) @EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class TaskanaEngineController { public class TaskanaEngineController {
private final TaskanaEngineConfiguration taskanaEngineConfiguration; private final TaskanaConfiguration taskanaEngineConfiguration;
private final TaskanaEngine taskanaEngine; private final TaskanaEngine taskanaEngine;
private final CurrentUserContext currentUserContext; private final CurrentUserContext currentUserContext;
private final ConfigurationService configurationService; private final ConfigurationService configurationService;
@Autowired @Autowired
TaskanaEngineController( TaskanaEngineController(
TaskanaEngineConfiguration taskanaEngineConfiguration, TaskanaConfiguration taskanaEngineConfiguration,
TaskanaEngine taskanaEngine, TaskanaEngine taskanaEngine,
CurrentUserContext currentUserContext, CurrentUserContext currentUserContext,
ConfigurationService configurationService) { ConfigurationService configurationService) {
@ -159,7 +159,7 @@ public class TaskanaEngineController {
@Transactional(readOnly = true, rollbackFor = Exception.class) @Transactional(readOnly = true, rollbackFor = Exception.class)
public ResponseEntity<VersionRepresentationModel> currentVersion() { public ResponseEntity<VersionRepresentationModel> currentVersion() {
VersionRepresentationModel resource = new VersionRepresentationModel(); VersionRepresentationModel resource = new VersionRepresentationModel();
resource.setVersion(TaskanaEngineConfiguration.class.getPackage().getImplementationVersion()); resource.setVersion(TaskanaConfiguration.class.getPackage().getImplementationVersion());
return ResponseEntity.ok(resource); return ResponseEntity.ok(resource);
} }
} }

View File

@ -28,7 +28,7 @@ import org.springframework.ldap.filter.WhitespaceWildcardsFilter;
import org.springframework.ldap.support.LdapNameBuilder; import org.springframework.ldap.support.LdapNameBuilder;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.api.exceptions.SystemException;
@ -43,7 +43,7 @@ public class LdapClient {
private static final Logger LOGGER = LoggerFactory.getLogger(LdapClient.class); private static final Logger LOGGER = LoggerFactory.getLogger(LdapClient.class);
private static final String CN = "cn"; private static final String CN = "cn";
private final TaskanaEngineConfiguration taskanaEngineConfiguration; private final TaskanaConfiguration taskanaEngineConfiguration;
private final Environment env; private final Environment env;
private final LdapTemplate ldapTemplate; private final LdapTemplate ldapTemplate;
private final boolean useLowerCaseForAccessIds; private final boolean useLowerCaseForAccessIds;
@ -54,13 +54,11 @@ public class LdapClient {
@Autowired @Autowired
public LdapClient( public LdapClient(
Environment env, Environment env, LdapTemplate ldapTemplate, TaskanaConfiguration taskanaEngineConfiguration) {
LdapTemplate ldapTemplate,
TaskanaEngineConfiguration taskanaEngineConfiguration) {
this.env = env; this.env = env;
this.ldapTemplate = ldapTemplate; this.ldapTemplate = ldapTemplate;
this.taskanaEngineConfiguration = taskanaEngineConfiguration; this.taskanaEngineConfiguration = taskanaEngineConfiguration;
this.useLowerCaseForAccessIds = TaskanaEngineConfiguration.shouldUseLowerCaseForAccessIds(); this.useLowerCaseForAccessIds = TaskanaConfiguration.shouldUseLowerCaseForAccessIds();
} }
/** /**

View File

@ -29,7 +29,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.core.LdapTemplate;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaRole; import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.SystemException; import pro.taskana.common.api.exceptions.SystemException;
@ -42,7 +42,7 @@ class LdapClientTest {
@Mock LdapTemplate ldapTemplate; @Mock LdapTemplate ldapTemplate;
@Mock TaskanaEngineConfiguration taskanaEngineConfiguration; @Mock TaskanaConfiguration taskanaEngineConfiguration;
@Spy @InjectMocks LdapClient cut; @Spy @InjectMocks LdapClient cut;

View File

@ -17,7 +17,7 @@ import org.springframework.core.io.ClassPathResource;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.TaskanaConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode; import pro.taskana.common.api.TaskanaEngine.ConnectionManagementMode;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
@ -44,9 +44,10 @@ class DmnConverterServiceAccTest {
DataSource dataSource = DataSourceGenerator.createDataSourceForH2(); DataSource dataSource = DataSourceGenerator.createDataSourceForH2();
String schemaName = "TASKANA"; String schemaName = "TASKANA";
TaskanaEngineConfiguration taskanaEngineConfiguration = TaskanaConfiguration taskanaEngineConfiguration =
new TaskanaEngineConfiguration(dataSource, false, schemaName); new TaskanaConfiguration.Builder(dataSource, false, schemaName)
taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(true); .germanPublicHolidaysEnabled(true)
.build();
SampleDataGenerator sampleDataGenerator = SampleDataGenerator sampleDataGenerator =
new SampleDataGenerator(dataSource, taskanaEngineConfiguration.getSchemaName()); new SampleDataGenerator(dataSource, taskanaEngineConfiguration.getSchemaName());
if (dropTables) { if (dropTables) {

View File

@ -99,8 +99,7 @@ public class DmnTaskRouter implements TaskRoutingProvider {
} }
protected DmnModelInstance readModelFromDmnTable() { protected DmnModelInstance readModelFromDmnTable() {
String pathToDmn = String pathToDmn = taskanaEngine.getConfiguration().getProperties().get(DMN_TABLE_PROPERTY);
taskanaEngine.getConfiguration().readPropertiesFromFile().getProperty(DMN_TABLE_PROPERTY);
try (InputStream stream = FileLoaderUtil.openFileFromClasspathOrSystem(pathToDmn, getClass())) { try (InputStream stream = FileLoaderUtil.openFileFromClasspathOrSystem(pathToDmn, getClass())) {
return Dmn.readModelFromStream(stream); return Dmn.readModelFromStream(stream);
} catch (IOException e) { } catch (IOException e) {

View File

@ -14,7 +14,7 @@ import pro.taskana.task.internal.models.ObjectReferenceImpl;
public abstract class AbstractAccTest { public abstract class AbstractAccTest {
protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaConfiguration taskanaEngineConfiguration;
protected static TaskanaEngine taskanaEngine; protected static TaskanaEngine taskanaEngine;
protected static WorkingDaysToDaysConverter converter; protected static WorkingDaysToDaysConverter converter;
@ -32,8 +32,10 @@ public abstract class AbstractAccTest {
sampleDataGenerator.dropDb(); sampleDataGenerator.dropDb();
} }
dataSource = DataSourceGenerator.getDataSource(); dataSource = DataSourceGenerator.getDataSource();
taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, schemaName); taskanaEngineConfiguration =
taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(true); new TaskanaConfiguration.Builder(dataSource, false, schemaName)
.germanPublicHolidaysEnabled(true)
.build();
DbSchemaCreator dbSchemaCreator = DbSchemaCreator dbSchemaCreator =
new DbSchemaCreator(dataSource, taskanaEngineConfiguration.getSchemaName()); new DbSchemaCreator(dataSource, taskanaEngineConfiguration.getSchemaName());
dbSchemaCreator.run(); dbSchemaCreator.run();