diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java index 84164da60c6a470be346c24cf809e6b1f389aabf..a640653dcd9df64180fd2162ee4d3b83362174cc 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java @@ -58,7 +58,7 @@ public final class DBMigrationEngine } final String databaseEngineCode = context.getDatabaseEngineCode(); final ISqlScriptProvider sqlScriptProvider = - new SqlScriptProvider(scriptFolder, databaseEngineCode); + new SqlScriptProvider(context.getSqlScriptFolders(), databaseEngineCode); final DBMigrationEngine migrationEngine = new DBMigrationEngine(migrationDAOFactory, sqlScriptProvider, context .isCreateFromScratch()); diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java index 5231c63f57bae064bc90a60e3c8872ecaf408acb..7adecb4b78a8d6ba0b8768d32cc0776d29839e83 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DatabaseConfigurationContext.java @@ -16,6 +16,12 @@ package ch.systemsx.cisd.dbmigration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.StringTokenizer; + import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; @@ -44,6 +50,8 @@ public class DatabaseConfigurationContext implements DisposableBean private String adminPassword; private String scriptFolder; + + private List<String> scriptFolders; private String databaseKind; @@ -591,6 +599,35 @@ public class DatabaseConfigurationContext implements DisposableBean this.scriptFolder = scriptFolder; } + public List<String> getSqlScriptFolders() + { + if (scriptFolder != null && variablesResolved(scriptFolder)) + { + return Arrays.asList(scriptFolder); + } + if (scriptFolders != null && scriptFolders.size() > 0 + && variablesResolved(scriptFolders.get(0))) + { + return scriptFolders; + } + return Collections.emptyList(); + } + + private boolean variablesResolved(String value) + { + return value.indexOf("${") < 0; + } + + public void setScriptFolders(String scriptFolders) + { + this.scriptFolders = new ArrayList<String>(); + StringTokenizer tokenizer = new StringTokenizer(scriptFolders, ","); + while (tokenizer.hasMoreTokens()) + { + this.scriptFolders.add(tokenizer.nextToken().trim()); + } + } + public final String getDatabaseInstance() { return StringUtils.trim(databaseInstance); diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java index 353535bbcdd016b37b20be2a0827ac5c066597c3..d711e6ba084f0459b5e05a5b3cac579b65b43250 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.dbmigration; import java.io.File; import java.io.IOException; +import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; @@ -37,6 +38,8 @@ import ch.systemsx.cisd.common.logging.LogFactory; */ public class SqlScriptProvider implements ISqlScriptProvider { + static final String GENERIC = "generic"; + private static final String DUMP_FILENAME = ".DUMP"; private static final String SQL_FILE_TYPE = ".sql"; @@ -44,24 +47,28 @@ public class SqlScriptProvider implements ISqlScriptProvider private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, SqlScriptProvider.class); - private final String genericScriptFolder; + private final List<String> schemaScriptRootFolders; - private final String specificScriptFolder; + private final String databaseEngineCode; /** * Creates an instance for the specified script folders. They are either resource folders or * folders relative to the working directory. * - * @param schemaScriptRootFolder Root folder of schema, migration and data scripts. + * @param schemaScriptRootFolders Root folders of schema, migration and data scripts. * @param databaseEngineCode The code of the database engine. Used to find the db engine * specific schema script folder. */ - public SqlScriptProvider(final String schemaScriptRootFolder, final String databaseEngineCode) + public SqlScriptProvider(final List<String> schemaScriptRootFolders, final String databaseEngineCode) { - this.genericScriptFolder = schemaScriptRootFolder + "/generic"; - this.specificScriptFolder = schemaScriptRootFolder + "/" + databaseEngineCode; + if (schemaScriptRootFolders.isEmpty()) + { + throw new IllegalArgumentException("Unspecified script root folders."); + } + this.schemaScriptRootFolders = schemaScriptRootFolders; + this.databaseEngineCode = databaseEngineCode; } - + /** * Returns <code>true</code> if a <finish script> is found and <code>false</code> * otherwise. @@ -92,7 +99,8 @@ public class SqlScriptProvider implements ISqlScriptProvider */ public File getDumpFolder(final String version) { - return new File(specificScriptFolder, version); + return new File(getSpecificScriptFolder(schemaScriptRootFolders.get(schemaScriptRootFolders + .size() - 1)), version); } /** @@ -197,14 +205,24 @@ public class SqlScriptProvider implements ISqlScriptProvider private Script tryLoadScript(final String scriptName, final String scriptVersion, final String prefix) { - Script script = - tryPrimLoadScript(specificScriptFolder + "/" + prefix, scriptName, scriptVersion); - if (script == null) + for (String rootFolder : schemaScriptRootFolders) { + Script script = + tryPrimLoadScript(getSpecificScriptFolder(rootFolder) + "/" + prefix, + scriptName, scriptVersion); + if (script != null) + { + return script; + } script = - tryPrimLoadScript(genericScriptFolder + "/" + prefix, scriptName, scriptVersion); + tryPrimLoadScript(getGenericScriptFolder(rootFolder) + "/" + prefix, + scriptName, scriptVersion); + if (script != null) + { + return script; + } } - return script; + return null; } private Script tryPrimLoadScript(final String scriptFolder, final String scriptName, @@ -234,4 +252,14 @@ public class SqlScriptProvider implements ISqlScriptProvider return new Script(scriptPath, script, scriptVersion); } + private String getGenericScriptFolder(String rootFolder) + { + return rootFolder + "/" + GENERIC; + } + + private String getSpecificScriptFolder(String rootFolder) + { + return rootFolder + "/" + databaseEngineCode; + } + } diff --git a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java index 5ba0cebc7b3e53ed78d6c56ba13b8fc9da3b0ba5..79ec5585c9209d7d2eeb20b9fd1e988c05e72aae 100644 --- a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java +++ b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java @@ -25,6 +25,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.Arrays; import org.apache.commons.io.IOUtils; import org.testng.annotations.AfterClass; @@ -53,7 +54,7 @@ public class SqlScriptProviderTest new File(TEMPORARY_SCHEMA_SCRIPT_FOLDER_NAME); private static final File TEMP_SCHEMA_GENERIC_SCRIPT_FOLDER = - new File(TEMP_SCHEMA_SCRIPT_ROOT_FOLDER, "generic"); + new File(TEMP_SCHEMA_SCRIPT_ROOT_FOLDER, SqlScriptProvider.GENERIC); private static final File TEMP_SCHEMA_SPECIFIC_SCRIPT_FOLDER = new File(TEMP_SCHEMA_SCRIPT_ROOT_FOLDER, DB_ENGINE_CODE); @@ -84,7 +85,8 @@ public class SqlScriptProviderTest "code: migration"); write(new File(specificSchemaVersionFolder, "data-" + VERSION + ".sql"), "code: data"); sqlScriptProvider = - new SqlScriptProvider(TEMPORARY_SCHEMA_SCRIPT_FOLDER_NAME, DB_ENGINE_CODE); + new SqlScriptProvider(Arrays.asList(TEMPORARY_SCHEMA_SCRIPT_FOLDER_NAME), + DB_ENGINE_CODE); dumpFile = new File(sqlScriptProvider.getDumpFolder(VERSION), ".DUMP"); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java index 875afc23f7cc71598ac3f10230913203139cad7d..08c95aaa9df329e830766910f0d24d053e3e63c9 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java @@ -24,7 +24,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; public final class DatabaseVersionHolder { /** Current version of the database. */ - private static final String DATABASE_VERSION = "073";// S109 + private static final String DATABASE_VERSION = "074"; // S110 private DatabaseVersionHolder() { diff --git a/openbis/source/java/dbConfigurationContext.xml b/openbis/source/java/dbConfigurationContext.xml index d7520880b96a72f1ca4e21077edb7f861a461cb2..573e6456ad6cfec1a8986820bcb40e1f94bacbf1 100644 --- a/openbis/source/java/dbConfigurationContext.xml +++ b/openbis/source/java/dbConfigurationContext.xml @@ -36,6 +36,7 @@ <property name="databaseKind" value="${database.kind}" /> <property name="databaseEngineCode" value="${database.engine}" /> <property name="scriptFolder" value="${script-folder}/sql" /> + <property name="scriptFolders" value="${script-folders}" /> <property name="databaseInstance" value="${database-instance}" /> </bean> diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/registrator/api/v1/IImageDataSet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/registrator/api/v1/IImageDataSet.java index d71fafc5c869ed19022d3cfe15378c32f4c9e77e..b4d14161853d1e45ff3f5789b02f9afeb6359967 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/registrator/api/v1/IImageDataSet.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/registrator/api/v1/IImageDataSet.java @@ -29,5 +29,4 @@ public interface IImageDataSet extends IDataSet * Sets the tile geometry by specified number of rows and columns. */ public void setTileGeometry(int numberOfRows, int numberOfColumns); - } diff --git a/screening/source/java/service.properties b/screening/source/java/service.properties index c5229793c51fc00e14e3be02f25e6520b4732457..516e6586bf1f230eac0d5f5548262500fd95e414 100644 --- a/screening/source/java/service.properties +++ b/screening/source/java/service.properties @@ -7,7 +7,7 @@ session-timeout = 720 # Supported: 'no-authorization' and 'active-authorization' authorization-component-factory = active-authorization -script-folder = ../openbis/source/ +script-folders = source/sql, ../openbis/source/sql # Supported: currently only 'postgresql' is supported database.engine = postgresql