From 95016648e8a17d9835d76627fd104a264c36690d Mon Sep 17 00:00:00 2001 From: Aron Roberts Date: Mon, 17 Mar 2014 17:01:41 -0700 Subject: [PATCH] CSPACE-6336: Initial attempt at updating initialization script to drop all Nuxeo-managed databases. As yet untested. --- .../services/common/api/FileTools.java | 29 ++++++++ .../common/api/JEEServerDeployment.java | 4 + .../services/common/ServiceMain.java | 73 +++++++++++++++++-- 3 files changed, 99 insertions(+), 7 deletions(-) diff --git a/services/common-api/src/main/java/org/collectionspace/services/common/api/FileTools.java b/services/common-api/src/main/java/org/collectionspace/services/common/api/FileTools.java index 7490cd039..61d71b6dc 100644 --- a/services/common-api/src/main/java/org/collectionspace/services/common/api/FileTools.java +++ b/services/common-api/src/main/java/org/collectionspace/services/common/api/FileTools.java @@ -29,6 +29,13 @@ package org.collectionspace.services.common.api; // albeit with different functions, which does have dependencies. import java.io.*; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.OpenOption; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.List; import java.util.UUID; import javax.xml.bind.JAXBContext; @@ -43,6 +50,7 @@ public class FileTools { public static String DEFAULT_ENCODING = ""; public static String UTF8_ENCODING = "UTF-8"; + public static Charset UTF8_CHARSET = Charset.forName(UTF8_ENCODING); public static boolean FORCE_CREATE_PARENT_DIRS = true; private static String JAVA_TEMP_DIR_PROPERTY = "java.io.tmpdir"; @@ -168,6 +176,27 @@ public class FileTools { return null; } } + + public static List readFileAsLines(String filePath) { + List lines = null; + try { + Path path = Paths.get(filePath); + lines = Files.readAllLines(path, UTF8_CHARSET); + } catch (Exception e) { + System.out.println("ERROR: " + e); + return null; + } + return lines; + } + + public static void writeFileFromLines(String filePath, Iterable lines) { + try { + Path path = Paths.get(filePath); + Files.write(path, lines, UTF8_CHARSET, StandardOpenOption.WRITE); + } catch (Exception e) { + System.out.println("ERROR: " + e); + } + } public static File saveFile(String dir, String relativeName, String content, boolean forceParentDirs) { return saveFile(dir, relativeName, content, forceParentDirs, DEFAULT_ENCODING); diff --git a/services/common-api/src/main/java/org/collectionspace/services/common/api/JEEServerDeployment.java b/services/common-api/src/main/java/org/collectionspace/services/common/api/JEEServerDeployment.java index 2fbb3659a..57cc0f822 100644 --- a/services/common-api/src/main/java/org/collectionspace/services/common/api/JEEServerDeployment.java +++ b/services/common-api/src/main/java/org/collectionspace/services/common/api/JEEServerDeployment.java @@ -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"; } diff --git a/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java b/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java index a1e0e23ee..8895119d8 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java +++ b/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java @@ -6,6 +6,7 @@ package org.collectionspace.services.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileWriter; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; @@ -20,6 +21,7 @@ import javax.sql.DataSource; import org.apache.tomcat.dbcp.dbcp.BasicDataSource; import org.collectionspace.authentication.AuthN; import org.collectionspace.services.common.api.JEEServerDeployment; +import org.collectionspace.services.common.api.FileTools; import org.collectionspace.services.common.api.Tools; import org.collectionspace.services.common.authorization_mgt.AuthorizationCommon; import org.collectionspace.services.common.config.ConfigReader; @@ -163,9 +165,9 @@ public class ServiceMain { // access rights to each. HashSet dbsCheckedOrCreated = createNuxeoDatabases(); - // Update the SQL script that drops databases, so they can be - // reinitialized, to reflect each of the Nuxeo-managed databases. - updateInitializationScript(dbsCheckedOrCreated); + // Update the SQL script that drops databases so that they can be + // reinitialized, to include each of the Nuxeo-managed database names. + updateInitializationScript(getNuxeoDatabasesInitScriptFilename(), dbsCheckedOrCreated); // // Start up and initialize our embedded Nuxeo instance. @@ -405,11 +407,27 @@ public class ServiceMain { private String getNuxeoProtoConfigFilename() { return JEEServerDeployment.NUXEO_PROTOTYPE_CONFIG_FILENAME; } - + private String getNuxeoConfigFilename(String reponame) { return reponame + JEEServerDeployment.NUXEO_REPO_CONFIG_FILENAME_SUFFIX; } + private String getDatabaseScriptsPath() { + String cspaceInstanceId = getCspaceInstanceId(); + String DATABASE_PRODUCT_NAME = "postgrres"; // FIXME: Hack during dev PLEASE REPLACE!! + return JEEServerDeployment.DATABASE_SCRIPTS_DIR_PATH + File.separator + + DATABASE_PRODUCT_NAME; +// + JDBCTools.getDatabaseProductName( +// JDBCTools.CSADMIN_DATASOURCE_NAME, +// JDBCTools.getDatabaseName(repositoryName, cspaceInstanceId), +// cspaceInstanceId); + } + + private String getNuxeoDatabasesInitScriptFilename() { + return getDatabaseScriptsPath() + + File.separator + JEEServerDeployment.NUXEO_DB_INIT_SCRIPT_FILENAME; + } + /** * @return the server resources path */ @@ -866,9 +884,50 @@ public class ServiceMain { return repoConfigDoc; } - private void updateInitializationScript(HashSet dbsCheckedOrCreated) { - for (String dbName : dbsCheckedOrCreated) { - logger.warn("DROP DATABASE IF EXISTS " + dbName); // Temporary for debugging + private void updateInitializationScript(String dbInitializationScriptFilePath, + HashSet dbsCheckedOrCreated) { + // Get the current copy of the Nuxeo databases initialization script file, + // if that file exists, and read all of its lines except for those which + // drop databases. + List lines = null; + File nuxeoDatabasesInitScriptFile = new File(dbInitializationScriptFilePath); + try { + if (! nuxeoDatabasesInitScriptFile.canRead()) { + String msg = String.format("Could not find and/or read the Nuxeo databases initialization script file '%s'", + nuxeoDatabasesInitScriptFile.getCanonicalPath()); + logger.warn(msg); + } else { + // Note: Exceptions are written only to the console, not thrown, by + // this method in the common-api package. + lines = FileTools.readFileAsLines(dbInitializationScriptFilePath); + for (String line : lines) { + // Elide current DROP DATABASE statements + if (line.toLowerCase().contains("DROP DATABASE".toLowerCase())) { + continue; + } + } + } + // Write new DROP DATABASE lines for every Nuxeo-managed database. + List replacementLines = new ArrayList(); + for (String dbName : dbsCheckedOrCreated) { + replacementLines.add("DROP DATABASE IF EXISTS " + dbName); + } + // Append all (non-DROP DATABASE) existing lines from that file, if any. + if (lines != null && ! lines.isEmpty()) { + replacementLines.addAll(lines); + } + if (! nuxeoDatabasesInitScriptFile.canWrite()) { + String msg = String.format("Could not find and/or write the Nuxeo databases initialization script file '%s'", + nuxeoDatabasesInitScriptFile.getCanonicalPath()); + logger.warn(msg); + } else { + // Note: Exceptions are written only to the console, not thrown, by + // this method in the common-api package. + FileTools.writeFileFromLines(dbInitializationScriptFilePath, replacementLines); + } + } catch (Exception e) { + } + } } -- 2.47.3