]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-6349: Dynamically manage DROP USER commands in Nuxeo database initialization...
authorAron Roberts <aron@socrates.berkeley.edu>
Wed, 19 Mar 2014 21:47:27 +0000 (14:47 -0700)
committerAron Roberts <aron@socrates.berkeley.edu>
Wed, 19 Mar 2014 21:47:27 +0000 (14:47 -0700)
services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java

index 314a7e6d98649b8c6a7025db53595cd3c8c83c90..85fc10e5f170269af4d7bd8be465e51eeabbe42d 100644 (file)
@@ -15,6 +15,7 @@ import java.sql.SQLException;
 import java.sql.Statement;\r
 import java.util.*;\r
 \r
+import javax.naming.NamingException;\r
 import javax.servlet.ServletContext;\r
 import javax.sql.DataSource;\r
 \r
@@ -82,6 +83,8 @@ public class ServiceMain {
     \r
     private static final String DROP_DATABASE_SQL_CMD = "DROP DATABASE";\r
     private static final String DROP_DATABASE_IF_EXISTS_SQL_CMD = DROP_DATABASE_SQL_CMD + " IF EXISTS %s;";\r
+    private static final String DROP_USER_SQL_CMD = "DROP USER";\r
+    private static final String DROP_USER_IF_EXISTS_SQL_CMD = DROP_USER_SQL_CMD + " IF EXISTS %s;";\r
     private static final String DROP_OBJECTS_SQL_COMMENT = "-- drop all the objects before dropping roles";\r
 \r
             \r
@@ -171,9 +174,12 @@ public class ServiceMain {
         // access rights to each.\r
        HashSet<String> dbsCheckedOrCreated = createNuxeoDatabases();\r
         \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
+        // Update the SQL script that drops databases and users,\r
+        // to include DROP statements for each of the Nuxeo-managed\r
+        // database names and for each relevant datasource user.\r
+        String[] dataSourceNames = {JDBCTools.NUXEO_DATASOURCE_NAME, JDBCTools.NUXEO_READER_DATASOURCE_NAME};\r
+        updateInitializationScript(getNuxeoDatabasesInitScriptFilename(),\r
+                dbsCheckedOrCreated, dataSourceNames);\r
 \r
         //\r
         // Start up and initialize our embedded Nuxeo instance.\r
@@ -469,21 +475,11 @@ public class ServiceMain {
        final String DB_EXISTS_QUERY_MYSQL = \r
                        "SELECT 1 AS result FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=?";\r
                \r
-       DataSource nuxeoDataSource = JDBCTools.getDataSource(JDBCTools.NUXEO_DATASOURCE_NAME);\r
-               BasicDataSource tomcatDataSource = (BasicDataSource)nuxeoDataSource;\r
-       String nuxeoUser = tomcatDataSource.getUsername();\r
-       String nuxeoPW = tomcatDataSource.getPassword();\r
-\r
-       // Get reader data source, if any\r
-       DataSource nuxeoReaderDataSource = JDBCTools.getDataSource(JDBCTools.NUXEO_READER_DATASOURCE_NAME);\r
-       String readerUser = null;\r
-       String readerPW = null;\r
-       if (nuxeoReaderDataSource!= null) {\r
-               tomcatDataSource = (BasicDataSource)nuxeoReaderDataSource;\r
-               // Get the template URL value from the JNDI datasource and substitute the databaseName\r
-               readerUser = tomcatDataSource.getUsername();\r
-               readerPW = tomcatDataSource.getPassword();\r
-       }\r
+        String nuxeoUser = getBasicDataSourceUsername(JDBCTools.NUXEO_DATASOURCE_NAME);\r
+       String nuxeoPW = getBasicDataSourceUsername(JDBCTools.NUXEO_DATASOURCE_NAME);\r
+\r
+        String readerUser = getBasicDataSourcePassword(JDBCTools.NUXEO_READER_DATASOURCE_NAME);\r
+       String readerPW = getBasicDataSourcePassword(JDBCTools.NUXEO_READER_DATASOURCE_NAME);\r
        \r
        DatabaseProductType dbType = JDBCTools.getDatabaseProductType(JDBCTools.CSADMIN_DATASOURCE_NAME,\r
                        getServiceConfig().getDbCsadminName());\r
@@ -667,7 +663,43 @@ public class ServiceMain {
                }\r
 \r
        }\r
-    \r
+        \r
+        private BasicDataSource getBasicDataSource(String dataSourceName) {\r
+            BasicDataSource basicDataSource = null;\r
+            if (Tools.isBlank(dataSourceName)) {\r
+                return basicDataSource;\r
+            }\r
+            try {\r
+                DataSource dataSource = JDBCTools.getDataSource(dataSourceName);\r
+                basicDataSource = (BasicDataSource) dataSource;\r
+            } catch (NamingException ne) {\r
+                logger.warn("Error attempting to retrieve basic datasource '%s': %s",\r
+                        dataSourceName, ne.getMessage());\r
+                return basicDataSource;\r
+            }\r
+            return basicDataSource;\r
+        }\r
+        \r
+        private String getBasicDataSourceUsername(String dataSourceName) {\r
+            String username = null;\r
+            BasicDataSource basicDataSource = getBasicDataSource(dataSourceName);\r
+            if (basicDataSource == null) {\r
+                return username;\r
+            }\r
+            username = basicDataSource.getUsername();\r
+            return username;\r
+        }\r
+        \r
+        private String getBasicDataSourcePassword(String dataSourceName) {\r
+            String password = null;\r
+            BasicDataSource basicDataSource = getBasicDataSource(dataSourceName);\r
+            if (basicDataSource == null) {\r
+                return password;\r
+            }\r
+            password = basicDataSource.getUsername();\r
+            return password;\r
+        }\r
+     \r
     /*\r
      * This might be useful for something, but the reader grants are better handled in the ReportPostInitHandler.\r
      * \r
@@ -891,15 +923,20 @@ public class ServiceMain {
     }\r
 \r
     /**\r
-     * Update the current copy of the Nuxeo databases initialization script file,\r
-     * by removing all existing DROP DATABASE commands, then adding a DROP DATABASE\r
-     * command for each current database, at the top of that file.\r
+     * Update the current copy of the Nuxeo databases initialization script file by\r
+     * \r
+     * <ul>\r
+     *   <li>Removing all existing DROP DATABASE commands</li>\r
+     *   <li>Removing all existing DROP USER commands</li>\r
+     *   <li>Adding a DROP DATABASE command for each current database, at the top of that file.</li>\r
+     *   <li>Adding DROP USER commands for each provided datasource, following the DROP DATABASE commands.</li>\r
+     * </ul>\r
      * \r
      * @param dbInitializationScriptFilePath\r
      * @param dbsCheckedOrCreated \r
      */\r
     private void updateInitializationScript(String dbInitializationScriptFilePath,\r
-            HashSet<String> dbsCheckedOrCreated) {\r
+            HashSet<String> dbsCheckedOrCreated, String[] dataSourceNames) {\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
@@ -927,6 +964,10 @@ public class ServiceMain {
                     if (currentLine.toLowerCase().contains(DROP_OBJECTS_SQL_COMMENT.toLowerCase())) {\r
                         linesIterator.remove();\r
                     }\r
+                    // Elide all existing DROP USER statements.\r
+                    if (currentLine.toLowerCase().contains(DROP_USER_SQL_CMD.toLowerCase())) {\r
+                        linesIterator.remove();\r
+                    }\r
                 }\r
             }\r
             List<String> replacementLines = new ArrayList<String>();\r
@@ -934,7 +975,17 @@ public class ServiceMain {
             replacementLines.add(DROP_OBJECTS_SQL_COMMENT);\r
             // Add new DROP DATABASE lines for every Nuxeo-managed database.\r
             for (String dbName : dbsCheckedOrCreated) {\r
-              replacementLines.add(String.format(DROP_DATABASE_IF_EXISTS_SQL_CMD, dbName));\r
+              if (Tools.notBlank(dbName)) {\r
+                  replacementLines.add(String.format(DROP_DATABASE_IF_EXISTS_SQL_CMD, dbName));\r
+              }\r
+            }\r
+            // Add new DROP USER commands for every provided datasource.\r
+            String username;\r
+            for (String dataSourceName : dataSourceNames) {\r
+                username = getBasicDataSourceUsername(dataSourceName);\r
+                if (Tools.notBlank(username)) {\r
+                    replacementLines.add(String.format(DROP_USER_IF_EXISTS_SQL_CMD, username));\r
+                }\r
             }\r
             // Now append all existing lines from that file, except for\r
             // any lines that were elided above.\r