<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.vocabulary.nuxeo.VocabularyValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.vocabularies_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularies_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object name="Vocabulary" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.vocabulary.nuxeo.VocabularyItemValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object name="Vocabularyitem" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.organization.nuxeo.OrgAuthorityValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.orgauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.orgauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Orgauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.organization.nuxeo.OrganizationValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Organization" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.person.nuxeo.PersonAuthorityValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.personauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.personauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Personauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.person.nuxeo.PersonValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Person" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:documentHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.location.nuxeo.LocationAuthorityDocumentModelHandler
</service:documentHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.locationauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locationauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Locationauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.location.nuxeo.LocationValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Locationitem" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
</tenant:serviceBindings>
<!-- end media service meta-data -->
-
<!-- begin movement service meta-data -->
<tenant:serviceBindings name="Movements" type="procedure" version="0.1">
<!-- other URI paths using which this service could be accessed -->
<service:documentHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.vocabulary.nuxeo.VocabularyDocumentModelHandler
</service:documentHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.vocabularies_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularies_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object name="Vocabulary" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.vocabulary.nuxeo.VocabularyItemValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.vocabularyitems_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object name="Vocabularyitem" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.organization.nuxeo.OrgAuthorityValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.orgauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.orgauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Orgauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.organization.nuxeo.OrganizationValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.organizations_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Organization" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<types:item><types:key>authRef</types:key><types:value>contactNames|contactName</types:value></types:item>
<types:item><types:key>authRef</types:key><types:value>subBodies|subBody</types:value></types:item>
</service:properties>
-
<service:content contentType="application/xml">
<service:xmlContent
namespaceURI="http://collectionspace.org/services/organization"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.person.nuxeo.PersonAuthorityValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.personauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.personauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Personauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.person.nuxeo.PersonValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.persons_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Person" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:documentHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.location.nuxeo.LocationAuthorityDocumentModelHandler
</service:documentHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.locationauthorities_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locationauthorities_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Locationauthority" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
<service:validatorHandler xmlns:service='http://collectionspace.org/services/common/service'>
org.collectionspace.services.location.nuxeo.LocationValidatorHandler
</service:validatorHandler>
+ <service:initHandler xmlns:service='http://collectionspace.org/services/common/service'>
+ <service:classname>org.collectionspace.services.common.init.AddIndices</service:classname>
+ <service:params>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>inauthority</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>displayname</service:col>
+ </service:field>
+ <service:field>
+ <service:table>nuxeo.locations_common</service:table>
+ <service:col>shortidentifier</service:col>
+ </service:field>
+ </service:params>
+ </service:initHandler>
<service:object id="1" name="Locationitem" version="0.1"
xmlns:service='http://collectionspace.org/services/common/service'>
<service:part id="0" control_group="Managed"
import org.collectionspace.services.common.service.InitHandler.Params.Field;\r
import org.collectionspace.services.common.service.InitHandler.Params.Property;\r
import org.collectionspace.services.common.storage.DatabaseProductType;\r
+import org.collectionspace.services.common.storage.JDBCTools;\r
\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
+import java.sql.Connection;\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.sql.Statement;\r
+\r
import java.util.List;\r
\r
/**\r
//todo: all post-init tasks for services, or delegate to services that override.\r
int rows = 0;\r
String sql = "";\r
- logger.info("Creating indicies for designated fields in " + sbt.getName()\r
+ logger.info("Creating indicies, as needed, for designated fields in " + sbt.getName()\r
+ " for repository domain " + sbt.getRepositoryDomain().trim() + "...");\r
\r
for (Field field : fields) {\r
if(Tools.notEmpty(param) && (param.indexOf(',')>-1)){\r
String[] fieldNames = param.split(",");\r
for (String fn: fieldNames){\r
- addOneIndex(tableName, fn);\r
+ rows = addOneIndex(tableName, fn);\r
}\r
} else {\r
- addOneIndex(tableName, fieldName);\r
+ rows = addOneIndex(tableName, fieldName);\r
}\r
}\r
}\r
private int addOneIndex(String tableName, String columnName){\r
int rows = 0;\r
String sql = "";\r
+ String indexName = columnName + INDEX_SUFFIX;\r
try {\r
- DatabaseProductType databaseProductType = getDatabaseProductType();\r
+ DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType();\r
// TODO: Consider refactoring this 'if' statement to a general-purpose\r
// mechanism for retrieving and populating catalog/DDL-type SQL statements\r
// appropriate to a particular database product.\r
if (databaseProductType == DatabaseProductType.MYSQL) {\r
- sql = "CREATE INDEX " + columnName + INDEX_SUFFIX + " ON " + tableName + " (" + columnName + ")";\r
+ // If the index already exists, do nothing.\r
+ if (indexExists(databaseProductType, tableName, indexName)) {\r
+ // FIXME: Can add the option to drop and re-create an index here.\r
+ // See MySQL documentation on DROP INDEX.\r
+ } else {\r
+ sql = "CREATE INDEX " + indexName + " ON " + tableName + " (" + columnName + ")";\r
+ }\r
} else if (databaseProductType == DatabaseProductType.POSTGRESQL) {\r
- sql = "CREATE INDEX ON " + tableName + " (" + columnName + ")";\r
+ if (indexExists(databaseProductType, tableName, indexName)) {\r
+ // FIXME: Can add the option to reindex an existing index here.\r
+ // See PostgreSQL documentation on REINDEX.\r
+ } else {\r
+ sql = "CREATE INDEX ON " + tableName + " (" + columnName + ")";\r
+ }\r
} else {\r
throw new Exception("Unrecognized database system " + databaseProductType);\r
}\r
- rows = executeUpdate(sql);\r
- logger.info("Index added to column ("+columnName+") on table ("+tableName+")");\r
+ if (sql != null && ! sql.trim().isEmpty()) {\r
+ rows = JDBCTools.executeUpdate(sql);\r
+ logger.info("Index added to column ("+columnName+") on table ("+tableName+")");\r
+ }\r
return rows;\r
} catch (Throwable e) {\r
logger.info("Index NOT added to column ("+columnName+") on table ("+tableName+") SQL: "+sql+" ERROR: "+e);\r
}\r
}\r
\r
+ private boolean indexExists(DatabaseProductType databaseProductType,\r
+ String tableName, String indexName) {\r
+ boolean indexExists = false;\r
+ int rows = 0;\r
+ String sql = "";\r
+ Connection conn = null;\r
+ Statement stmt = null;\r
+ ResultSet rs = null;\r
+ try {\r
+ if (databaseProductType == DatabaseProductType.MYSQL) {\r
+ sql = "SHOW INDEX FROM " + tableName + " WHERE key_name='"\r
+ + indexName + "'";\r
+ conn = JDBCTools.getConnection(JDBCTools.getDefaultRepositoryName());\r
+ stmt = conn.createStatement();\r
+ rs = stmt.executeQuery(sql);\r
+ if (rs.last()) {\r
+ rows = rs.getRow();\r
+ }\r
+ rs.close();\r
+ stmt.close();\r
+ conn.close();\r
+ if (rows > 0) {\r
+ indexExists = true;\r
+ }\r
+ } else if (databaseProductType == DatabaseProductType.POSTGRESQL) {\r
+ // FIXME: Add comparable logic for PostgreSQL.\r
+ }\r
+ } catch (Exception e) {\r
+ logger.debug("Error when identifying whether index exists in table "\r
+ + tableName + ":" + e.getMessage());\r
+ } finally {\r
+ try {\r
+ if (rs != null) {\r
+ conn.close();\r
+ }\r
+ if (conn != null) {\r
+ conn.close();\r
+ }\r
+ if (stmt != null) {\r
+ stmt.close();\r
+ }\r
+ } catch (SQLException sqle) {\r
+ logger.debug("SQL Exception closing statement/connection in AddIndices: " + sqle.getLocalizedMessage());\r
+ }\r
+ }\r
+ return indexExists;\r
+ }\r
+\r
}\r