TSK-1957: add taskana property 'minimalPermissionsToAssignDomains'

This commit is contained in:
Norman Schmidt 2022-09-22 12:03:15 +02:00 committed by norman-schmidt
parent d6da6f8124
commit 5a14c00fa1
16 changed files with 87 additions and 57 deletions

View File

@ -3,8 +3,6 @@ package pro.taskana.common.internal.configuration;
import static java.util.function.Predicate.not;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.time.Duration;
import java.time.Instant;
@ -129,21 +127,10 @@ public class TaskanaConfigurationInitializer {
}
private static void setFieldValue(Object instance, Field field, Object value) {
final Optional<Method> hasSetterMethod =
Arrays.stream(instance.getClass().getMethods())
.filter(m -> m.getParameterCount() == 1)
.filter(m -> m.getName().startsWith("set"))
.filter(m -> m.getName().toLowerCase().contains(field.getName().toLowerCase()))
.findFirst();
if (hasSetterMethod.isEmpty()) {
throw new SystemException("No setter method for " + field.getName());
}
try {
final Method method = hasSetterMethod.get();
method.invoke(instance, value);
} catch (IllegalAccessException | InvocationTargetException e) {
field.setAccessible(true);
field.set(instance, value);
} catch (IllegalAccessException | IllegalArgumentException e) {
throw new SystemException(
"Property value " + value + " is invalid for field " + field.getName(), e);
}
@ -175,11 +162,29 @@ public class TaskanaConfigurationInitializer {
@Override
public Optional<List<?>> initialize(
Properties properties, String separator, Field field, TaskanaProperty taskanaProperty) {
final String typeName =
((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0].getTypeName();
if (!List.class.isAssignableFrom(field.getType())) {
throw new SystemException(
String.format(
"Cannot initialize field '%s' because field type '%s' is not a List",
field, field.getType()));
}
Class<?> genericClass =
(Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
if (typeName.equals("pro.taskana.common.api.CustomHoliday")) {
CheckedFunction<String, List<?>, Exception> parseFunction2 =
if (genericClass.isEnum()) {
Map<String, ?> enumConstants =
Arrays.stream(genericClass.getEnumConstants())
.collect(Collectors.toMap(e -> e.toString().toLowerCase(), Function.identity()));
CheckedFunction<String, List<?>, Exception> parseFunction =
s ->
splitStringAndTrimElements(s, separator).stream()
.map(String::toLowerCase)
.map(enumConstants::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
return parseProperty(properties, taskanaProperty.value(), parseFunction);
} else if (CustomHoliday.class.isAssignableFrom(genericClass)) {
CheckedFunction<String, List<?>, Exception> parseFunction =
s ->
splitStringAndTrimElements(s, separator).stream()
.map(
@ -193,12 +198,16 @@ public class TaskanaConfigurationInitializer {
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
return parseProperty(properties, taskanaProperty.value(), parseFunction2);
} else {
return parseProperty(properties, taskanaProperty.value(), parseFunction);
} else if (String.class.isAssignableFrom(genericClass)) {
CheckedFunction<String, List<?>, Exception> parseListFunction =
p -> splitStringAndTrimElements(p, ",", String::toUpperCase);
return parseProperty(properties, taskanaProperty.value(), parseListFunction);
} else {
throw new SystemException(
String.format(
"Cannot initialize field '%s' because field type '%s' is unknown",
field, genericClass));
}
}
}

View File

@ -3,7 +3,8 @@ taskana.roles.admin=name=konrad,Organisation=novatec|admin
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=Domain_A , DOMAIN_B
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -3,7 +3,8 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=Domain_A , DOMAIN_B
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -3,7 +3,8 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=Domain_A , DOMAIN_B
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -33,6 +33,7 @@ import pro.taskana.common.internal.TaskanaEngineImpl;
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.
@ -129,6 +130,9 @@ public class TaskanaEngineConfiguration {
@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);
@ -214,6 +218,8 @@ public class TaskanaEngineConfiguration {
LOGGER.debug("Configured domains: {}", domains);
LOGGER.debug("Configured classificationTypes: {}", classificationTypes);
LOGGER.debug("Configured custom Holidays : {}", customHolidays);
LOGGER.debug(
"Configured minimalPermissionsToAssignDomains : {}", minimalPermissionsToAssignDomains);
}
}
@ -457,6 +463,15 @@ public class TaskanaEngineConfiguration {
this.userRefreshJobRunEvery = userRefreshJobRunEvery;
}
public List<WorkbasketPermission> getMinimalPermissionsToAssignDomains() {
return minimalPermissionsToAssignDomains;
}
public void setMinimalPermissionsToAssignDomains(
List<WorkbasketPermission> minimalPermissionsToAssignDomains) {
this.minimalPermissionsToAssignDomains = minimalPermissionsToAssignDomains;
}
public Instant getUserRefreshJobFirstRun() {
return userRefreshJobFirstRun;
}

View File

@ -16,6 +16,7 @@ import org.junit.jupiter.api.io.TempDir;
import pro.taskana.TaskanaEngineConfiguration;
import pro.taskana.common.test.config.DataSourceGenerator;
import pro.taskana.workbasket.api.WorkbasketPermission;
/** Test taskana configuration without roles. */
class TaskanaConfigAccTest {
@ -36,6 +37,12 @@ class TaskanaConfigAccTest {
.containsExactlyInAnyOrder("DOMAIN_A", "DOMAIN_B");
}
@Test
void should_ConfigureMinimalPermissionsToAssignDomains_For_DefaultPropertiesFile() {
assertThat(taskanaEngineConfiguration.getMinimalPermissionsToAssignDomains())
.containsExactly(WorkbasketPermission.READ, WorkbasketPermission.OPEN);
}
@Test
void should_ConfigureClassificationTypes_For_DefaultPropertiesFile() {
assertThat(taskanaEngineConfiguration.getClassificationTypes())

View File

@ -4,7 +4,8 @@ taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.roles.taskrouter=cn=routers,cn=groups,OU=Test,O=TASKANA | user-taskrouter
taskana.domains=Domain_A , DOMAIN_B
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -2,12 +2,11 @@ taskana.roles.user=cn=ksc-users,cn=groups,OU=Test,O=TASKANA | teamlead-1 | teaml
taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains= Domain_A , DOMAIN_B
taskana.classification.types= TASK , document
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.cleanup.schedule=0 0 3 * * *
taskana.jobs.cleanup.runEvery=P1D
taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z

View File

@ -3,7 +3,8 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=Domain_A , DOMAIN_B
taskana.domains=DOMAIN_A , DOMAIN_B
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK , document
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -1,14 +1,13 @@
taskana.roles.user= cn=ksc-users,cn=groups,OU=Test,O=TASKANA | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2
taskana.roles.user=cn=ksc-users,cn=groups,OU=Test,O=TASKANA | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2
taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.maxRetries=3
taskana.jobs.batchSize=50
taskana.jobs.cleanup.runEvery=P1D
@ -23,5 +22,4 @@ taskana.jobs.user.refresh.firstRunAt=2018-07-25T23:00:00Z
taskana.german.holidays.enabled=true
taskana.german.holidays.corpus-christi.enabled=true
taskana.historylogger.name=AUDIT
taskana.routing.dmn=/dmn-table.dmn

View File

@ -4,6 +4,7 @@ taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -3,12 +3,11 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DEFAULT_DOMAIN,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.maxRetries=3
taskana.jobs.batchSize=50
taskana.jobs.cleanup.runEvery=P1D

View File

@ -4,6 +4,7 @@ taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL

View File

@ -3,12 +3,11 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.maxRetries=3
taskana.jobs.batchSize=50
taskana.jobs.cleanup.runEvery=P1D

View File

@ -3,12 +3,11 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C,DOMAIN_TEST
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.maxRetries=3
taskana.jobs.batchSize=50
taskana.jobs.cleanup.runEvery=P1D

View File

@ -3,12 +3,11 @@ taskana.roles.admin=admin | uid=admin,cn=users,OU=Test,O=TASKANA
taskana.roles.businessadmin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=TASKANA
taskana.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=TASKANA
taskana.roles.taskadmin=taskadmin
taskana.domains=DOMAIN_A,DOMAIN_B,DOMAIN_C
taskana.user.minimalPermissionsToAssignDomains=READ | OPEN
taskana.classification.types=TASK,DOCUMENT
taskana.classification.categories.task= EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document= EXTERNAL
taskana.classification.categories.task=EXTERNAL, manual, autoMAtic, Process
taskana.classification.categories.document=EXTERNAL
taskana.jobs.maxRetries=3
taskana.jobs.batchSize=50
taskana.jobs.cleanup.runEvery=P1D
@ -21,5 +20,4 @@ taskana.jobs.history.cleanup.runEvery=P1D
taskana.german.holidays.enabled=true
taskana.german.holidays.corpus-christi.enabled=true
taskana.historylogger.name=AUDIT
taskana.routing.dmn=/dmn-table.dmn