diff --git a/lib/taskana-core/src/test/java/acceptance/AbstractAccTest.java b/lib/taskana-core/src/test/java/acceptance/AbstractAccTest.java index 9f38cb896..7a8a3881b 100644 --- a/lib/taskana-core/src/test/java/acceptance/AbstractAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/AbstractAccTest.java @@ -24,8 +24,8 @@ import pro.taskana.TimeInterval; import pro.taskana.configuration.TaskanaEngineConfiguration; import pro.taskana.database.TestDataGenerator; import pro.taskana.exceptions.ClassificationNotFoundException; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.sampledata.DBCleaner; /** * Base class for all acceptance tests. @@ -34,7 +34,6 @@ public abstract class AbstractAccTest { protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaEngine taskanaEngine; - private static DBCleaner cleaner = new DBCleaner(); protected static TestDataGenerator testDataGenerator = new TestDataGenerator(); @BeforeAll @@ -45,16 +44,18 @@ public abstract class AbstractAccTest { public static void resetDb(boolean dropTables) throws SQLException, IOException { DataSource dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + DBCleaner dbCleaner = new DBCleaner(); if (dropTables) { - cleaner.clearDb(dataSource, dropTables); + dbCleaner.dropDb(dataSource, schemaName); } dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); taskanaEngine.setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); - cleaner.clearDb(dataSource, false); - testDataGenerator.generateTestData(dataSource); + dbCleaner.clearDb(dataSource, schemaName); + testDataGenerator.generateTestData(dataSource, schemaName); } protected ObjectReference createObjectReference(String company, String system, String systemInstance, String type, diff --git a/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java b/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java index d270ac7c1..154ee1210 100644 --- a/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/classification/UpdateClassificationAccTest.java @@ -147,7 +147,9 @@ public class UpdateClassificationAccTest extends AbstractAccTest { equalTo("PROCESS")); assertThat(classification.getCreated(), equalTo(createdBefore)); - assertTrue(modifiedBefore.isBefore(classification.getModified())); + //isBeforeOrEquals in case of too fast execution + assertTrue(modifiedBefore.isBefore(classification.getModified()) || modifiedBefore.equals( + classification.getModified())); } @WithAccessId( diff --git a/lib/taskana-core/src/test/java/acceptance/report/AbstractReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/report/AbstractReportAccTest.java index 1d670d167..d84d1ec2c 100644 --- a/lib/taskana-core/src/test/java/acceptance/report/AbstractReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/report/AbstractReportAccTest.java @@ -11,8 +11,8 @@ import org.junit.jupiter.api.BeforeAll; import pro.taskana.TaskanaEngine; import pro.taskana.configuration.TaskanaEngineConfiguration; import pro.taskana.database.TestDataGenerator; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.sampledata.DBCleaner; /** * Abstract test class for all report building tests. @@ -34,13 +34,14 @@ public class AbstractReportAccTest { private static void resetDb() throws SQLException, IOException { DataSource dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); DBCleaner cleaner = new DBCleaner(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); taskanaEngine.setConnectionManagementMode(TaskanaEngine.ConnectionManagementMode.AUTOCOMMIT); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); TestDataGenerator testDataGenerator = new TestDataGenerator(); testDataGenerator.generateMonitoringTestData(dataSource); } diff --git a/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java b/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java index 0169b8856..e4fbfb612 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java +++ b/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java @@ -23,7 +23,6 @@ import org.apache.ibatis.jdbc.ScriptRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import pro.taskana.configuration.DbSchemaCreator; import pro.taskana.impl.TaskanaEngineImpl; /** @@ -31,7 +30,7 @@ import pro.taskana.impl.TaskanaEngineImpl; */ public class TestDataGenerator { - private static final Logger LOGGER = LoggerFactory.getLogger(DbSchemaCreator.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TestDataGenerator.class); private static final String SQL = "/sql"; private static final String TASK = SQL + "/task.sql"; private static final String WORKBASKET = SQL + "/workbasket.sql"; @@ -54,11 +53,12 @@ public class TestDataGenerator { this.errorLogWriter = new PrintWriter(this.errorWriter); } - public void generateTestData(DataSource dataSource) throws SQLException, IOException { + public void generateTestData(DataSource dataSource, String schema) throws SQLException, IOException { ScriptRunner runner = null; try { Connection connection = dataSource.getConnection(); LOGGER.debug(connection.getMetaData().toString()); + connection.setSchema(schema); runner = new ScriptRunner(connection); runner.setStopOnError(true); runner.setLogWriter(this.logWriter); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java index e8d130cf1..241116706 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntAutoCommitTest.java @@ -31,8 +31,8 @@ import pro.taskana.exceptions.DomainNotFoundException; import pro.taskana.exceptions.InvalidArgumentException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.impl.TaskanaEngineImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.sampledata.DBCleaner; /** * Integration Test for ClassificationServiceImpl with connection management mode AUTOCOMMIT. @@ -49,23 +49,25 @@ public class ClassificationServiceImplIntAutoCommitTest { private TaskanaEngineImpl taskanaEngineImpl; @BeforeClass - public static void resetDb() { + public static void resetDb() throws SQLException { DataSource ds = TaskanaEngineConfigurationTest.getDataSource(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(ds, true); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + cleaner.dropDb(ds, schemaName); } @Before public void setup() throws SQLException { dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); classificationService = taskanaEngine.getClassificationService(); taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; taskanaEngineImpl.setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); } @Test diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java index 3f304c0aa..29b0f9cca 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/ClassificationServiceImplIntExplicitTest.java @@ -38,8 +38,8 @@ import pro.taskana.exceptions.InvalidArgumentException; import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.impl.ClassificationImpl; import pro.taskana.impl.TaskanaEngineImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; +import pro.taskana.sampledata.DBCleaner; /** * Integration Test for ClassificationServiceImpl with connection management mode EXPLICIT. @@ -58,23 +58,25 @@ public class ClassificationServiceImplIntExplicitTest { private TaskanaEngineImpl taskanaEngineImpl; @BeforeClass - public static void resetDb() { + public static void resetDb() throws SQLException { DataSource ds = TaskanaEngineConfigurationTest.getDataSource(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(ds, true); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + cleaner.dropDb(ds, schemaName); } @Before public void setup() throws SQLException { dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); classificationService = taskanaEngine.getClassificationService(); taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; taskanaEngineImpl.setConnectionManagementMode(ConnectionManagementMode.EXPLICIT); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); } @Test diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java index 63b495aec..733239058 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntAutocommitTest.java @@ -48,9 +48,9 @@ import pro.taskana.impl.TaskImpl; import pro.taskana.impl.TaskServiceImpl; import pro.taskana.impl.TaskanaEngineImpl; import pro.taskana.impl.WorkbasketImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; +import pro.taskana.sampledata.DBCleaner; import pro.taskana.security.CurrentUserContext; import pro.taskana.security.JAASExtension; import pro.taskana.security.WithAccessId; @@ -80,8 +80,9 @@ class TaskServiceImplIntAutocommitTest { @BeforeEach void setup() throws SQLException { dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; @@ -90,7 +91,7 @@ class TaskServiceImplIntAutocommitTest { classificationService = taskanaEngine.getClassificationService(); workbasketService = taskanaEngine.getWorkbasketService(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); } @Test diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java index 1c4c78e83..450c6daaf 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/TaskServiceImplIntExplicitTest.java @@ -54,9 +54,9 @@ import pro.taskana.impl.TaskServiceImpl; import pro.taskana.impl.TaskanaEngineImpl; import pro.taskana.impl.WorkbasketImpl; import pro.taskana.impl.WorkbasketSummaryImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; +import pro.taskana.sampledata.DBCleaner; import pro.taskana.security.CurrentUserContext; import pro.taskana.security.JAASExtension; import pro.taskana.security.WithAccessId; @@ -107,8 +107,9 @@ class TaskServiceImplIntExplicitTest { } @BeforeEach - void resetDb() { - cleaner.clearDb(dataSource, false); + void resetDb() throws SQLException { + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + cleaner.clearDb(dataSource, schemaName); } @WithAccessId(userName = "Elena", groupNames = {"businessadmin"}) diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntAutocommitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntAutocommitTest.java index 211516f5f..673691383 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntAutocommitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntAutocommitTest.java @@ -37,10 +37,10 @@ import pro.taskana.exceptions.WorkbasketAlreadyExistException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.impl.TaskanaEngineProxyForTest; import pro.taskana.impl.WorkbasketImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; import pro.taskana.mappings.WorkbasketMapper; +import pro.taskana.sampledata.DBCleaner; import pro.taskana.security.JAASRunner; import pro.taskana.security.WithAccessId; @@ -60,22 +60,24 @@ public class WorkbasketServiceImplIntAutocommitTest { private Instant now; @BeforeClass - public static void resetDb() { + public static void resetDb() throws SQLException { DataSource ds = TaskanaEngineConfigurationTest.getDataSource(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(ds, true); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + cleaner.dropDb(ds, schemaName); } @Before public void setup() throws SQLException { dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); taskanaEngine.setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); workBasketService = taskanaEngine.getWorkbasketService(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); now = Instant.now(); } diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java index 23c381608..0a88a6e50 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/integration/WorkbasketServiceImplIntExplicitTest.java @@ -31,9 +31,9 @@ import pro.taskana.exceptions.WorkbasketAlreadyExistException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.impl.TaskanaEngineImpl; import pro.taskana.impl.WorkbasketImpl; -import pro.taskana.sampledata.DBCleaner; import pro.taskana.impl.configuration.TaskanaEngineConfigurationTest; import pro.taskana.impl.util.IdGenerator; +import pro.taskana.sampledata.DBCleaner; import pro.taskana.security.JAASRunner; import pro.taskana.security.WithAccessId; @@ -54,22 +54,24 @@ public class WorkbasketServiceImplIntExplicitTest { private WorkbasketService workBasketService; @BeforeClass - public static void resetDb() { + public static void resetDb() throws SQLException { DataSource ds = TaskanaEngineConfigurationTest.getDataSource(); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(ds, true); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); + cleaner.dropDb(ds, schemaName); } @Before public void setup() throws SQLException { dataSource = TaskanaEngineConfigurationTest.getDataSource(); + String schemaName = TaskanaEngineConfigurationTest.getSchemaName(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false, - TaskanaEngineConfigurationTest.getSchemaName()); + schemaName); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); taskanaEngineImpl = (TaskanaEngineImpl) taskanaEngine; taskanaEngineImpl.setConnectionManagementMode(ConnectionManagementMode.EXPLICIT); DBCleaner cleaner = new DBCleaner(); - cleaner.clearDb(dataSource, false); + cleaner.clearDb(dataSource, schemaName); } @WithAccessId(userName = "Elena", groupNames = {"businessadmin"}) diff --git a/lib/taskana-core/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java b/lib/taskana-core/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java index 8ebd18c80..d0aa0c42d 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java @@ -16,7 +16,7 @@ class SampleDataGeneratorTest { PooledDataSource pooledDataSource = new PooledDataSource("org.h2.Driver", "jdbc:h2:mem:taskana;IGNORECASE=TRUE;LOCK_MODE=0;INIT=CREATE SCHEMA IF NOT EXISTS TASKANA", "sa", "sa"); Assertions.assertDoesNotThrow(() -> new DbSchemaCreator(pooledDataSource, "TASKANA").run()); - Assertions.assertDoesNotThrow(() -> new SampleDataGenerator(pooledDataSource).generateSampleData("TASKANA")); + Assertions.assertDoesNotThrow(() -> new SampleDataGenerator(pooledDataSource, "TASKANA").generateSampleData()); pooledDataSource.forceCloseAll(); } diff --git a/lib/taskana-data/src/main/java/pro/taskana/sampledata/DBCleaner.java b/lib/taskana-data/src/main/java/pro/taskana/sampledata/DBCleaner.java index a6ded8753..cff236c53 100644 --- a/lib/taskana-data/src/main/java/pro/taskana/sampledata/DBCleaner.java +++ b/lib/taskana-data/src/main/java/pro/taskana/sampledata/DBCleaner.java @@ -1,59 +1,22 @@ package pro.taskana.sampledata; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.sql.Connection; +import java.sql.SQLException; import javax.sql.DataSource; -import org.apache.ibatis.jdbc.ScriptRunner; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** - * This class cleans the complete database. Only to be used in Unittest + * This class cleans the complete database. */ public class DBCleaner { - private static final Logger LOGGER = LoggerFactory.getLogger(DBCleaner.class); - private static final String DB_CLEAR_SCRIPT = "/sql/clear/clear-db.sql"; - private static final String DB_DROP_TABLES_SCRIPT = "/sql/clear/drop-tables.sql"; + public void clearDb(DataSource dataSource, String schema) throws SQLException { + SampleDataGenerator sampleDataGenerator = new SampleDataGenerator(dataSource, schema); + sampleDataGenerator.runScripts(sampleDataGenerator::clearDb); + } - private StringWriter outWriter = new StringWriter(); - private PrintWriter logWriter = new PrintWriter(outWriter); - private StringWriter errorWriter = new StringWriter(); - private PrintWriter errorLogWriter = new PrintWriter(errorWriter); + public void dropDb(DataSource dataSource, String schema) throws SQLException { + SampleDataGenerator sampleDataGenerator = new SampleDataGenerator(dataSource, schema); + sampleDataGenerator.runScripts(sampleDataGenerator::dropDb); - /** - * Clears the db. - * - * @param dataSource the datasource - * @param dropTables - * if true drop tables, else clean tables - */ - public void clearDb(DataSource dataSource, boolean dropTables) { - try (Connection connection = dataSource.getConnection()) { - ScriptRunner runner = new ScriptRunner(connection); - LOGGER.debug(connection.getMetaData().toString()); - - runner.setStopOnError(false); - runner.setLogWriter(logWriter); - runner.setErrorLogWriter(errorLogWriter); - if (dropTables) { - runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DB_DROP_TABLES_SCRIPT))); - } else { - runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DB_CLEAR_SCRIPT))); - } - - } catch (Exception e) { - LOGGER.error("caught Exception " + e); - } - LOGGER.debug(outWriter.toString()); - String errorMsg = errorWriter.toString().trim(); - - if (!errorMsg.isEmpty() && !errorMsg.contains("SQLCODE=-204, SQLSTATE=42704")) { - LOGGER.error(errorWriter.toString()); - } } } diff --git a/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java b/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java index 3bd0d44b7..4071ecf0f 100644 --- a/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java +++ b/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataGenerator.java @@ -11,6 +11,7 @@ import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Optional; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -29,18 +30,8 @@ public class SampleDataGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(SampleDataGenerator.class); - private static final String CLEAR = "/sql/clear/clear-db.sql"; - private static final String CLEAR_HISTORY_EVENTS = "/sql/clear/clear-history-events.sql"; - - private static final String TASK = "/sql/sample-data/task.sql"; - private static final String WORKBASKET = "/sql/sample-data/workbasket.sql"; - private static final String DISTRIBUTION_TARGETS = "/sql/sample-data/distribution-targets.sql"; - private static final String WORKBASKET_ACCESS_LIST = "/sql/sample-data/workbasket-access-list.sql"; - private static final String CLASSIFICATION = "/sql/sample-data/classification.sql"; - private static final String OBJECT_REFERENCE = "/sql/sample-data/object-reference.sql"; - private static final String ATTACHMENT = "/sql/sample-data/attachment.sql"; - private static final String HISTORY_EVENT = "/sql/sample-data/history-event.sql"; - private static final String CHECK_HISTORY_EVENT_EXIST = "/sql/sample-data/check-history-event-exist.sql"; + private static final String DB_CLEAR_TABLES_SCRIPT = "/sql/clear/clear-db.sql"; + private static final String DB_DROP_TABLES_SCRIPT = "/sql/clear/drop-tables.sql"; static final String RELATIVE_DATE_REGEX = "RELATIVE_DATE\\((-?\\d+)\\)"; static final Pattern RELATIVE_DATE_PATTERN = Pattern.compile(RELATIVE_DATE_REGEX); @@ -49,16 +40,23 @@ public class SampleDataGenerator { private final DataSource dataSource; private final LocalDateTime now; - public SampleDataGenerator(DataSource dataSource) { - this(dataSource, LocalDateTime.now()); + /** + * This value cannot be automatically obtained by connection.getSchema(), + * because setting not yet existing schema will result into an SQL Exception. + */ + private final String schema; + + public SampleDataGenerator(DataSource dataSource, String schema) { + this(dataSource, schema, LocalDateTime.now()); } - public SampleDataGenerator(DataSource dataSource, LocalDateTime now) { + public SampleDataGenerator(DataSource dataSource, String schema, LocalDateTime now) { this.dataSource = dataSource; + this.schema = schema; this.now = now; } - public void generateSampleData(String schemaName) throws SQLException { + public void runScripts(Consumer consumer) throws SQLException { try (Connection connection = dataSource.getConnection()) { if (LOGGER.isTraceEnabled()) { @@ -68,18 +66,8 @@ public class SampleDataGenerator { StringWriter outWriter = new StringWriter(); StringWriter errorWriter = new StringWriter(); - ScriptRunner runner = getScriptRunner(schemaName, connection, outWriter, errorWriter); - - Stream scriptsList = getDefaultScripts(); - try { - runner.runScript(getScriptBufferedStream(CHECK_HISTORY_EVENT_EXIST)); - runner.runScript(getScriptBufferedStream(CLEAR_HISTORY_EVENTS)); - scriptsList = Stream.concat(scriptsList, Stream.of(HISTORY_EVENT)); - } catch (Exception e) { - LOGGER.error("The HISTORY_EVENTS table is not created"); - } - - executeScripts(runner, scriptsList); + ScriptRunner runner = getScriptRunner(connection, outWriter, errorWriter); + consumer.accept(runner); runner.closeConnection(); if (LOGGER.isTraceEnabled()) { @@ -92,6 +80,13 @@ public class SampleDataGenerator { } } + public void generateSampleData() throws SQLException { + runScripts((runner) -> { + clearDb(runner); + executeScripts(runner, SampleDataProvider.getDataProvider(runner)); + }); + } + private void executeScripts(ScriptRunner runner, Stream scriptsList) { scriptsList .map(s -> SampleDataGenerator.parseAndReplace(now, s)) @@ -100,20 +95,28 @@ public class SampleDataGenerator { .forEachOrdered(runner::runScript); } - private ScriptRunner getScriptRunner(String schemaName, Connection connection, StringWriter outWriter, + public void clearDb(ScriptRunner runner) { + runner.setStopOnError(false); + runner.runScript(getScriptBufferedStream(DB_CLEAR_TABLES_SCRIPT)); + runner.setStopOnError(true); + } + + public void dropDb(ScriptRunner runner) { + runner.setStopOnError(false); + runner.runScript(getScriptBufferedStream(DB_DROP_TABLES_SCRIPT)); + runner.setStopOnError(true); + } + + ScriptRunner getScriptRunner(Connection connection, StringWriter outWriter, StringWriter errorWriter) throws SQLException { PrintWriter logWriter = new PrintWriter(outWriter); PrintWriter errorLogWriter = new PrintWriter(errorWriter); ScriptRunner runner = new ScriptRunner(connection); + connection.setSchema(schema); String databaseProductName = connection.getMetaData().getDatabaseProductName(); - runner.runScript(selectSchemaScript(databaseProductName, schemaName)); - runner.setStopOnError(false); - runner.runScript(getScriptBufferedStream(CLEAR)); - - runner.setStopOnError(true); runner.setLogWriter(logWriter); runner.setErrorLogWriter(errorLogWriter); return runner; @@ -149,12 +152,6 @@ public class SampleDataGenerator { return "'" + now.plusDays(days).format(DATE_TIME_FORMATTER) + "'"; } - private StringReader selectSchemaScript(String dbProductName, String schemaName) { - return new StringReader(isPostgreSQL(dbProductName) - ? "SET search_path TO " + schemaName + ";" - : "SET SCHEMA " + schemaName + ";"); - } - private static String parseAndReplace(LocalDateTime now, String script) { return replaceDatePlaceholder(now, getScriptBufferedStream(script).lines().collect(Collectors.joining(System.lineSeparator()))); @@ -166,11 +163,6 @@ public class SampleDataGenerator { new InputStreamReader(inputStream, StandardCharsets.UTF_8))).orElse(null); } - static Stream getDefaultScripts() { - return Stream.of(WORKBASKET, DISTRIBUTION_TARGETS, CLASSIFICATION, TASK, ATTACHMENT, WORKBASKET_ACCESS_LIST, - OBJECT_REFERENCE); - } - private static boolean isPostgreSQL(String databaseProductName) { return "PostgreSQL".equals(databaseProductName); } diff --git a/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataProvider.java b/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataProvider.java new file mode 100644 index 000000000..ab3f8060f --- /dev/null +++ b/lib/taskana-data/src/main/java/pro/taskana/sampledata/SampleDataProvider.java @@ -0,0 +1,47 @@ +package pro.taskana.sampledata; + +import java.util.stream.Stream; + +import org.apache.ibatis.jdbc.ScriptRunner; + +/** + * Provides a sample data set. + */ +public final class SampleDataProvider { + + private static final String CLEAR_HISTORY_EVENTS = "/sql/clear/clear-history-events.sql"; + private static final String HISTORY_EVENT = "/sql/sample-data/history-event.sql"; + private static final String CHECK_HISTORY_EVENT_EXIST = "/sql/sample-data/check-history-event-exist.sql"; + + private static final String TASK = "/sql/sample-data/task.sql"; + private static final String WORKBASKET = "/sql/sample-data/workbasket.sql"; + private static final String DISTRIBUTION_TARGETS = "/sql/sample-data/distribution-targets.sql"; + private static final String WORKBASKET_ACCESS_LIST = "/sql/sample-data/workbasket-access-list.sql"; + private static final String CLASSIFICATION = "/sql/sample-data/classification.sql"; + private static final String OBJECT_REFERENCE = "/sql/sample-data/object-reference.sql"; + private static final String ATTACHMENT = "/sql/sample-data/attachment.sql"; + + private SampleDataProvider() { + } + + static Stream getScripts() { + return Stream.of( + WORKBASKET, DISTRIBUTION_TARGETS, CLASSIFICATION, TASK, ATTACHMENT, WORKBASKET_ACCESS_LIST, + OBJECT_REFERENCE); + } + + static Stream getScriptsWithEvents() { + return Stream.concat(getScripts(), Stream.of(CLEAR_HISTORY_EVENTS, HISTORY_EVENT)); + } + + public static Stream getDataProvider(ScriptRunner runner) { + + try { + //TODO find a better method of testing if a table exists + runner.runScript(SampleDataGenerator.getScriptBufferedStream(CHECK_HISTORY_EVENT_EXIST)); + return SampleDataProvider.getScriptsWithEvents(); + } catch (Exception e) { + return SampleDataProvider.getScripts(); + } + } +} diff --git a/lib/taskana-data/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java b/lib/taskana-data/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java index 9c89a619d..b35ab869d 100644 --- a/lib/taskana-data/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java +++ b/lib/taskana-data/src/test/java/pro/taskana/sampledata/SampleDataGeneratorTest.java @@ -1,6 +1,8 @@ package pro.taskana.sampledata; import static org.hamcrest.MatcherAssert.assertThat; +import static pro.taskana.sampledata.SampleDataGenerator.DATE_TIME_FORMATTER; +import static pro.taskana.sampledata.SampleDataGenerator.RELATIVE_DATE_PATTERN; import java.time.LocalDateTime; import java.util.regex.Matcher; @@ -16,17 +18,19 @@ class SampleDataGeneratorTest { @Test void getScriptsNotNull() { - Assertions.assertNotNull(SampleDataGenerator.getDefaultScripts()); + Assertions.assertNotNull(SampleDataProvider.getScripts()); + Assertions.assertNotNull(SampleDataProvider.getScriptsWithEvents()); } @Test void getScriptsNotEmpty() { - Assertions.assertTrue(SampleDataGenerator.getDefaultScripts().count() > 0); + Assertions.assertTrue(SampleDataProvider.getScripts().count() > 0); + Assertions.assertTrue(SampleDataProvider.getScriptsWithEvents().count() > 0); } @Test void getScriptsFileExists() { - SampleDataGenerator.getDefaultScripts() + SampleDataProvider.getScripts() .map(SampleDataGenerator::getScriptBufferedStream) .forEach(Assertions::assertNotNull); } @@ -34,7 +38,7 @@ class SampleDataGeneratorTest { @Test void replaceRelativeTimeFunctionSameDate() { LocalDateTime now = LocalDateTime.now(); - String dateFormatted = now.format(SampleDataGenerator.DATE_TIME_FORMATTER); + String dateFormatted = now.format(DATE_TIME_FORMATTER); String sqlStringReplaced = SampleDataGenerator.replaceDatePlaceholder(now, "... RELATIVE_DATE(0) ..."); assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted)); @@ -43,22 +47,21 @@ class SampleDataGeneratorTest { @Test void testDateRegex() { - Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)").matches()); + Assertions.assertTrue(RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)").matches()); - Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(5) ...").find()); - Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(0) ...").find()); - Assertions.assertTrue(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(-123) ...").find()); + Assertions.assertTrue(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(5) ...").find()); + Assertions.assertTrue(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(0) ...").find()); + Assertions.assertTrue(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(-123) ...").find()); - Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE() ...").find()); - Assertions.assertFalse( - SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(ABCDE) ...").find()); - Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("... RELATIVE_NO(5) ...").find()); - Assertions.assertFalse(SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("...").find()); + Assertions.assertFalse(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE() ...").find()); + Assertions.assertFalse(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_DATE(ABCDE) ...").find()); + Assertions.assertFalse(RELATIVE_DATE_PATTERN.matcher("... RELATIVE_NO(5) ...").find()); + Assertions.assertFalse(RELATIVE_DATE_PATTERN.matcher("...").find()); } @Test void testDateRegexExtractGroup() { - Matcher matcher = SampleDataGenerator.RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)"); + Matcher matcher = RELATIVE_DATE_PATTERN.matcher("RELATIVE_DATE(123)"); Assertions.assertTrue(matcher.find()); Assertions.assertEquals("123", matcher.group(1)); } @@ -66,7 +69,7 @@ class SampleDataGeneratorTest { @Test void replaceRelativeTimeFunctionPosDate() { LocalDateTime now = LocalDateTime.now(); - String dateFormatted = now.plusDays(5).format(SampleDataGenerator.DATE_TIME_FORMATTER); + String dateFormatted = now.plusDays(5).format(DATE_TIME_FORMATTER); String sqlStringReplaced = SampleDataGenerator.replaceDatePlaceholder(now, "... RELATIVE_DATE(5) ..."); assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted)); @@ -75,7 +78,7 @@ class SampleDataGeneratorTest { @Test void replaceRelativeTimeFunctionNegDate() { LocalDateTime now = LocalDateTime.now(); - String dateFormatted = now.plusDays(-10).format(SampleDataGenerator.DATE_TIME_FORMATTER); + String dateFormatted = now.plusDays(-10).format(DATE_TIME_FORMATTER); String sqlStringReplaced = SampleDataGenerator.replaceDatePlaceholder(now, "... RELATIVE_DATE(-10) ..."); assertThat(sqlStringReplaced, CoreMatchers.containsString(dateFormatted)); diff --git a/rest/taskana-rest-spring-example-boot/src/main/java/pro/taskana/rest/ExampleRestApplication.java b/rest/taskana-rest-spring-example-boot/src/main/java/pro/taskana/rest/ExampleRestApplication.java index c1e3dd17a..7a7801d9c 100644 --- a/rest/taskana-rest-spring-example-boot/src/main/java/pro/taskana/rest/ExampleRestApplication.java +++ b/rest/taskana-rest-spring-example-boot/src/main/java/pro/taskana/rest/ExampleRestApplication.java @@ -58,7 +58,7 @@ public class ExampleRestApplication { @Bean @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted public SampleDataGenerator generateSampleData(DataSource dataSource) { - sampleDataGenerator = new SampleDataGenerator(dataSource); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); return sampleDataGenerator; } @@ -68,7 +68,7 @@ public class ExampleRestApplication { AccessIdController.setLdapCache(ldapCacheTest); } if (generateSampleData) { - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator.generateSampleData(); } } } diff --git a/rest/taskana-rest-spring-example-common/src/test/java/pro/taskana/rest/ExampleRestApplication.java b/rest/taskana-rest-spring-example-common/src/test/java/pro/taskana/rest/ExampleRestApplication.java index c1e3dd17a..7a7801d9c 100644 --- a/rest/taskana-rest-spring-example-common/src/test/java/pro/taskana/rest/ExampleRestApplication.java +++ b/rest/taskana-rest-spring-example-common/src/test/java/pro/taskana/rest/ExampleRestApplication.java @@ -58,7 +58,7 @@ public class ExampleRestApplication { @Bean @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted public SampleDataGenerator generateSampleData(DataSource dataSource) { - sampleDataGenerator = new SampleDataGenerator(dataSource); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); return sampleDataGenerator; } @@ -68,7 +68,7 @@ public class ExampleRestApplication { AccessIdController.setLdapCache(ldapCacheTest); } if (generateSampleData) { - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator.generateSampleData(); } } } diff --git a/rest/taskana-rest-spring-example-wildfly/src/main/java/pro/taskana/TaskanaWildFlyApplication.java b/rest/taskana-rest-spring-example-wildfly/src/main/java/pro/taskana/TaskanaWildFlyApplication.java index a0cbd663d..05011a501 100644 --- a/rest/taskana-rest-spring-example-wildfly/src/main/java/pro/taskana/TaskanaWildFlyApplication.java +++ b/rest/taskana-rest-spring-example-wildfly/src/main/java/pro/taskana/TaskanaWildFlyApplication.java @@ -99,7 +99,7 @@ public class TaskanaWildFlyApplication extends SpringBootServletInitializer { @Bean @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted public SampleDataGenerator generateSampleData(DataSource dataSource) { - sampleDataGenerator = new SampleDataGenerator(dataSource); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); return sampleDataGenerator; } @@ -109,7 +109,7 @@ public class TaskanaWildFlyApplication extends SpringBootServletInitializer { AccessIdController.setLdapCache(ldapCacheTest); } if (generateSampleData) { - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator.generateSampleData(); } } } diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/ExampleDocumentationApp.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/ExampleDocumentationApp.java index 27cbc20fe..7a0a8eb31 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/ExampleDocumentationApp.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/ExampleDocumentationApp.java @@ -64,13 +64,13 @@ public class ExampleDocumentationApp { @Bean @DependsOn("getTaskanaEngine") // generate sample data after schema was inserted public SampleDataGenerator generateSampleData(DataSource dataSource) { - sampleDataGenerator = new SampleDataGenerator(dataSource); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); return sampleDataGenerator; } @PostConstruct private void init() throws SQLException { AccessIdController.setLdapCache(new LdapCacheTestImpl()); - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator.generateSampleData(); } } diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TaskControllerIntTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TaskControllerIntTest.java index f16a2a03b..e57601da7 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TaskControllerIntTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TaskControllerIntTest.java @@ -73,8 +73,8 @@ class TaskControllerIntTest { void resetDb() { SampleDataGenerator sampleDataGenerator; try { - sampleDataGenerator = new SampleDataGenerator(dataSource); - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); + sampleDataGenerator.generateSampleData(); } catch (SQLException e) { throw new SystemException("tried to reset DB and caught Exception " + e, e); } diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java index 24da65f7c..bb7ced50e 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/TestSchemaNameCustomizable.java @@ -37,8 +37,8 @@ class TestSchemaNameCustomizable { schemaName = schemaName.toLowerCase(); } new SpringTaskanaEngineConfiguration(dataSource, true, true, schemaName); - sampleDataGenerator = new SampleDataGenerator(dataSource); - sampleDataGenerator.generateSampleData(schemaName); + sampleDataGenerator = new SampleDataGenerator(dataSource, schemaName); + sampleDataGenerator.generateSampleData(); } catch (SQLException e) { throw new SystemException("tried to reset DB and caught Exception " + e, e); }