integrated logic for existing schema

This commit is contained in:
Eberhard Mayer 2017-07-04 09:37:47 +02:00
parent 9755ff98ca
commit 51ae3c97e3
10 changed files with 142 additions and 128 deletions

View File

@ -16,27 +16,28 @@ public class DbScriptRunner {
private static final Logger logger = LoggerFactory.getLogger(DbScriptRunner.class); private static final Logger logger = LoggerFactory.getLogger(DbScriptRunner.class);
private static final String SQL = "/sql"; 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 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) { public DbScriptRunner(DataSource dataSource) {
super(); super();
this.dataSource = dataSource; this.dataSource = dataSource;
} }
/** /**
* Run all db scripts * Run all db scripts
* *
* @throws SQLException * @throws SQLException
*/ */
public void run() 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()); ScriptRunner runner = new ScriptRunner(dataSource.getConnection());
logger.debug(dataSource.getConnection().getMetaData().toString()); logger.debug(dataSource.getConnection().getMetaData().toString());
@ -44,7 +45,9 @@ public class DbScriptRunner {
runner.setLogWriter(logWriter); runner.setLogWriter(logWriter);
runner.setErrorLogWriter(errorLogWriter); 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(); runner.closeConnection();
logger.debug(outWriter.toString()); 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() { public DataSource getDataSource() {
return dataSource; return dataSource;
} }

View File

@ -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
);

View File

@ -0,0 +1 @@
SELECT COUNT(*) FROM TASKANA_SCHEMA_VERSION;

View File

@ -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)
);

View File

