mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-07 18:25:23 +00:00
35394: ALF-13394: Allow administrators to gain SiteManager role 35407: ALF-12740: Updated XHR request processing for IE to ensure no caching (had previously thought IE9 was not affected but apparently it is) 35408: Fix for ALF-13286 who_can_create_site mention and bad error message - explicitly declare public interface on SiteService 35412: Merged DEV to V4.0-BUG-FIX 35153: ALF-1834: Renaming folders breaks web form content Original solution by Ivan has been reimplemented as per Derek's requirements and against 4.0. [DH: Did some minor legibility changes and fixed LF for AVMDiskDriver] 35414: Incremented version.revision for 4.0.2 35417: Merged BRANCHES/DEV/THOR0 to BRANCHES/DEV/V4.0-BUG-FIX: (THOR-6 / ALF-13755) 29356: THOR-6: MT is configured (but not enabled) by default - will be auto-enabled when first tenant is created 29455: THOR-6: build test/fix 29471: THOR-6: build test/fix 35423: Merged BRANCHES/DEV/THOR0 to BRANCHES/DEV/V4.0-BUG-FIX: (THOR-4 / ALF-13756) 29500: THOR-4: Replace Tenant attributes with Tenant table (alf_tenant) 29501: THOR-4: Replace Tenant attributes with Tenant table (alf_tenant) 29503: THOR-4: Replace Tenant attributes with Tenant table (alf_tenant) TODO: ALF-13757 - patch to migrate Tenant attributes to Tenant table (for existing customers) 35431: Merged V3.4-BUG-FIX to V4.0-BUG-FIX 35367: ALF-13382: WorkflowService Returning Incorrect Values When Using Native jBPM API to set Local Task Variables - Fix by Alex Bykov 35400: Fix for ALF-13557 - Share forms selectmany.ftl template does not work with Share search query parser; should do a logical OR or AND but does a concatenation 35416: Incremented version.revision for 3.4.10 35429: Merged V4.0-BUG-FIX to V3.4-BUG-FIX (partial) 35328: ALF-13409: Avoid concurrency issues in unit test tear downs by deleting users before sites. User deletion deletes invitations synchronously. Site deletion deletes invitations concurrently to avoid UI timeouts. The potential to access invitations that are being concurrently deleted still exists, but always did! 35430: ALF-13409: Avoid concurrency issues in unit test tear downs by deleting users before sites - another instance. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@35434 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
163 lines
5.5 KiB
Java
163 lines
5.5 KiB
Java
/*
|
|
* Copyright (C) 2005-2011 Alfresco Software Limited.
|
|
*
|
|
* This file is part of Alfresco
|
|
*
|
|
* Alfresco is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alfresco is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package org.alfresco.repo.content;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
import org.alfresco.repo.content.filestore.FileContentStore;
|
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
import org.alfresco.repo.tenant.Tenant;
|
|
import org.alfresco.repo.tenant.TenantDeployer;
|
|
import org.alfresco.repo.tenant.TenantService;
|
|
import org.springframework.beans.BeansException;
|
|
import org.springframework.context.ApplicationContext;
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
|
/**
|
|
* Content Store that supports tenant routing, if multi-tenancy is enabled.
|
|
*
|
|
* Note: Need to initialise before the dictionary service, in the case that models are dynamically loaded for the tenant.
|
|
*/
|
|
public class TenantRoutingFileContentStore extends AbstractRoutingContentStore implements TenantDeployer, ApplicationContextAware
|
|
{
|
|
// cache of tenant file stores
|
|
Map<String, FileContentStore> tenantFileStores = new ConcurrentHashMap<String, FileContentStore>();
|
|
|
|
private String defaultRootDirectory;
|
|
private TenantService tenantService;
|
|
private ApplicationContext applicationContext;
|
|
|
|
|
|
public void setDefaultRootDir(String defaultRootDirectory)
|
|
{
|
|
this.defaultRootDirectory = defaultRootDirectory;
|
|
}
|
|
|
|
public void setTenantService(TenantService tenantService)
|
|
{
|
|
this.tenantService = tenantService;
|
|
}
|
|
|
|
/*
|
|
* (non-Javadoc)
|
|
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.
|
|
* ApplicationContext)
|
|
*/
|
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
|
|
{
|
|
this.applicationContext = applicationContext;
|
|
}
|
|
|
|
@Override
|
|
protected ContentStore selectWriteStore(ContentContext ctx)
|
|
{
|
|
return getTenantFileStore(tenantService.getCurrentUserDomain());
|
|
}
|
|
|
|
@Override
|
|
public List<ContentStore> getAllStores()
|
|
{
|
|
if (tenantService.isEnabled())
|
|
{
|
|
String currentUser = AuthenticationUtil.getFullyAuthenticatedUser();
|
|
if ((currentUser == null) || (tenantService.getBaseNameUser(currentUser).equals(AuthenticationUtil.getSystemUserName())))
|
|
{
|
|
// return enabled stores across all tenants, if running as system/null user, for example, ContentStoreCleaner scheduled job
|
|
List<ContentStore> allEnabledStores = new ArrayList<ContentStore>();
|
|
for (String tenantDomain : tenantFileStores.keySet())
|
|
{
|
|
allEnabledStores.add(tenantFileStores.get(tenantDomain)); // note: cache should only contain enabled stores
|
|
}
|
|
|
|
if (allEnabledStores.size() > 0)
|
|
{
|
|
return allEnabledStores;
|
|
}
|
|
|
|
// drop through to ensure default content store has been init'ed
|
|
}
|
|
}
|
|
return Arrays.asList(getTenantFileStore(tenantService.getCurrentUserDomain()));
|
|
}
|
|
|
|
private ContentStore getTenantFileStore(String tenantDomain)
|
|
{
|
|
ContentStore cs = tenantFileStores.get(tenantDomain);
|
|
if (cs == null)
|
|
{
|
|
init();
|
|
cs = tenantFileStores.get(tenantDomain);
|
|
}
|
|
return cs;
|
|
}
|
|
|
|
private void putTenantFileStore(String tenantDomain, FileContentStore fileStore)
|
|
{
|
|
tenantFileStores.put(tenantDomain, fileStore);
|
|
}
|
|
|
|
private void removeTenantFileStore(String tenantDomain)
|
|
{
|
|
tenantFileStores.remove(tenantDomain);
|
|
}
|
|
|
|
public void init()
|
|
{
|
|
String tenantDomain = TenantService.DEFAULT_DOMAIN;
|
|
String rootDir = defaultRootDirectory;
|
|
|
|
Tenant tenant = tenantService.getTenant(tenantService.getCurrentUserDomain());
|
|
if (tenant != null)
|
|
{
|
|
if (tenant.getRootContentStoreDir() != null)
|
|
{
|
|
rootDir = tenant.getRootContentStoreDir();
|
|
}
|
|
tenantDomain = tenant.getTenantDomain();
|
|
}
|
|
|
|
putTenantFileStore(tenantDomain, new FileContentStore(this.applicationContext, new File(rootDir)));
|
|
}
|
|
|
|
public void destroy()
|
|
{
|
|
removeTenantFileStore(tenantService.getCurrentUserDomain());
|
|
}
|
|
|
|
public void onEnableTenant()
|
|
{
|
|
init();
|
|
}
|
|
|
|
public void onDisableTenant()
|
|
{
|
|
destroy();
|
|
}
|
|
|
|
public String getDefaultRootDir()
|
|
{
|
|
return this.defaultRootDirectory;
|
|
}
|
|
}
|