From: Sanjay Dalal Date: Thu, 29 Oct 2009 06:01:22 +0000 (+0000) Subject: CSPACE-375 workspaces are "created" if not found. RepositoryClient.getWorkspaceId... X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=e678e0453ca305b50acfea0d7cb432c2b9c0079e;p=tmp%2Fjakarta-migration.git CSPACE-375 workspaces are "created" if not found. RepositoryClient.getWorkspaceId is not yet tested or used. test: created workspaces after reinitializing service layer (drop databases, tables, etc.) tested with existing workspaces too. used mvn test at service level. M common/src/main/java/org/collectionspace/services/common/repository/RepositoryClient.java M common/src/main/java/org/collectionspace/services/common/ServiceMain.java M common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReader.java M common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClient.java M common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnector.java M common/src/main/java/org/collectionspace/services/nuxeo/client/rest/RepositoryRESTClient.java --- diff --git a/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java b/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java index 2d8e39eb2..e079530a6 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java +++ b/services/common/src/main/java/org/collectionspace/services/common/ServiceMain.java @@ -97,16 +97,6 @@ public class ServiceMain { getTenantBindingConfigReader().retrieveAllWorkspaceIds(); } - /** - * retrieveWorkspaceIds for given tenant domain. - * @param tenantDomain - * @return Hashtable key=workspace name, value=workspace id - * @throws Exception - */ - public Hashtable retrieveWorkspaceIds(String tenantDomain) throws Exception { - return nuxeoConnector.retrieveWorkspaceIds(tenantDomain); - } - /** * @return the nuxeoConnector */ diff --git a/services/common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReader.java b/services/common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReader.java index d6186a873..cd4e052b1 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReader.java +++ b/services/common/src/main/java/org/collectionspace/services/common/config/TenantBindingConfigReader.java @@ -25,11 +25,11 @@ package org.collectionspace.services.common.config; import java.io.File; import java.util.Hashtable; -import java.util.List; import org.collectionspace.services.common.ClientType; -import org.collectionspace.services.common.RepositoryWorkspaceType; -import org.collectionspace.services.common.ServiceConfig; +import org.collectionspace.services.common.RepositoryClientConfigType; import org.collectionspace.services.common.ServiceMain; +import org.collectionspace.services.common.repository.RepositoryClient; +import org.collectionspace.services.common.repository.RepositoryClientFactory; import org.collectionspace.services.common.service.ServiceBindingType; import org.collectionspace.services.common.tenant.TenantBindingType; import org.collectionspace.services.common.tenant.TenantBindingConfig; @@ -110,25 +110,43 @@ public class TenantBindingConfigReader } } + /** + * retrieveWorkspaceIds retrieves workspace ids for services used by + * the given tenant + * @param tenantBinding + * @throws Exception + */ public void retrieveWorkspaceIds(TenantBindingType tenantBinding) throws Exception { - String tenantDomain = tenantBinding.getRepositoryDomain(); Hashtable workspaceIds = new Hashtable(); ServiceMain svcMain = ServiceMain.getInstance(); + RepositoryClientConfigType rclientConfig = svcMain.getServicesConfigReader().getConfiguration().getRepositoryClient(); ClientType clientType = svcMain.getClientType(); - if(clientType.equals(ClientType.JAVA)){ - workspaceIds = svcMain.retrieveWorkspaceIds(tenantDomain); + if(clientType.equals(ClientType.JAVA) && + rclientConfig.getName().equalsIgnoreCase("nuxeo-java")){ + //FIXME only one repository client is recognized + workspaceIds = svcMain.getNuxeoConnector().retrieveWorkspaceIds( + tenantBinding.getRepositoryDomain()); } + //verify if workspace exists for each service in the tenant binding for(ServiceBindingType serviceBinding : tenantBinding.getServiceBindings()){ String serviceName = serviceBinding.getName(); + RepositoryClient repositoryClient = getRepositoryClient( + serviceBinding.getRepositoryClient()); String workspaceId = null; //workspace name is service name by convention String workspace = serviceBinding.getName().toLowerCase(); if(clientType.equals(ClientType.JAVA)){ workspaceId = workspaceIds.get(workspace); if(workspaceId == null){ - logger.warn("failed to retrieve workspace id for " + workspace); - //FIXME: should we throw an exception here? - continue; + logger.warn("failed to retrieve workspace id for " + workspace + + " trying to create a new workspace..."); + workspaceId = repositoryClient.createWorkspace( + tenantBinding.getRepositoryDomain(), + serviceBinding.getName()); + if(workspaceId == null){ + logger.warn("failed to create workspace for " + workspace); + continue; + } } }else{ workspaceId = serviceBinding.getRepositoryWorkspaceId(); @@ -190,4 +208,8 @@ public class TenantBindingConfigReader String tenantId, String serviceName) { return tenantId + "." + serviceName.toLowerCase(); } + + private RepositoryClient getRepositoryClient(String clientName) { + return RepositoryClientFactory.getInstance().getClient(clientName); + } } diff --git a/services/common/src/main/java/org/collectionspace/services/common/repository/RepositoryClient.java b/services/common/src/main/java/org/collectionspace/services/common/repository/RepositoryClient.java index d2bfa6bdb..f186d2743 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/repository/RepositoryClient.java +++ b/services/common/src/main/java/org/collectionspace/services/common/repository/RepositoryClient.java @@ -25,7 +25,6 @@ package org.collectionspace.services.common.repository; import org.collectionspace.services.common.context.ServiceContext; - /** * RepositoryClient is a generic Document Repository client * @@ -86,4 +85,22 @@ public interface RepositoryClient { * @throws DocumentException */ void update(ServiceContext ctx, String id, DocumentHandler handler) throws BadRequestException, DocumentNotFoundException, DocumentException; + + /** + * createWorkspace creates a workspace in default repository under given domain + * @param tenantDomain domain representing tenant + * @param workspaceName name of the workspace + * @return id of newly created workspace + * @throws java.lang.Exception + */ + public String createWorkspace(String tenantDomain, String workspaceName) throws Exception; + + /** + * getWorkspaceId gets an id of given workspace in default repository under given domain + * @param tenantDomain domain representing tenant + * @param workspaceName name of the workspace + * @return id of the workspace + * @throws java.lang.Exception + */ + public String getWorkspaceId(String tenantDomain, String workspaceName) throws Exception; } diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnector.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnector.java index 604d64768..0de8fedf1 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnector.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/NuxeoConnector.java @@ -209,7 +209,7 @@ public class NuxeoConnector { /** * retrieveWorkspaceIds retrieves all workspace ids from default repository * @param tenantDomain domain representing tenant - * @return + * @return * @throws java.lang.Exception */ public Hashtable retrieveWorkspaceIds(String tenantDomain) throws Exception { @@ -225,7 +225,7 @@ public class NuxeoConnector { String domainPath = "/" + tenantDomain; if(!domain.getPathAsString().equalsIgnoreCase(domainPath)){ continue; - } +} if(logger.isDebugEnabled()){ logger.debug("domain=" + domain.toString()); } diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClient.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClient.java index 152e946d4..097fb241e 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClient.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClient.java @@ -17,6 +17,7 @@ */ package org.collectionspace.services.nuxeo.client.java; +import java.util.Hashtable; import org.collectionspace.services.common.repository.RepositoryClient; import org.collectionspace.services.common.context.ServiceContext; import org.collectionspace.services.common.repository.BadRequestException; @@ -189,8 +190,8 @@ public class RepositoryJavaClient implements RepositoryClient { String nuxeoWspaceId = ctx.getRepositoryWorkspaceId(); if(nuxeoWspaceId == null){ throw new DocumentNotFoundException( - "Unable to find workspace for service " + - ctx.getServiceName() + + "Unable to find workspace for service " + + ctx.getServiceName() + " check if the workspace exists in the Nuxeo repository"); } RepositoryInstance repoSession = null; @@ -323,6 +324,68 @@ public class RepositoryJavaClient implements RepositoryClient { } } + @Override + public String createWorkspace(String tenantDomain, String workspaceName) throws Exception { + RepositoryInstance repoSession = null; + String workspaceId = null; + try{ + repoSession= getRepositorySession(); + DocumentRef docRef = new PathRef( + "/" + tenantDomain + + "/" + "workspaces"); + DocumentModel parent = repoSession.getDocument(docRef); + DocumentModel doc = repoSession.createDocumentModel(parent.getPathAsString(), + workspaceName, "Workspace"); + doc.setPropertyValue("dc:title", workspaceName); + doc.setPropertyValue("dc:description", "A CollectionSpace workspace for " + + workspaceName); + doc = repoSession.createDocument(doc); + workspaceId = doc.getId(); + repoSession.save(); + if(logger.isDebugEnabled()){ + logger.debug("created workspace name=" + workspaceName + + " id=" + workspaceId); + } + }catch(Exception e){ + if(logger.isDebugEnabled()){ + logger.debug("createWorkspace caught exception ", e); + } + throw e; + }finally{ + if(repoSession != null){ + releaseRepositorySession(repoSession); + } + } + return workspaceId; + } + + @Override + public String getWorkspaceId(String tenantDomain, String workspaceName) throws Exception { + String workspaceId = null; + RepositoryInstance repoSession = null; + try{ + repoSession = getRepositorySession(); + DocumentRef docRef = new PathRef( + "/" + tenantDomain + + "/" + "workspaces" + + "/" + workspaceName); + DocumentModel workspace = repoSession.getDocument(docRef); + workspaceId = workspace.getId(); + }catch(DocumentException de){ + throw de; + }catch(Exception e){ + if(logger.isDebugEnabled()){ + logger.debug("Caught exception ", e); + } + throw new DocumentException(e); + }finally{ + if(repoSession != null){ + releaseRepositorySession(repoSession); + } + } + return workspaceId; + } + private RepositoryInstance getRepositorySession() throws Exception { // FIXME: is it possible to reuse repository session? // Authentication failures happen while trying to reuse the session diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/rest/RepositoryRESTClient.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/rest/RepositoryRESTClient.java index 4ebe43e60..f0c44db00 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/rest/RepositoryRESTClient.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/rest/RepositoryRESTClient.java @@ -307,6 +307,16 @@ public class RepositoryRESTClient implements RepositoryClient { } } + @Override + public String createWorkspace(String tenantDomain, String workspaceName) throws Exception { + throw new UnsupportedOperationException(); + } + + @Override + public String getWorkspaceId(String tenantDomain, String workspaceName) throws Exception { + throw new UnsupportedOperationException(); + } + /** * buildRequest build HTTP request given parameters * @param method