@ -41,6 +41,7 @@ public class WorkbasketServiceImplIntTest {
int before = workbasketServiceImpl.getWorkbaskets().size(); int before = workbasketServiceImpl.getWorkbaskets().size();
Workbasket workbasket = new Workbasket(); Workbasket workbasket = new Workbasket();
workbasket.setId("1"); workbasket.setId("1");
workbasket.setName("Megabasket");
workbasketServiceImpl.createWorkbasket(workbasket); workbasketServiceImpl.createWorkbasket(workbasket);
Assert.assertEquals(before + 1, workbasketServiceImpl.getWorkbaskets().size()); Assert.assertEquals(before + 1, workbasketServiceImpl.getWorkbaskets().size());
} }
@ -50,12 +51,15 @@ public class WorkbasketServiceImplIntTest {
int before = workbasketServiceImpl.getWorkbaskets().size(); int before = workbasketServiceImpl.getWorkbaskets().size();
Workbasket workbasket0 = new Workbasket(); Workbasket workbasket0 = new Workbasket();
workbasket0.setId("0"); workbasket0.setId("0");
workbasket0.setName("Superbasket");
workbasketServiceImpl.createWorkbasket(workbasket0); workbasketServiceImpl.createWorkbasket(workbasket0);
Workbasket workbasket1 = new Workbasket(); Workbasket workbasket1 = new Workbasket();
workbasket1.setId("1"); workbasket1.setId("1");
workbasket1.setName("Megabasket");
workbasketServiceImpl.createWorkbasket(workbasket1); workbasketServiceImpl.createWorkbasket(workbasket1);
Workbasket workbasket2 = new Workbasket(); Workbasket workbasket2 = new Workbasket();
workbasket2.setId("2"); workbasket2.setId("2");
workbasket2.setName("Hyperbasket");
workbasketServiceImpl.createWorkbasket(workbasket2); workbasketServiceImpl.createWorkbasket(workbasket2);
Assert.assertEquals(before + 3, workbasketServiceImpl.getWorkbaskets().size()); Assert.assertEquals(before + 3, workbasketServiceImpl.getWorkbaskets().size());
} }
@ -64,12 +68,15 @@ public class WorkbasketServiceImplIntTest {
public void testSelectWorkbasket() throws WorkbasketNotFoundException, NotAuthorizedException { public void testSelectWorkbasket() throws WorkbasketNotFoundException, NotAuthorizedException {
Workbasket workbasket0 = new Workbasket(); Workbasket workbasket0 = new Workbasket();
workbasket0.setId("0"); workbasket0.setId("0");
workbasket0.setName("Superbasket");
workbasketServiceImpl.createWorkbasket(workbasket0); workbasketServiceImpl.createWorkbasket(workbasket0);
Workbasket workbasket1 = new Workbasket(); Workbasket workbasket1 = new Workbasket();
workbasket1.setId("1"); workbasket1.setId("1");
workbasket1.setName("Megabasket");
workbasketServiceImpl.createWorkbasket(workbasket1); workbasketServiceImpl.createWorkbasket(workbasket1);
Workbasket workbasket2 = new Workbasket(); Workbasket workbasket2 = new Workbasket();
workbasket2.setId("2"); workbasket2.setId("2");
workbasket2.setName("Hyperbasket");
workbasketServiceImpl.createWorkbasket(workbasket2); workbasketServiceImpl.createWorkbasket(workbasket2);
Workbasket foundWorkbasket = workbasketServiceImpl.getWorkbasket("2"); Workbasket foundWorkbasket = workbasketServiceImpl.getWorkbasket("2");
Assert.assertEquals("2", foundWorkbasket.getId()); Assert.assertEquals("2", foundWorkbasket.getId());
@ -84,10 +91,13 @@ public class WorkbasketServiceImplIntTest {
public void testSelectWorkbasketWithDistribution() throws WorkbasketNotFoundException, NotAuthorizedException { public void testSelectWorkbasketWithDistribution() throws WorkbasketNotFoundException, NotAuthorizedException {
Workbasket workbasket0 = new Workbasket(); Workbasket workbasket0 = new Workbasket();
workbasket0.setId("0"); workbasket0.setId("0");
workbasket0.setName("Superbasket");
Workbasket workbasket1 = new Workbasket(); Workbasket workbasket1 = new Workbasket();
workbasket1.setId("1"); workbasket1.setId("1");
workbasket1.setName("Megabasket");
Workbasket workbasket2 = new Workbasket(); Workbasket workbasket2 = new Workbasket();
workbasket2.setId("2"); workbasket2.setId("2");
workbasket2.setName("Hyperbasket");
workbasket2.setDistributionTargets(new ArrayList<>()); workbasket2.setDistributionTargets(new ArrayList<>());
workbasket2.getDistributionTargets().add(workbasket0); workbasket2.getDistributionTargets().add(workbasket0);
workbasket2.getDistributionTargets().add(workbasket1); workbasket2.getDistributionTargets().add(workbasket1);
@ -101,16 +111,20 @@ public class WorkbasketServiceImplIntTest {
public void testUpdateWorkbasket() throws Exception { public void testUpdateWorkbasket() throws Exception {
Workbasket workbasket0 = new Workbasket(); Workbasket workbasket0 = new Workbasket();
workbasket0.setId("0"); workbasket0.setId("0");
workbasket0.setName("Superbasket");
Workbasket workbasket1 = new Workbasket(); Workbasket workbasket1 = new Workbasket();
workbasket1.setId("1"); workbasket1.setId("1");
workbasket1.setName("Megabasket");
Workbasket workbasket2 = new Workbasket(); Workbasket workbasket2 = new Workbasket();
workbasket2.setId("2"); workbasket2.setId("2");
workbasket2.setName("Hyperbasket");
workbasket2.getDistributionTargets().add(workbasket0); workbasket2.getDistributionTargets().add(workbasket0);
workbasket2.getDistributionTargets().add(workbasket1); workbasket2.getDistributionTargets().add(workbasket1);
workbasketServiceImpl.createWorkbasket(workbasket2); workbasketServiceImpl.createWorkbasket(workbasket2);
Workbasket workbasket3 = new Workbasket(); Workbasket workbasket3 = new Workbasket();
workbasket3.setId("3"); workbasket3.setId("3");
workbasket3.setName("hm ... irgend ein basket");
workbasket2.getDistributionTargets().clear(); workbasket2.getDistributionTargets().clear();
workbasket2.getDistributionTargets().add(workbasket3); workbasket2.getDistributionTargets().add(workbasket3);
Thread.sleep(100); Thread.sleep(100);

View File

@ -34,7 +34,11 @@
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId> <artifactId>spring-tx</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.taskana</groupId> <groupId>org.taskana</groupId>
<artifactId>taskana-core</artifactId> <artifactId>taskana-core</artifactId>

View File

@ -0,0 +1 @@
logging.level.org.taskana=DEBUG

View File

@ -5,8 +5,7 @@
<tx:annotation-driven transaction-manager="transactionManager" /> <tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource" <bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<property name="targetDataSource"> <property name="targetDataSource">
<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="org.h2.Driver" /> <property name="driverClass" value="org.h2.Driver" />
@ -18,31 +17,14 @@
</property> </property>
</bean> </bean>
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="targetDataSource"> <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.ibm.db2.jcc.DB2Driver" /> <property
name="url" value="jdbc:db2://localhost:50000/SAMPLE:retrieveMessagesFromServerOnGetMessage=true;"
/> <property name="username" value="eh" /> <property name="password" value=""
/> </bean> </property> </bean> -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" /> <property name="dataSource" ref="dataSource" />
</bean> </bean>
<bean id="taskEngineConfiguration" class="SpringTaskanaEngineConfiguration"> <bean id="taskanaEngineConfiguration" class="org.taskana.configuration.SpringTaskanaEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="taskEngineConfiguration" class="SpringTaskanaEngineConfiguration">
<property name="dataSource" ref="dataSource" /> <property name="dataSource" ref="dataSource" />
</bean> </bean>
<bean id="taskEngine" factory-bean="taskEngineConfiguration" <bean id="taskanaEngine" factory-bean="taskanaEngineConfiguration" factory-method="buildTaskanaEngine" />
factory-method="createTaskEngineConfiguration"> <bean id="taskService" factory-bean="taskanaEngine" factory-method="getTaskService" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="taskService" factory-bean="taskEngine" factory-method="getTaskService" />
</beans> </beans>

View File

@ -5,29 +5,21 @@ import java.sql.SQLException;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.springframework.transaction.PlatformTransactionManager;
import org.taskana.configuration.SpringTaskanaEngineConfiguration; import org.taskana.configuration.SpringTaskanaEngineConfiguration;
import org.taskana.impl.TaskanaEngineImpl; import org.taskana.impl.TaskanaEngineImpl;
/**
* This class configures the TaskanaEngine for spring
*/
public class SpringTaskanaEngineImpl extends TaskanaEngineImpl { public class SpringTaskanaEngineImpl extends TaskanaEngineImpl {
public SpringTaskanaEngineImpl(SpringTaskanaEngineConfiguration taskanaEngineConfiguration) { public SpringTaskanaEngineImpl(SpringTaskanaEngineConfiguration taskanaEngineConfiguration) {
super(taskanaEngineConfiguration); super(taskanaEngineConfiguration);
} }
private PlatformTransactionManager transactionManager;
@PostConstruct @PostConstruct
public void init() throws SQLException { public void init() throws SQLException {
this.transactionFactory = new ManagedTransactionFactory(); this.transactionFactory = new ManagedTransactionFactory();
} }
public PlatformTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
} }

View File

@ -2,19 +2,19 @@ package org.taskana.configuration;
import java.sql.SQLException; import java.sql.SQLException;
import javax.annotation.PostConstruct;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.taskana.SpringTaskanaEngineImpl; import org.taskana.SpringTaskanaEngineImpl;
import org.taskana.TaskanaEngine; import org.taskana.TaskanaEngine;
/**
* This class configures the TaskanaEngineConfiguration for spring
*/
public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration { public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration {
@PostConstruct private static final Logger logger = LoggerFactory.getLogger(SpringTaskanaEngineConfiguration.class);
public void init() throws SQLException {
dbScriptRunner = new DbScriptRunner(this.dataSource);
dbScriptRunner.run();
}
/** /**
* This method creates the Spring-based TaskanaEngine without an * This method creates the Spring-based TaskanaEngine without an
@ -23,10 +23,19 @@ public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration
* @return the TaskanaEngine * @return the TaskanaEngine
* @throws SQLException * @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); return new SpringTaskanaEngineImpl(this);
} }
public void setDataSource(DataSource dataSource) { public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource; this.dataSource = dataSource;
} }