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
\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
// 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
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
}\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
}\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
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
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