mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merge WCM_SERVICES into HEAD 11697, 11698, 11702, 11751, 11801, 11924, 12023, 12073
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12076 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -24,24 +24,29 @@
|
||||
*/
|
||||
package org.alfresco.wcm.sandbox;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.config.JNDIConstants;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.mbeans.VirtServerRegistry;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.domain.PropertyValue;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
|
||||
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.DNSNameMangler;
|
||||
import org.alfresco.util.GUID;
|
||||
import org.alfresco.util.ParameterCheck;
|
||||
import org.alfresco.wcm.util.WCMUtil;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@@ -57,9 +62,11 @@ public final class SandboxFactory extends WCMUtil
|
||||
private static Log logger = LogFactory.getLog(SandboxFactory.class);
|
||||
|
||||
/** Services */
|
||||
private NodeService nodeService;
|
||||
private PermissionService permissionService;
|
||||
private AVMService avmService;
|
||||
private NodeService nodeService;
|
||||
private AVMLockingService avmLockingService;
|
||||
private VirtServerRegistry virtServerRegistry;
|
||||
|
||||
public void setNodeService(NodeService nodeService)
|
||||
{
|
||||
@@ -76,6 +83,17 @@ public final class SandboxFactory extends WCMUtil
|
||||
this.avmService = avmService;
|
||||
}
|
||||
|
||||
public void setAvmLockingService(AVMLockingService avmLockingService)
|
||||
{
|
||||
this.avmLockingService = avmLockingService;
|
||||
}
|
||||
|
||||
public void setVirtServerRegistry(VirtServerRegistry virtServerRegistry)
|
||||
{
|
||||
this.virtServerRegistry = virtServerRegistry;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
*/
|
||||
@@ -109,7 +127,7 @@ public final class SandboxFactory extends WCMUtil
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Created staging sandbox store: " + stagingStoreName);
|
||||
logger.debug("Created staging sandbox: " + stagingStoreName);
|
||||
}
|
||||
|
||||
// we can either branch from an existing staging store or create a new structure
|
||||
@@ -200,27 +218,100 @@ public final class SandboxFactory extends WCMUtil
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
|
||||
return new SandboxInfo( new String[] { stagingStoreName, previewStoreName } );
|
||||
return getSandbox(stagingStoreName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sandbox info for given sandbox store id
|
||||
*
|
||||
* @param sandboxId
|
||||
* @return SandboxInfo returns sandbox info or null if sandbox does not exist or is not visible
|
||||
*/
|
||||
public SandboxInfo getSandbox(String sandboxId)
|
||||
{
|
||||
AVMStoreDescriptor storeDesc = avmService.getStore(sandboxId);
|
||||
if (storeDesc == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
String wpStoreId = WCMUtil.getWebProjectStoreId(sandboxId);
|
||||
|
||||
String[] storeNames = null;
|
||||
|
||||
// Check sandbox type
|
||||
Map<QName, PropertyValue> props = avmService.getStoreProperties(sandboxId);
|
||||
QName sandboxType = null;
|
||||
|
||||
// derive name for now
|
||||
String name = null;
|
||||
|
||||
if (props.containsKey(SandboxConstants.PROP_SANDBOX_STAGING_MAIN))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_STAGING_MAIN;
|
||||
name = sandboxId;
|
||||
storeNames = new String[] {sandboxId, WCMUtil.getCorrespondingPreviewStoreName(sandboxId)};
|
||||
}
|
||||
else if ( props.containsKey( SandboxConstants.PROP_SANDBOX_STAGING_PREVIEW))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_STAGING_PREVIEW;
|
||||
storeNames = new String[] {WCMUtil.getCorrespondingMainStoreName(sandboxId), sandboxId};
|
||||
}
|
||||
else if (props.containsKey(SandboxConstants.PROP_SANDBOX_AUTHOR_MAIN))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_AUTHOR_MAIN;
|
||||
name = WCMUtil.getUserName(sandboxId);
|
||||
storeNames = new String[] {sandboxId, WCMUtil.getCorrespondingPreviewStoreName(sandboxId)};
|
||||
}
|
||||
else if (props.containsKey(SandboxConstants.PROP_SANDBOX_AUTHOR_PREVIEW))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_AUTHOR_PREVIEW;
|
||||
name = WCMUtil.getUserName(sandboxId);
|
||||
storeNames = new String[] {WCMUtil.getCorrespondingMainStoreName(sandboxId), sandboxId};
|
||||
}
|
||||
else if (props.containsKey(SandboxConstants.PROP_SANDBOX_WORKFLOW_MAIN))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_WORKFLOW_MAIN;
|
||||
name = WCMUtil.getWorkflowId(sandboxId);
|
||||
storeNames = new String[] {sandboxId, WCMUtil.getCorrespondingPreviewStoreName(sandboxId)};
|
||||
}
|
||||
else if (props.containsKey(SandboxConstants.PROP_SANDBOX_WORKFLOW_PREVIEW))
|
||||
{
|
||||
sandboxType = SandboxConstants.PROP_SANDBOX_WORKFLOW_PREVIEW;
|
||||
name = WCMUtil.getWorkflowId(sandboxId);
|
||||
storeNames = new String[] {WCMUtil.getCorrespondingMainStoreName(sandboxId), sandboxId};
|
||||
}
|
||||
|
||||
if ((storeNames == null) || (storeNames.length == 0))
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Must have at least one store");
|
||||
}
|
||||
|
||||
if ((storeNames.length == 1) && (! sandboxType.equals(SandboxConstants.PROP_SANDBOX_STAGING_MAIN)))
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Main store must be of type: " + SandboxConstants.PROP_SANDBOX_STAGING_MAIN);
|
||||
}
|
||||
|
||||
return new SandboxInfoImpl(wpStoreId, sandboxId, sandboxType, name, storeNames, new Date(storeDesc.getCreateDate()), storeDesc.getCreator());
|
||||
}
|
||||
|
||||
protected void setStagingPermissions(String storeId, NodeRef webProjectNodeRef)
|
||||
protected void setStagingPermissions(String storeId, NodeRef wpNodeRef)
|
||||
{
|
||||
String storeName = WCMUtil.buildStagingStoreName(storeId);
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, WCMUtil.buildStoreRootPath(storeName));
|
||||
|
||||
// Apply sepcific user permissions as set on the web project
|
||||
// All these will be masked out
|
||||
List<ChildAssociationRef> userInfoRefs = nodeService.getChildAssocs(
|
||||
webProjectNodeRef, WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
String storeName = WCMUtil.buildStagingStoreName(storeId);
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, WCMUtil.buildStoreRootPath(storeName));
|
||||
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
{
|
||||
NodeRef userInfoRef = ref.getChildRef();
|
||||
String username = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
String userrole = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
// Apply specific user permissions as set on the web project
|
||||
// All these will be masked out
|
||||
|
||||
permissionService.setPermission(dirRef, username, userrole, true);
|
||||
}
|
||||
Map<String, String> userRoles = WCMUtil.listWebUsers(nodeService, wpNodeRef);
|
||||
|
||||
for (Map.Entry<String, String> userRole : userRoles.entrySet())
|
||||
{
|
||||
String username = userRole.getKey();
|
||||
String userrole = userRole.getValue();
|
||||
|
||||
permissionService.setPermission(dirRef, username, userrole, true);
|
||||
}
|
||||
}
|
||||
|
||||
public void setStagingPermissionMasks(String storeId)
|
||||
@@ -238,7 +329,7 @@ public final class SandboxFactory extends WCMUtil
|
||||
permissionService.setPermission(dirRef, PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
}
|
||||
|
||||
public void updateStagingAreaManagers(String storeId, NodeRef webProjectNodeRef, final List<String> managers)
|
||||
private void updateStagingAreaManagers(String storeId, NodeRef webProjectNodeRef, final List<String> managers)
|
||||
{
|
||||
// The stores have the mask set in updateSandboxManagers
|
||||
String storeName = WCMUtil.buildStagingStoreName(storeId);
|
||||
@@ -256,10 +347,10 @@ public final class SandboxFactory extends WCMUtil
|
||||
}
|
||||
}
|
||||
|
||||
public void addStagingAreaUser(String storeId, String authority, String role)
|
||||
public void addStagingAreaUser(String wpStoreId, String authority, String role)
|
||||
{
|
||||
// The stores have the mask set in updateSandboxManagers
|
||||
String storeName = WCMUtil.buildStagingStoreName(storeId);
|
||||
String storeName = WCMUtil.buildStagingStoreName(wpStoreId);
|
||||
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, WCMUtil.buildStoreRootPath(storeName));
|
||||
permissionService.setPermission(dirRef, authority, role, true);
|
||||
@@ -293,20 +384,23 @@ public final class SandboxFactory extends WCMUtil
|
||||
String userStoreName = WCMUtil.buildUserMainStoreName(storeId, username);
|
||||
String previewStoreName = WCMUtil.buildUserPreviewStoreName(storeId, username);
|
||||
|
||||
if (avmService.getStore(userStoreName) != null)
|
||||
SandboxInfo userSandboxInfo = getSandbox(userStoreName);
|
||||
if (userSandboxInfo != null)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Not creating as store already exists: " + userStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { userStoreName, previewStoreName } );
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Not creating author sandbox as it already exists: " + userStoreName);
|
||||
}
|
||||
return userSandboxInfo;
|
||||
}
|
||||
|
||||
avmService.createStore(userStoreName);
|
||||
String stagingStoreName = WCMUtil.buildStagingStoreName(storeId);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created user sandbox store: " + userStoreName +
|
||||
" above staging store " + stagingStoreName);
|
||||
{
|
||||
logger.debug("Created user sandbox: " + userStoreName + " above staging store " + stagingStoreName);
|
||||
}
|
||||
|
||||
// create a layered directory pointing to 'www' in the staging area
|
||||
avmService.createLayeredDirectory(WCMUtil.buildStoreRootPath(stagingStoreName),
|
||||
@@ -417,7 +511,8 @@ public final class SandboxFactory extends WCMUtil
|
||||
dumpStoreProperties(avmService, userStoreName);
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { userStoreName, previewStoreName } );
|
||||
|
||||
return getSandbox(userStoreName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -533,7 +628,232 @@ public final class SandboxFactory extends WCMUtil
|
||||
dumpStoreProperties(avmService, mainStoreName);
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { mainStoreName, previewStoreName } );
|
||||
|
||||
return getSandbox(mainStoreName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a workflow sandbox for the given user store. This will create a
|
||||
* workflow sandbox layered over the user's main store.
|
||||
*
|
||||
* @param stagingStore The name of the staging store the user sandbox is layered over
|
||||
* @param userStore The name of the user store to create the workflow for
|
||||
* @return The store name of the main store in the workflow sandbox
|
||||
*/
|
||||
// TODO refactor AVMExpiredContentProcessor ...
|
||||
public String createUserWorkflowSandbox(String stagingStore, String userStore)
|
||||
{
|
||||
// create the workflow 'main' store
|
||||
String packageName = "workflow-" + GUID.generate();
|
||||
String workflowStoreName = userStore + STORE_SEPARATOR + packageName;
|
||||
|
||||
this.avmService.createStore(workflowStoreName);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created user workflow sandbox store: " + workflowStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the users store
|
||||
this.avmService.createLayeredDirectory(
|
||||
userStore + ":/" + JNDIConstants.DIR_DEFAULT_WWW,
|
||||
workflowStoreName + ":/", JNDIConstants.DIR_DEFAULT_WWW);
|
||||
|
||||
// tag the store with the store type
|
||||
this.avmService.setStoreProperty(workflowStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_AUTHOR_WORKFLOW_MAIN,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the name of the author's store this one is layered over
|
||||
this.avmService.setStoreProperty(workflowStoreName,
|
||||
SandboxConstants.PROP_AUTHOR_NAME,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, userStore));
|
||||
|
||||
// tag the store, oddly enough, with its own store name for querying.
|
||||
this.avmService.setStoreProperty(workflowStoreName,
|
||||
QName.createQName(null, SandboxConstants.PROP_SANDBOX_STORE_PREFIX + workflowStoreName),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
String path = workflowStoreName + ":/" + JNDIConstants.DIR_DEFAULT_WWW +
|
||||
"/" + JNDIConstants.DIR_DEFAULT_APPBASE;
|
||||
// DNS name mangle the property name - can only contain value DNS characters!
|
||||
String dnsProp = SandboxConstants.PROP_DNS + DNSNameMangler.MakeDNSName(stagingStore, packageName);
|
||||
this.avmService.setStoreProperty(workflowStoreName, QName.createQName(null, dnsProp),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, path));
|
||||
|
||||
// the main workflow store depends on the main user store (dist=1)
|
||||
String prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + userStore;
|
||||
this.avmService.setStoreProperty(workflowStoreName, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, 1));
|
||||
|
||||
// The main workflow store depends on the main staging store (dist=2)
|
||||
prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + stagingStore;
|
||||
this.avmService.setStoreProperty(workflowStoreName, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, 2));
|
||||
|
||||
// snapshot the store
|
||||
this.avmService.createSnapshot(workflowStoreName, null, null);
|
||||
|
||||
// create the workflow 'preview' store
|
||||
String previewStoreName = workflowStoreName + STORE_SEPARATOR + "preview";
|
||||
this.avmService.createStore(previewStoreName);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created user workflow sandbox preview store: " + previewStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the workflow 'main' store
|
||||
this.avmService.createLayeredDirectory(
|
||||
workflowStoreName + ":/" + JNDIConstants.DIR_DEFAULT_WWW,
|
||||
previewStoreName + ":/", JNDIConstants.DIR_DEFAULT_WWW);
|
||||
|
||||
// tag the store with the store type
|
||||
this.avmService.setStoreProperty(previewStoreName, SandboxConstants.PROP_SANDBOX_WORKFLOW_PREVIEW,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with its own store name for querying.
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
QName.createQName(null, SandboxConstants.PROP_SANDBOX_STORE_PREFIX + previewStoreName),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
path = previewStoreName + ":/" + JNDIConstants.DIR_DEFAULT_WWW +
|
||||
"/" + JNDIConstants.DIR_DEFAULT_APPBASE;
|
||||
// DNS name mangle the property name - can only contain value DNS characters!
|
||||
dnsProp = SandboxConstants.PROP_DNS + DNSNameMangler.MakeDNSName(userStore, packageName, "preview");
|
||||
this.avmService.setStoreProperty(previewStoreName, QName.createQName(null, dnsProp),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, path));
|
||||
|
||||
// The preview worfkflow store depends on the main workflow store (dist=1)
|
||||
prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + workflowStoreName;
|
||||
this.avmService.setStoreProperty(previewStoreName, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, 1));
|
||||
|
||||
// The preview workflow store depends on the main user store (dist=2)
|
||||
prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + userStore;
|
||||
this.avmService.setStoreProperty(previewStoreName, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, 2));
|
||||
|
||||
// The preview workflow store depends on the main staging store (dist=3)
|
||||
prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + stagingStore;
|
||||
this.avmService.setStoreProperty(previewStoreName, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, 3));
|
||||
|
||||
// snapshot the store
|
||||
this.avmService.createSnapshot(previewStoreName, null, null);
|
||||
|
||||
// tag all related stores to indicate that they are part of a single sandbox
|
||||
QName sandboxIdProp = QName.createQName(SandboxConstants.PROP_SANDBOXID + GUID.generate());
|
||||
this.avmService.setStoreProperty(workflowStoreName, sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
this.avmService.setStoreProperty(previewStoreName, sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// return the main workflow store name
|
||||
return workflowStoreName;
|
||||
}
|
||||
|
||||
public List<SandboxInfo> listSandboxes(final String wpStoreId, String userName)
|
||||
{
|
||||
ParameterCheck.mandatoryString("wpStoreId", wpStoreId);
|
||||
ParameterCheck.mandatoryString("userName", userName);
|
||||
|
||||
return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<List<SandboxInfo>>()
|
||||
{
|
||||
public List<SandboxInfo> doWork() throws Exception
|
||||
{
|
||||
List<AVMStoreDescriptor> stores = avmService.getStores();
|
||||
|
||||
List<SandboxInfo> sbInfos = new ArrayList<SandboxInfo>();
|
||||
for (AVMStoreDescriptor store : stores)
|
||||
{
|
||||
String storeName = store.getName();
|
||||
|
||||
// list main stores - not preview stores or workflow stores
|
||||
if ((storeName.startsWith(wpStoreId)) &&
|
||||
(! WCMUtil.isPreviewStore(storeName)) &&
|
||||
(! WCMUtil.isWorkflowStore(storeName)))
|
||||
{
|
||||
sbInfos.add(getSandbox(storeName));
|
||||
}
|
||||
}
|
||||
|
||||
return sbInfos;
|
||||
}
|
||||
}, userName);
|
||||
}
|
||||
|
||||
public void deleteSandbox(String sbStoreId)
|
||||
{
|
||||
SandboxInfo sbInfo = getSandbox(sbStoreId);
|
||||
|
||||
if (sbInfo != null)
|
||||
{
|
||||
String mainSandboxStore = sbInfo.getMainStoreName();
|
||||
|
||||
// found the sandbox to remove - remove the main store (eg. user main store, staging main store, workflow main store)
|
||||
String path = WCMUtil.buildSandboxRootPath(mainSandboxStore);
|
||||
|
||||
// Notify virtualisation server about removing this sandbox.
|
||||
//
|
||||
// Implementation note:
|
||||
//
|
||||
// Because the removal of virtual webapps in the
|
||||
// virtualization server is recursive, it only
|
||||
// needs to be given the name of the main store.
|
||||
//
|
||||
// This notification must occur *prior* to purging content
|
||||
// within the AVM because the virtualization server must list
|
||||
// the avm_webapps dir in each store to discover which
|
||||
// virtual webapps must be unloaded. The virtualization
|
||||
// server traverses the sandbox's stores in most-to-least
|
||||
// dependent order, so clients don't have to worry about
|
||||
// accessing a preview layer whose main layer has been torn
|
||||
// out from under it.
|
||||
|
||||
WCMUtil.removeAllVServerWebapps(virtServerRegistry, path, true);
|
||||
|
||||
// TODO: Use the .sandbox-id. property to delete all sandboxes,
|
||||
// rather than assume a sandbox always had a single preview
|
||||
// layer attached.
|
||||
|
||||
// purge stores, eg. main store followed by preview store
|
||||
String[] avmStoreNames = sbInfo.getStoreNames();
|
||||
|
||||
for (String avmStoreName : avmStoreNames)
|
||||
{
|
||||
// check it exists before we try to remove it
|
||||
if (avmService.getStore(avmStoreName) != null)
|
||||
{
|
||||
// purge store from the system
|
||||
avmService.purgeStore(avmStoreName);
|
||||
}
|
||||
|
||||
// remove any locks this user may have
|
||||
avmLockingService.removeStoreLocks(avmStoreName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void updateSandboxManagers(final String wpStoreId, NodeRef wpNodeRef, List<String> managers)
|
||||
{
|
||||
// walk existing user sandboxes and reapply manager permissions to include new manager user
|
||||
List<SandboxInfo> sbInfos = AuthenticationUtil.runAs(new RunAsWork<List<SandboxInfo>>()
|
||||
{
|
||||
public List<SandboxInfo> doWork() throws Exception
|
||||
{
|
||||
return listSandboxes(wpStoreId, AuthenticationUtil.getSystemUserName());
|
||||
}
|
||||
}, AuthenticationUtil.getSystemUserName());
|
||||
|
||||
for (SandboxInfo sbInfo : sbInfos)
|
||||
{
|
||||
if (sbInfo.getSandboxType().equals(SandboxConstants.PROP_SANDBOX_AUTHOR_MAIN))
|
||||
{
|
||||
String username = sbInfo.getName();
|
||||
updateUserSandboxManagers(wpStoreId, managers, username);
|
||||
}
|
||||
}
|
||||
|
||||
updateStagingAreaManagers(wpStoreId, wpNodeRef, managers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -545,7 +865,7 @@ public final class SandboxFactory extends WCMUtil
|
||||
* @param managers The list of authorities who have ContentManager role in the web project
|
||||
* @param username Username of the user sandbox to update
|
||||
*/
|
||||
public void updateSandboxManagers(final String storeId, final List<String> managers, final String username)
|
||||
private void updateUserSandboxManagers(final String storeId, final List<String> managers, final String username)
|
||||
{
|
||||
final String userStoreName = WCMUtil.buildUserMainStoreName(storeId, username);
|
||||
final String previewStoreName = WCMUtil.buildUserPreviewStoreName(storeId, username);
|
||||
|
Reference in New Issue
Block a user