]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-6168: Added more support for tenant qualified database names.
authorRichard Millet <remillet@berkeley.edu>
Tue, 11 Mar 2014 22:39:29 +0000 (15:39 -0700)
committerRichard Millet <remillet@berkeley.edu>
Tue, 11 Mar 2014 22:39:29 +0000 (15:39 -0700)
16 files changed:
services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java
services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java
services/common/src/main/java/org/collectionspace/services/common/authorization_mgt/AuthorizationCommon.java
services/common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReaderImpl.java
services/common/src/main/java/org/collectionspace/services/common/context/ServiceBindingUtils.java
services/common/src/main/java/org/collectionspace/services/common/init/AddIndices.java
services/common/src/main/java/org/collectionspace/services/common/init/IInitHandler.java
services/common/src/main/java/org/collectionspace/services/common/init/InitHandler.java
services/common/src/main/java/org/collectionspace/services/common/init/ModifyFieldDatatypes.java
services/common/src/main/java/org/collectionspace/services/common/init/RunSqlScripts.java
services/common/src/main/java/org/collectionspace/services/common/query/QueryManager.java
services/common/src/main/java/org/collectionspace/services/common/query/nuxeo/QueryManagerNuxeoImpl.java
services/common/src/main/java/org/collectionspace/services/common/storage/JDBCTools.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClientImpl.java
services/config/src/main/java/org/collectionspace/services/common/config/ConfigUtils.java
services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportPostInitHandler.java

index 88bb3736c8735660f7f9fb80f0fb7fef111eafe3..0719483cc26a20154e6f011dba4c82dee67c2323 100644 (file)
@@ -134,6 +134,7 @@ public interface IQueryManager {
         */\r
        public String createWhereClauseForPartialMatch(String dataSourceName,\r
                        String repositoryName,\r
+                       String cspaceInstanceId,\r
                        String field,\r
                        boolean startingWildcard,\r
                        String partialTerm);\r
index bc965f27c77226eb02250bfdf898e7df36ead121..3b1f4953ca5ef4519a5f3b9390d1a58d25833ede 100644 (file)
@@ -23,6 +23,7 @@ import org.collectionspace.services.common.config.ConfigReader;
 import org.collectionspace.services.common.config.ConfigUtils;\r
 import org.collectionspace.services.common.config.ServicesConfigReaderImpl;\r
 import org.collectionspace.services.common.config.TenantBindingConfigReaderImpl;\r
+import org.collectionspace.services.common.context.ServiceBindingUtils;\r
 import org.collectionspace.services.common.init.AddIndices;\r
 import org.collectionspace.services.config.service.InitHandler.Params.Field;\r
 import org.collectionspace.services.common.init.IInitHandler;\r
@@ -165,12 +166,15 @@ public class ServiceMain {
                throw new RuntimeException("Unknown CollectionSpace services client type: " + getClientType());\r
         }\r
         //\r
-        // Create all the default user accounts and permissions\r
+        // Create all the default user accounts and permissions.  Since some of our "cspace" database config files\r
+        // for Spring need to be created at build time, the "cspace" database already will be suffixed with the\r
+        // correct 'cspaceInstanceId' so we don't need to pass it to the JDBCTools methods.\r
         //\r
                try {\r
                        AuthorizationCommon.createDefaultWorkflowPermissions(tenantBindingConfigReader);\r
                        String cspaceDatabaseName = getCspaceDatabaseName();\r
-                       DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType(JDBCTools.CSPACE_DATASOURCE_NAME, cspaceDatabaseName);\r
+                       DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType(JDBCTools.CSPACE_DATASOURCE_NAME,\r
+                                       cspaceDatabaseName);\r
                        AuthorizationCommon.createDefaultAccounts(tenantBindingConfigReader, databaseProductType,\r
                                        cspaceDatabaseName);\r
                } catch (Exception e) {\r
@@ -241,6 +245,7 @@ public class ServiceMain {
         //\r
         //Loop through all tenants in tenant-bindings.xml\r
         //\r
+        String cspaceInstanceId = getCspaceInstanceId();\r
         for (TenantBindingType tbt : tenantBindingTypeMap.values()) {\r
                List<String> repositoryNameList = ConfigUtils.getRepositoryNameList(tbt);\r
                        if (repositoryNameList != null && repositoryNameList.isEmpty() == false) {\r
@@ -274,7 +279,8 @@ public class ServiceMain {
                                                                                                                                // 1\r
                                                fields.add(field);\r
                                        }\r
-                                       addindices.onRepositoryInitialized(JDBCTools.NUXEO_DATASOURCE_NAME, repositoryName, null, fields, null);\r
+                                       addindices.onRepositoryInitialized(JDBCTools.NUXEO_DATASOURCE_NAME, repositoryName, cspaceInstanceId,\r
+                                                       null, fields, null);\r
                                }\r
                        } else {\r
                                String errMsg = "repositoryNameList was empty or null.";\r
@@ -289,13 +295,17 @@ public class ServiceMain {
         //\r
         //Loop through all tenants in tenant-bindings.xml\r
         //\r
+        String cspaceInstanceId = getCspaceInstanceId();\r
         for (TenantBindingType tbt : tenantBindingTypeMap.values()) {\r
                //\r
                //Loop through all the services in this tenant\r
                //\r
             List<ServiceBindingType> sbtList = tbt.getServiceBindings();\r
             for (ServiceBindingType sbt: sbtList) {\r
-               String repositoryName = ConfigUtils.getRepositoryName(tbt, sbt.getRepositoryDomain()); // Each service can have a different repo domain\r
+               String repositoryName = null;\r
+               if (sbt.getType().equalsIgnoreCase(ServiceBindingUtils.SERVICE_TYPE_SECURITY) == false) {\r
+                       repositoryName = ConfigUtils.getRepositoryName(tbt, sbt.getRepositoryDomain()); // Each service can have a different repo domain\r
+               }\r
                 //Get the list of InitHandler elements, extract the first one (only one supported right now) and fire it using reflection.\r
                 List<org.collectionspace.services.config.service.InitHandler> list = sbt.getInitHandler();\r
                 if (list != null && list.size() > 0) {\r
@@ -313,7 +323,8 @@ public class ServiceMain {
                     Object o = instantiate(initHandlerClassname, IInitHandler.class);\r
                     if (o != null && o instanceof IInitHandler){\r
                         IInitHandler handler = (IInitHandler)o;\r
-                        handler.onRepositoryInitialized(JDBCTools.NUXEO_DATASOURCE_NAME, repositoryName, sbt, fields, props);\r
+                        handler.onRepositoryInitialized(JDBCTools.NUXEO_DATASOURCE_NAME, repositoryName, cspaceInstanceId,\r
+                                       sbt, fields, props);\r
                         //The InitHandler may be the default one,\r
                         //  or specialized classes which still implement this interface and are registered in tenant-bindings.xml.\r
                     }\r
index 26518fb0823ddf817ec6da38cd3c37ae7aa4c1cd..14c562c1f0fcaeac25bc84b1132928cf8fd60aa5 100644 (file)
@@ -919,13 +919,10 @@ public class AuthorizationCommon {
                TenantBindingConfigReaderImpl tenantBindingConfigReader,\r
                DatabaseProductType databaseProductType,\r
                String cspaceDatabaseName) throws Exception {\r
-       if (logger.isDebugEnabled()) {\r
-               logger.debug("ServiceMain.createDefaultAccounts starting...");\r
-       }\r
+\r
+       logger.debug("ServiceMain.createDefaultAccounts starting...");\r
        \r
-       String cspaceDbName = tenantBindingConfigReader.getRepositoryDomain(null).getStorageName();\r
         Hashtable<String, String> tenantInfo = getTenantNamesFromConfig(tenantBindingConfigReader);\r
-        \r
         Connection conn = null;\r
         // TODO - need to put in tests for existence first.\r
         // We could just look for the accounts per tenant up front, and assume that\r
@@ -1041,14 +1038,16 @@ public class AuthorizationCommon {
                }\r
                \r
                if (result == null) {\r
-                       logger.warn("Could not retrieve a lifecycle transition definition list from: "\r
-                                       + serviceBinding.getName()\r
-                                       + " with tenant ID = "\r
-                                       + tenantBinding.getId());                       \r
+                       if (serviceBinding.getType().equalsIgnoreCase(ServiceBindingUtils.SERVICE_TYPE_SECURITY) == false) {\r
+                               logger.warn("Could not retrieve a lifecycle transition definition list from: "\r
+                                               + serviceBinding.getName()\r
+                                               + " with tenant ID = "\r
+                                               + tenantBinding.getId());\r
+                       }\r
                        // return an empty list                 \r
                        result = new TransitionDefList();\r
                } else {\r
-                       logger.debug("Successfully etrieved a lifecycle transition definition list from: "\r
+                       logger.debug("Successfully retrieved a lifecycle transition definition list from: "\r
                                        + serviceBinding.getName()\r
                                        + " with tenant ID = "\r
                                        + tenantBinding.getId());\r
index b9ad278d1be286d74899b2abbb406bd2a6361c2e..9a49c241a6ba71f07fbe33b87125cd0c1c607644 100644 (file)
@@ -33,7 +33,6 @@ import java.util.Hashtable;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
-import org.collectionspace.services.common.ServiceMain;
 import org.collectionspace.services.common.api.JEEServerDeployment;
 import org.collectionspace.services.common.api.Tools;
 import org.collectionspace.services.config.service.ServiceBindingType;
index 0031dbdeb830dbc87c9621b423b980db2e11da48..6ab6e4975481da441bec3edf7f9da50e8e44b153 100644 (file)
@@ -17,8 +17,6 @@ import org.collectionspace.services.nuxeo.util.NuxeoUtils;
 import org.nuxeo.ecm.core.api.ClientException;\r
 import org.nuxeo.ecm.core.api.DocumentModel;\r
 import java.lang.IndexOutOfBoundsException;\r
-import java.util.GregorianCalendar;\r
-import org.collectionspace.services.common.api.GregorianCalendarDateTimeUtils;\r
 import org.collectionspace.services.common.api.Tools;\r
 import org.collectionspace.services.common.document.DocumentUtils;\r
 import org.slf4j.Logger;\r
index 910934d47beceae0a46b10d0a7bfaf6f6158b2fc..376d59bfcaf310f344c089a7c0a9570be9fa0708 100644 (file)
@@ -89,6 +89,7 @@ public class AddIndices extends InitHandler implements IInitHandler {
     @Override\r
     public void onRepositoryInitialized(String dataSourceName,\r
                String repositoryName,\r
+               String cspaceInstanceId,\r
                ServiceBindingType sbt, \r
                List<Field> fields, \r
                List<Property> properties) throws Exception {\r
@@ -107,16 +108,17 @@ public class AddIndices extends InitHandler implements IInitHandler {
             if(Tools.notEmpty(param) && (param.indexOf(',')>-1)){\r
                 String[] fieldNames = param.split(",");\r
                 for (String fn: fieldNames){\r
-                    rows = addOneIndex(dataSourceName, repositoryName, tableName, fn);\r
+                    rows = addOneIndex(dataSourceName, repositoryName, cspaceInstanceId, tableName, fn);\r
                 }\r
             } else {\r
-                rows = addOneIndex(dataSourceName, repositoryName, tableName, fieldName);\r
+                rows = addOneIndex(dataSourceName, repositoryName, cspaceInstanceId, tableName, fieldName);\r
             }\r
         }\r
     }\r
 \r
     private int addOneIndex(String dataSourceName,\r
-               String repositoryName, \r
+               String repositoryName,\r
+               String cspaceInstanceId,\r
                String tableName, \r
                String columnName) {\r
         int rows = 0;\r
@@ -124,7 +126,7 @@ public class AddIndices extends InitHandler implements IInitHandler {
         String indexName = tableName + INDEX_SEP + columnName + INDEX_SUFFIX;\r
         try {\r
                DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType(dataSourceName, repositoryName);\r
-            if (indexExists(dataSourceName, repositoryName, databaseProductType,\r
+            if (indexExists(dataSourceName, repositoryName, cspaceInstanceId, databaseProductType,\r
                        tableName, columnName, indexName)) {\r
                 logger.trace("Index already exists for column " + columnName\r
                         + " in table " + tableName);\r
@@ -153,7 +155,7 @@ public class AddIndices extends InitHandler implements IInitHandler {
                 //\r
                 // If this assumption is no longer valid, we might instead\r
                 // identify the relevant repository from the table name here.\r
-                rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, sql);\r
+                rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, cspaceInstanceId, sql);\r
                 logger.trace("Index added to column ("+columnName+") on table ("+tableName+")");\r
             }\r
             return rows;\r
@@ -165,6 +167,7 @@ public class AddIndices extends InitHandler implements IInitHandler {
 \r
     private boolean indexExists(String dataSourceName,\r
                String repositoryName,\r
+               String cspaceInstanceId,\r
                DatabaseProductType databaseProductType,\r
             String tableName, \r
             String colName, \r
@@ -210,7 +213,7 @@ public class AddIndices extends InitHandler implements IInitHandler {
             //\r
             // If this assumption is no longer valid, we might instead\r
             // identify the relevant repository from the table name here.\r
-            conn = JDBCTools.getConnection(dataSourceName, repositoryName);\r
+            conn = JDBCTools.getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
             stmt = conn.createStatement();\r
             rs = stmt.executeQuery(sql);\r
             if (rs.next()) {\r
index fc1154bec92f31957cb88db7dbbd06a6be4592a5..27788d6ed2091211519d5d7533fe717523fced14 100644 (file)
@@ -15,6 +15,7 @@ import org.collectionspace.services.config.service.ServiceBindingType;
 public interface IInitHandler {\r
     public void onRepositoryInitialized(String dataSourceName,\r
                String repositoryName,\r
+               String cspaceInstanceId,\r
                ServiceBindingType sbt, \r
                List<Field> fields, \r
                List<Property> property) throws Exception;\r
index ca2411243e524190e92a855484a4cc5bc4fc6805..e33c129f65c287ad676b136b639c8e61db0cbf52 100644 (file)
@@ -52,7 +52,8 @@ public class InitHandler implements IInitHandler {
     @Override\r
     public void onRepositoryInitialized(String dataSourceName,\r
                String repositoryName,\r
-               ServiceBindingType sbt, \r
+               String cspaceInstanceId,\r
+               ServiceBindingType sbt,\r
                List<Field> fields, \r
                List<Property> properties) throws Exception {\r
 \r
index ff8a3985e883154911c3b50de2594ff10a944578..6f8da421f1b2cfb0d83d29ecabb1508842e42f2b 100644 (file)
@@ -56,6 +56,7 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler {
     @Override
     public void onRepositoryInitialized(String dataSourceName,
                String repositoryName,
+               String cspaceInstanceId,
                ServiceBindingType sbt, 
                List<Field> fields, 
                List<Property> properties) throws Exception {
@@ -72,7 +73,8 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler {
             for (Field field : fields) {
                 datatype = getDatatypeFromLogicalType(databaseProductType, field.getType());
                 // If the field is already of the desired datatype, skip it.
-                if (fieldHasDesiredDatatype(dataSourceName, repositoryName, databaseProductType, field, datatype)) {
+                if (fieldHasDesiredDatatype(dataSourceName, repositoryName, cspaceInstanceId, databaseProductType,
+                               field, datatype)) {
                     logger.trace("Field " + field.getTable() + "." + field.getCol()
                             + " is already of desired datatype " + datatype);
                     continue;
@@ -102,7 +104,7 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler {
                 //
                 // If this assumption is no longer valid, we might instead
                 // identify the relevant repository from the table name here.
-                rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, sql);
+                rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, cspaceInstanceId, sql);
             }
         } catch (Exception e) {
             throw e;
@@ -146,6 +148,7 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler {
 
     private boolean fieldHasDesiredDatatype(String dataSourceName,
                String repositoryName,
+               String cspaceInstanceId,
                DatabaseProductType databaseProductType,
             Field field, String datatype) {
         
@@ -162,9 +165,9 @@ public class ModifyFieldDatatypes extends InitHandler implements IInitHandler {
         ResultSet rs = null;
 
         try {
-            conn = JDBCTools.getConnection(dataSourceName, repositoryName);
+            conn = JDBCTools.getConnection(dataSourceName, repositoryName, cspaceInstanceId);
             stmt = conn.createStatement();
-            String databaseName = JDBCTools.getDatabaseName(dataSourceName, repositoryName, conn);
+            String databaseName = JDBCTools.getDatabaseName(dataSourceName, repositoryName, cspaceInstanceId, conn);
             
             if (databaseProductType == DatabaseProductType.MYSQL) {
                 sql = "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS "
index 0ac977b5e330d0594f3a736d8bc486747cd7ee4a..51861d75e69db7f1dae3149a116d49807649546c 100644 (file)
@@ -57,6 +57,7 @@ public class RunSqlScripts extends InitHandler implements IInitHandler {
     @Override
     public void onRepositoryInitialized(String dataSourceName,
             String repositoryName,
+            String cspaceInstanceId,
             ServiceBindingType sbt,
             List<Field> fields,
             List<Property> properties) throws Exception {
@@ -90,7 +91,7 @@ public class RunSqlScripts extends InitHandler implements IInitHandler {
                 logger.warn(CANNOT_PERFORM_TASKS_MESSAGE);
                 continue;
             }
-            runScript(dataSourceName, repositoryName, scriptContents, "resource path " + scriptPath);
+            runScript(dataSourceName, repositoryName, cspaceInstanceId, scriptContents, "resource path " + scriptPath);
         }
 
         // Next, run a second sequence of SQL scripts, where those scripts may be
@@ -114,7 +115,7 @@ public class RunSqlScripts extends InitHandler implements IInitHandler {
                 logger.warn(CANNOT_PERFORM_TASKS_MESSAGE);
                 continue;
             }
-            runScript(dataSourceName, repositoryName, scriptContents, "file " + scriptFile.getName());
+            runScript(dataSourceName, repositoryName, cspaceInstanceId, scriptContents, "file " + scriptFile.getName());
         }
 
     }
@@ -236,10 +237,10 @@ public class RunSqlScripts extends InitHandler implements IInitHandler {
         return sb.toString();
     }
 
-    private void runScript(String dataSourceName, String repositoryName, String scriptContents, String scriptPath) {
+    private void runScript(String dataSourceName, String repositoryName, String cspaceInstanceId, String scriptContents, String scriptPath) {
         int rows = 0;
         try {
-            rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, scriptContents);
+            rows = JDBCTools.executeUpdate(dataSourceName, repositoryName, cspaceInstanceId, scriptContents);
         } catch (Throwable e) {
             logger.warn("Running SQL script from " + scriptPath + " resulted in error: ", e.getMessage());
             rows = -1;
index 6e330883b127035d1b7608d3c23c2e4a66051d06..d59b4a2d8109c0b651ee2100c89bbe729fb33a65 100644 (file)
@@ -63,6 +63,7 @@ public class QueryManager {
        static public String createWhereClauseForPartialMatch(ServiceContext ctx,\r
                        String field,\r
                        String partialTerm) throws Exception {\r
+               String cspaceInstanceId = ServiceMain.getInstance().getCspaceInstanceId();\r
                String repositoryName = ctx.getRepositoryName();\r
         // Otherwise, generate that list and cache it for re-use.\r
         TenantBindingConfigReaderImpl tReader =\r
@@ -74,7 +75,7 @@ public class QueryManager {
                                || Boolean.parseBoolean(ptStartingWildcardValue);\r
 \r
                return queryManager.createWhereClauseForPartialMatch(queryManager.getDatasourceName(),\r
-                               repositoryName, field, ptStartingWildcard, partialTerm);\r
+                               repositoryName, cspaceInstanceId, field, ptStartingWildcard, partialTerm);\r
        }\r
        \r
        /**\r
index a8c4734edad7b007db4196fd26ea24cccf3adeea..e9e2f4cb2a98b3eea45343e5323b024c207b0012 100644 (file)
@@ -66,10 +66,10 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
        private static Pattern advSearchSqlWildcard = Pattern.compile(".*?[I]*LIKE\\s*\\\"\\%\\\".*?");\r
 \r
 \r
-       private static String getLikeForm(String dataSourceName, String repositoryName) {\r
+       private static String getLikeForm(String dataSourceName, String repositoryName, String cspaceInstanceId) {\r
                if (SEARCH_LIKE_FORM == null) {\r
                        try {\r
-                               DatabaseProductType type = JDBCTools.getDatabaseProductType(dataSourceName, repositoryName);\r
+                               DatabaseProductType type = JDBCTools.getDatabaseProductType(dataSourceName, repositoryName, cspaceInstanceId);\r
                                if (type == DatabaseProductType.MYSQL) {\r
                                        SEARCH_LIKE_FORM = IQueryManager.SEARCH_LIKE;\r
                                } else if (type == DatabaseProductType.POSTGRESQL) {\r
@@ -239,6 +239,7 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
        @Override\r
        public String createWhereClauseForPartialMatch(String dataSourceName,\r
                        String repositoryName,\r
+                       String cspaceInstanceId,\r
                        String field,\r
                        boolean startingWildcard,\r
                        String partialTerm) {\r
@@ -259,7 +260,7 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
                        \r
                StringBuilder ptClause = new StringBuilder(trimmed.length()+field.length()+20);\r
                ptClause.append(field);\r
-               ptClause.append(getLikeForm(dataSourceName, repositoryName));\r
+               ptClause.append(getLikeForm(dataSourceName, repositoryName, cspaceInstanceId));\r
                ptClause.append(startingWildcard?"'%":"'");\r
                ptClause.append(unescapedSingleQuote.matcher(trimmed).replaceAll("\\\\'"));\r
                ptClause.append("%'");\r
index 5470435f72afd686bd6117116424d193bd3ba840..f47c35b3843ed27c07585d6cec8c033d84122e90 100644 (file)
@@ -129,7 +129,18 @@ public class JDBCTools {
        return result;\r
     }\r
     \r
-    public static Connection getConnection(String dataSourceName, String repositoryName) throws NamingException, SQLException {\r
+    //\r
+    // Use this version of the getConnection() method when you don't want to qualify the database name\r
+    // with a CollectionSpace instance ID.\r
+    //\r
+    public static Connection getConnection(String dataSourceName,\r
+               String databaseName) throws NamingException, SQLException {\r
+       return getConnection(dataSourceName, databaseName, null);\r
+    }\r
+    \r
+    public static Connection getConnection(String dataSourceName,\r
+               String repositoryName,\r
+               String cspaceInstanceId) throws NamingException, SQLException {\r
        Connection result = null;\r
        \r
        if (Tools.isEmpty(dataSourceName) || Tools.isEmpty(repositoryName)) {\r
@@ -154,7 +165,7 @@ public class JDBCTools {
                BasicDataSource dataSource = (BasicDataSource)getDataSource(dataSourceName);\r
                // Get the template URL value from the JNDI datasource and substitute the databaseName\r
                String urlTemplate = dataSource.getUrl();\r
-               String databaseName = getDatabaseName(repositoryName);\r
+               String databaseName = getDatabaseName(repositoryName, cspaceInstanceId);\r
                String connectionUrl = urlTemplate.replace(URL_DATABASE_NAME, databaseName);\r
 \r
                // ATTENTION!\r
@@ -181,11 +192,11 @@ public class JDBCTools {
         return result;\r
     }\r
 \r
-    public static CachedRowSet executeQuery(String dataSourceName, String repositoryName, String sql) throws Exception {\r
+    public static CachedRowSet executeQuery(String dataSourceName, String repositoryName, String cspaceInstanceId, String sql) throws Exception {\r
         Connection conn = null;\r
         Statement stmt = null;\r
         try {\r
-            conn = getConnection(dataSourceName, repositoryName);\r
+            conn = getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
             stmt = conn.createStatement();\r
              \r
             RowSetFactory rowSetFactory = RowSetProvider.newFactory();\r
@@ -219,11 +230,11 @@ public class JDBCTools {
     }\r
     \r
     public static CachedRowSet executePreparedQuery(final PreparedStatementBuilder builder,\r
-            String dataSourceName, String repositoryName) throws Exception {\r
+            String dataSourceName, String repositoryName, String cspaceInstanceId) throws Exception {\r
         Connection conn = null;\r
         PreparedStatement ps = null;\r
         try {\r
-            conn = getConnection(dataSourceName, repositoryName);\r
+            conn = getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
             RowSetFactory rowSetFactory = RowSetProvider.newFactory();\r
             CachedRowSet crs = rowSetFactory.createCachedRowSet();\r
             ps = builder.build(conn);\r
@@ -260,12 +271,12 @@ public class JDBCTools {
     // FIXME: This method's code significantly overlaps that of executePrepareQuery(), above,\r
     // and the two could be refactored into a single method, if desired.\r
     public static List<CachedRowSet> executePreparedQueries(final List<PreparedStatementBuilder> builders,\r
-            String dataSourceName, String repositoryName, Boolean executeWithinTransaction) throws Exception {\r
+            String dataSourceName, String repositoryName, String cspaceInstanceId, Boolean executeWithinTransaction) throws Exception {\r
         Connection conn = null;\r
         PreparedStatement ps = null;\r
         List<CachedRowSet> results = new ArrayList<>();\r
         try {\r
-            conn = getConnection(dataSourceName, repositoryName);\r
+            conn = getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
             if (executeWithinTransaction) {\r
                 conn.setAutoCommit(false);\r
             }\r
@@ -288,6 +299,7 @@ public class JDBCTools {
                     }\r
                 } catch (Exception e) {\r
                     int rowcount = ps.executeUpdate();\r
+                       logger.debug(String.format("Row count for builder %s is %d", ps.toString(), rowcount));\r
                     // Throw uncaught exception here if update attempt also fails\r
                 }\r
             }\r
@@ -320,11 +332,14 @@ public class JDBCTools {
         }\r
     }\r
 \r
-    public static int executeUpdate(String dataSourceName, String repositoryName, String sql) throws Exception {\r
+    public static int executeUpdate(String dataSourceName,\r
+               String repositoryName, \r
+               String cspaceInstanceId, \r
+               String sql) throws Exception {\r
         Connection conn = null;\r
         Statement stmt = null;\r
         try {\r
-            conn = getConnection(dataSourceName, repositoryName);\r
+            conn = getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
             stmt = conn.createStatement();\r
             int rows = stmt.executeUpdate(sql);\r
             stmt.close();\r
@@ -371,11 +386,12 @@ public class JDBCTools {
      * @return the database product name\r
      */\r
     public static String getDatabaseProductName(String dataSourceName,\r
-               String repositoryName) {\r
+               String repositoryName,\r
+               String cspaceInstanceId) {\r
        if (DBProductName == null) {\r
                Connection conn = null;\r
                try {\r
-                   conn = getConnection(dataSourceName, repositoryName);\r
+                   conn = getConnection(dataSourceName, repositoryName, cspaceInstanceId);\r
                    DBProductName = conn.getMetaData().getDatabaseProductName();\r
                } catch (Exception e) {\r
                        if (logger.isTraceEnabled() == true) {\r
@@ -404,11 +420,31 @@ public class JDBCTools {
      * @return an enumerated value identifying the database product type\r
      * @throws Exception \r
      */\r
+    public static DatabaseProductType getDatabaseProductType(String dataSourceName,\r
+               String repositoryName,\r
+               String cspaceInstanceId) throws Exception {\r
+       DatabaseProductType result = DatabaseProductType.UNRECOGNIZED;\r
+       \r
+        String productName = getDatabaseProductName(dataSourceName, repositoryName, cspaceInstanceId);\r
+        if (productName.matches("(?i).*mysql.*")) {\r
+               result = DatabaseProductType.MYSQL;\r
+        } else if (productName.matches("(?i).*postgresql.*")) {\r
+               result = DatabaseProductType.POSTGRESQL;\r
+        } else {\r
+            throw new Exception("Unrecognized database system " + productName);\r
+        }\r
+       \r
+        return result;\r
+    }\r
+    \r
+    //\r
+    // Same as method above except the cspace instance ID is not needed.\r
+    //\r
     public static DatabaseProductType getDatabaseProductType(String dataSourceName,\r
                String repositoryName) throws Exception {\r
        DatabaseProductType result = DatabaseProductType.UNRECOGNIZED;\r
        \r
-        String productName = getDatabaseProductName(dataSourceName, repositoryName);\r
+        String productName = getDatabaseProductName(dataSourceName, repositoryName, null);\r
         if (productName.matches("(?i).*mysql.*")) {\r
                result = DatabaseProductType.MYSQL;\r
         } else if (productName.matches("(?i).*postgresql.*")) {\r
@@ -420,6 +456,10 @@ public class JDBCTools {
         return result;\r
     }\r
     \r
+    /*\r
+     * By convention, the repository name and database name are the same.  However, this\r
+     * call encapulates that convention and allows overrides.\r
+     */\r
     public static String getDatabaseName(String repoName, String cspaceInstanceId) {\r
        String result = repoName;\r
        \r
@@ -431,20 +471,19 @@ public class JDBCTools {
                result = DEFAULT_NUXEO_DATABASE_NAME;\r
        }\r
        \r
-       result = result + cspaceInstanceId;\r
+       //\r
+       // If we have a non-null 'cspaceInstanceId' instance ID then we need to append it\r
+       // as a suffix to the database name.\r
+       //\r
+       if (cspaceInstanceId != null && !cspaceInstanceId.trim().isEmpty()) {\r
+               if (result.endsWith(cspaceInstanceId) == false) { // ensure we don't already have the suffix\r
+                       result = result + cspaceInstanceId;\r
+               }\r
+       }\r
        \r
        return result;\r
     }\r
-    \r
-    /*\r
-     * By convention, the repository name and database name are the same.  However, this\r
-     * call encapulates that convention and allows overrides.\r
-     */\r
-    public static String getDatabaseName(String repoName) {\r
-       String cspaceInstanceId = ServiceMain.getInstance().getCspaceInstanceId();\r
-       return getDatabaseName(repoName, cspaceInstanceId);\r
-    }\r
-    \r
+        \r
     /**\r
      * Returns the catalog/database name for an open JDBC connection.\r
      * \r
@@ -454,6 +493,7 @@ public class JDBCTools {
      */\r
     public static String getDatabaseName(String dataSourceName,\r
                String repositoryName,\r
+               String cspaceInstanceId,\r
                Connection conn) throws Exception {\r
         String databaseName = null;\r
         \r
@@ -463,13 +503,13 @@ public class JDBCTools {
                \r
                // Format of the PostgreSQL JDBC URL:\r
                // http://jdbc.postgresql.org/documentation/80/connect.html\r
-               if (getDatabaseProductType(dataSourceName, repositoryName) == DatabaseProductType.POSTGRESQL) {\r
+               if (getDatabaseProductType(dataSourceName, repositoryName, cspaceInstanceId) == DatabaseProductType.POSTGRESQL) {\r
                    String tokens[] = urlStr.split(JDBC_URL_DATABASE_SEPARATOR);\r
                    databaseName = tokens[tokens.length - 1];\r
                    // Format of the MySQL JDBC URL:\r
                    // http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html\r
                    // FIXME: the last token could contain optional parameters, not accounted for here.\r
-               } else if (getDatabaseProductType(dataSourceName, repositoryName) == DatabaseProductType.MYSQL) {\r
+               } else if (getDatabaseProductType(dataSourceName, repositoryName, cspaceInstanceId) == DatabaseProductType.MYSQL) {\r
                    String tokens[] = urlStr.split(JDBC_URL_DATABASE_SEPARATOR);\r
                    databaseName = tokens[tokens.length - 1];\r
                }\r
index 4af1eeca5b5d7bd209d81e40f2912e32f9952280..12d809bcd2b8359ab0333c4f121623d57d35c1a7 100644 (file)
@@ -1124,8 +1124,9 @@ public class RepositoryJavaClientImpl implements RepositoryClient<PoxPayloadIn,
         final Boolean EXECUTE_WITHIN_TRANSACTION = true;
         Set<String> docIds = new HashSet<>();
         try {
+               String cspaceInstanceId = ServiceMain.getInstance().getCspaceInstanceId();
             List<CachedRowSet> resultsList = JDBCTools.executePreparedQueries(builders,
-                dataSourceName, repositoryName, EXECUTE_WITHIN_TRANSACTION);
+                dataSourceName, repositoryName, cspaceInstanceId, EXECUTE_WITHIN_TRANSACTION);
 
             // At least one set of results is expected, from the second prepared
             // statement to be executed.
index 00f142a9ad87e271327cc9ca76dfce793d396d21..92ebd9b93abb3b456ed42ad269d60915823c0ca5 100644 (file)
@@ -36,7 +36,6 @@ public class ConfigUtils {
     public static String getRepositoryName(TenantBindingType tenantBindingType, String domainName) {
                String result = null;
                
-               
                if (domainName != null && domainName.trim().isEmpty() == false) {
                        List<RepositoryDomainType> repoDomainList = tenantBindingType.getRepositoryDomain();
                        if (repoDomainList != null && repoDomainList.isEmpty() == false) {
@@ -48,7 +47,7 @@ public class ConfigUtils {
                                }
                        }
                } else {
-                       logger.error(String.format("No domain name was specified on call to getRepositoryName() method."));
+                       logger.error(String.format("There was no domain name specified on a call to getRepositoryName() method."));
                }
                
                if (result == null && logger.isTraceEnabled()) {
index b97dfec1597ac76fc26c4bfdff0547f74baa8d25..f8c2c02012880a1c9261f36518d53350ab817ef2 100644 (file)
 package org.collectionspace.services.report.nuxeo;\r
 \r
 import java.sql.Connection;\r
-import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
 import java.sql.Statement;\r
 import java.util.List;\r
 \r
-import javax.sql.DataSource;\r
-\r
 import org.collectionspace.services.common.api.Tools;\r
 import org.collectionspace.services.common.init.IInitHandler;\r
 import org.collectionspace.services.common.init.InitHandler;\r
@@ -59,6 +56,7 @@ public class ReportPostInitHandler extends InitHandler implements IInitHandler {
     @Override\r
     public void onRepositoryInitialized(String dataSourceName,\r
                String repositoryName,\r
+               String cspaceInstanceId,\r
                ServiceBindingType sbt, \r
                List<Field> fields, \r
                List<Property> propertyList) throws Exception {\r
@@ -73,11 +71,13 @@ public class ReportPostInitHandler extends InitHandler implements IInitHandler {
                    }\r
                }\r
         }\r
+       \r
         Connection conn = null;\r
         Statement stmt = null;\r
         String sql = "";\r
         try {\r
-            DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType(dataSourceName, repositoryName);\r
+            DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType(dataSourceName, repositoryName,\r
+                       cspaceInstanceId);\r
             if (databaseProductType == DatabaseProductType.MYSQL) {\r
                // Nothing to do: MYSQL already does wildcard grants in init_db.sql\r
             } else if(databaseProductType != DatabaseProductType.POSTGRESQL) {\r