diff --git a/lib/taskana-core/src/main/java/org/taskana/configuration/DbScriptRunner.java b/lib/taskana-core/src/main/java/org/taskana/configuration/DbScriptRunner.java index 5031a1899..3b3a47711 100644 --- a/lib/taskana-core/src/main/java/org/taskana/configuration/DbScriptRunner.java +++ b/lib/taskana-core/src/main/java/org/taskana/configuration/DbScriptRunner.java @@ -16,27 +16,28 @@ public class DbScriptRunner { private static final Logger logger = LoggerFactory.getLogger(DbScriptRunner.class); private static final String SQL = "/sql"; - private static final String DB_STRUCTURE = SQL + "/db-structure.sql"; + private static final String DB_SCHEMA = SQL + "/taskana-schema.sql"; + private static final String DB_SCHEMA_DETECTION = SQL + "/schema-detection.sql"; private DataSource dataSource; + private StringWriter outWriter = new StringWriter(); + private PrintWriter logWriter = new PrintWriter(outWriter); + private StringWriter errorWriter = new StringWriter(); + private PrintWriter errorLogWriter = new PrintWriter(errorWriter); + public DbScriptRunner(DataSource dataSource) { super(); this.dataSource = dataSource; } + /** * Run all db scripts * * @throws SQLException */ public void run() throws SQLException { - StringWriter outWriter = new StringWriter(); - PrintWriter logWriter = new PrintWriter(outWriter); - - StringWriter errorWriter = new StringWriter(); - PrintWriter errorLogWriter = new PrintWriter(errorWriter); - ScriptRunner runner = new ScriptRunner(dataSource.getConnection()); logger.debug(dataSource.getConnection().getMetaData().toString()); @@ -44,7 +45,9 @@ public class DbScriptRunner { runner.setLogWriter(logWriter); runner.setErrorLogWriter(errorLogWriter); - runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DB_STRUCTURE))); + if (!isSchemaPreexisting(runner)) { + runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DB_SCHEMA))); + } runner.closeConnection(); logger.debug(outWriter.toString()); @@ -53,6 +56,17 @@ public class DbScriptRunner { } } + private boolean isSchemaPreexisting(ScriptRunner runner) { + try { + runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DB_SCHEMA_DETECTION))); + } catch (Exception e) { + logger.debug("Schema does not exist."); + return false; + } + logger.debug("Schema does exist."); + return true; + } + public DataSource getDataSource() { return dataSource; } diff --git a/lib/taskana-core/src/main/resources/sql/db-structure.sql b/lib/taskana-core/src/main/resources/sql/db-structure.sql deleted file mode 100644 index 0921284de..000000000 --- a/lib/taskana-core/src/main/resources/sql/db-structure.sql +++ /dev/null @@ -1,77 +0,0 @@ -CREATE TABLE IF NOT EXISTS TASK( - ID varchar(36) NOT NULL, - TENANT_ID varchar(36) NULL, - CREATED TIMESTAMP NULL, - CLAIMED TIMESTAMP NULL, - COMPLETED TIMESTAMP NULL, - MODIFIED TIMESTAMP NULL, - PLANNED TIMESTAMP NULL, - DUE TIMESTAMP NULL, - NAME varchar(1024) NULL, - DESCRIPTION varchar(4096) NULL, - PRIORITY INT NULL, - STATE varchar(20) NULL, - TYPE varchar(255) NULL, - WORKBASKETID varchar(36) NULL, - OWNER varchar(255) NULL, - PRIMARY_OBJ_REF_ID varchar(36) NULL, - IS_READ bit NOT NULL, - IS_TRANSFERRED bit NOT NULL, - PRIMARY KEY (ID) -); - -CREATE TABLE IF NOT EXISTS WORKBASKET( - ID varchar(36) NOT NULL, - TENANT_ID varchar(36) NULL, - CREATED TIMESTAMP NULL, - MODIFIED TIMESTAMP NULL, - NAME varchar(255) NULL, - DESCRIPTION varchar(255) NULL, - OWNER varchar(255) NULL, - PRIMARY KEY (ID), - CONSTRAINT UC_NAME UNIQUE (NAME) -); - -CREATE TABLE IF NOT EXISTS DISTRIBUTION_TARGETS( - SOURCE_ID varchar(36) NOT NULL, - TARGET_ID varchar(36) NOT NULL, - PRIMARY KEY (SOURCE_ID, TARGET_ID) -); - -CREATE TABLE IF NOT EXISTS CLASSIFICATION( - ID varchar(36) NOT NULL, - TENANT_ID varchar(36) NULL, - PARENT_CLASSIFICATION_ID varchar(255), - CATEGORY varchar(255), - TYPE varchar(255), - CREATED DATE NULL, - MODIFIED DATE NULL, - NAME varchar(255) NULL, - DESCRIPTION varchar(255) NULL, - PRIORITY INT NULL, - SERVICE_LEVEL varchar(255) NULL, - PRIMARY KEY (ID) -); - -CREATE TABLE IF NOT EXISTS WORKBASKET_ACCESS_LIST( - ID varchar(36) NOT NULL, - WORKBASKET_ID varchar(36) NOT NULL, - USER_ID varchar(255) NULL, - GROUP_ID varchar(255) NULL, - READ bit NOT NULL, - OPEN bit NOT NULL, - APPEND bit NOT NULL, - TRANSFER bit NOT NULL, - DISTRIBUTE bit NOT NULL, - PRIMARY KEY (ID) -); - -CREATE TABLE IF NOT EXISTS OBJECT_REFERENCE( - ID varchar(36) NOT NULL, - TENANT_ID varchar(36) NULL, - COMPANY varchar(32) NOT NULL, - SYSTEM varchar(32) NOT NULL, - SYSTEM_INSTANCE varchar(32) NOT NULL, - TYPE varchar(32) NOT NULL, - VALUE varchar(128) NOT NULL -); diff --git a/lib/taskana-core/src/main/resources/sql/schema-detection.sql b/lib/taskana-core/src/main/resources/sql/schema-detection.sql new file mode 100644 index 000000000..7dd6924e3 --- /dev/null +++ b/lib/taskana-core/src/main/resources/sql/schema-detection.sql @@ -0,0 +1 @@ +SELECT COUNT(*) FROM TASKANA_SCHEMA_VERSION; diff --git a/lib/taskana-core/src/main/resources/sql/taskana-schema.sql b/lib/taskana-core/src/main/resources/sql/taskana-schema.sql new file mode 100644 index 000000000..dfe1775fa --- /dev/null +++ b/lib/taskana-core/src/main/resources/sql/taskana-schema.sql @@ -0,0 +1,74 @@ +CREATE TABLE TASKANA_SCHEMA_VERSION( + ID VARCHAR(36) NOT NULL, + VERSION VARCHAR(255) NOT NULL, + PRIMARY KEY (ID) +); +INSERT INTO TASKANA_SCHEMA_VERSION VALUES ('1', '0.0.1'); + +CREATE TABLE TASK( + ID VARCHAR(36) NOT NULL, + TENANT_ID VARCHAR(36) NULL, + CREATED TIMESTAMP NULL, + CLAIMED TIMESTAMP NULL, + COMPLETED TIMESTAMP NULL, + MODIFIED TIMESTAMP NULL, + PLANNED TIMESTAMP NULL, + DUE TIMESTAMP NULL, + NAME VARCHAR(1024) NULL, + DESCRIPTION VARCHAR(4096) NULL, + PRIORITY INT NULL, + STATE VARCHAR(20) NULL, + TYPE VARCHAR(255) NULL, + WORKBASKETID VARCHAR(36) NULL, + OWNER VARCHAR(255) NULL, + PRIMARY_OBJ_REF_ID varchar(36) NULL, + IS_READ BOOLEAN NOT NULL, + IS_TRANSFERRED BOOLEAN NOT NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE WORKBASKET( + ID VARCHAR(36) NOT NULL, + TENANT_ID VARCHAR(36) NULL, + CREATED TIMESTAMP NULL, + MODIFIED TIMESTAMP NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255) NULL, + OWNER VARCHAR(255) NULL, + PRIMARY KEY (ID), + CONSTRAINT UC_NAME UNIQUE (NAME) +); + +CREATE TABLE DISTRIBUTION_TARGETS( + SOURCE_ID VARCHAR(36) NOT NULL, + TARGET_ID VARCHAR(36) NOT NULL, + PRIMARY KEY (SOURCE_ID, TARGET_ID) +); + +CREATE TABLE CLASSIFICATION( + ID VARCHAR(36) NOT NULL, + TENANT_ID VARCHAR(36) NULL, + PARENT_CLASSIFICATION_ID VARCHAR(255), + CATEGORY VARCHAR(255), + TYPE VARCHAR(255), + CREATED DATE NULL, + MODIFIED DATE NULL, + NAME VARCHAR(255) NULL, + DESCRIPTION VARCHAR(255) NULL, + PRIORITY INT NULL, + SERVICE_LEVEL VARCHAR(255) NULL, + PRIMARY KEY (ID) +); + +CREATE TABLE WORKBASKET_ACCESS_LIST( + ID VARCHAR(36) NOT NULL, + WORKBASKET_ID VARCHAR(36) NOT NULL, + USER_ID VARCHAR(255) NULL, + GROUP_ID VARCHAR(255) NULL, + READ BOOLEAN NOT NULL, + OPEN BOOLEAN NOT NULL, + APPEND BOOLEAN NOT NULL, + TRANSFER BOOLEAN NOT NULL, + DISTRIBUTE BOOLEAN NOT NULL, + PRIMARY KEY (ID) +); diff --git a/lib/taskana-core/src/test/java/org/taskana/impl/integration/WorkbasketServiceImplIntTest.java b/lib/taskana-core/src/test/java/org/taskana/impl/integration/WorkbasketServiceImplIntTest.java index af602db40..a63f7e3c4 100644 --- a/lib/taskana-core/src/test/java/org/taskana/impl/integration/WorkbasketServiceImplIntTest.java +++ b/lib/taskana-core/src/test/java/org/taskana/impl/integration/WorkbasketServiceImplIntTest.java @@ -41,6 +41,7 @@ public class WorkbasketServiceImplIntTest { int before = workbasketServiceImpl.getWorkbaskets().size(); Workbasket workbasket = new Workbasket(); workbasket.setId("1"); + workbasket.setName("Megabasket"); workbasketServiceImpl.createWorkbasket(workbasket); Assert.assertEquals(before + 1, workbasketServiceImpl.getWorkbaskets().size()); } @@ -50,12 +51,15 @@ public class WorkbasketServiceImplIntTest { int before = workbasketServiceImpl.getWorkbaskets().size(); Workbasket workbasket0 = new Workbasket(); workbasket0.setId("0"); + workbasket0.setName("Superbasket"); workbasketServiceImpl.createWorkbasket(workbasket0); Workbasket workbasket1 = new Workbasket(); workbasket1.setId("1"); + workbasket1.setName("Megabasket"); workbasketServiceImpl.createWorkbasket(workbasket1); Workbasket workbasket2 = new Workbasket(); workbasket2.setId("2"); + workbasket2.setName("Hyperbasket"); workbasketServiceImpl.createWorkbasket(workbasket2); Assert.assertEquals(before + 3, workbasketServiceImpl.getWorkbaskets().size()); } @@ -64,12 +68,15 @@ public class WorkbasketServiceImplIntTest { public void testSelectWorkbasket() throws WorkbasketNotFoundException, NotAuthorizedException { Workbasket workbasket0 = new Workbasket(); workbasket0.setId("0"); + workbasket0.setName("Superbasket"); workbasketServiceImpl.createWorkbasket(workbasket0); Workbasket workbasket1 = new Workbasket(); workbasket1.setId("1"); + workbasket1.setName("Megabasket"); workbasketServiceImpl.createWorkbasket(workbasket1); Workbasket workbasket2 = new Workbasket(); workbasket2.setId("2"); + workbasket2.setName("Hyperbasket"); workbasketServiceImpl.createWorkbasket(workbasket2); Workbasket foundWorkbasket = workbasketServiceImpl.getWorkbasket("2"); Assert.assertEquals("2", foundWorkbasket.getId()); @@ -84,10 +91,13 @@ public class WorkbasketServiceImplIntTest { public void testSelectWorkbasketWithDistribution() throws WorkbasketNotFoundException, NotAuthorizedException { Workbasket workbasket0 = new Workbasket(); workbasket0.setId("0"); + workbasket0.setName("Superbasket"); Workbasket workbasket1 = new Workbasket(); workbasket1.setId("1"); + workbasket1.setName("Megabasket"); Workbasket workbasket2 = new Workbasket(); workbasket2.setId("2"); + workbasket2.setName("Hyperbasket"); workbasket2.setDistributionTargets(new ArrayList<>()); workbasket2.getDistributionTargets().add(workbasket0); workbasket2.getDistributionTargets().add(workbasket1); @@ -101,16 +111,20 @@ public class WorkbasketServiceImplIntTest { public void testUpdateWorkbasket() throws Exception { Workbasket workbasket0 = new Workbasket(); workbasket0.setId("0"); + workbasket0.setName("Superbasket"); Workbasket workbasket1 = new Workbasket(); workbasket1.setId("1"); + workbasket1.setName("Megabasket"); Workbasket workbasket2 = new Workbasket(); workbasket2.setId("2"); + workbasket2.setName("Hyperbasket"); workbasket2.getDistributionTargets().add(workbasket0); workbasket2.getDistributionTargets().add(workbasket1); workbasketServiceImpl.createWorkbasket(workbasket2); Workbasket workbasket3 = new Workbasket(); workbasket3.setId("3"); + workbasket3.setName("hm ... irgend ein basket"); workbasket2.getDistributionTargets().clear(); workbasket2.getDistributionTargets().add(workbasket3); Thread.sleep(100); diff --git a/lib/taskana-spring-example/pom.xml b/lib/taskana-spring-example/pom.xml index db98be019..ddb85326c 100644 --- a/lib/taskana-spring-example/pom.xml +++ b/lib/taskana-spring-example/pom.xml @@ -34,7 +34,11 @@ org.springframework spring-tx - + + com.h2database + h2 + + org.taskana taskana-core diff --git a/lib/taskana-spring-example/src/main/resources/application.properties b/lib/taskana-spring-example/src/main/resources/application.properties new file mode 100644 index 000000000..ed9c0ff88 --- /dev/null +++ b/lib/taskana-spring-example/src/main/resources/application.properties @@ -0,0 +1 @@ +logging.level.org.taskana=DEBUG diff --git a/lib/taskana-spring-example/src/main/resources/applicationContext.xml b/lib/taskana-spring-example/src/main/resources/applicationContext.xml index 3229062bf..d619bd682 100644 --- a/lib/taskana-spring-example/src/main/resources/applicationContext.xml +++ b/lib/taskana-spring-example/src/main/resources/applicationContext.xml @@ -5,8 +5,7 @@ - + @@ -18,31 +17,14 @@ - - - + - - - - - - + - - - - - + + \ No newline at end of file diff --git a/lib/taskana-spring/src/main/java/org/taskana/SpringTaskanaEngineImpl.java b/lib/taskana-spring/src/main/java/org/taskana/SpringTaskanaEngineImpl.java index 49dbfece6..9c1c0bdbd 100644 --- a/lib/taskana-spring/src/main/java/org/taskana/SpringTaskanaEngineImpl.java +++ b/lib/taskana-spring/src/main/java/org/taskana/SpringTaskanaEngineImpl.java @@ -5,29 +5,21 @@ import java.sql.SQLException; import javax.annotation.PostConstruct; import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; -import org.springframework.transaction.PlatformTransactionManager; import org.taskana.configuration.SpringTaskanaEngineConfiguration; import org.taskana.impl.TaskanaEngineImpl; +/** + * This class configures the TaskanaEngine for spring + */ public class SpringTaskanaEngineImpl extends TaskanaEngineImpl { public SpringTaskanaEngineImpl(SpringTaskanaEngineConfiguration taskanaEngineConfiguration) { super(taskanaEngineConfiguration); } - private PlatformTransactionManager transactionManager; - @PostConstruct public void init() throws SQLException { this.transactionFactory = new ManagedTransactionFactory(); } - public PlatformTransactionManager getTransactionManager() { - return transactionManager; - } - - public void setTransactionManager(PlatformTransactionManager transactionManager) { - this.transactionManager = transactionManager; - } - } diff --git a/lib/taskana-spring/src/main/java/org/taskana/configuration/SpringTaskanaEngineConfiguration.java b/lib/taskana-spring/src/main/java/org/taskana/configuration/SpringTaskanaEngineConfiguration.java index 66d039494..03ee319e9 100644 --- a/lib/taskana-spring/src/main/java/org/taskana/configuration/SpringTaskanaEngineConfiguration.java +++ b/lib/taskana-spring/src/main/java/org/taskana/configuration/SpringTaskanaEngineConfiguration.java @@ -2,19 +2,19 @@ package org.taskana.configuration; import java.sql.SQLException; -import javax.annotation.PostConstruct; import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.taskana.SpringTaskanaEngineImpl; import org.taskana.TaskanaEngine; +/** + * This class configures the TaskanaEngineConfiguration for spring + */ public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration { - @PostConstruct - public void init() throws SQLException { - dbScriptRunner = new DbScriptRunner(this.dataSource); - dbScriptRunner.run(); - } + private static final Logger logger = LoggerFactory.getLogger(SpringTaskanaEngineConfiguration.class); /** * This method creates the Spring-based TaskanaEngine without an @@ -23,10 +23,19 @@ public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration * @return the TaskanaEngine * @throws SQLException */ - public TaskanaEngine buildTaskanaEngine() throws SQLException { + public TaskanaEngine buildTaskanaEngine() { + this.useContainerManagedTransactions = true; + + dbScriptRunner = new DbScriptRunner(this.dataSource); + try { + dbScriptRunner.run(); + } catch (SQLException e) { + logger.error("The taskana schema could not be created: ", e); + } + return new SpringTaskanaEngineImpl(this); } - + public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }