Merge pull request #13 from eberhardmayer/master2

integrated logic for existing schema
This commit is contained in:
Holger Hagen 2017-07-05 10:46:07 +02:00 committed by GitHub
commit cff6901846
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 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;
}

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

View File

@ -34,7 +34,11 @@
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.taskana</groupId>
<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" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<property name="targetDataSource">
<bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="org.h2.Driver" />
@ -18,31 +17,14 @@
</property>
</bean>
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<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">
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="taskEngineConfiguration" class="SpringTaskanaEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="taskEngineConfiguration" class="SpringTaskanaEngineConfiguration">
<bean id="taskanaEngineConfiguration" class="org.taskana.configuration.SpringTaskanaEngineConfiguration">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="taskEngine" factory-bean="taskEngineConfiguration"
factory-method="createTaskEngineConfiguration">
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="taskService" factory-bean="taskEngine" factory-method="getTaskService" />
<bean id="taskanaEngine" factory-bean="taskanaEngineConfiguration" factory-method="buildTaskanaEngine" />
<bean id="taskService" factory-bean="taskanaEngine" factory-method="getTaskService" />
</beans>

View File

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

View File

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