From 26b4dfc846d7b116c46eddeb539795e0695c1ab8 Mon Sep 17 00:00:00 2001 From: Aron Roberts Date: Fri, 19 Jul 2013 15:54:04 -0700 Subject: [PATCH] CSPACE-5950: Allow importing of documents into repository domains other than the default domain. --- .../test-data/xmlreplay/imports/imports.xml | 35 +++++++++- .../test-data/xmlreplay/xml-replay-master.xml | 4 +- .../tenants/tenant-bindings-proto.xml | 9 +++ .../services/imports/ImportsResource.java | 68 +++++++++++++------ .../services/imports/nuxeo/ImportCommand.java | 48 ++++++------- 5 files changed, 118 insertions(+), 46 deletions(-) diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/imports/imports.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/imports/imports.xml index 81187b2c8..d242b11f6 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/imports/imports.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/imports/imports.xml @@ -3,6 +3,7 @@ YWRtaW5AY29yZS5jb2xsZWN0aW9uc3BhY2Uub3JnOkFkbWluaXN0cmF0b3I= + YWRtaW5AbGlmZXNjaS5jb2xsZWN0aW9uc3BhY2Uub3JnOkFkbWluaXN0cmF0b3I= @@ -25,7 +26,7 @@ DELETE /cspace-services/objectexit/${importObjectExit.got("//csid")} - + - + 200 POST /cspace-services/imports @@ -360,6 +361,34 @@ + + + + + + 200 + POST + /cspace-services/imports + imports/import-objectexit.xml + + + imports/res/import-objectexit.res.xml + + + + 200 + DELETE + /cspace-services/objectexit/${importObjectExitSeparateRepo.got("//csid")} + + + + + diff --git a/services/imports/service/src/main/java/org/collectionspace/services/imports/ImportsResource.java b/services/imports/service/src/main/java/org/collectionspace/services/imports/ImportsResource.java index 759e25e9d..c167de8d5 100644 --- a/services/imports/service/src/main/java/org/collectionspace/services/imports/ImportsResource.java +++ b/services/imports/service/src/main/java/org/collectionspace/services/imports/ImportsResource.java @@ -84,35 +84,63 @@ public class ImportsResource extends AbstractCollectionSpaceResourceImpl repositoryDomainList = tenantBinding - .getRepositoryDomain(); + List repositoryDomainList = getRepositoryDomainList(); if (repositoryDomainList.size() == 1) { String domainName = repositoryDomainList.get(0).getStorageName() .trim(); - result = "/" + domainName + "/" + NuxeoUtils.Workspaces; + result = NUXEO_SPACES_PATH_DELIMITER + domainName + + NUXEO_SPACES_PATH_DELIMITER + NuxeoUtils.Workspaces; } else { + // Currently, the Imports service places all documents + // imported via a single request, into the same repository + // and repository domain. It doesn't currently have the + // ability to assign individual documents, depending on + // their associated service, to different repositories + // and/or repository domains. If a tenant is configured with + // more than one repository domain, the import will fail here. throw new ConfigurationException( "Tenant bindings contains 0 or more than 1 repository domains."); } - return result; } + + private static String getRepoName() throws ConfigurationException { + String repoName = null; + List repositoryDomainList = getRepositoryDomainList(); + if (repositoryDomainList.size() == 1) { + repoName = repositoryDomainList.get(0).getRepositoryName().trim(); + } else { + // See relevant comments in getWorkspacesPath() + throw new ConfigurationException( + "Tenant bindings contains 0 or more than 1 repository domains."); + } + return repoName; + } + + private static List getRepositoryDomainList() throws ConfigurationException { + TenantBindingConfigReaderImpl tReader = ServiceMain.getInstance() + .getTenantBindingConfigReader(); + TenantBindingType tenantBinding = tReader.getTenantBinding(AuthN.get() + .getCurrentTenantId()); + List repositoryDomainList = tenantBinding + .getRepositoryDomain(); + return repositoryDomainList; + } + @Override public String getServiceName() { @@ -162,7 +190,7 @@ public class ImportsResource extends AbstractCollectionSpaceResourceImpl queryParams = ui.getQueryParameters(); if (queryParams != null) { @@ -228,11 +256,12 @@ public class ImportsResource extends AbstractCollectionSpaceResourceImplSUCCESS" + report + ""; } catch (Exception e) { @@ -258,11 +287,12 @@ public class ImportsResource extends AbstractCollectionSpaceResourceImplSUCCESS" + report + ""; } catch (Exception e) { diff --git a/services/imports/service/src/main/java/org/collectionspace/services/imports/nuxeo/ImportCommand.java b/services/imports/service/src/main/java/org/collectionspace/services/imports/nuxeo/ImportCommand.java index e6aeb2fa5..53d39f0f9 100644 --- a/services/imports/service/src/main/java/org/collectionspace/services/imports/nuxeo/ImportCommand.java +++ b/services/imports/service/src/main/java/org/collectionspace/services/imports/nuxeo/ImportCommand.java @@ -5,6 +5,7 @@ import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.TreeSet; +import org.collectionspace.services.common.api.Tools; import org.collectionspace.services.nuxeo.client.java.NuxeoClientEmbedded; import org.collectionspace.services.nuxeo.client.java.NuxeoConnectorEmbedded; import org.nuxeo.ecm.core.api.DocumentModel; @@ -22,45 +23,46 @@ import org.slf4j.LoggerFactory; // based loosely on package org.nuxeo.ecm.shell.commands.io.ImportCommand; public class ImportCommand { - + private final Logger logger = LoggerFactory.getLogger(ImportCommand.class); - public String run(String src, String dest, int timeOut) throws Exception { + public String run(String src, String repoName, String workspacesPath, int timeOut) throws Exception { File file = new File(src); ///cspace way of configuring client and auth: NuxeoClientEmbedded client = NuxeoConnectorEmbedded.getInstance().getClient(); - RepositoryInstance repoSession = client.openRepository(timeOut); + RepositoryInstance repoSession = null; try { + repoSession = client.openRepository(repoName, timeOut); if (logger.isDebugEnabled()) { String msg = String.format("Start of import is Local time: %tT", Calendar.getInstance()); logger.debug(msg); } - return importTree(repoSession, file, dest); + return importTree(repoSession, file, workspacesPath); } catch (Exception e) { throw e; } finally { if (logger.isDebugEnabled()) { - String msg = String.format("End of import is Local time: %tT", Calendar.getInstance()); - logger.debug(msg); + String msg = String.format("End of import is Local time: %tT", Calendar.getInstance()); + logger.debug(msg); } client.releaseRepository(repoSession); } } String importTree(RepositoryInstance repoSession, File file, String toPath) throws Exception { - Exception failed = null; + Exception failed = null; DocumentReader reader = null; DocumentWriter writer = null; DocumentModel docModel = null; DocumentRef keyDocRef, valueDocRef; String docType; StringBuffer dump = new StringBuffer(); - Map recordsImportedForDocType = new HashMap(); + Map recordsImportedForDocType = new HashMap(); Integer numRecordsImportedForDocType = new Integer(0); int totalRecordsImported = 0; try { if (logger.isInfoEnabled()) { - logger.info("importTree reading file: "+file+(file!=null ? " exists? "+file.exists() : " file param is null")); + logger.info("importTree reading file: " + file + (file != null ? " exists? " + file.exists() : " file param is null")); } reader = new LoggedXMLDirectoryReader(file); //our overload of XMLDirectoryReader. writer = new DocumentModelWriter(repoSession, toPath, 10); @@ -69,9 +71,9 @@ public class ImportCommand { pipe.setReader(reader); pipe.setWriter(writer); DocumentTranslationMap dtm = pipe.run(); - Map documentRefs = dtm.getDocRefMap(); // FIXME: Should be checking for null here! + Map documentRefs = dtm.getDocRefMap(); // FIXME: Should be checking for null here! dump.append(""); - for (Map.Entry entry: documentRefs.entrySet()) { + for (Map.Entry entry : documentRefs.entrySet()) { keyDocRef = (DocumentRef) entry.getKey(); valueDocRef = (DocumentRef) entry.getValue(); if (keyDocRef == null || valueDocRef == null) { @@ -80,8 +82,8 @@ public class ImportCommand { dump.append(""); docModel = repoSession.getDocument(valueDocRef); docType = docModel.getDocumentType().getName(); - dump.append(""+docType+""); - dump.append(""+keyDocRef.toString()+""); + dump.append("" + docType + ""); + dump.append("" + keyDocRef.toString() + ""); dump.append(""); if (recordsImportedForDocType.containsKey(docType)) { numRecordsImportedForDocType = (Integer) recordsImportedForDocType.get(docType); @@ -94,32 +96,32 @@ public class ImportCommand { } dump.append(""); } catch (Exception e) { - failed = e; + failed = e; throw failed; } finally { - String status = failed == null ? "Success" : "Failed"; - dump.append("" + status + ""); - dump.append(""+totalRecordsImported+""); + String status = failed == null ? "Success" : "Failed"; + dump.append("" + status + ""); + dump.append("" + totalRecordsImported + ""); dump.append(""); TreeSet keys = new TreeSet(recordsImportedForDocType.keySet()); for (String key : keys) { dump.append(""); - dump.append(""+key+""); - dump.append(""+recordsImportedForDocType.get(key).intValue()+""); + dump.append("" + key + ""); + dump.append("" + recordsImportedForDocType.get(key).intValue() + ""); dump.append(""); } dump.append(""); if (reader != null) { - dump.append(""+(((LoggedXMLDirectoryReader)reader).report())+""); + dump.append("" + (((LoggedXMLDirectoryReader) reader).report()) + ""); reader.close(); } if (writer != null) { writer.close(); } - + if (failed != null) { - String msg = "The Import service encountered an exception: " + failed.getLocalizedMessage(); - logger.error(msg, failed); + String msg = "The Import service encountered an exception: " + failed.getLocalizedMessage(); + logger.error(msg, failed); } } return dump.toString(); -- 2.47.3