Skip to content
Snippets Groups Projects
Commit 06db1521 authored by felmer's avatar felmer
Browse files

LMS-2356 introduce list of script root folders in order to "merge" screening...

LMS-2356 introduce list of script root folders in order to "merge" screening and generic script folders

SVN: 21928
parent 3dfe85c4
No related branches found
No related tags found
No related merge requests found
......@@ -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());
......
......@@ -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);
......
......@@ -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 &lt;finish script&gt; 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;
}
}
......@@ -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");
}
......
......@@ -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()
{
......
......@@ -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>
......
......@@ -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);
}
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment