db.dialect=org.hibernate.dialect.MySQLDialect\r
db.typemapping=mySQL\r
db.exceptionsorter=org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter\r
+db.spring.acl.classIdentityQuery=SELECT @@IDENTITY\r
+db.spring.acl.sidIdentityQuery=SELECT @@IDENTITY\r
\r
#For postgresql, uncomment this, and comment out mysql section\r
#db.port=5432\r
#db.jdbc.driver.class=org.postgresql.Driver\r
#db.dialect=org.hibernate.dialect.PostgreSQLDialect\r
#db.typemapping=PostgreSQL 8.0\r
-#db.exceptionsorter=org.jboss.resource.adapter.jdbc.vendor.PostgreSQLExceptionSorter\r
+# Should be org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter\r
+# but current JBoss does not seem to include it...\r
+#db.exceptionsorter= \r
+#db.spring.acl.classIdentityQuery=select currval(pg_get_serial_sequence('acl_class', 'id'))\r
+#db.spring.acl.sidIdentityQuery=select currval(pg_get_serial_sequence('acl_sid', 'id'))\r
\r
\r
#database common settings\r
url="${db.jdbc.baseurl}"\r
userid="${db.user}"\r
password="${db.user.password}"\r
+ autocommit="true"\r
src="${db.script.dir}/init_db.sql"\r
>\r
<classpath>\r
<enabled>false</enabled>\r
</snapshots>\r
</pluginRepository>\r
+ <pluginRepository>\r
+ <id>repo1</id>\r
+ <name>Maven repo1</name>\r
+ <url>http://repo1.maven.org/maven2</url>\r
+ <snapshots>\r
+ <enabled>false</enabled>\r
+ </snapshots>\r
+ </pluginRepository>\r
<pluginRepository>\r
<id>maven repo</id>\r
<name>maven repo</name>\r
<auths>\r
<!-- IMPORTANT: THESE ARE STICKY :: THEY STICK AROUND UNTIL RESET, IN EXEC ORDER OF THIS FILE. -->\r
<auth ID="admin@core.collectionspace.org">YWRtaW5AY29yZS5jb2xsZWN0aW9uc3BhY2Uub3JnOkFkbWluaXN0cmF0b3I=</auth>\r
- <auth ID="testAdministator">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
</auths>\r
<testGroup ID="testSingle" autoDeletePOSTS="true">\r
<test ID="createCollObj1" auth="test">\r
<build>\r
<finalName>cspace-services</finalName>\r
<defaultGoal>package</defaultGoal>\r
+ <filters>\r
+ <filter>../../build.properties</filter>\r
+ </filters>\r
+ <resources>\r
+ <resource>\r
+ <directory>src/main/resources</directory>\r
+ <filtering>true</filtering>\r
+ </resource>\r
+ </resources>\r
<plugins>\r
<plugin>\r
<groupId>org.codehaus.mojo</groupId>\r
</files>\r
</configuration>\r
</plugin>\r
- <plugin>\r
+ <plugin>\r
+ <groupId>org.apache.maven.plugins</groupId>\r
+ <artifactId>maven-resources-plugin</artifactId>\r
+ <version>2.5</version>\r
+ <executions>\r
+ <execution>\r
+ <phase>process-resources</phase>\r
+ <goals>\r
+ <goal>resources</goal>\r
+ </goals>\r
+ </execution>\r
+ </executions>\r
+ </plugin>\r
+ <plugin>\r
<groupId>org.codehaus.cargo</groupId>\r
<artifactId>cargo-maven2-plugin</artifactId>\r
<version>0.3</version>\r
<class>org.collectionspace.services.authorization.Role</class>
<class>org.collectionspace.services.authorization.AccountRoleRel</class>
<properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
+ <property name="hibernate.dialect" value="${db.dialect}"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<!--property name="hibernate.hbm2ddl.auto" value="create-drop"/-->
</properties>
<artifactId>mysql-connector-java</artifactId>\r
<scope>test</scope>\r
</dependency>\r
- <!-- <dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <scope>test</scope>\r
+ </dependency>\r
+ <!-- <dependency>\r
<groupId>org.collectionspace.services</groupId>\r
<artifactId>org.collectionspace.services.client</artifactId>\r
<version>${project.version}</version>\r
\r
<properties>\r
<sql.file>account.sql</sql.file>\r
- <sql.dir>${basedir}/src/main/resources/db/mysql</sql.dir>\r
+ <sql.dir>${basedir}/src/main/resources/db</sql.dir>\r
</properties>\r
\r
<dependencies>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
</dependency>\r
- <!-- CollectionSpace dependencies -->\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ </dependency>\r
+ <!-- CollectionSpace dependencies -->\r
<dependency>\r
<groupId>org.collectionspace.services</groupId>\r
<artifactId>org.collectionspace.services.account.jaxb</artifactId>\r
<id>ddl</id>\r
<build>\r
<plugins>\r
+ <plugin>\r
+ <groupId>org.codehaus.mojo</groupId>\r
+ <artifactId>properties-maven-plugin</artifactId>\r
+ <version>1.0-alpha-2</version>\r
+ <executions>\r
+ <execution>\r
+ <phase>initialize</phase>\r
+ <goals>\r
+ <goal>read-project-properties</goal>\r
+ </goals>\r
+ <configuration>\r
+ <files>\r
+ <file>${basedir}/../../../build.properties</file>\r
+ </files>\r
+ </configuration>\r
+ </execution>\r
+ </executions>\r
+ </plugin>\r
<plugin>\r
<groupId>org.codehaus.mojo</groupId>\r
<artifactId>hibernate3-maven-plugin</artifactId>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
- <version>5.1.5</version>\r
+ <version>5.1.5</version>\r
</dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <version>8.4-702.jdbc4</version>\r
+ </dependency>\r
</dependencies>\r
</plugin>\r
<plugin>\r
<phase>process-test-resources</phase>\r
<configuration>\r
<tasks>\r
- <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${sql.file}"/>\r
+ <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${db}/${sql.file}"/>\r
</tasks>\r
</configuration>\r
<goals>\r
-- Licensed under the Educational Community License (ECL), Version 2.0.
-- You may not use this file except in compliance with this License.
--
-use cspace;
+-- use cspace;
CREATE INDEX index_userid ON accounts_common (userid);
CREATE INDEX index_screen_name ON accounts_common (screen_name);
CREATE INDEX index_email ON accounts_common (email);
--- /dev/null
+The file account.sql is basically generated by the gen_ddl ant target.\r
+However, you must modify the result of that to make the \r
+\r
+ DROP TABLE \r
+\r
+statements be \r
+ \r
+ DROP TABLE IF EXISTS table CASCADE \r
+\r
+This ensures that first time setup does not fail, and that later invocations\r
+can deal with dependencies.\r
+\r
+You must also make the\r
+\r
+ DROP SEQUENCE \r
+\r
+statements be \r
+\r
+ DROP SEQUENCE IF EXISTS\r
+\r
+for similar reasons.\r
+\r
+You must also remove (comment out) the statement (which is superfluous with the CASCADE above):\r
+\r
+ alter table permissions_actions drop constraint FKFDA649B05A9CEEB5;\r
+\r
+When using the account_tenants table on insert, you have to specify "nextval('hibernate_sequence')" \r
+as the value for the HJID column. \r
+\r
+Note that because of the way gen_ddl does its work per-sub-project, there is a single shared\r
+sequence for both this and the authorization.sql script. This should be okay, even if it does\r
+create gaps in what would be a nice sequence for each table.\r
--- /dev/null
+-- alter table accounts_tenants drop constraint FKFDA649B05A9CEEB5;
+DROP TABLE IF EXISTS accounts_common CASCADE;
+DROP TABLE IF EXISTS accounts_tenants CASCADE;
+DROP TABLE IF EXISTS tenants CASCADE;
+DROP SEQUENCE IF EXISTS hibernate_sequence;
+create table accounts_common (csid varchar(128) not null, created_at timestamp not null, email varchar(255) not null, mobile varchar(255), person_ref_name varchar(255), phone varchar(255), screen_name varchar(128) not null, status varchar(15) not null, updated_at timestamp, userid varchar(128) not null, primary key (csid));
+create table accounts_tenants (HJID int8 not null, tenant_id varchar(128) not null, TENANTS_ACCOUNTSCOMMON_CSID varchar(128), primary key (HJID));
+create table tenants (id varchar(128) not null, created_at timestamp not null, name varchar(255) not null, updated_at timestamp, primary key (id));
+alter table accounts_tenants add constraint FKFDA649B05A9CEEB5 foreign key (TENANTS_ACCOUNTSCOMMON_CSID) references accounts_common;
+create sequence hibernate_sequence;
--- /dev/null
+--
+-- Copyright 20010 University of California at Berkeley
+-- Licensed under the Educational Community License (ECL), Version 2.0.
+-- You may not use this file except in compliance with this License.
+--
+-- use cspace;
+CREATE INDEX index_userid ON accounts_common (userid);
+CREATE INDEX index_screen_name ON accounts_common (screen_name);
+CREATE INDEX index_email ON accounts_common (email);
+CREATE INDEX index_person_ref_name ON accounts_common (person_ref_name);
+CREATE INDEX index_update_at ON accounts_common (updated_at);
+CREATE INDEX index_status ON accounts_common (status);
<pathelement path="${db.driver.jar}"/>\r
</classpath>\r
</sql>\r
+ <!-- No longer used\r
<sql driver="${db.jdbc.driver.class}"\r
url="${db.jdbc.cspace.url}"\r
userid="${db.cspace.user}"\r
<pathelement path="${db.driver.jar}"/>\r
</classpath>\r
</sql>\r
- <!-- No longer used\r
<sql driver="${db.jdbc.driver.class}"\r
url="${db.jdbc.cspace.url}"\r
userid="${db.cspace.user}"\r
\r
<properties>\r
<sql.file>authentication.sql</sql.file>\r
- <sql.dir>${basedir}/src/main/resources/db/mysql</sql.dir>\r
+ <sql.dir>${basedir}/src/main/resources/db</sql.dir>\r
</properties>\r
\r
<dependencies>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
</dependency>\r
<!-- CollectionSpace -->\r
<dependency>\r
<id>ddl</id>\r
<build>\r
<plugins>\r
- <plugin>\r
+ <plugin>\r
+ <groupId>org.codehaus.mojo</groupId>\r
+ <artifactId>properties-maven-plugin</artifactId>\r
+ <version>1.0-alpha-2</version>\r
+ <executions>\r
+ <execution>\r
+ <phase>initialize</phase>\r
+ <goals>\r
+ <goal>read-project-properties</goal>\r
+ </goals>\r
+ <configuration>\r
+ <files>\r
+ <file>${basedir}/../../../build.properties</file>\r
+ </files>\r
+ </configuration>\r
+ </execution>\r
+ </executions>\r
+ </plugin>\r
+ <plugin>\r
<groupId>org.codehaus.mojo</groupId>\r
<artifactId>hibernate3-maven-plugin</artifactId>\r
<version>2.2</version>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
- <version>5.1.5</version>\r
+ <!-- <version>5.1.5</version> -->\r
</dependency>\r
- </dependencies>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <!-- <version>8.4-702.jdbc4</version> -->\r
+ </dependency>\r
+ </dependencies>\r
</plugin>\r
<plugin>\r
<artifactId>maven-antrun-plugin</artifactId>\r
<phase>process-test-resources</phase>\r
<configuration>\r
<tasks>\r
- <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${sql.file}"/>\r
+ <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${db}/${sql.file}"/>\r
</tasks>\r
</configuration>\r
<goals>\r
--- /dev/null
+The file authentication.sql is basically generated by the gen_ddl ant target.\r
+\r
+However, you must modify the result of that to make the \r
+\r
+ DROP TABLE \r
+\r
+statements be \r
+ \r
+ DROP TABLE IF EXISTS table \r
+\r
+This ensures that first time setup does not fail.\r
--- /dev/null
+DROP TABLE IF EXISTS users;
+create table users (username varchar(128) not null, created_at timestamp not null, passwd varchar(128) not null, updated_at timestamp, primary key (username));
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
</dependency>\r
- <dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ </dependency>\r
+ <dependency>\r
<groupId>javax.persistence</groupId>\r
<artifactId>persistence-api</artifactId>\r
</dependency>\r
<artifactId>mysql-connector-java</artifactId>\r
<scope>test</scope>\r
</dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <scope>test</scope>\r
+ </dependency>\r
</dependencies>\r
\r
<build>\r
<filter token="DB_USER" value="${db.cspace.user}" /> <!-- double-sub from ${db.user} fails -->\r
<filter token="DB_PASSWORD" value="${env.DB_PASSWORD_CSPACE}" /> <!-- double-sub from ${db.jboss.user.password} fails -->\r
<filter token="DB_DIALECT" value="${db.dialect}" />\r
+ <filter token="CLASS_ID_QUERY" value="${db.spring.acl.classIdentityQuery}" />\r
+ <filter token="SID_ID_QUERY" value="${db.spring.acl.sidIdentityQuery}" />\r
<copy tofile="${dest.hibernate.cfg}" file="${src.hibernate.cfg}" filtering="true"/>\r
<copy tofile="${dest.appContext.cfg}" file="${src.appContext.cfg}" filtering="true"/>\r
</target>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
</dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ </dependency>\r
<dependency>\r
<groupId>ch.elca.el4j.modules</groupId>\r
<artifactId>module-xml_merge-common</artifactId>\r
\r
<build>\r
<finalName>cspace-services-authorization-mgt-import</finalName>\r
+ <filters>\r
+ <filter>../../../build.properties</filter>\r
+ </filters>\r
+ <resources>\r
+ <resource>\r
+ <directory>src/main/resources</directory>\r
+ <filtering>true</filtering>\r
+ </resource>\r
+ </resources>\r
<plugins>\r
+ <plugin>\r
+ <groupId>org.apache.maven.plugins</groupId>\r
+ <artifactId>maven-resources-plugin</artifactId>\r
+ <version>2.5</version>\r
+ <executions>\r
+ <execution>\r
+ <phase>process-resources</phase>\r
+ <goals>\r
+ <goal>resources</goal>\r
+ </goals>\r
+ </execution>\r
+ </executions>\r
+ </plugin>\r
<plugin>\r
<groupId>org.codehaus.mojo</groupId>\r
<artifactId>exec-maven-plugin</artifactId>\r
<argument>-p</argument>\r
<argument>does_not_matter</argument>\r
<argument>-b</argument>\r
+ <!-- This should be (Needs testing):\r
+ <argument>${jboss.server.cspace}</argument>\r
+ -->\r
<argument>${basedir}/../../common/src/main</argument>\r
<argument>-edir</argument>\r
<argument>${basedir}/target</argument>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
- <version>5.1.5</version>\r
+ <version>5.1.5</version>\r
</dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <version>8.4-702.jdbc4</version>\r
+ </dependency>\r
</dependencies>\r
</plugin>\r
</plugins>\r
rv.setRoleId(role.getCsid());
roleValues.add(rv);
} else {
- if (logger.isDebugEnabled() == true) {
- logger.debug("Role and Permission tenant ID did not match."); //FIXME: REM - Remove this debug statement.
+ if (logger.isTraceEnabled() == true) {
+ logger.trace("Role and Permission tenant ID did not match."); //FIXME: REM - Remove this debug statement.
}
}
}
<constructor-arg ref="dataSource"/>
<constructor-arg ref="lookupStrategy"/>
<constructor-arg ref="aclCache"/>
- <property name="classIdentityQuery" value="SELECT @@IDENTITY"/>
- <property name="sidIdentityQuery" value="SELECT @@IDENTITY"/>
- </bean>
+ <property name="classIdentityQuery" value="@CLASS_ID_QUERY@"/>
+ <property name="sidIdentityQuery" value="@SID_ID_QUERY@"/>
+ </bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="@DB_DRIVER_CLASS@"/>
<name>services.authorization.pstore</name>\r
<properties>\r
<sql.file>authorization.sql</sql.file>\r
- <sql.dir>${basedir}/src/main/resources/db/mysql</sql.dir>\r
+ <sql.dir>${basedir}/src/main/resources/db</sql.dir>\r
</properties>\r
<dependencies>\r
<dependency>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
</dependency>\r
</dependencies>\r
\r
<id>ddl</id>\r
<build>\r
<plugins>\r
- <plugin>\r
+ <plugin>\r
+ <groupId>org.codehaus.mojo</groupId>\r
+ <artifactId>properties-maven-plugin</artifactId>\r
+ <version>1.0-alpha-2</version>\r
+ <executions>\r
+ <execution>\r
+ <phase>initialize</phase>\r
+ <goals>\r
+ <goal>read-project-properties</goal>\r
+ </goals>\r
+ <configuration>\r
+ <files>\r
+ <file>${basedir}/../../../build.properties</file>\r
+ </files>\r
+ </configuration>\r
+ </execution>\r
+ </executions>\r
+ </plugin>\r
+ <plugin>\r
<groupId>org.codehaus.mojo</groupId>\r
<artifactId>hibernate3-maven-plugin</artifactId>\r
<version>2.2</version>\r
<dependency>\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
- <version>5.1.5</version>\r
+ <!-- <version>5.1.5</version> -->\r
</dependency>\r
- </dependencies>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ <!-- <version>8.4-702.jdbc4</version> -->\r
+ </dependency>\r
+ </dependencies>\r
</plugin>\r
<plugin>\r
<artifactId>maven-antrun-plugin</artifactId>\r
<phase>process-test-resources</phase>\r
<configuration>\r
<tasks>\r
- <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${sql.file}" />\r
+ <copy file="${basedir}/target/hibernate3/sql/${sql.file}" tofile="${sql.dir}/${db}/${sql.file}"/>\r
</tasks>\r
</configuration>\r
<goals>\r
-- You may not use this file except in compliance with this License.
--
-use cspace;
+-- use cspace;
drop table if exists `acl_entry`;
drop table if exists `acl_object_identity`;
drop table if exists `acl_sid`;
-- Table structure for table `acl_class`
--
-CREATE TABLE IF NOT EXISTS `acl_class` (
+CREATE TABLE `acl_class` (
`id` bigint(20) NOT NULL auto_increment,
`class` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
-- Table structure for table `acl_sid`
--
-CREATE TABLE IF NOT EXISTS `acl_sid` (
+CREATE TABLE `acl_sid` (
`id` bigint(20) NOT NULL auto_increment,
`principal` tinyint(1) NOT NULL,
`sid` varchar(100) NOT NULL,
-- Table structure for table `acl_entry`
--
-CREATE TABLE IF NOT EXISTS `acl_entry` (
+CREATE TABLE `acl_entry` (
`id` bigint(20) NOT NULL auto_increment,
`acl_object_identity` bigint(20) NOT NULL,
`ace_order` int(11) NOT NULL,
-- Table structure for table `acl_object_identity`
--
-CREATE TABLE IF NOT EXISTS `acl_object_identity` (
+CREATE TABLE `acl_object_identity` (
`id` bigint(20) NOT NULL auto_increment,
`object_id_class` bigint(20) NOT NULL,
`object_id_identity` bigint(20) NOT NULL,
-- Licensed under the Educational Community License (ECL), Version 2.0.
-- You may not use this file except in compliance with this License.
--
-use cspace;
+-- use cspace;
CREATE INDEX index_rolename ON roles (rolename);
CREATE INDEX index_rolegroup ON roles (rolegroup);
CREATE INDEX index_tenant_id ON roles (tenant_id);
--- /dev/null
+The file authorization.sql is basically generated by the gen_ddl ant target.\r
+However, you must modify the result of that to make the \r
+\r
+ DROP TABLE \r
+\r
+statements be \r
+ \r
+ DROP TABLE IF EXISTS table CASCADE \r
+\r
+This ensures that first time setup does not fail, and that later invocations\r
+can deal with dependencies.\r
+\r
+You must also make the\r
+\r
+ DROP SEQUENCE \r
+\r
+statements be \r
+\r
+ DROP SEQUENCE IF EXISTS\r
+\r
+for similar reasons.\r
+\r
+You must also remove (comment out) the statement (which is superfluous with the CASCADE above):\r
+\r
+ alter table permissions_actions drop constraint FK85F82042E2DC84FD;\r
+\r
+When using the account_tenants table on insert, you have to specify "nextval('hibernate_sequence')" \r
+as the value for the HJID column. \r
+\r
+Note that because of the way gen_ddl does its work per-sub-project, there is a single shared\r
+sequence for both this and the authorization.sql script. This should be okay, even if it does\r
+create gaps in what would be a nice sequence for each table.\r
--- /dev/null
+--
+-- Copyright 2010 University of California at Berkeley
+-- Licensed under the Educational Community License (ECL), Version 2.0.
+-- You may not use this file except in compliance with this License.
+--
+
+-- use cspace;
+DROP TABLE IF EXISTS acl_entry;
+DROP TABLE IF EXISTS acl_object_identity;
+DROP TABLE IF EXISTS acl_sid;
+DROP TABLE IF EXISTS acl_class;
+
+--
+-- Table structure for table acl_class
+--
+CREATE TABLE acl_class(
+ id bigserial not null primary key,
+ class varchar(100) not null,
+ constraint unique_uk_2 unique(class)
+);
+
+
+--
+-- Table structure for table acl_sid
+--
+CREATE TABLE acl_sid(
+ id bigserial not null primary key,
+ principal boolean not null,
+ sid varchar(100) not null,
+ constraint unique_uk_1 unique(sid,principal)
+);
+
+--
+-- Table structure for table acl_object_identity
+--
+CREATE TABLE acl_object_identity(
+ id bigserial primary key,
+ object_id_class bigint not null,
+ object_id_identity bigint not null,
+ parent_object bigint,
+ owner_sid bigint,
+ entries_inheriting boolean not null,
+ constraint unique_uk_3 unique(object_id_class,object_id_identity),
+ constraint acl_obj_id_ibfk_1 foreign key(parent_object) references acl_object_identity(id),
+ constraint acl_obj_id_ibfk_2 foreign key(object_id_class) references acl_class(id),
+ constraint acl_obj_id_ibfk_3 foreign key(owner_sid) references acl_sid(id)
+);
+
+--
+-- Table structure for table acl_entry
+--
+CREATE TABLE acl_entry(
+ id bigserial primary key,
+ acl_object_identity bigint not null,
+ ace_order int not null,
+ sid bigint not null,
+ mask integer not null,
+ granting boolean not null,
+ audit_success boolean not null,
+ audit_failure boolean not null,
+ constraint unique_uk_4 unique(acl_object_identity,ace_order),
+ constraint acl_entry_ibfk_1 foreign key(acl_object_identity)
+ references acl_object_identity(id),
+ constraint acl_entry_ibfk_2 foreign key(sid) references acl_sid(id)
+);
+
--- /dev/null
+-- alter table permissions_actions drop constraint FK85F82042E2DC84FD;
+DROP TABLE IF EXISTS accounts_roles CASCADE;
+DROP TABLE IF EXISTS permissions CASCADE;
+DROP TABLE IF EXISTS permissions_actions CASCADE;
+DROP TABLE IF EXISTS permissions_roles CASCADE;
+DROP TABLE IF EXISTS roles CASCADE;
+DROP SEQUENCE IF EXISTS hibernate_sequence;
+create table accounts_roles (HJID int8 not null, account_id varchar(128) not null, created_at timestamp not null, role_id varchar(128) not null, role_name varchar(255), screen_name varchar(255), user_id varchar(128) not null, primary key (HJID), unique (account_id, role_id));
+create table permissions (csid varchar(128) not null, action_group varchar(128), attribute_name varchar(128), created_at timestamp not null, description varchar(255), effect varchar(32) not null, resource_name varchar(128) not null, tenant_id varchar(128) not null, updated_at timestamp, primary key (csid));
+create table permissions_actions (HJID int8 not null, name varchar(128) not null, objectIdentity varchar(128) not null, objectIdentityResource varchar(128) not null, ACTIONS_PERMISSION_CSID varchar(128), primary key (HJID));
+create table permissions_roles (HJID int8 not null, actionGroup varchar(255), created_at timestamp not null, permission_id varchar(128) not null, permission_resource varchar(255), role_id varchar(128) not null, role_name varchar(255), primary key (HJID), unique (permission_id, role_id));
+create table roles (csid varchar(128) not null, created_at timestamp not null, description varchar(255), displayname varchar(200) not null, rolegroup varchar(255), rolename varchar(200) not null, tenant_id varchar(128) not null, updated_at timestamp, primary key (csid), unique (rolename, tenant_id), unique (displayname, tenant_id));
+alter table permissions_actions add constraint FK85F82042E2DC84FD foreign key (ACTIONS_PERMISSION_CSID) references permissions;
+create sequence hibernate_sequence;
--- /dev/null
+--
+-- Copyright 2010 University of California at Berkeley
+-- Licensed under the Educational Community License (ECL), Version 2.0.
+-- You may not use this file except in compliance with this License.
+--
+-- use cspace;
+CREATE INDEX index_rolename ON roles (rolename);
+CREATE INDEX index_rolegroup ON roles (rolegroup);
+CREATE INDEX index_tenant_id ON roles (tenant_id);
+
+CREATE INDEX index_user_id ON accounts_roles (user_id);
+CREATE INDEX index_account_id ON accounts_roles (account_id);
+CREATE INDEX index_acct_role_id ON accounts_roles (role_id);
+
+CREATE INDEX index_permission_id ON permissions_roles (permission_id);
+CREATE INDEX index_perm_role_id ON permissions_roles (role_id);
+
<artifactId>mysql-connector-java</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.collectionspace.services</groupId>
<build>
<finalName>cspace-services-authz</finalName>
- <plugins>
-
- </plugins>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.5</version>
+ <executions>
+ <execution>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>resources</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <filters>
+ <filter>../../../build.properties</filter>
+ </filters>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
</build>
</project>
<constructor-arg ref="dataSource"/>
<constructor-arg ref="lookupStrategy"/>
<constructor-arg ref="aclCache"/>
- <property name="classIdentityQuery" value="SELECT @@IDENTITY"/>
- <property name="sidIdentityQuery" value="SELECT @@IDENTITY"/>
+ <!-- Set query properties for the ${db} db variant -->
+ <property name="classIdentityQuery" value="${db.spring.acl.classIdentityQuery}"/>
+ <property name="sidIdentityQuery" value="${db.spring.acl.sidIdentityQuery}"/>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
final static String SEARCH_GROUP_CLOSE = ")";\r
final static String SEARCH_TERM_SEPARATOR = " ";\r
final static String SEARCH_LIKE = " LIKE ";\r
+ final static String SEARCH_ILIKE = " ILIKE ";\r
final static String SEARCH_TYPE_KEYWORDS = "keywords";\r
final static String SEARCH_TYPE_KEYWORDS_KW = "kw";\r
final static String SEARCH_TYPE_PARTIALTERM = "pt";\r
final static String SEARCH_TYPE_DOCTYPE = "doctype";\r
final static String SEARCH_TYPE_INVOCATION = "inv";\r
- final static String ECM_FULLTEXT_LIKE = "ecm:fulltext" + SEARCH_TERM_SEPARATOR + SEARCH_LIKE;\r
final static String SEARCH_QUALIFIER_AND = SEARCH_TERM_SEPARATOR + "AND" + SEARCH_TERM_SEPARATOR;\r
final static String SEARCH_QUALIFIER_OR = SEARCH_TERM_SEPARATOR + "OR" + SEARCH_TERM_SEPARATOR;\r
\r
<groupId>mysql</groupId>\r
<artifactId>mysql-connector-java</artifactId>\r
</dependency>\r
- <dependency>\r
+ <dependency>\r
+ <groupId>postgresql</groupId>\r
+ <artifactId>postgresql</artifactId>\r
+ </dependency>\r
+ <dependency>\r
<groupId>javax.persistence</groupId>\r
<artifactId>persistence-api</artifactId>\r
</dependency>\r
<service:classname>org.collectionspace.services.common.init.ModifyFieldDatatypes</service:classname>
<service:params>
<service:field>
- <service:table>nuxeo.collectionobjects_common_briefdescriptions</service:table>
+ <service:table>collectionobjects_common_briefdescriptions</service:table>
<service:col>item</service:col>
<service:type>LARGETEXT</service:type>
<service:param />
</service:field>
<service:field>
- <service:table>nuxeo.collectionobjects_common_comments</service:table>
+ <service:table>collectionobjects_common_comments</service:table>
<service:col>item</service:col>
<service:type>LARGETEXT</service:type>
<service:param />
</service:field>
<service:field>
- <service:table>nuxeo.collectionobjects_common_objectproductionreasons</service:table>
+ <service:table>collectionobjects_common_objectproductionreasons</service:table>
<service:col>item</service:col>
<service:type>LARGETEXT</service:type>
<service:param />
</service:field>
<service:field>
- <service:table>nuxeo.collectionobjects_common_ownersreferences</service:table>
+ <service:table>collectionobjects_common_ownersreferences</service:table>
<service:col>item</service:col>
<service:type>LARGETEXT</service:type>
<service:param />
</service:field>
<service:field>
- <service:table>nuxeo.collectionobjects_common_viewersreferences</service:table>
+ <service:table>collectionobjects_common_viewersreferences</service:table>
<service:col>item</service:col>
<service:type>LARGETEXT</service:type>
<service:param />
import org.collectionspace.services.common.security.SecurityUtils;\r
import org.collectionspace.services.common.service.*;\r
import org.collectionspace.services.common.storage.JDBCTools;\r
+import org.collectionspace.services.common.storage.DatabaseProductType;\r
import org.collectionspace.services.common.tenant.TenantBindingType;\r
import org.collectionspace.services.common.types.PropertyItemType;\r
import org.collectionspace.services.common.types.PropertyType;\r
private static final String DEFAULT_ADMIN_PASSWORD = "Administrator";\r
private static final String DEFAULT_READER_PASSWORD = "reader";\r
\r
- public static final String NUXEO_REPOSITORY_NAME = "NuxeoDS";\r
- public static final String CSPACE_REPOSITORY_NAME = "CspaceDS";\r
- public static final String DEFAULT_REPOSITORY_NAME = CSPACE_REPOSITORY_NAME;\r
-\r
private ServiceMain() {\r
//empty\r
}\r
conn = getConnection();\r
// First find or create the tenants\r
String queryTenantSQL = \r
- "SELECT `id`,`name` FROM `tenants`";\r
+ "SELECT id,name FROM tenants";\r
stmt = conn.createStatement();\r
ResultSet rs = stmt.executeQuery(queryTenantSQL);\r
ArrayList<String> existingTenants = new ArrayList<String>();\r
rs.close();\r
\r
String insertTenantSQL = \r
- "INSERT INTO `tenants` (`id`,`name`,`created_at`) VALUES (?,?, now())";\r
+ "INSERT INTO tenants (id,name,created_at) VALUES (?,?, now())";\r
pstmt = conn.prepareStatement(insertTenantSQL); // create a statement\r
for(String tId : tenantInfo.keySet()) {\r
if(existingTenants.contains(tId)) {\r
pstmt.close();\r
// Second find or create the users\r
String queryUserSQL = \r
- "SELECT `username` FROM `users` WHERE `username` LIKE '"\r
- +TENANT_ADMIN_ACCT_PREFIX+"%' OR `username` LIKE '"\r
+ "SELECT username FROM users WHERE username LIKE '"\r
+ +TENANT_ADMIN_ACCT_PREFIX+"%' OR username LIKE '"\r
+TENANT_READER_ACCT_PREFIX+"%'";\r
rs = stmt.executeQuery(queryUserSQL);\r
ArrayList<String> usersInRepo = new ArrayList<String>();\r
}\r
rs.close();\r
String insertUserSQL = \r
- "INSERT INTO `users` (`username`,`passwd`, `created_at`)"\r
+ "INSERT INTO users (username,passwd, created_at)"\r
+" VALUES (?,?, now())";\r
pstmt = conn.prepareStatement(insertUserSQL); // create a statement\r
for(String tName : tenantInfo.values()) {\r
// Third, create the accounts. Assume that if the users were already there,\r
// then the accounts were as well\r
String insertAccountSQL = \r
- "INSERT INTO `accounts_common` "\r
- + "(`csid`, `email`, `userid`, `status`, `screen_name`, `created_at`) "\r
+ "INSERT INTO accounts_common "\r
+ + "(csid, email, userid, status, screen_name, created_at) "\r
+ "VALUES (?,?,?,'ACTIVE',?, now())";\r
Hashtable<String, String> tenantAdminAcctCSIDs = new Hashtable<String, String>();\r
Hashtable<String, String> tenantReaderAcctCSIDs = new Hashtable<String, String>();\r
pstmt.close();\r
// Fourth, bind accounts to tenants. Assume that if the users were already there,\r
// then the accounts were bound to tenants correctly\r
- String insertAccountTenantSQL =\r
- "INSERT INTO `accounts_tenants` (`TENANTS_ACCOUNTSCOMMON_CSID`,`tenant_id`) "\r
- + "VALUES (?, ?)";\r
+ String insertAccountTenantSQL;\r
+ DatabaseProductType databaseProductType = JDBCTools.getDatabaseProductType();\r
+ if (databaseProductType == DatabaseProductType.MYSQL) {\r
+ insertAccountTenantSQL =\r
+ "INSERT INTO accounts_tenants (TENANTS_ACCOUNTSCOMMON_CSID,tenant_id) "\r
+ + " VALUES(?, ?)";\r
+ } else if (databaseProductType == DatabaseProductType.POSTGRESQL) {\r
+ insertAccountTenantSQL =\r
+ "INSERT INTO accounts_tenants (HJID, TENANTS_ACCOUNTSCOMMON_CSID,tenant_id) "\r
+ + " VALUES(nextval('hibernate_sequence'), ?, ?)";\r
+ } else {\r
+ throw new Exception("Unrecognized database system.");\r
+ }\r
pstmt = conn.prepareStatement(insertAccountTenantSQL); // create a statement\r
for(String tId : tenantInfo.keySet()) {\r
String tName = tenantInfo.get(tId);\r
// Fifth, fetch and save the default roles\r
String springAdminRoleCSID = null;\r
String querySpringRole = \r
- "SELECT `csid` from `roles` WHERE `rolename`='"+SPRING_ADMIN_ROLE+"'";\r
+ "SELECT csid from roles WHERE rolename='"+SPRING_ADMIN_ROLE+"'";\r
rs = stmt.executeQuery(querySpringRole);\r
if(rs.next()) {\r
springAdminRoleCSID = rs.getString(1);\r
}\r
} else {\r
String insertSpringAdminRoleSQL =\r
- "INSERT INTO `roles` (`csid`, `rolename`, `displayName`, `rolegroup`, `created_at`, `tenant_id`) "\r
+ "INSERT INTO roles (csid, rolename, displayName, rolegroup, created_at, tenant_id) "\r
+ "VALUES ('-1', 'ROLE_SPRING_ADMIN', 'SPRING_ADMIN', 'Spring Security Administrator', now(), '0')";\r
stmt.executeUpdate(insertSpringAdminRoleSQL);\r
springAdminRoleCSID = "-1";\r
}\r
rs.close();\r
String getRoleCSIDSql =\r
- "SELECT `csid` from `roles` WHERE `tenant_id`=? and `rolename`=?";\r
+ "SELECT csid from roles WHERE tenant_id=? and rolename=?";\r
pstmt = conn.prepareStatement(getRoleCSIDSql); // create a statement\r
rs = null;\r
Hashtable<String, String> tenantAdminRoleCSIDs = new Hashtable<String, String>();\r
pstmt.close();\r
// Sixth, bind the accounts to roles. If the users already existed,\r
// we'll assume they were set up correctly.\r
- String insertAccountRoleSQL =\r
- "INSERT INTO `accounts_roles`(`account_id`, `user_id`, `role_id`, `role_name`, `created_at`)"\r
- + " VALUES(?, ?, ?, ?, now())";\r
+ String insertAccountRoleSQL;\r
+ if (databaseProductType == DatabaseProductType.MYSQL) {\r
+ insertAccountRoleSQL =\r
+ "INSERT INTO accounts_roles(account_id, user_id, role_id, role_name, created_at)"\r
+ +" VALUES(?, ?, ?, ?, now())";\r
+ } else if (databaseProductType == DatabaseProductType.POSTGRESQL) {\r
+ insertAccountRoleSQL =\r
+ "INSERT INTO accounts_roles(HJID, account_id, user_id, role_id, role_name, created_at)"\r
+ +" VALUES(nextval('hibernate_sequence'), ?, ?, ?, ?, now())";\r
+ } else {\r
+ throw new Exception("Unrecognized database system.");\r
+ }\r
if (logger.isDebugEnabled()) {\r
logger.debug("createDefaultAccounts binding accounts to roles with SQL:\n"\r
+insertAccountRoleSQL);\r
}\r
\r
private Connection getConnection() throws LoginException, SQLException {\r
- return JDBCTools.getConnection(DEFAULT_REPOSITORY_NAME);\r
+ return JDBCTools.getConnection(JDBCTools.CSPACE_REPOSITORY_NAME);\r
}\r
\r
void retrieveAllWorkspaceIds() throws Exception {\r
//\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(sql, JDBCTools.getNuxeoRepositoryName());\r
+ rows = JDBCTools.executeUpdate(JDBCTools.NUXEO_REPOSITORY_NAME, sql);\r
logger.trace("Index added to column ("+columnName+") on table ("+tableName+")");\r
}\r
return rows;\r
}\r
\r
try {\r
- // Assumes indicies will only be created at post-init time\r
+ // Assumes indices will only be created at post-init time\r
// for the Nuxeo repository.\r
// \r
// To date, for the CSpace repository, indices have typically been\r
//\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(JDBCTools.getNuxeoRepositoryName());\r
+ conn = JDBCTools.getConnection(JDBCTools.NUXEO_REPOSITORY_NAME);\r
stmt = conn.createStatement();\r
rs = stmt.executeQuery(sql);\r
if (rs.last()) {\r
if (databaseProductType == DatabaseProductType.MYSQL) {
logger.info("Modifying field " + field.getTable() + "."
+ field.getCol() + " to datatype " + datatype);
- sql = "ALTER TABLE " + field.getTable() + " MODIFY COLUMN " + field.getCol() + " " + datatype;
+ sql = "ALTER TABLE " + field.getTable() + " MODIFY COLUMN "
+ + field.getCol() + " " + datatype;
} else if (databaseProductType == DatabaseProductType.POSTGRESQL) {
logger.info("Modifying field " + field.getTable() + "."
+ field.getCol() + " to datatype " + datatype);
- sql = "ALTER TABLE " + field.getTable() + " ALTER COLUMN " + field.getCol() + " " + datatype;
+ sql = "ALTER TABLE " + field.getTable() + " ALTER COLUMN "
+ + field.getCol() + " TYPE " + datatype;
} else {
throw new Exception("Unrecognized database system.");
}
//
// If this assumption is no longer valid, we might instead
// identify the relevant repository from the table name here.
- rows = JDBCTools.executeUpdate(sql, JDBCTools.getNuxeoRepositoryName());
+ rows = JDBCTools.executeUpdate(JDBCTools.NUXEO_REPOSITORY_NAME, sql);
}
} catch (Exception e) {
throw e;
}
try {
- conn = JDBCTools.getConnection(JDBCTools.getNuxeoRepositoryName());
+ conn = JDBCTools.getConnection(JDBCTools.NUXEO_REPOSITORY_NAME);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
import org.collectionspace.services.nuxeo.client.java.NuxeoConnector;\r
import org.collectionspace.services.nuxeo.client.java.RepositoryJavaClientImpl;\r
import org.collectionspace.services.client.IQueryManager;\r
+import org.collectionspace.services.common.storage.DatabaseProductType;\r
+import org.collectionspace.services.common.storage.JDBCTools;\r
\r
public class QueryManagerNuxeoImpl implements IQueryManager {\r
\r
+ private static String ECM_FULLTEXT_LIKE = \r
+ "ecm:fulltext" + SEARCH_TERM_SEPARATOR + IQueryManager.SEARCH_LIKE;\r
+ private static String SEARCH_LIKE_FORM = null;\r
+\r
private final Logger logger = LoggerFactory\r
.getLogger(QueryManagerNuxeoImpl.class);\r
\r
private static Pattern nonWordChars = Pattern.compile("[^\\p{L}\\p{M}\\p{N}_']");\r
private static Pattern unescapedDblQuotes = Pattern.compile("(?<!\\\\)\"");\r
private static Pattern unescapedSingleQuote = Pattern.compile("(?<!\\\\)'");\r
+ \r
+ private static String getLikeForm() {\r
+ if(SEARCH_LIKE_FORM == null) {\r
+ try {\r
+ DatabaseProductType type = JDBCTools.getDatabaseProductType();\r
+ if(type == DatabaseProductType.MYSQL) {\r
+ SEARCH_LIKE_FORM = IQueryManager.SEARCH_LIKE;\r
+ } else if(type == DatabaseProductType.POSTGRESQL) {\r
+ SEARCH_LIKE_FORM = IQueryManager.SEARCH_ILIKE;\r
+ }\r
+ } catch (Exception e) {\r
+ SEARCH_LIKE_FORM = IQueryManager.SEARCH_LIKE;\r
+ }\r
+ }\r
+ return SEARCH_LIKE_FORM;\r
+ }\r
\r
//TODO: This is currently just an example fixed query. This should eventually be\r
// removed or replaced with a more generic method.\r
throw new RuntimeException("No match field specified.");\r
}\r
String ptClause = field\r
- + IQueryManager.SEARCH_LIKE\r
+ + getLikeForm()\r
+ "'%" + unescapedSingleQuote.matcher(trimmed).replaceAll("\\\\'") + "%'";\r
return ptClause;\r
}\r
* $LastChangedDate: $\r
*/\r
public class JDBCTools {\r
+ public static String CSPACE_REPOSITORY_NAME = "CspaceDS";\r
+ public static String NUXEO_REPOSITORY_NAME = "NuxeoDS";\r
+ public static String DEFAULT_REPOSITORY_NAME = NUXEO_REPOSITORY_NAME;\r
+ private static String DBProductName = null;\r
+ private static DatabaseProductType DBProductType = DatabaseProductType.UNRECOGNIZED;\r
\r
//todo: make sure this will get instantiated in the right order\r
final static Logger logger = LoggerFactory.getLogger(JDBCTools.class);\r
\r
public static Connection getConnection(String repositoryName) throws LoginException, SQLException {\r
- if (Tools.isBlank(repositoryName)) {\r
+ if (Tools.isEmpty(repositoryName)) {\r
repositoryName = getDefaultRepositoryName();\r
}\r
InitialContext ctx = null;\r
}\r
}\r
}\r
- \r
- public static ResultSet executeQuery(String sql) throws Exception {\r
- return executeQuery(sql, getDefaultRepositoryName());\r
- }\r
\r
- public static ResultSet executeQuery(String sql, String repositoryName) throws Exception {\r
+\r
+ public static ResultSet executeQuery(String repoName, String sql) throws Exception {\r
Connection conn = null;\r
Statement stmt = null;\r
try {\r
- if (Tools.isBlank(repositoryName)) {\r
- repositoryName = getDefaultRepositoryName();\r
- }\r
- conn = getConnection(repositoryName);\r
+ conn = getConnection(repoName); // If null, uses default\r
stmt = conn.createStatement();\r
ResultSet rs = stmt.executeQuery(sql);\r
stmt.close();\r
}\r
}\r
}\r
- \r
- public static int executeUpdate(String sql) throws Exception {\r
- return executeUpdate(sql, getDefaultRepositoryName());\r
- }\r
\r
- public static int executeUpdate(String sql, String repositoryName) throws Exception {\r
+ public static int executeUpdate(String repoName, String sql) throws Exception {\r
Connection conn = null;\r
Statement stmt = null;\r
try {\r
- if (Tools.isBlank(repositoryName)) {\r
- repositoryName = getDefaultRepositoryName();\r
- }\r
- conn = getConnection(repositoryName);\r
+ conn = getConnection(repoName); // If null, uses default\r
stmt = conn.createStatement();\r
int rows = stmt.executeUpdate(sql);\r
stmt.close();\r
* @return the database product name\r
*/\r
public static String getDatabaseProductName() {\r
- String productName = "";\r
- Connection conn = null;\r
- try {\r
- conn = getConnection(getDefaultRepositoryName());\r
- productName = conn.getMetaData().getDatabaseProductName();\r
- } catch (Exception e) {\r
- } finally {\r
- try {\r
- if (conn != null) {\r
- conn.close();\r
- }\r
- } catch (SQLException sqle) {\r
- logger.debug("SQL Exception closing statement/connection in getDatabaseProductName: " + sqle.getLocalizedMessage());\r
- return productName;\r
- }\r
- }\r
- return productName;\r
+ if(DBProductName==null) {\r
+ Connection conn = null;\r
+ try {\r
+ conn = getConnection(getDefaultRepositoryName());\r
+ DBProductName = conn.getMetaData().getDatabaseProductName();\r
+ } catch (Exception e) {\r
+ } finally {\r
+ try {\r
+ if (conn != null) {\r
+ conn.close();\r
+ }\r
+ } catch (SQLException sqle) {\r
+ logger.debug("SQL Exception closing statement/connection in getDatabaseProductName: "\r
+ + sqle.getLocalizedMessage());\r
+ }\r
+ }\r
+ }\r
+ return DBProductName;\r
}\r
\r
/**\r
* @throws Exception \r
*/\r
public static DatabaseProductType getDatabaseProductType() throws Exception {\r
- DatabaseProductType productType = DatabaseProductType.UNRECOGNIZED;\r
- String productName = getDatabaseProductName();\r
- if (productName.matches("(?i).*mysql.*")) {\r
- productType = DatabaseProductType.MYSQL;\r
- } else if (productName.matches("(?i).*postgresql.*")) {\r
- productType = DatabaseProductType.POSTGRESQL;\r
- } else {\r
- throw new Exception("Unrecognized database system " + productName);\r
- }\r
- return productType;\r
+ if(DBProductType == DatabaseProductType.UNRECOGNIZED) {\r
+ String productName = getDatabaseProductName();\r
+ if (productName.matches("(?i).*mysql.*")) {\r
+ DBProductType = DatabaseProductType.MYSQL;\r
+ } else if (productName.matches("(?i).*postgresql.*")) {\r
+ DBProductType = DatabaseProductType.POSTGRESQL;\r
+ } else {\r
+ throw new Exception("Unrecognized database system " \r
+ + productName);\r
+ }\r
+ }\r
+ return DBProductType;\r
}\r
\r
public static String getDefaultRepositoryName() {\r
- return ServiceMain.DEFAULT_REPOSITORY_NAME;\r
- }\r
- \r
- public static String getNuxeoRepositoryName() {\r
- return ServiceMain.NUXEO_REPOSITORY_NAME;\r
+ return DEFAULT_REPOSITORY_NAME;\r
}\r
\r
/**\r
System.out.println("database url=" + metadata.getURL());\r
}\r
}\r
+ \r
}\r
return result;
}
+ private static AccountValue getAccountValue(String csid)
+ throws DocumentNotFoundException {
+
+ try {
+ //
+ // If the CSID is null then return the currently logged in user's ID
+ //
+ String whereClause;
+ HashMap<String, Object> params = new HashMap<String, Object>();
+ if (csid.equals(CS_CURRENT_USER) == true) {
+ whereClause = "where userId = :userId";
+ params.put("userId", AuthN.get().getUserId());
+ } else {
+ whereClause = "where csid = :csid";
+ params.put("csid", csid);
+ }
+
+ Object account = JpaStorageUtils.getEntity(
+ "org.collectionspace.services.account.AccountsCommon", whereClause, params);
+ if (account == null) {
+ String msg = "User's account not found, csid=" + csid;
+ throw new DocumentNotFoundException(msg);
+ }
+ AccountValue av = new AccountValue();
+ av.setAccountId((String)JaxbUtils.getValue(account, "getCsid"));
+ av.setScreenName((String)JaxbUtils.getValue(account, "getScreenName"));
+ av.setUserId((String)JaxbUtils.getValue(account, "getUserId"));
+ // Add the currentTenantId to the payload so the client knows the current tenancy.
+ av.setTenantId(AuthN.get().getCurrentTenantId());
+
+ return av;
+ } catch (Exception e) {
+ String msg = "User's account is in invalid state, csid=" + csid;
+ throw new DocumentNotFoundException(msg);
+ }
+ }
+
//FIXME: REM - This method should probably be moved to the AccountPermissionDocumemntHandler
/*
* This is a prototype for the /accounts/{csid}/permissions GET service call.
// permission -that is, the csid's userId match the currently logged in userId or
// that they have read access to the "accounts" resource.
//
- String userId = getUserId(csid);
+ AccountValue account = getAccountValue(csid);
+ String userId = account.getUserId();
String currentUserId = AuthN.get().getUserId();
if (currentUserId.equalsIgnoreCase(userId) == false) {
CSpaceResource res = new URIResourceImpl("accounts", "GET");
AccountPermission result = new AccountPermission();
EntityManagerFactory emf = null;
EntityManager em = null;
- Iterator<Object[]> tuples = null;
+ Iterator<Object> resultList = null;
try {
- StringBuilder queryStrBldr = new StringBuilder("SELECT ar, pr FROM " + AccountRoleRel.class.getName() +
- " ar, " + PermissionRoleRel.class.getName() + " pr" +
- " WHERE ar.roleId = pr.roleId and ar.userId=" + "'" + userId + "'");
+ List<AccountValue> accountValues = new ArrayList<AccountValue>();
+ accountValues.add(account);
+ result.setAccounts(accountValues);
+
+ emf = getEntityManagerFactory();
+ em = emf.createEntityManager();
+
+ StringBuilder permQueryStrBldr = new StringBuilder(
+ "SELECT DISTINCT pr FROM " + AccountRoleRel.class.getName() + " ar, "
+ + PermissionRoleRel.class.getName() + " pr"
+ + " WHERE ar.roleId = pr.roleId and ar.userId=" + "'" + userId + "'");
//
// Filter by the permissionResource param if it is set to something
//
if (permissionResource != null && currentResource != null) {
- queryStrBldr.append(" and (pr.permissionResource = " + "'" + currentResource + "'" +
+ permQueryStrBldr.append(" and (pr.permissionResource = " + "'" + currentResource + "'" +
" or pr.permissionResource = " + "'" + permissionResource + "'" + ")");
}
- //
- // Add group by clause
- //
- queryStrBldr.append(" group by pr.permissionId");
-
- emf = getEntityManagerFactory();
- em = emf.createEntityManager();
- String queryStr = queryStrBldr.toString(); //for debugging
+ String queryStr = permQueryStrBldr.toString(); //for debugging
Query q = em.createQuery(queryStr);
- tuples = q.getResultList().iterator();
- if (tuples.hasNext()) {
- //
- // get the first tuple, extract the AccountRoleRel and set the Account value for the result list
- //
- Object[] tuple = tuples.next();
- List<AccountValue> accountValues = new ArrayList<AccountValue>();
- accountValues.add(AuthorizationRoleRel.buildAccountValue((AccountRoleRel)tuple[0]));
- //
- // Since we extracted the first tuple, we need to store the first perm value as well
- // before iterating over the rest of the tuples.
- //
+ resultList = q.getResultList().iterator();
+
+ if (resultList.hasNext()) {
List<PermissionValue> permissionValues = new ArrayList<PermissionValue>();
- permissionValues.add(AuthorizationRoleRel.buildPermissionValue((PermissionRoleRel)tuple[1]));
- //
- // Now finish add the permission values.
- //
- while (tuples.hasNext()) {
- tuple = tuples.next();
- permissionValues.add(AuthorizationRoleRel.buildPermissionValue((PermissionRoleRel)tuple[1]));
+ while (resultList.hasNext()) {
+ PermissionRoleRel permRolRel = (PermissionRoleRel)resultList.next();
+ permissionValues.add(AuthorizationRoleRel.buildPermissionValue(permRolRel));
}
- result.setAccounts(accountValues);
result.setPermissions(permissionValues);
}
} catch (NoResultException nre) {
releaseEntityManagerFactory(emf);
}
}
- /*
- * Add the currentTenantId to the payload so the client knows the current
- * tenancy.
- */
- AccountValue av = result.getAccounts().get(0);
- av.setTenantId(AuthN.get().getCurrentTenantId());
return result;
}
<target name="create_db"
description="create tables(s), indices for id service">
<sql driver="${db.jdbc.driver.class}"
- url="${db.jdbc.cspace.url}"
- userid="${db.cspace.user}"
- password="${db.cspace.user.password}"
+ url="${db.jdbc.nuxeo.url}"
+ userid="${db.nuxeo.user}"
+ password="${db.nuxeo.user.password}"
src="${db.script.dir}/create_id_generators_table.sql" >
<classpath>
<pathelement path="${db.driver.jar}"/>
</classpath>
</sql>
<sql driver="${db.jdbc.driver.class}"
- url="${db.jdbc.cspace.url}"
- userid="${db.cspace.user}"
- password="${db.cspace.user.password}"
+ url="${db.jdbc.nuxeo.url}"
+ userid="${db.nuxeo.user}"
+ password="${db.nuxeo.user.password}"
src="${db.script.dir}/load_id_generators.sql" >
<classpath>
<pathelement path="${db.driver.jar}"/>
logger.debug("> in getJdbcConnection");
- // Providing an empty repository name to getConnection() will cause the
- // default repository name to be used.
- final String EMPTY_REPOSITORY_NAME = "";
-
Connection conn = null;
try {
- conn = JDBCTools.getConnection(EMPTY_REPOSITORY_NAME);
+ conn = JDBCTools.getConnection(JDBCTools.NUXEO_REPOSITORY_NAME);
} catch (LoginException e) {
throw e;
} catch (SQLException e) {
* $LastChangedDate$
*/
-CREATE DATABASE IF NOT EXISTS `cspace`;
-USE `cspace`;
-
DROP TABLE IF EXISTS `id_generators`;
CREATE TABLE `id_generators` (
`csid` varchar(80) PRIMARY KEY,
* initial value is '1').
*/
-USE `cspace`;
-
-- ACCESSION_LOT_NUMBER
INSERT INTO `id_generators`
* $LastChangedDate$
*/
--- Will return non-fatal failure result code and error message
--- if this database already exists.
-CREATE DATABASE cspace WITH ENCODING = 'UTF8';
-
--- Explicitly use this database before creating a table within it
--- (only works with scripts executed by the 'psql' client).
-\c cspace;
-
DROP TABLE IF EXISTS id_generators;
CREATE TABLE id_generators
(
);
-- CREATE UNIQUE INDEX csid_idx ON id_generators USING btree (csid);
+CREATE OR REPLACE FUNCTION update_modified_column()
+RETURNS TRIGGER AS 'BEGIN NEW.modified = now(); RETURN NEW; END;' language 'plpgsql';
--- Update the timestamp in the 'modified' field when the record is updated.
-CREATE OR REPLACE RULE update_idgenerators_timestamp AS
- ON UPDATE TO id_generators
- DO INSERT INTO id_generators (modified)
- VALUES (now());
+CREATE TRIGGER update_customer_modtime BEFORE UPDATE
+ ON id_generators FOR EACH ROW EXECUTE PROCEDURE
+ update_modified_column();
* initial value is '1').
*/
--- (Only works with scripts executed by the 'psql' client.)
-\c cspace;
-
-- ACCESSION_LOT_NUMBER
INSERT INTO id_generators
</systemProperties>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>properties-maven-plugin</artifactId>
+ <version>1.0-alpha-2</version>
+ </plugin>
+
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.5</version>
</dependency>
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>8.4-702.jdbc4</version>
+ </dependency>
</dependencies>
</dependencyManagement>
</project>
DROP USER IF EXISTS nuxeo;\r
DROP USER IF EXISTS cspace;\r
DROP USER IF EXISTS jboss;\r
+DROP USER IF EXISTS reader;\r
\r
CREATE ROLE @DB_NUXEO_USER@ WITH PASSWORD '@DB_NUXEO_PASSWORD@' LOGIN;\r
CREATE ROLE @DB_CSPACE_USER@ WITH PASSWORD '@DB_CSPACE_PASSWORD@' LOGIN;\r