From 9d48f5c5e015f8171d1b5c37f56a0d8e63306901 Mon Sep 17 00:00:00 2001 From: remillet Date: Wed, 4 May 2016 19:24:25 -0700 Subject: [PATCH] CSPACE-6949: Adding code that will create a uniqueness constraint on the shortidentifier column of all authorities and vocabularies. --- .../common/context/ServiceBindingUtils.java | 1 + .../services/common/init/AddIndices.java | 44 ++++++++++++++++++- .../config/src/main/resources/service.xsd | 1 + 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/services/common/src/main/java/org/collectionspace/services/common/context/ServiceBindingUtils.java b/services/common/src/main/java/org/collectionspace/services/common/context/ServiceBindingUtils.java index 69c134c83..84b8f2cc5 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/context/ServiceBindingUtils.java +++ b/services/common/src/main/java/org/collectionspace/services/common/context/ServiceBindingUtils.java @@ -36,6 +36,7 @@ public class ServiceBindingUtils { public static final String SERVICE_TYPE_AUTHORITY = "authority"; public static final String SERVICE_TYPE_UTILITY = "utility"; public static final String SERVICE_TYPE_SECURITY = "security"; + public static final String SERVICE_COMMONPART_ID = "1"; private static final String TENANT_EXTENSION_PATTERN = "(.*)"+ServiceContext.TENANT_SUFFIX+"[\\d]+$"; private static final String TENANT_REPLACEMENT_PATTERN = "$1"; diff --git a/services/common/src/main/java/org/collectionspace/services/common/init/AddIndices.java b/services/common/src/main/java/org/collectionspace/services/common/init/AddIndices.java index 2f18d305b..f4c26f6ce 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/init/AddIndices.java +++ b/services/common/src/main/java/org/collectionspace/services/common/init/AddIndices.java @@ -26,12 +26,13 @@ import java.util.List; import javax.sql.DataSource; import org.collectionspace.services.common.api.Tools; +import org.collectionspace.services.common.context.ServiceBindingUtils; import org.collectionspace.services.common.storage.DatabaseProductType; import org.collectionspace.services.common.storage.JDBCTools; import org.collectionspace.services.config.service.InitHandler.Params.Field; import org.collectionspace.services.config.service.InitHandler.Params.Property; +import org.collectionspace.services.config.service.ObjectPartType; import org.collectionspace.services.config.service.ServiceBindingType; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -114,6 +115,47 @@ public class AddIndices extends InitHandler implements IInitHandler { rows = addOneIndex(dataSourceName, repositoryName, cspaceInstanceId, tableName, fieldName); } } + // + // Add a uniqueness constraint on the short ID field of authority and authority item tables + // + if (sbt != null && sbt.isRequiresUniqueShortId()) { + ensureShortIdConstraintOnAuthority(dataSourceName, + repositoryName, + cspaceInstanceId, + sbt); + } + } + + /** + * + * Add a DB level uniqueness constraint on the short ID column of this service's common part table. + * + * @param dataSourceName + * @param repositoryName + * @param cspaceInstanceId + * @param sbt + */ + private void ensureShortIdConstraintOnAuthority(String dataSourceName, + String repositoryName, + String cspaceInstanceId, + ServiceBindingType sbt) { + +// #TEST: +// SELECT constraint_name FROM information_schema.constraint_column_usage WHERE table_name = 'persons_common' AND constraint_name = 'persons_shortid_unique'; +// +// #IF: emptyResult +// ALTER TABLE persons_common add CONSTRAINT persons_shortid_unique UNIQUE (shortidentifier); + + String tableName = null; + + List objectPartTypes = sbt.getObject().getPart(); + for (ObjectPartType objectPartType : objectPartTypes) { + if (objectPartType.getId().equalsIgnoreCase(ServiceBindingUtils.SERVICE_COMMONPART_ID) == true) { + tableName = objectPartType.getLabel(); + } + } + System.out.println(String.format("Added uniqueness constraint on short ID of repo:%s%s service:%s tablename:%s", + repositoryName, cspaceInstanceId, sbt.getName(), tableName)); } private int addOneIndex(String dataSourceName, diff --git a/services/config/src/main/resources/service.xsd b/services/config/src/main/resources/service.xsd index a42c00fbe..158c1bb3f 100644 --- a/services/config/src/main/resources/service.xsd +++ b/services/config/src/main/resources/service.xsd @@ -61,6 +61,7 @@ +