From 06db152129338e56b059fd0f957916d5796c80a3 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 30 Jun 2011 11:58:16 +0000
Subject: [PATCH] LMS-2356 introduce list of script root folders in order to
 "merge" screening and generic script folders

SVN: 21928
---
 .../cisd/dbmigration/DBMigrationEngine.java   |  2 +-
 .../DatabaseConfigurationContext.java         | 37 +++++++++++++
 .../cisd/dbmigration/SqlScriptProvider.java   | 54 ++++++++++++++-----
 .../dbmigration/SqlScriptProviderTest.java    |  6 ++-
 .../dataaccess/db/DatabaseVersionHolder.java  |  2 +-
 .../source/java/dbConfigurationContext.xml    |  1 +
 .../etl/registrator/api/v1/IImageDataSet.java |  1 -
 screening/source/java/service.properties      |  2 +-
 8 files changed, 86 insertions(+), 19 deletions(-)

diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java
index 84164da60c6..a640653dcd9 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 5231c63f57b..7adecb4b78a 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 353535bbcdd..d711e6ba084 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 &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;
+    }
+    
 }
diff --git a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/SqlScriptProviderTest.java
index 5ba0cebc7b3..79ec5585c92 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 875afc23f7c..08c95aaa9df 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 d7520880b96..573e6456ad6 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 d71fafc5c86..b4d14161853 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 c5229793c51..516e6586bf1 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
-- 
GitLab