TSK-516 verify schema version at startup
This commit is contained in:
parent
71a42b58fd
commit
4dedc761f1
|
|
@ -5,10 +5,12 @@ import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.apache.ibatis.jdbc.ScriptRunner;
|
import org.apache.ibatis.jdbc.ScriptRunner;
|
||||||
|
import org.apache.ibatis.jdbc.SqlRunner;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
@ -76,6 +78,40 @@ public class DbSchemaCreator {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isValidSchemaVersion(String expectedVersion) {
|
||||||
|
SqlRunner runner = null;
|
||||||
|
try {
|
||||||
|
Connection connection = dataSource.getConnection();
|
||||||
|
runner = new SqlRunner(connection);
|
||||||
|
LOGGER.debug(connection.getMetaData().toString());
|
||||||
|
|
||||||
|
String query = "select VERSION from TASKANA.TASKANA_SCHEMA_VERSION where "
|
||||||
|
+ "VERSION = (select max(VERSION) from TASKANA.TASKANA_SCHEMA_VERSION) "
|
||||||
|
+ "AND VERSION = '" + expectedVersion + "'";
|
||||||
|
|
||||||
|
Map<String, Object> queryResult = runner.selectOne(query, new Object[] {});
|
||||||
|
if (queryResult == null || queryResult.isEmpty()) {
|
||||||
|
LOGGER.error(
|
||||||
|
"Schema version not valid. The VERSION property in table TASKANA.TASKANA_SCHEMA_VERSION has not the expected value {}",
|
||||||
|
expectedVersion);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
LOGGER.debug("Schema version is valid.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.error(
|
||||||
|
"Schema version not valid. The VERSION property in table TASKANA.TASKANA_SCHEMA_VERSION has not the expected value {}",
|
||||||
|
expectedVersion);
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
if (runner != null) {
|
||||||
|
runner.closeConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public DataSource getDataSource() {
|
public DataSource getDataSource() {
|
||||||
return dataSource;
|
return dataSource;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,13 +49,15 @@ public class TaskanaEngineConfiguration {
|
||||||
private static final String TASKANA_DOMAINS_PROPERTY = "taskana.domains";
|
private static final String TASKANA_DOMAINS_PROPERTY = "taskana.domains";
|
||||||
private static final String TASKANA_CLASSIFICATION_TYPES_PROPERTY = "taskana.classification.types";
|
private static final String TASKANA_CLASSIFICATION_TYPES_PROPERTY = "taskana.classification.types";
|
||||||
private static final String TASKANA_CLASSIFICATION_CATEGORIES_PROPERTY = "taskana.classification.categories";
|
private static final String TASKANA_CLASSIFICATION_CATEGORIES_PROPERTY = "taskana.classification.categories";
|
||||||
|
protected static final String TASKANA_SCHEMA_VERSION = "0.9.2"; // must match the VERSION value in table
|
||||||
|
// TASKANA.TASKANA_SCHEMA_VERSION
|
||||||
|
|
||||||
// Taskana properties file
|
// Taskana properties file
|
||||||
protected String propertiesFileName = TASKANA_PROPERTIES;
|
protected String propertiesFileName = TASKANA_PROPERTIES;
|
||||||
|
|
||||||
// Taskana datasource configuration
|
// Taskana datasource configuration
|
||||||
protected DataSource dataSource;
|
protected DataSource dataSource;
|
||||||
protected DbSchemaCreator dbScriptRunner;
|
protected DbSchemaCreator dbSchemaCreator;
|
||||||
|
|
||||||
// Taskana role configuration
|
// Taskana role configuration
|
||||||
protected String rolesSeparator = TASKANA_ROLES_SEPARATOR;
|
protected String rolesSeparator = TASKANA_ROLES_SEPARATOR;
|
||||||
|
|
@ -114,8 +116,13 @@ public class TaskanaEngineConfiguration {
|
||||||
// use default In Memory datasource
|
// use default In Memory datasource
|
||||||
this.dataSource = createDefaultDataSource();
|
this.dataSource = createDefaultDataSource();
|
||||||
}
|
}
|
||||||
dbScriptRunner = new DbSchemaCreator(this.dataSource);
|
dbSchemaCreator = new DbSchemaCreator(this.dataSource);
|
||||||
dbScriptRunner.run();
|
dbSchemaCreator.run();
|
||||||
|
|
||||||
|
if (!dbSchemaCreator.isValidSchemaVersion(TASKANA_SCHEMA_VERSION)) {
|
||||||
|
throw new SystemException(
|
||||||
|
"The Database Schema Version doesn't match the expected version " + TASKANA_SCHEMA_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ CREATE TABLE TASKANA.TASKANA_SCHEMA_VERSION(
|
||||||
VERSION VARCHAR(255) NOT NULL,
|
VERSION VARCHAR(255) NOT NULL,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
-- The VERSION value must match the value of TaskanaEngineConfiguration.TASKANA_SCHEMA_VERSION
|
||||||
INSERT INTO TASKANA.TASKANA_SCHEMA_VERSION VALUES ('1', '0.9.2');
|
INSERT INTO TASKANA.TASKANA_SCHEMA_VERSION VALUES ('1', '0.9.2');
|
||||||
|
|
||||||
CREATE TABLE TASKANA.CLASSIFICATION(
|
CREATE TABLE TASKANA.CLASSIFICATION(
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,6 @@ import java.sql.SQLException;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import pro.taskana.SpringTaskanaEngineImpl;
|
import pro.taskana.SpringTaskanaEngineImpl;
|
||||||
import pro.taskana.TaskanaEngine;
|
import pro.taskana.TaskanaEngine;
|
||||||
|
|
||||||
|
|
@ -15,8 +12,6 @@ import pro.taskana.TaskanaEngine;
|
||||||
*/
|
*/
|
||||||
public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration {
|
public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(SpringTaskanaEngineConfiguration.class);
|
|
||||||
|
|
||||||
public SpringTaskanaEngineConfiguration(DataSource dataSource, boolean useManagedTransactions,
|
public SpringTaskanaEngineConfiguration(DataSource dataSource, boolean useManagedTransactions,
|
||||||
boolean securityEnabled) throws SQLException {
|
boolean securityEnabled) throws SQLException {
|
||||||
super(dataSource, useManagedTransactions, securityEnabled);
|
super(dataSource, useManagedTransactions, securityEnabled);
|
||||||
|
|
@ -35,14 +30,6 @@ public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration
|
||||||
@Override
|
@Override
|
||||||
public TaskanaEngine buildTaskanaEngine() {
|
public TaskanaEngine buildTaskanaEngine() {
|
||||||
this.useManagedTransactions = true;
|
this.useManagedTransactions = true;
|
||||||
|
|
||||||
dbScriptRunner = new DbSchemaCreator(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue