]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-6336: Initial attempt at updating initialization script to drop all Nuxeo...
authorAron Roberts <aron@socrates.berkeley.edu>
Tue, 18 Mar 2014 00:01:41 +0000 (17:01 -0700)
committerAron Roberts <aron@socrates.berkeley.edu>
Tue, 18 Mar 2014 00:01:41 +0000 (17:01 -0700)
services/common-api/src/main/java/org/collectionspace/services/common/api/FileTools.java
services/common-api/src/main/java/org/collectionspace/services/common/api/JEEServerDeployment.java
services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java

index 7490cd039ccb1fcd33096e53043a604cf5f6cf7b..61d71b6dc7f39ace1aebec11a2cfbc636e7c0d47 100644 (file)
@@ -29,6 +29,13 @@ package org.collectionspace.services.common.api;
 //  albeit with different functions, which does have dependencies.\r
 \r
 import java.io.*;\r
+import java.nio.charset.Charset;\r
+import java.nio.file.Files;\r
+import java.nio.file.OpenOption;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.StandardOpenOption;\r
+import java.util.List;\r
 import java.util.UUID;\r
 \r
 import javax.xml.bind.JAXBContext;\r
@@ -43,6 +50,7 @@ public class FileTools {
     \r
     public static String DEFAULT_ENCODING = "";\r
     public static String UTF8_ENCODING = "UTF-8";\r
+    public static Charset UTF8_CHARSET = Charset.forName(UTF8_ENCODING);\r
     public static boolean FORCE_CREATE_PARENT_DIRS = true;\r
     private static String JAVA_TEMP_DIR_PROPERTY = "java.io.tmpdir";\r
 \r
@@ -168,6 +176,27 @@ public class FileTools {
             return null;\r
         }\r
     }\r
+    \r
+    public static List<String> readFileAsLines(String filePath) {\r
+        List<String> lines = null;\r
+        try {\r
+            Path path = Paths.get(filePath);\r
+            lines = Files.readAllLines(path, UTF8_CHARSET);\r
+        } catch (Exception e) {\r
+            System.out.println("ERROR: " + e);\r
+            return null;\r
+        }\r
+        return lines;\r
+    }\r
+    \r
+    public static void writeFileFromLines(String filePath, Iterable<? extends CharSequence> lines) {\r
+        try {\r
+            Path path = Paths.get(filePath);\r
+            Files.write(path, lines, UTF8_CHARSET, StandardOpenOption.WRITE);\r
+        } catch (Exception e) {\r
+            System.out.println("ERROR: " + e);\r
+        }\r
+    }\r
 \r
     public static File saveFile(String dir, String relativeName, String content, boolean forceParentDirs) {\r
         return saveFile(dir, relativeName, content, forceParentDirs, DEFAULT_ENCODING);\r
index 2fbb3659a909df193803ec022474a4033d20f60b..57cc0f8229fd6d280a053d99699585c20eeae9a2 100644 (file)
@@ -6,8 +6,11 @@ public interface JEEServerDeployment {
     final public static String CONFIG_DIR_NAME = "config";
     final public static String CSPACE_DIR_NAME = "cspace";
     final public static String SERVICES_DIR_NAME = "services";
+    final public static String DATABASE_SCRIPTS_DIR_NAME = "db";
     final public static String CONFIG_DIR_PATH = CONFIG_DIR_NAME + File.separator + SERVICES_DIR_NAME;
     final public static String CSPACE_CONFIG_SERVICES_DIR_PATH = CSPACE_DIR_NAME + File.separator + CONFIG_DIR_PATH;
+    final public static String CSPACE_SERVICES_DIR_PATH = CSPACE_DIR_NAME + File.separator + SERVICES_DIR_NAME;
+    final public static String DATABASE_SCRIPTS_DIR_PATH = CSPACE_SERVICES_DIR_PATH + File.separator + DATABASE_SCRIPTS_DIR_NAME;
 
     final public static String TENANT_BINDINGS_FILENAME_PREFIX = "tenant-bindings";
     final public static String TENANT_BINDINGS_PROTOTYPE_FILENAME = TENANT_BINDINGS_FILENAME_PREFIX + "-proto.xml";
@@ -21,4 +24,5 @@ public interface JEEServerDeployment {
         public final static String NUXEO_PROTOTYPE_CONFIG_FILENAME = "proto" + NUXEO_REPO_CONFIG_FILENAME_SUFFIX;
        public final static String NUXEO_PLUGINS_DIR = "plugins";
        public final static String NUXEO_SERVER_PLUGINS_DIR = NUXEO_SERVER_DIR + File.separator + NUXEO_PLUGINS_DIR;
+        public final static String NUXEO_DB_INIT_SCRIPT_FILENAME = "init_nuxeo_db.sql";
 }
index a1e0e23eec46b4392375585725a104cda919d6c7..8895119d84d3c4f246448ded17f3baf2055b5970 100644 (file)
@@ -6,6 +6,7 @@ package org.collectionspace.services.common;
 import java.io.File;\r
 import java.io.FileInputStream;\r
 import java.io.FileNotFoundException;\r
+import java.io.FileWriter;\r
 import java.io.InputStream;\r
 import java.sql.Connection;\r
 import java.sql.PreparedStatement;\r
@@ -20,6 +21,7 @@ import javax.sql.DataSource;
 import org.apache.tomcat.dbcp.dbcp.BasicDataSource;\r
 import org.collectionspace.authentication.AuthN;\r
 import org.collectionspace.services.common.api.JEEServerDeployment;\r
+import org.collectionspace.services.common.api.FileTools;\r
 import org.collectionspace.services.common.api.Tools;\r
 import org.collectionspace.services.common.authorization_mgt.AuthorizationCommon;\r
 import org.collectionspace.services.common.config.ConfigReader;\r
@@ -163,9 +165,9 @@ public class ServiceMain {
         // access rights to each.\r
        HashSet<String> dbsCheckedOrCreated = createNuxeoDatabases();\r
         \r
-        // Update the SQL script that drops databases, so they can be\r
-        // reinitialized, to reflect each of the Nuxeo-managed databases.\r
-        updateInitializationScript(dbsCheckedOrCreated);\r
+        // Update the SQL script that drops databases so that they can be\r
+        // reinitialized, to include each of the Nuxeo-managed database names.\r
+        updateInitializationScript(getNuxeoDatabasesInitScriptFilename(), dbsCheckedOrCreated);\r
 \r
         //\r
         // Start up and initialize our embedded Nuxeo instance.\r
@@ -405,11 +407,27 @@ public class ServiceMain {
     private String getNuxeoProtoConfigFilename() {\r
         return JEEServerDeployment.NUXEO_PROTOTYPE_CONFIG_FILENAME;\r
     }\r
-    \r
+        \r
     private String getNuxeoConfigFilename(String reponame) {\r
         return reponame + JEEServerDeployment.NUXEO_REPO_CONFIG_FILENAME_SUFFIX;\r
     }\r
     \r
+    private String getDatabaseScriptsPath() {\r
+        String cspaceInstanceId = getCspaceInstanceId();\r
+        String DATABASE_PRODUCT_NAME = "postgrres"; // FIXME: Hack during dev PLEASE REPLACE!!\r
+        return JEEServerDeployment.DATABASE_SCRIPTS_DIR_PATH + File.separator +\r
+                DATABASE_PRODUCT_NAME;\r
+//                + JDBCTools.getDatabaseProductName(\r
+//                JDBCTools.CSADMIN_DATASOURCE_NAME,\r
+//             JDBCTools.getDatabaseName(repositoryName, cspaceInstanceId),\r
+//             cspaceInstanceId);\r
+    }\r
+    \r
+    private String getNuxeoDatabasesInitScriptFilename() {\r
+        return getDatabaseScriptsPath()\r
+                + File.separator + JEEServerDeployment.NUXEO_DB_INIT_SCRIPT_FILENAME;\r
+    }\r
+    \r
     /**\r
      * @return the server resources path\r
      */\r
@@ -866,9 +884,50 @@ public class ServiceMain {
         return repoConfigDoc;\r
     }\r
 \r
-    private void updateInitializationScript(HashSet<String> dbsCheckedOrCreated) {\r
-        for (String dbName : dbsCheckedOrCreated) {\r
-            logger.warn("DROP DATABASE IF EXISTS " + dbName); // Temporary for debugging\r
+    private void updateInitializationScript(String dbInitializationScriptFilePath,\r
+            HashSet<String> dbsCheckedOrCreated) {\r
+        // Get the current copy of the Nuxeo databases initialization script file,\r
+        // if that file exists, and read all of its lines except for those which\r
+        // drop databases.\r
+        List<String> lines = null;\r
+        File nuxeoDatabasesInitScriptFile = new File(dbInitializationScriptFilePath);\r
+        try {\r
+            if (! nuxeoDatabasesInitScriptFile.canRead()) {\r
+                String msg = String.format("Could not find and/or read the Nuxeo databases initialization script file '%s'",\r
+                        nuxeoDatabasesInitScriptFile.getCanonicalPath());\r
+                logger.warn(msg);\r
+            } else {\r
+                // Note: Exceptions are written only to the console, not thrown, by\r
+                // this method in the common-api package.\r
+                lines = FileTools.readFileAsLines(dbInitializationScriptFilePath);\r
+                for (String line : lines) {\r
+                    // Elide current DROP DATABASE statements\r
+                    if (line.toLowerCase().contains("DROP DATABASE".toLowerCase())) {\r
+                        continue;\r
+                    }\r
+                }\r
+            }\r
+            // Write new DROP DATABASE lines for every Nuxeo-managed database.\r
+            List<String> replacementLines = new ArrayList<String>();\r
+            for (String dbName : dbsCheckedOrCreated) {\r
+              replacementLines.add("DROP DATABASE IF EXISTS " + dbName);\r
+            }\r
+            // Append all (non-DROP DATABASE) existing lines from that file, if any.\r
+            if (lines != null && ! lines.isEmpty()) {\r
+                replacementLines.addAll(lines);\r
+            }\r
+            if (! nuxeoDatabasesInitScriptFile.canWrite()) {\r
+                String msg = String.format("Could not find and/or write the Nuxeo databases initialization script file '%s'",\r
+                        nuxeoDatabasesInitScriptFile.getCanonicalPath());\r
+                logger.warn(msg);\r
+            } else {\r
+                // Note: Exceptions are written only to the console, not thrown, by\r
+                // this method in the common-api package.\r
+                FileTools.writeFileFromLines(dbInitializationScriptFilePath, replacementLines);\r
+            }\r
+        } catch (Exception e) {\r
+\r
         }\r
+\r
     }\r
 }\r