diff --git a/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/TaskanaEngineTestConfiguration.java b/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/TaskanaEngineTestConfiguration.java index acbb404e1..a19366953 100644 --- a/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/TaskanaEngineTestConfiguration.java +++ b/common/taskana-common-test/src/main/java/pro/taskana/common/test/config/TaskanaEngineTestConfiguration.java @@ -2,7 +2,6 @@ package pro.taskana.common.test.config; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -21,8 +20,7 @@ public final class TaskanaEngineTestConfiguration { private static String schemaName = null; static { - String userHomeDirectroy = System.getProperty("user.home"); - String propertiesFileName = userHomeDirectroy + "/taskanaUnitTest.properties"; + String propertiesFileName = System.getProperty("user.home") + "/taskanaUnitTest.properties"; File f = new File(propertiesFileName); if (f.exists() && !f.isDirectory()) { DATA_SOURCE = createDataSourceFromProperties(propertiesFileName); @@ -60,8 +58,7 @@ public final class TaskanaEngineTestConfiguration { */ public static String getSchemaName() { if (schemaName == null) { - String userHomeDirectroy = System.getProperty("user.home"); - String propertiesFileName = userHomeDirectroy + "/taskanaUnitTest.properties"; + String propertiesFileName = System.getProperty("user.home") + "/taskanaUnitTest.properties"; File f = new File(propertiesFileName); if (f.exists() && !f.isDirectory()) { schemaName = getSchemaNameFromPropertiesObject(propertiesFileName); @@ -117,13 +114,13 @@ public final class TaskanaEngineTestConfiguration { ((PooledDataSource) ds) .forceCloseAll(); // otherwise the MyBatis pool is not initialized correctly } else { - LOGGER.warn("propertiesFile " + propertiesFileName + " is incomplete" + warningMessage); + LOGGER.warn("propertiesFile {} is incomplete {}", propertiesFileName, warningMessage); LOGGER.warn("Using default Datasource for Test"); ds = createDefaultDataSource(); } } catch (IOException e) { - LOGGER.warn("createDataSourceFromProperties caught Exception " + e); + LOGGER.warn("createDataSourceFromProperties caught Exception ", e); LOGGER.warn("Using default Datasource for Test"); ds = createDefaultDataSource(); } @@ -145,33 +142,20 @@ public final class TaskanaEngineTestConfiguration { } if (!propertiesFileIsComplete) { - LOGGER.warn("propertiesFile " + propertiesFileName + " is incomplete" + warningMessage); + LOGGER.warn("propertiesFile {} is incomplete {}", propertiesFileName, warningMessage); LOGGER.warn("Using default Datasource for Test"); schemaName = "TASKANA"; } - } catch (FileNotFoundException e) { - LOGGER.warn("getSchemaNameFromPropertiesObject caught Exception " + e); + } catch (Exception e) { + LOGGER.warn("Caught Exception ", e); LOGGER.warn("Using default schemaName for Test"); - } catch (IOException e) { - LOGGER.warn("createDataSourceFromProperties caught Exception " + e); - LOGGER.warn("Using default Datasource for Test"); } return schemaName; } - /** - * create Default Datasource for in-memory database. - * - * @return the default datasource. - */ private static DataSource createDefaultDataSource() { - // JdbcDataSource ds = new JdbcDataSource(); - // ds.setURL("jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0"); - // ds.setPassword("sa"); - // ds.setUser("sa"); - String jdbcDriver = "org.h2.Driver"; String jdbcUrl = "jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0;" diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ComparableVersion.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ComparableVersion.java index 5ffe7cbea..fcd257e49 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ComparableVersion.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/ComparableVersion.java @@ -161,59 +161,6 @@ public class ComparableVersion implements Comparable { return canonical; } - /** - * Main to test version parsing and comparison. - * - *

To check how "1.2.7" compares to "1.2-SNAPSHOT", for example, you can issue - * - *

-   * java -jar ${maven.repo.local}/org/apache/maven/maven-artifact/
-   * ${maven.version}/maven-artifact-${maven.version}.jar "1.2.7" "1.2-SNAPSHOT"
-   * 
- * - *

command to command line. Result of given command will be something like this: - * - *

-   * Display parameters as parsed by Maven (in canonical form) and comparison result:
-   * 1. 1.2.7 == 1.2.7
-   *    1.2.7 > 1.2-SNAPSHOT
-   * 2. 1.2-SNAPSHOT == 1.2-snapshot
-   * 
- * - * @param args the version strings to parse and compare. You can pass arbitrary number of version - * strings and always two adjacent will be compared - */ - // CHECKSTYLE_ON: LineLength - public static void main(String... args) { - /* System.out.println( - "Display parameters as parsed by Maven (in canonical form) and comparison result:");*/ - if (args.length == 0) { - return; - } - - ComparableVersion prev = null; - int i = 1; - for (String version : args) { - ComparableVersion c = new ComparableVersion(version); - - if (prev != null) { - int compare = prev.compareTo(c); - /* System.out.println( - " " - + prev.toString() - + ' ' - + ((compare == 0) ? "==" : ((compare < 0) ? "<" : ">")) - + ' ' - + version); - }*/ - - // System.out.println(String.valueOf(i++) + ". " + version + " == " + c.getCanonical()); - - prev = c; - } - } - } - private static Item parseItem(boolean isDigit, String buf) { if (isDigit) { buf = stripLeadingZeroes(buf); @@ -303,7 +250,7 @@ public class ComparableVersion implements Comparable { switch (item.getType()) { case INT_ITEM: int itemValue = ((IntItem) item).value; - return (value < itemValue) ? -1 : ((value == itemValue) ? 0 : 1); + return Integer.compare(value, itemValue); case LONG_ITEM: case BIGINTEGER_ITEM: return -1; @@ -373,7 +320,7 @@ public class ComparableVersion implements Comparable { return 1; case LONG_ITEM: long itemValue = ((LongItem) item).value; - return (value < itemValue) ? -1 : ((value == itemValue) ? 0 : 1); + return Long.compare(value, itemValue); case BIGINTEGER_ITEM: return -1; @@ -642,7 +589,7 @@ public class ComparableVersion implements Comparable { Item r = right.hasNext() ? right.next() : null; // if this is shorter, then invert the compare and mul with -1 - int result = l == null ? (r == null ? 0 : -1 * r.compareTo(l)) : l.compareTo(r); + int result = l == null ? (r == null ? 0 : -1 * r.compareTo(null)) : l.compareTo(r); if (result != 0) { return result; diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/FileLoaderUtil.java b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/FileLoaderUtil.java index 4df82b9fa..8f49bb3db 100644 --- a/common/taskana-common/src/main/java/pro/taskana/common/internal/util/FileLoaderUtil.java +++ b/common/taskana-common/src/main/java/pro/taskana/common/internal/util/FileLoaderUtil.java @@ -1,10 +1,23 @@ package pro.taskana.common.internal.util; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import pro.taskana.common.api.exceptions.SystemException; public class FileLoaderUtil { - public static boolean loadFromClasspath(String fileToLoad) { + private static final Logger LOGGER = LoggerFactory.getLogger(FileLoaderUtil.class); + + private FileLoaderUtil() { + throw new IllegalStateException("Utility class"); + } + + public static boolean isInClasspath(String fileToLoad) { boolean loadFromClasspath = true; File f = new File(fileToLoad); if (f.exists() && !f.isDirectory()) { @@ -13,4 +26,24 @@ public class FileLoaderUtil { return loadFromClasspath; } + public static InputStream openFileFromClasspathOrSystem(String fileToLoad, Class clazz) { + if (isInClasspath(fileToLoad)) { + InputStream inputStream = clazz.getResourceAsStream(fileToLoad); + if (inputStream == null) { + throw new SystemException( + String.format("Could not find a file in the classpath %s", fileToLoad)); + } + LOGGER.debug("Load file {} from classpath", fileToLoad); + return inputStream; + } + + try { + FileInputStream inputStream = new FileInputStream(fileToLoad); + LOGGER.debug("Load file {} from path", fileToLoad); + return inputStream; + } catch (FileNotFoundException e) { + throw new SystemException( + String.format("Could not find a file with provided path %s", fileToLoad)); + } + } } diff --git a/history/taskana-simplehistory-rest-spring/src/test/resources/taskana.properties b/history/taskana-simplehistory-rest-spring/src/test/resources/taskana.properties new file mode 100644 index 000000000..b79925b1d --- /dev/null +++ b/history/taskana-simplehistory-rest-spring/src/test/resources/taskana.properties @@ -0,0 +1,19 @@ +taskana.roles.user=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 +taskana.classification.types=TASK , document +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 +taskana.jobs.cleanup.firstRunAt=2018-07-25T08:00:00Z +taskana.jobs.cleanup.minimumAge=P14D +taskana.german.holidays.enabled=true +taskana.german.holidays.corpus-christi.enabled=false +taskana.history.deletion.on.task.deletion.enabled=true + + diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngineConfiguration.java b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngineConfiguration.java index e46a7e22c..8b013dc60 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngineConfiguration.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskanaEngineConfiguration.java @@ -1,11 +1,7 @@ package pro.taskana; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.SQLException; import java.time.Duration; @@ -48,6 +44,7 @@ import pro.taskana.common.internal.util.Pair; *
* Security is enabled by default. */ +@SuppressWarnings("checkstyle:OverloadMethodsDeclarationOrder") public class TaskanaEngineConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(TaskanaEngineConfiguration.class); @@ -368,6 +365,10 @@ public class TaskanaEngineConfiguration { return true; } + public Properties readPropertiesFromFile() { + return readPropertiesFromFile(this.propertiesFileName); + } + private Optional parseProperty( Properties props, String key, CheckedFunction function) { String property = props.getProperty(key, ""); @@ -556,29 +557,12 @@ public class TaskanaEngineConfiguration { .collect(Collectors.toList()); } - public Properties readPropertiesFromFile() { - return readPropertiesFromFile(this.propertiesFileName); - } - - private Properties readPropertiesFromFile(String propertiesFile) { Properties props = new Properties(); - boolean loadFromClasspath = FileLoaderUtil.loadFromClasspath(propertiesFile); try { - if (loadFromClasspath) { - InputStream inputStream = - TaskanaEngineConfiguration.class.getResourceAsStream(propertiesFile); - if (inputStream == null) { - LOGGER.error("taskana properties file {} was not found on classpath.", propertiesFile); - } else { - props.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); - LOGGER.debug("Role properties were loaded from file {} from classpath.", propertiesFile); - } - } else { - try (FileInputStream stream = new FileInputStream(propertiesFile)) { - props.load(stream); - } - LOGGER.debug("Role properties were loaded from file {}.", propertiesFile); + try (InputStream stream = + FileLoaderUtil.openFileFromClasspathOrSystem(propertiesFile, getClass())) { + props.load(stream); } } catch (IOException e) { LOGGER.error("caught IOException when processing properties file {}.", propertiesFile); @@ -587,13 +571,4 @@ public class TaskanaEngineConfiguration { } return props; } - - private boolean loadFromClasspath(String propertiesFile) { - boolean loadFromClasspath = true; - File f = new File(propertiesFile); - if (f.exists() && !f.isDirectory()) { - loadFromClasspath = false; - } - return loadFromClasspath; - } } diff --git a/lib/taskana-core/src/test/java/acceptance/config/TaskanaConfigAccTest.java b/lib/taskana-core/src/test/java/acceptance/config/TaskanaConfigAccTest.java index e4b1d13a6..36ef04fd2 100644 --- a/lib/taskana-core/src/test/java/acceptance/config/TaskanaConfigAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/config/TaskanaConfigAccTest.java @@ -6,96 +6,99 @@ import acceptance.TaskanaEngineTestConfiguration; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import pro.taskana.TaskanaEngineConfiguration; -import pro.taskana.common.internal.TaskanaEngineImpl; /** Test taskana configuration without roles. */ -class TaskanaConfigAccTest extends TaskanaEngineImpl { +class TaskanaConfigAccTest { @TempDir Path tempDir; + private TaskanaEngineConfiguration taskanaEngineConfiguration; - TaskanaConfigAccTest() throws Exception { - super( + @BeforeEach + void setup() { + taskanaEngineConfiguration = new TaskanaEngineConfiguration( TaskanaEngineTestConfiguration.getDataSource(), true, - TaskanaEngineTestConfiguration.getSchemaName())); + TaskanaEngineTestConfiguration.getSchemaName()); } @Test - void testDomains() { - assertThat(getConfiguration().getDomains()).containsExactlyInAnyOrder("DOMAIN_A", "DOMAIN_B"); + void should_ConfigureDomains_For_DefaultPropertiesFile() { + assertThat(taskanaEngineConfiguration.getDomains()) + .containsExactlyInAnyOrder("DOMAIN_A", "DOMAIN_B"); } @Test - void testClassificationTypes() { - assertThat(getConfiguration().getClassificationTypes()) + void should_ConfigureClassificationTypes_For_DefaultPropertiesFile() { + assertThat(taskanaEngineConfiguration.getClassificationTypes()) .containsExactlyInAnyOrder("TASK", "DOCUMENT"); } @Test - void testClassificationCategories() { - assertThat(getConfiguration().getClassificationCategoriesByType("TASK")) + void should_ConfigureClassificationCategories_For_DefaultPropertiesFile() { + assertThat(taskanaEngineConfiguration.getClassificationCategoriesByType("TASK")) .containsExactlyInAnyOrder("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS"); } @Test - void testDoesNotExistPropertyClassificationTypeOrItIsEmpty() throws Exception { - taskanaEngineConfiguration.setClassificationTypes(new ArrayList<>()); - String propertiesFileName = createNewConfigFile("dummyTestConfig.properties", false, true); + void should_NotConfigureClassificationTypes_When_PropertiesAreNotDefined() throws Exception { + String propertiesFileName = createNewConfigFile("dummyTestConfig1.properties", false, true); String delimiter = ";"; - getConfiguration().initTaskanaProperties(propertiesFileName, delimiter); + taskanaEngineConfiguration = + new TaskanaEngineConfiguration( + TaskanaEngineTestConfiguration.getDataSource(), + true, + true, + propertiesFileName, + delimiter, + TaskanaEngineTestConfiguration.getSchemaName()); assertThat(taskanaEngineConfiguration.getClassificationTypes()).isEmpty(); } @Test - void testDoesNotExistPropertyClassificationCategoryOrItIsEmpty() throws Exception { - taskanaEngineConfiguration.setClassificationTypes(new ArrayList<>()); - taskanaEngineConfiguration.setClassificationCategoriesByType(new HashMap<>()); - String propertiesFileName = createNewConfigFile("dummyTestConfig.properties", true, false); + void should_NotConfigureClassificationCategories_When_PropertiesAreNotDefined() throws Exception { + String propertiesFileName = createNewConfigFile("dummyTestConfig2.properties", true, false); String delimiter = ";"; - getConfiguration().initTaskanaProperties(propertiesFileName, delimiter); - assertThat( - taskanaEngineConfiguration.getClassificationCategoriesByType( - taskanaEngineConfiguration.getClassificationTypes().get(0))) - .isEmpty(); + taskanaEngineConfiguration = + new TaskanaEngineConfiguration( + TaskanaEngineTestConfiguration.getDataSource(), + true, + true, + propertiesFileName, + delimiter, + TaskanaEngineTestConfiguration.getSchemaName()); + assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap()) + .containsExactly( + Map.entry("TASK", Collections.emptyList()), + Map.entry("DOCUMENT", Collections.emptyList())); } @Test - void testWithCategoriesAndClassificationFilled() throws Exception { - taskanaEngineConfiguration.setClassificationTypes(new ArrayList<>()); - taskanaEngineConfiguration.setClassificationCategoriesByType(new HashMap<>()); - String propertiesFileName = createNewConfigFile("dummyTestConfig.properties", true, true); + void should_ApplyClassificationProperties_When_PropertiesAreDefined() throws Exception { + String propertiesFileName = createNewConfigFile("dummyTestConfig3.properties", true, true); String delimiter = ";"; - getConfiguration().initTaskanaProperties(propertiesFileName, delimiter); - assertThat(taskanaEngineConfiguration.getClassificationTypes().isEmpty()).isFalse(); - assertThat( - taskanaEngineConfiguration - .getClassificationCategoriesByType( - taskanaEngineConfiguration.getClassificationTypes().get(0)) - .isEmpty()) - .isFalse(); - assertThat(taskanaEngineConfiguration.getClassificationTypes()).hasSize(2); - assertThat( - taskanaEngineConfiguration - .getClassificationCategoriesByType( - taskanaEngineConfiguration.getClassificationTypes().get(0)) - .size()) - .isEqualTo(4); - assertThat( - taskanaEngineConfiguration - .getClassificationCategoriesByType( - taskanaEngineConfiguration.getClassificationTypes().get(1)) - .size()) - .isEqualTo(1); + taskanaEngineConfiguration = + new TaskanaEngineConfiguration( + TaskanaEngineTestConfiguration.getDataSource(), + true, + true, + propertiesFileName, + delimiter, + TaskanaEngineTestConfiguration.getSchemaName()); + assertThat(taskanaEngineConfiguration.getClassificationCategoriesByTypeMap()) + .containsExactly( + Map.entry("TASK", List.of("EXTERNAL", "MANUAL", "AUTOMATIC", "PROCESS")), + Map.entry("DOCUMENT", List.of("EXTERNAL"))); } private String createNewConfigFile( diff --git a/lib/taskana-core/src/test/java/acceptance/config/TaskanaEngineConfigTest.java b/lib/taskana-core/src/test/java/acceptance/config/TaskanaEngineConfigTest.java index 7af2fa39f..c597a0c66 100644 --- a/lib/taskana-core/src/test/java/acceptance/config/TaskanaEngineConfigTest.java +++ b/lib/taskana-core/src/test/java/acceptance/config/TaskanaEngineConfigTest.java @@ -64,7 +64,7 @@ class TaskanaEngineConfigTest { ds, false, true, - "/custom_holiday_With_Wrong_format_taskana.properties", + "/custom_holiday_with_wrong_format_taskana.properties", "|", TaskanaEngineTestConfiguration.getSchemaName()); assertThat(taskEngineConfiguration.getCustomHolidays()).isEmpty(); diff --git a/lib/taskana-core/src/test/java/acceptance/config/TaskanaRoleConfigAccTest.java b/lib/taskana-core/src/test/java/acceptance/config/TaskanaRoleConfigAccTest.java index 2f9afc95c..43341d4d0 100644 --- a/lib/taskana-core/src/test/java/acceptance/config/TaskanaRoleConfigAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/config/TaskanaRoleConfigAccTest.java @@ -8,32 +8,35 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Set; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import pro.taskana.TaskanaEngineConfiguration; import pro.taskana.common.api.TaskanaRole; -import pro.taskana.common.internal.TaskanaEngineImpl; /** Test taskana's role configuration. */ -class TaskanaRoleConfigAccTest extends TaskanaEngineImpl { +class TaskanaRoleConfigAccTest { + + private TaskanaEngineConfiguration taskanaEngineConfiguration; @TempDir Path tempDir; - TaskanaRoleConfigAccTest() throws Exception { - super( + @BeforeEach + void setup() { + taskanaEngineConfiguration = new TaskanaEngineConfiguration( TaskanaEngineTestConfiguration.getDataSource(), true, - TaskanaEngineTestConfiguration.getSchemaName())); + TaskanaEngineTestConfiguration.getSchemaName()); } @Test - void testStandardConfig() { - Set rolesConfigured = getConfiguration().getRoleMap().keySet(); + void should_ApplyDefaultConfiguration_For_DefaultPropertiesFile() { + Set rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet(); assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values()); - Set users = getConfiguration().getRoleMap().get(TaskanaRole.USER); + Set users = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.USER); assertThat(users) .containsExactlyInAnyOrder( "teamlead-1", @@ -45,63 +48,82 @@ class TaskanaRoleConfigAccTest extends TaskanaEngineImpl { "user-b-1", "user-b-2"); - Set admins = getConfiguration().getRoleMap().get(TaskanaRole.ADMIN); + Set admins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.ADMIN); assertThat(admins).containsExactlyInAnyOrder("uid=admin,cn=users,ou=test,o=taskana", "admin"); - Set taskAdmins = getConfiguration().getRoleMap().get(TaskanaRole.TASK_ADMIN); + Set taskAdmins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.TASK_ADMIN); assertThat(taskAdmins).containsExactlyInAnyOrder("taskadmin"); - Set businessAdmins = getConfiguration().getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); + Set businessAdmins = + taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); assertThat(businessAdmins) .containsExactlyInAnyOrder( "businessadmin", "cn=business-admins,cn=groups,ou=test,o=taskana"); - Set monitorAccessIds = getConfiguration().getRoleMap().get(TaskanaRole.MONITOR); + Set monitorAccessIds = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.MONITOR); assertThat(monitorAccessIds) .containsExactlyInAnyOrder("monitor", "cn=monitor-users,cn=groups,ou=test,o=taskana"); } @Test - void testOtherConfigFileSameDelimiter() throws Exception { + void should_ApplyDifferentConfiguration_For_DifferentFile() throws Exception { String propertiesFileName = createNewConfigFileWithSameDelimiter("dummyTestConfig.properties"); - getConfiguration().initTaskanaProperties(propertiesFileName, "|"); + String delimiter = "|"; + taskanaEngineConfiguration = + new TaskanaEngineConfiguration( + TaskanaEngineTestConfiguration.getDataSource(), + true, + true, + propertiesFileName, + delimiter, + TaskanaEngineTestConfiguration.getSchemaName()); - Set rolesConfigured = getConfiguration().getRoleMap().keySet(); + Set rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet(); assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values()); - Set users = getConfiguration().getRoleMap().get(TaskanaRole.USER); + Set users = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.USER); assertThat(users).containsExactly("nobody"); - Set admins = getConfiguration().getRoleMap().get(TaskanaRole.ADMIN); + Set admins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.ADMIN); assertThat(admins).containsExactlyInAnyOrder("user", "username"); - Set businessAdmins = getConfiguration().getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); + Set businessAdmins = + taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); assertThat(businessAdmins).containsExactlyInAnyOrder("user2", "user3"); - Set taskAdmins = getConfiguration().getRoleMap().get(TaskanaRole.TASK_ADMIN); + Set taskAdmins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.TASK_ADMIN); assertThat(taskAdmins).containsExactlyInAnyOrder("taskadmin"); } @Test - void testOtherConfigFileDifferentDelimiter() throws Exception { + void should_ApplyConfiguration_When_UsingDifferentDelimiter() throws Exception { String delimiter = ";"; String propertiesFileName = createNewConfigFileWithDifferentDelimiter("dummyTestConfig.properties", delimiter); - getConfiguration().initTaskanaProperties(propertiesFileName, delimiter); - Set rolesConfigured = getConfiguration().getRoleMap().keySet(); + taskanaEngineConfiguration = + new TaskanaEngineConfiguration( + TaskanaEngineTestConfiguration.getDataSource(), + true, + true, + propertiesFileName, + delimiter, + TaskanaEngineTestConfiguration.getSchemaName()); + + Set rolesConfigured = taskanaEngineConfiguration.getRoleMap().keySet(); assertThat(rolesConfigured).containsExactlyInAnyOrder(TaskanaRole.values()); - Set users = getConfiguration().getRoleMap().get(TaskanaRole.USER); + Set users = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.USER); assertThat(users).isEmpty(); - Set admins = getConfiguration().getRoleMap().get(TaskanaRole.ADMIN); + Set admins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.ADMIN); assertThat(admins).containsExactlyInAnyOrder("user", "name=username,organisation=novatec"); - Set businessAdmins = getConfiguration().getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); + Set businessAdmins = + taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.BUSINESS_ADMIN); assertThat(businessAdmins).containsExactlyInAnyOrder("name=user2, ou = bpm", "user3"); - Set taskAdmins = getConfiguration().getRoleMap().get(TaskanaRole.TASK_ADMIN); + Set taskAdmins = taskanaEngineConfiguration.getRoleMap().get(TaskanaRole.TASK_ADMIN); assertThat(taskAdmins).contains("taskadmin"); } diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/assembler/TaskRepresentationModelAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/assembler/TaskRepresentationModelAssembler.java index 6e951a13d..aaf221860 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/assembler/TaskRepresentationModelAssembler.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/assembler/TaskRepresentationModelAssembler.java @@ -112,12 +112,7 @@ public class TaskRepresentationModelAssembler public Task toEntityModel(TaskRepresentationModel repModel) throws InvalidArgumentException { verifyCorrectCustomAttributesFormat(repModel); - TaskImpl task; - if (repModel.getWorkbasketSummary() != null) { - task = (TaskImpl) taskService.newTask(repModel.getWorkbasketSummary().getWorkbasketId()); - } else { - task = (TaskImpl) taskService.newTask(); - } + TaskImpl task = (TaskImpl) taskService.newTask(); task.setId(repModel.getTaskId()); task.setExternalId(repModel.getExternalId()); task.setCreated(repModel.getCreated()); diff --git a/taskana-routing-parent/pom.xml b/taskana-routing-parent/pom.xml index 95f0f9022..8aa24759b 100644 --- a/taskana-routing-parent/pom.xml +++ b/taskana-routing-parent/pom.xml @@ -2,11 +2,8 @@ - 4.0.0 - taskana-routing-parent - pom ${project.groupId}:${project.artifactId} @@ -23,5 +20,4 @@ taskana-spi-routing-dmn-router - diff --git a/taskana-routing-parent/taskana-spi-routing-dmn-router/pom.xml b/taskana-routing-parent/taskana-spi-routing-dmn-router/pom.xml index d48643f34..8d4f27287 100644 --- a/taskana-routing-parent/taskana-spi-routing-dmn-router/pom.xml +++ b/taskana-routing-parent/taskana-spi-routing-dmn-router/pom.xml @@ -2,14 +2,18 @@ + 4.0.0 + taskana-spi-routing-dmn-router + + ${project.groupId}:${project.artifactId} + TaskRouter implementation using dmn tables. + taskana-routing-parent pro.taskana 4.5.2-SNAPSHOT + ../pom.xml - 4.0.0 - - taskana-spi-routing-dmn-router @@ -58,6 +62,4 @@ - - diff --git a/taskana-routing-parent/taskana-spi-routing-dmn-router/src/main/java/pro/taskana/routing/dmn/DmnTaskRouter.java b/taskana-routing-parent/taskana-spi-routing-dmn-router/src/main/java/pro/taskana/routing/dmn/DmnTaskRouter.java index 3438bb1ef..2b797dd4a 100644 --- a/taskana-routing-parent/taskana-spi-routing-dmn-router/src/main/java/pro/taskana/routing/dmn/DmnTaskRouter.java +++ b/taskana-routing-parent/taskana-spi-routing-dmn-router/src/main/java/pro/taskana/routing/dmn/DmnTaskRouter.java @@ -1,6 +1,5 @@ package pro.taskana.routing.dmn; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -33,22 +32,18 @@ import pro.taskana.workbasket.api.exceptions.WorkbasketNotFoundException; public class DmnTaskRouter implements TaskRoutingProvider { private static final Logger LOGGER = LoggerFactory.getLogger(DmnTaskRouter.class); + private static final String DMN_TABLE_PROPERTY = "taskana.routing.dmn"; + private static final String DECISION_ID = "workbasketRouting"; private static final String DECISION_VARIABLE_MAP_NAME = "task"; private static final String OUTPUT_WORKBASKET_KEY = "workbasketKey"; private static final String OUTPUT_DOMAIN = "domain"; - private static final String DMN_TABLE_PROPERTY = "taskana.routing.dmn"; private TaskanaEngine taskanaEngine; private DmnEngine dmnEngine; private DmnDecision decision; @Override public void initialize(TaskanaEngine taskanaEngine) { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Entering initialize()"); - } - this.taskanaEngine = taskanaEngine; dmnEngine = DmnEngineConfiguration.createDefaultDmnEngineConfiguration().buildEngine(); @@ -57,19 +52,10 @@ public class DmnTaskRouter implements TaskRoutingProvider { decision = dmnEngine.parseDecision(DECISION_ID, dmnModel); validateOutputs(dmnModel); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Exiting initialize()"); - } } @Override public String determineWorkbasketId(Task task) { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Entering determineWorkbasketId(task = {})", task); - } - VariableMap variables = Variables.putValue(DECISION_VARIABLE_MAP_NAME, task); DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables); @@ -83,13 +69,7 @@ public class DmnTaskRouter implements TaskRoutingProvider { try { - String determinedWorkbasketId = - taskanaEngine.getWorkbasketService().getWorkbasket(workbasketKey, domain).getId(); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug( - String.format("Exiting determineWorkbasketId, returning %s", determinedWorkbasketId)); - } - return determinedWorkbasketId; + return taskanaEngine.getWorkbasketService().getWorkbasket(workbasketKey, domain).getId(); } catch (WorkbasketNotFoundException e) { throw new SystemException( String.format( @@ -105,11 +85,6 @@ public class DmnTaskRouter implements TaskRoutingProvider { } protected Set> getAllWorkbasketAndDomainOutputs(DmnModelInstance dmnModel) { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Entering getAllWorkbasketAndDomainOutputs()"); - } - Set> allWorkbasketAndDomainOutputs = new HashSet<>(); for (Rule rule : dmnModel.getModelElementsByType(Rule.class)) { @@ -120,67 +95,29 @@ public class DmnTaskRouter implements TaskRoutingProvider { allWorkbasketAndDomainOutputs.add(Pair.of(workbasketKey, domain)); } - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Exiting getAllWorkbasketAndDomainOutputs()"); - } - return allWorkbasketAndDomainOutputs; } protected DmnModelInstance readModelFromDmnTable() { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Entering readModelFromDmnTable()"); - } - String pathToDmn = taskanaEngine.getConfiguration().readPropertiesFromFile().getProperty(DMN_TABLE_PROPERTY); - - if (FileLoaderUtil.loadFromClasspath(pathToDmn)) { - try (InputStream inputStream = DmnTaskRouter.class.getResourceAsStream(pathToDmn)) { - if (inputStream == null) { - LOGGER.error("dmn file {} was not found on classpath.", pathToDmn); - } else { - return Dmn.readModelFromStream(inputStream); - } - } catch (IOException e) { - LOGGER.error("caught IOException when processing dmn file"); - throw new SystemException("Internal System error when processing dmn file", e.getCause()); - } - } - - try (FileInputStream inputStream = new FileInputStream(pathToDmn)) { - return Dmn.readModelFromStream(inputStream); + try (InputStream stream = FileLoaderUtil.openFileFromClasspathOrSystem(pathToDmn, getClass())) { + return Dmn.readModelFromStream(stream); } catch (IOException e) { + LOGGER.error("caught IOException when processing dmn file {}.", pathToDmn); throw new SystemException( - String.format("Could not find a dmn file with provided path %s", pathToDmn)); + "internal System error when processing dmn file " + pathToDmn, e.getCause()); } } private void validateOutputs(DmnModelInstance dmnModel) { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Entering validateOutputs()"); - } - Set> allWorkbasketAndDomainOutputs = getAllWorkbasketAndDomainOutputs(dmnModel); validate(allWorkbasketAndDomainOutputs); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Exiting validateOutputs()"); - } } private void validate(Set> allWorkbasketAndDomainOutputs) { - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug( - "Entering validate(allWorkbasketAndDomainOutputs = {}", allWorkbasketAndDomainOutputs); - } - WorkbasketService workbasketService = taskanaEngine.getWorkbasketService(); for (Pair pair : allWorkbasketAndDomainOutputs) { @@ -203,9 +140,5 @@ public class DmnTaskRouter implements TaskRoutingProvider { } }); } - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Exiting validate()"); - } } } diff --git a/taskana-routing-parent/taskana-spi-routing-dmn-router/src/test/java/pro/taskana/routing/dmn/DmnTaskRouterTest.java b/taskana-routing-parent/taskana-spi-routing-dmn-router/src/test/java/pro/taskana/routing/dmn/DmnTaskRouterTest.java index ae825db36..49d3c34f3 100644 --- a/taskana-routing-parent/taskana-spi-routing-dmn-router/src/test/java/pro/taskana/routing/dmn/DmnTaskRouterTest.java +++ b/taskana-routing-parent/taskana-spi-routing-dmn-router/src/test/java/pro/taskana/routing/dmn/DmnTaskRouterTest.java @@ -16,7 +16,7 @@ import pro.taskana.task.api.models.ObjectReference; import pro.taskana.task.api.models.Task; @ExtendWith(JaasExtension.class) -public class DmnTaskRouterTest extends AbstractAccTest { +class DmnTaskRouterTest extends AbstractAccTest { private final TaskService taskService = taskanaEngine.getTaskService();