diff --git a/source/java/org/alfresco/repo/model/Repository.java b/source/java/org/alfresco/repo/model/Repository.java index d295f48328..16a9232b24 100644 --- a/source/java/org/alfresco/repo/model/Repository.java +++ b/source/java/org/alfresco/repo/model/Repository.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -28,9 +28,10 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.tenant.TenantAdminService; import org.alfresco.repo.tenant.TenantDeployer; +import org.alfresco.repo.tenant.TenantUtil; +import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; @@ -76,7 +77,8 @@ public class Repository implements ApplicationContextAware, ApplicationListener, private StoreRef companyHomeStore; private String companyHomePath; private Map companyHomeRefs; - private NodeRef rootRef; + + private Map rootRefs; /** @@ -199,7 +201,12 @@ public class Repository implements ApplicationContextAware, ApplicationListener, if (companyHomeRefs == null) { - companyHomeRefs = new ConcurrentHashMap(4); + companyHomeRefs = new ConcurrentHashMap(4); + } + + if (rootRefs == null) + { + rootRefs = new ConcurrentHashMap(4); } getCompanyHome(); @@ -213,9 +220,18 @@ public class Repository implements ApplicationContextAware, ApplicationListener, */ public NodeRef getRootHome() { + String tenantDomain = tenantAdminService.getCurrentUserDomain(); + NodeRef rootRef = rootRefs.get(tenantDomain); if (rootRef == null) { - rootRef = nodeService.getRootNode(companyHomeStore); + rootRef = TenantUtil.runAsSystemTenant(new TenantRunAsWork() + { + public NodeRef doWork() throws Exception + { + return nodeService.getRootNode(companyHomeStore); + } + }, tenantDomain); + rootRefs.put(tenantDomain, rootRef); } return rootRef; } @@ -231,8 +247,8 @@ public class Repository implements ApplicationContextAware, ApplicationListener, NodeRef companyHomeRef = companyHomeRefs.get(tenantDomain); if (companyHomeRef == null) { - companyHomeRef = AuthenticationUtil.runAs(new RunAsWork() - { + companyHomeRef = TenantUtil.runAsSystemTenant(new TenantRunAsWork() + { public NodeRef doWork() throws Exception { return retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback() @@ -243,13 +259,13 @@ public class Repository implements ApplicationContextAware, ApplicationListener, if (refs.size() != 1) { throw new IllegalStateException("Invalid company home path: " + companyHomePath + " - found: " + refs.size()); - } - return refs.get(0); } - }, true); - } - }, AuthenticationUtil.getSystemUserName()); - companyHomeRefs.put(tenantDomain, companyHomeRef); + return refs.get(0); + } + }, true); + } + }, tenantDomain); + companyHomeRefs.put(tenantDomain, companyHomeRef); } return companyHomeRef; } diff --git a/source/java/org/alfresco/repo/tenant/MultiTDemoTest.java b/source/java/org/alfresco/repo/tenant/MultiTDemoTest.java index b14524f84a..42b9f9f36a 100644 --- a/source/java/org/alfresco/repo/tenant/MultiTDemoTest.java +++ b/source/java/org/alfresco/repo/tenant/MultiTDemoTest.java @@ -1280,6 +1280,41 @@ public class MultiTDemoTest extends TestCase }, tenantAdminName); } + public void test_ALF_14354() + { + final String tenantDomain1 = TEST_RUN+".one.alf14354"; + final String tenantDomain2 = TEST_RUN+".two.alf14354"; + + createTenant(tenantDomain1); + createTenant(tenantDomain2); + + String tenantAdminName = tenantService.getDomainUser(AuthenticationUtil.getAdminUserName(), tenantDomain1); + AuthenticationUtil.runAs(new RunAsWork() + { + public Object doWork() throws Exception + { + NodeRef rootNodeRef = repositoryHelper.getRootHome(); + + assertTrue(nodeService.exists(rootNodeRef)); + + return null; + } + }, tenantAdminName); + + tenantAdminName = tenantService.getDomainUser(AuthenticationUtil.getAdminUserName(), tenantDomain2); + AuthenticationUtil.runAs(new RunAsWork() + { + public Object doWork() throws Exception + { + NodeRef rootNodeRef = repositoryHelper.getRootHome(); + + assertTrue(nodeService.exists(rootNodeRef)); + + return null; + } + }, tenantAdminName); + } + private void createGroup(String shortName, String parentShortName) { // create new Group using authority Service