mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merge WCM-SERVICES to HEAD
Changes 11272-11536 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@11562 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -26,12 +26,9 @@ package org.alfresco.web.action.evaluator;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.web.action.ActionEvaluator;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wcm.SandboxFactory;
|
||||
|
||||
/**
|
||||
* Evaluator to return true if the current user is a content manager for the current website.
|
||||
@@ -48,10 +45,7 @@ public class WCMContentManagerEvaluator extends BaseActionEvaluator
|
||||
public boolean evaluate(final Node node)
|
||||
{
|
||||
FacesContext facesContext = FacesContext.getCurrentInstance();
|
||||
NodeService nodeService = Repository.getServiceRegistry(facesContext).getNodeService();
|
||||
|
||||
String storeId = (String)nodeService.getProperty(node.getNodeRef(), WCMAppModel.PROP_AVMSTORE);
|
||||
|
||||
return SandboxFactory.isContentManager(storeId);
|
||||
WebProjectService webProjectService = Repository.getServiceRegistry(facesContext).getWebProjectService();
|
||||
return webProjectService.isContentManager(node.getNodeRef());
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -100,7 +100,7 @@ public class CopyToWebProjectHandler extends BaseActionHandler
|
||||
folder = avmPath.substring(avmPath.indexOf(AVMUtil.DIR_ROOT)+4);
|
||||
|
||||
// get the destination web project name
|
||||
NodeRef webProjectNode = AVMUtil.getWebProjectNodeFromPath(avmPath);
|
||||
NodeRef webProjectNode = Repository.getServiceRegistry(context).getWebProjectService().findWebProjectNodeFromPath(avmPath);
|
||||
webProject = Repository.getNameForNode(
|
||||
Repository.getServiceRegistry(context).getNodeService(), webProjectNode);
|
||||
}
|
||||
|
@@ -75,9 +75,10 @@ import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.cmr.security.AccessStatus;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.alfresco.util.VirtServerUtils;
|
||||
import org.alfresco.wcm.webproject.WebProjectInfo;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.context.IContextListener;
|
||||
import org.alfresco.web.app.context.UIContextService;
|
||||
@@ -87,7 +88,6 @@ import org.alfresco.web.bean.BrowseBean;
|
||||
import org.alfresco.web.bean.NavigationBean;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.User;
|
||||
import org.alfresco.web.bean.search.SearchContext;
|
||||
import org.alfresco.web.forms.FormInstanceData;
|
||||
import org.alfresco.web.forms.FormNotFoundException;
|
||||
@@ -220,6 +220,9 @@ public class AVMBrowseBean implements IContextListener
|
||||
/** The NavigationBean bean reference */
|
||||
protected NavigationBean navigator;
|
||||
|
||||
/** WebProjectService bean reference */
|
||||
transient protected WebProjectService wpService;
|
||||
|
||||
/** AVM service bean reference */
|
||||
transient protected AVMService avmService;
|
||||
|
||||
@@ -255,6 +258,23 @@ public class AVMBrowseBean implements IContextListener
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean property getters and setters
|
||||
|
||||
/**
|
||||
* @param wpService The WebProjectService to set.
|
||||
*/
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param avmService The AVMService to set.
|
||||
*/
|
||||
@@ -493,8 +513,7 @@ public class AVMBrowseBean implements IContextListener
|
||||
summary.append(msg.getString(MSG_CREATED_BY)).append(": ")
|
||||
.append(store.getCreator())
|
||||
.append("<p>");
|
||||
final int numUsers = nodeService.getChildAssocs(
|
||||
webProject.getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL).size();
|
||||
final int numUsers = getWebProjectService().getWebUserCount(webProject.getNodeRef());
|
||||
summary.append(MessageFormat.format(msg.getString(MSG_WORKING_USERS), numUsers));
|
||||
}
|
||||
|
||||
@@ -616,7 +635,15 @@ public class AVMBrowseBean implements IContextListener
|
||||
if (this.webapp == null)
|
||||
{
|
||||
// TODO - temporary, should only be called for WCM forms (not ECM forms)
|
||||
this.webapp = this.getWebProject() != null ? this.getWebProject().getDefaultWebapp() : null;
|
||||
Node wpNode = getWebsite();
|
||||
if (wpNode != null)
|
||||
{
|
||||
WebProjectInfo wpInfo = getWebProjectService().getWebProject(wpNode.getNodeRef());
|
||||
if (wpInfo != null)
|
||||
{
|
||||
this.webapp = wpInfo.getDefaultWebApp();
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.webapp;
|
||||
}
|
||||
@@ -1012,8 +1039,12 @@ public class AVMBrowseBean implements IContextListener
|
||||
*/
|
||||
public boolean getIsManagerRole()
|
||||
{
|
||||
final User user = Application.getCurrentUser(FacesContext.getCurrentInstance());
|
||||
return this.getWebProject().isManager(user);
|
||||
Node wpNode = getWebsite();
|
||||
if (wpNode != null)
|
||||
{
|
||||
return getWebProjectService().isContentManager(wpNode.getNodeRef());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -25,7 +25,6 @@
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -36,36 +35,30 @@ import org.alfresco.config.ConfigElement;
|
||||
import org.alfresco.config.ConfigService;
|
||||
import org.alfresco.config.JNDIConstants;
|
||||
import org.alfresco.mbeans.VirtServerRegistry;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.domain.PropertyValue;
|
||||
import org.alfresco.sandbox.SandboxConstants;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.VirtServerUtils;
|
||||
import org.alfresco.wcm.util.WCMUtil;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wcm.preview.PreviewURIService;
|
||||
import org.alfresco.web.bean.wcm.preview.VirtualisationServerPreviewURIService;
|
||||
import org.alfresco.web.config.ClientConfigElement;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.jsf.FacesContextUtils;
|
||||
|
||||
|
||||
/**
|
||||
* Helper methods and constants related to AVM directories, paths and store name manipulation.
|
||||
*
|
||||
* TODO refactor ...
|
||||
*
|
||||
* @author Ariel Backenroth
|
||||
* @author Kevin Roast
|
||||
*/
|
||||
public final class AVMUtil
|
||||
public final class AVMUtil extends WCMUtil
|
||||
{
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -93,204 +86,64 @@ public final class AVMUtil
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
*/
|
||||
private AVMUtil()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the store name from the avmpath
|
||||
*
|
||||
* @param avmPath an absolute avm path
|
||||
*
|
||||
* @return the store name
|
||||
*/
|
||||
public static String getStoreName(final String avmPath)
|
||||
{
|
||||
final int i = avmPath.indexOf(':');
|
||||
if (i == -1)
|
||||
{
|
||||
throw new IllegalArgumentException("path " + avmPath + " does not contain a store");
|
||||
}
|
||||
return avmPath.substring(0, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the store name describes a preview store.
|
||||
*
|
||||
* @param storeName the store name
|
||||
*
|
||||
* @return <tt>true</tt> if the store is a preview store, <tt>false</tt> otherwise.
|
||||
*/
|
||||
public static boolean isPreviewStore(final String storeName)
|
||||
{
|
||||
return storeName.endsWith(AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the store name describes a workflow store.
|
||||
*
|
||||
* @param storeName the store name
|
||||
*
|
||||
* @return <tt>true</tt> if the store is a workflow store, <tt>false</tt> otherwise.
|
||||
*/
|
||||
public static boolean isWorkflowStore(String storeName)
|
||||
{
|
||||
if (AVMUtil.isPreviewStore(storeName))
|
||||
{
|
||||
storeName = AVMUtil.getCorrespondingMainStoreName(storeName);
|
||||
}
|
||||
|
||||
return storeName.indexOf(STORE_SEPARATOR + STORE_WORKFLOW) != -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the store name describes a user store.
|
||||
*
|
||||
* @param storeName the store name
|
||||
*
|
||||
* @return <tt>true</tt> if the store is a user store, <tt>false</tt> otherwise.
|
||||
*/
|
||||
public static boolean isUserStore(String storeName)
|
||||
{
|
||||
if (AVMUtil.isPreviewStore(storeName))
|
||||
{
|
||||
storeName = AVMUtil.getCorrespondingMainStoreName(storeName);
|
||||
}
|
||||
return storeName.indexOf(AVMUtil.STORE_SEPARATOR) != -1;
|
||||
return WCMUtil.getStoreName(avmPath);
|
||||
}
|
||||
|
||||
public static boolean isPreviewStore(final String storeName)
|
||||
{
|
||||
return WCMUtil.isPreviewStore(storeName);
|
||||
}
|
||||
|
||||
public static boolean isWorkflowStore(String storeName)
|
||||
{
|
||||
return WCMUtil.isWorkflowStore(storeName);
|
||||
}
|
||||
|
||||
public static boolean isUserStore(String storeName)
|
||||
{
|
||||
return WCMUtil.isUserStore(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the store name describes a main store.
|
||||
*
|
||||
* @param storeName the store name
|
||||
*
|
||||
* @return <tt>true</tt> if the store is a main store, <tt>false</tt> otherwise.
|
||||
*/
|
||||
public static boolean isMainStore(String storeName)
|
||||
{
|
||||
return (storeName.indexOf(AVMUtil.STORE_SEPARATOR) == -1);
|
||||
return WCMUtil.isMainStore(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the username from the store name.
|
||||
*
|
||||
* @param storeName the store name
|
||||
*
|
||||
* @return the username associated or <tt>null</tt> if this is a staging store.
|
||||
*/
|
||||
public static String getUserName(String storeName)
|
||||
{
|
||||
if (AVMUtil.isPreviewStore(storeName))
|
||||
{
|
||||
storeName = AVMUtil.getCorrespondingMainStoreName(storeName);
|
||||
}
|
||||
final int index = storeName.indexOf(AVMUtil.STORE_SEPARATOR);
|
||||
return (index == -1
|
||||
? null
|
||||
: storeName.substring(index + AVMUtil.STORE_SEPARATOR.length()));
|
||||
return WCMUtil.getUserName(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the store id from the store name.
|
||||
*
|
||||
* @param storeName the store name.
|
||||
*
|
||||
* @return the store id.
|
||||
*/
|
||||
public static String getStoreId(final String storeName)
|
||||
{
|
||||
final int index = storeName.indexOf(AVMUtil.STORE_SEPARATOR);
|
||||
return (index == -1
|
||||
? storeName
|
||||
: storeName.substring(0, index));
|
||||
return WCMUtil.getStoreId(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corresponding main store name if this is a preview store name.
|
||||
*
|
||||
* @param storeName the preview store name.
|
||||
*
|
||||
* @return the corresponding main store name.
|
||||
*
|
||||
* @exception IllegalArgumentException if this is not a preview store name.
|
||||
*/
|
||||
public static String getCorrespondingMainStoreName(final String storeName)
|
||||
{
|
||||
if (!AVMUtil.isPreviewStore(storeName))
|
||||
{
|
||||
throw new IllegalArgumentException("store " + storeName + " is not a preview store");
|
||||
}
|
||||
return storeName.substring(0,
|
||||
(storeName.length() -
|
||||
(AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW).length()));
|
||||
return WCMUtil.getCorrespondingMainStoreName(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corresponding preview store name if this is a main store name.
|
||||
*
|
||||
* @param storeName the main store name.
|
||||
*
|
||||
* @return the corresponding preview store name.
|
||||
*
|
||||
* @exception IllegalArgumentException if this is not a main store name.
|
||||
*/
|
||||
public static String getCorrespondingPreviewStoreName(final String storeName)
|
||||
{
|
||||
if (AVMUtil.isPreviewStore(storeName))
|
||||
{
|
||||
throw new IllegalArgumentException("store " + storeName + " is already a preview store");
|
||||
}
|
||||
return storeName + AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW;
|
||||
return WCMUtil.getCorrespondingPreviewStoreName(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corresponding path in the main store name if this is a path in
|
||||
* a preview store.
|
||||
*
|
||||
* @param avmPath an avm path within the main store.
|
||||
*
|
||||
* @return the corresponding path within the preview store.
|
||||
*
|
||||
* @exception IllegalArgumentException if this is not a path within the preview store.
|
||||
*/
|
||||
public static String getCorrespondingPathInMainStore(final String avmPath)
|
||||
{
|
||||
String storeName = AVMUtil.getStoreName(avmPath);
|
||||
storeName = AVMUtil.getCorrespondingMainStoreName(storeName);
|
||||
return AVMUtil.getCorrespondingPath(avmPath, storeName);
|
||||
return WCMUtil.getCorrespondingPathInMainStore(avmPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corresponding path in the preview store name if this is a path in
|
||||
* a main store.
|
||||
*
|
||||
* @param avmPath an avm path within the main store.
|
||||
*
|
||||
* @return the corresponding path within the preview store.
|
||||
*
|
||||
* @exception IllegalArgumentException if this is not a path within the preview store.
|
||||
*/
|
||||
public static String getCorrespondingPathInPreviewStore(final String avmPath)
|
||||
{
|
||||
String storeName = AVMUtil.getStoreName(avmPath);
|
||||
storeName = AVMUtil.getCorrespondingPreviewStoreName(storeName);
|
||||
return AVMUtil.getCorrespondingPath(avmPath, storeName);
|
||||
return WCMUtil.getCorrespondingPathInPreviewStore(avmPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the corresponding path in the store provided.
|
||||
*
|
||||
* @param avmPath an avm path
|
||||
* @param otherStore the other store to return the corresponding path for
|
||||
*
|
||||
* @return the corresponding path within the supplied store
|
||||
*/
|
||||
public static String getCorrespondingPath(final String avmPath, final String otherStore)
|
||||
{
|
||||
return (otherStore + ':' + AVMUtil.getStoreRelativePath(avmPath));
|
||||
return WCMUtil.getCorrespondingPath(avmPath, otherStore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -371,146 +224,53 @@ public final class AVMUtil
|
||||
return pollFreq;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the main staging store name for the specified store id.
|
||||
*
|
||||
* @param storeId store id to build staging store name for
|
||||
*
|
||||
* @return main staging store name for the specified store id
|
||||
*/
|
||||
public static String buildStagingStoreName(final String storeId)
|
||||
{
|
||||
if (storeId == null || storeId.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Store id is mandatory.");
|
||||
}
|
||||
return storeId;
|
||||
return WCMUtil.buildStagingStoreName(storeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preview store name for the specified store id.
|
||||
*
|
||||
* @param storeId store id to build preview store name for
|
||||
*
|
||||
* @return preview store name for the specified store id
|
||||
*/
|
||||
public static String buildStagingPreviewStoreName(final String storeId)
|
||||
{
|
||||
return (AVMUtil.buildStagingStoreName(storeId) +
|
||||
AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW);
|
||||
return WCMUtil.buildStagingPreviewStoreName(storeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the main store name for a specific username.
|
||||
*
|
||||
* @param storeId store id to build user store name for
|
||||
* @param username of the user to build store name for
|
||||
*
|
||||
* @return the main store for the specified user and store id
|
||||
*/
|
||||
public static String buildUserMainStoreName(final String storeId,
|
||||
final String username)
|
||||
{
|
||||
if (username == null || username.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Username is mandatory.");
|
||||
}
|
||||
return (AVMUtil.buildStagingStoreName(storeId) + AVMUtil.STORE_SEPARATOR +
|
||||
username);
|
||||
return WCMUtil.buildUserMainStoreName(storeId, username);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preview store name for a specific username.
|
||||
*
|
||||
* @param storeId store id to build user preview store name for
|
||||
* @param username of the user to build preview store name for
|
||||
*
|
||||
* @return the preview store for the specified user and store id
|
||||
*/
|
||||
public static String buildUserPreviewStoreName(final String storeId,
|
||||
final String username)
|
||||
{
|
||||
return (AVMUtil.buildUserMainStoreName(storeId, username) +
|
||||
AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW);
|
||||
return WCMUtil.buildUserPreviewStoreName(storeId, username);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the store name for a specific workflow Id.
|
||||
*
|
||||
* @param storeId store id to build workflow store name for
|
||||
* @param workflowId of the user to build workflow store name for
|
||||
*
|
||||
* @return the store for the specified workflow and store ids
|
||||
*/
|
||||
public static String buildWorkflowMainStoreName(final String storeId,
|
||||
final String workflowId)
|
||||
{
|
||||
if (workflowId == null || workflowId.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("workflowId is mandatory.");
|
||||
}
|
||||
return (AVMUtil.buildStagingStoreName(storeId) + AVMUtil.STORE_SEPARATOR +
|
||||
workflowId);
|
||||
return WCMUtil.buildWorkflowMainStoreName(storeId, workflowId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preview store name for a specific workflow Id.
|
||||
*
|
||||
* @param storeId store id to build preview workflow store name for
|
||||
* @param workflowId of the user to build preview workflow store name for
|
||||
*
|
||||
* @return the store for the specified preview workflow and store ids
|
||||
*/
|
||||
public static String buildWorkflowPreviewStoreName(final String storeId,
|
||||
final String workflowId)
|
||||
{
|
||||
return (AVMUtil.buildWorkflowMainStoreName(storeId, workflowId) +
|
||||
AVMUtil.STORE_SEPARATOR + AVMUtil.STORE_PREVIEW);
|
||||
return WCMUtil.buildWorkflowPreviewStoreName(storeId, workflowId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root path for the specified store name
|
||||
*
|
||||
* @param storeName store to build root path for
|
||||
*
|
||||
* @return root path for the specified store name
|
||||
*/
|
||||
public static String buildStoreRootPath(final String storeName)
|
||||
{
|
||||
if (storeName == null || storeName.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Store name is mandatory.");
|
||||
}
|
||||
return storeName + ":/" + JNDIConstants.DIR_DEFAULT_WWW;
|
||||
return WCMUtil.buildStoreRootPath(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root path for the specified sandbox name
|
||||
*
|
||||
* @param storeName store to build root sandbox path for
|
||||
*
|
||||
* @return root sandbox path for the specified store name
|
||||
*/
|
||||
public static String buildSandboxRootPath(final String storeName)
|
||||
{
|
||||
return AVMUtil.buildStoreRootPath(storeName) + '/' + JNDIConstants.DIR_DEFAULT_APPBASE;
|
||||
return WCMUtil.buildSandboxRootPath(storeName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root webapp path for the specified store and webapp name
|
||||
*
|
||||
* @param storeName store to build root webapp path for
|
||||
* @param webapp webapp folder name
|
||||
*
|
||||
* @return the root webapp path for the specified store and webapp name
|
||||
*/
|
||||
public static String buildStoreWebappPath(final String storeName, String webapp)
|
||||
{
|
||||
if (webapp == null || webapp.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Webapp name is mandatory.");
|
||||
}
|
||||
return AVMUtil.buildSandboxRootPath(storeName) + '/' + webapp;
|
||||
return WCMUtil.buildStoreWebappPath(storeName, webapp);
|
||||
}
|
||||
|
||||
public static String buildStoreUrl(String store)
|
||||
@@ -539,7 +299,7 @@ public final class AVMUtil
|
||||
return AVMUtil.buildWebappUrl(AVMUtil.getStoreName(avmPath),
|
||||
AVMUtil.getWebapp(avmPath));
|
||||
}
|
||||
|
||||
|
||||
public static String buildWebappUrl(final String store, final String webapp)
|
||||
{
|
||||
if (webapp == null || webapp.length() == 0)
|
||||
@@ -581,30 +341,7 @@ public final class AVMUtil
|
||||
|
||||
public static String buildAssetUrl(String assetPath, String domain, String port, String dns)
|
||||
{
|
||||
if (domain == null || port == null || dns == null)
|
||||
{
|
||||
throw new IllegalArgumentException("Domain, port and dns name are mandatory.");
|
||||
}
|
||||
if (assetPath == null || assetPath.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Asset path is mandatory.");
|
||||
}
|
||||
if (assetPath.startsWith('/' + JNDIConstants.DIR_DEFAULT_WWW +
|
||||
'/' + JNDIConstants.DIR_DEFAULT_APPBASE))
|
||||
{
|
||||
assetPath = assetPath.substring(('/' + JNDIConstants.DIR_DEFAULT_WWW +
|
||||
'/' + JNDIConstants.DIR_DEFAULT_APPBASE).length());
|
||||
}
|
||||
if (assetPath.startsWith('/' + DIR_ROOT))
|
||||
{
|
||||
assetPath = assetPath.substring(('/' + DIR_ROOT).length());
|
||||
}
|
||||
if (assetPath.length() == 0 || assetPath.charAt(0) != '/')
|
||||
{
|
||||
assetPath = '/' + assetPath;
|
||||
}
|
||||
|
||||
return MessageFormat.format(JNDIConstants.PREVIEW_ASSET_URL, dns, domain, port, assetPath);
|
||||
return WCMUtil.buildAssetUrl(assetPath, domain, port, dns);
|
||||
}
|
||||
|
||||
public static String getPreviewURI(final String storeId, final String assetPath)
|
||||
@@ -633,19 +370,10 @@ public final class AVMUtil
|
||||
|
||||
public static String lookupStoreDNS(String store)
|
||||
{
|
||||
if (store == null || store.length() == 0)
|
||||
{
|
||||
throw new IllegalArgumentException("Store name is mandatory.");
|
||||
}
|
||||
|
||||
final ServiceRegistry serviceRegistry =
|
||||
Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
final AVMService avmService = serviceRegistry.getAVMService();
|
||||
final Map<QName, PropertyValue> props =
|
||||
avmService.queryStorePropertyKey(store, QName.createQName(null, SandboxConstants.PROP_DNS + '%'));
|
||||
return (props.size() == 1
|
||||
? props.keySet().iterator().next().getLocalName().substring(SandboxConstants.PROP_DNS.length())
|
||||
: null);
|
||||
return WCMUtil.lookupStoreDNS(avmService, store);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -685,157 +413,34 @@ public final class AVMUtil
|
||||
return parent + path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a path relative to the store portion of the avm path.
|
||||
*
|
||||
* @param absoluteAVMPath an absolute path within the avm
|
||||
* @return the path without the store prefix.
|
||||
*/
|
||||
public static String getStoreRelativePath(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = STORE_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(1).length() != 0 ? m.group(1) : null;
|
||||
return WCMUtil.getStoreRelativePath(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a path relative to the webapp portion of the avm path.
|
||||
*
|
||||
* @param absoluteAVMPath an absolute path within the avm
|
||||
* @return a relative path within the webapp.
|
||||
*/
|
||||
|
||||
public static String getWebappRelativePath(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = WEBAPP_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(3).length() != 0 ? m.group(3) : "/";
|
||||
return WCMUtil.getWebappRelativePath(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the webapp within the path
|
||||
*
|
||||
* @param absoluteAVMPath the path from which to extract the webapp name
|
||||
*
|
||||
* @return an the webapp name contained within the path or <tt>null</tt>.
|
||||
*/
|
||||
public static String getWebapp(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = WEBAPP_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(2).length() != 0 ? m.group(2) : null;
|
||||
return WCMUtil.getWebapp(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path portion up the webapp
|
||||
*
|
||||
* @param absoluteAVMPath the path from which to extract the webapp path
|
||||
*
|
||||
* @return an absolute avm path to the webapp contained within
|
||||
* the path or <tt>null</tt>.
|
||||
*/
|
||||
public static String getWebappPath(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = WEBAPP_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(1).length() != 0 ? m.group(1) : null;
|
||||
return WCMUtil.getWebappPath(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a path relative to the sandbox porition of the avm path.
|
||||
*
|
||||
* @param absoluteAVMPath an absolute path within the avm
|
||||
* @return a relative path within the sandbox.
|
||||
*/
|
||||
public static String getSandboxRelativePath(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = SANDBOX_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(2).length() != 0 ? m.group(2) : "/";
|
||||
return WCMUtil.getSandboxRelativePath(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path portion up the sandbox
|
||||
*
|
||||
* @param absoluteAVMPath the path from which to extract the sandbox path
|
||||
*
|
||||
* @return an absolute avm path to the sandbox contained within
|
||||
* the path or <tt>null</tt>.
|
||||
*/
|
||||
public static String getSandboxPath(final String absoluteAVMPath)
|
||||
{
|
||||
final Matcher m = SANDBOX_RELATIVE_PATH_PATTERN.matcher(absoluteAVMPath);
|
||||
return m.matches() && m.group(1).length() != 0 ? m.group(1) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the NodeRef that represents the given avm path
|
||||
*
|
||||
* @param absoluteAVMPath The path from which to determine the Web Project
|
||||
* @return The NodeRef representing the Web Project the path is from or null
|
||||
* if it could not be determined
|
||||
*/
|
||||
public static NodeRef getWebProjectNodeFromPath(final String absoluteAVMPath)
|
||||
{
|
||||
String storeName = AVMUtil.getStoreName(absoluteAVMPath);
|
||||
String storeId = AVMUtil.getStoreId(storeName);
|
||||
return getWebProjectNodeFromStore(storeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the NodeRef that represents the given avm store
|
||||
*
|
||||
* @param storeName The store name from which to determine the Web Project
|
||||
* @return The NodeRef representing the Web Project the store is from or null
|
||||
* if it could not be determined
|
||||
*/
|
||||
public static NodeRef getWebProjectNodeFromStore(final String storeName)
|
||||
{
|
||||
// get services
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
SearchService searchService = Repository.getServiceRegistry(fc).getSearchService();
|
||||
NodeService nodeService = Repository.getServiceRegistry(fc).getNodeService();
|
||||
|
||||
// construct the query
|
||||
String path = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*";
|
||||
String query = "PATH:\"/" + path + "\" AND @wca\\:avmstore:\"" + storeName + "\"";
|
||||
|
||||
NodeRef webProjectNode = null;
|
||||
ResultSet results = null;
|
||||
try
|
||||
{
|
||||
// execute the query
|
||||
results = searchService.query(Repository.getStoreRef(),
|
||||
SearchService.LANGUAGE_LUCENE, query);
|
||||
|
||||
// WCM-810:
|
||||
// the 'avmstore' property was not defined as an identifier in the model (before 2.2)
|
||||
// which means it may get tokenised which in turn means that 'test' and 'test-site'
|
||||
// would get returned by the query above even though it's an exact match query,
|
||||
// we therefore need to go through the results and check names if there is more
|
||||
// than one result although this shouldn't happen anymore as the
|
||||
// AVMStorePropertyTokenisationPatch will have reindexed the wca:avmstore property
|
||||
if (results.length() == 1)
|
||||
{
|
||||
webProjectNode = results.getNodeRef(0);
|
||||
}
|
||||
else if (results.length() > 1)
|
||||
{
|
||||
for (NodeRef node : results.getNodeRefs())
|
||||
{
|
||||
String nodeStoreName = (String)nodeService.getProperty(node,
|
||||
WCMAppModel.PROP_AVMSTORE);
|
||||
if (nodeStoreName.equals(storeName))
|
||||
{
|
||||
webProjectNode = node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (results != null)
|
||||
{
|
||||
results.close();
|
||||
}
|
||||
}
|
||||
|
||||
return webProjectNode;
|
||||
return WCMUtil.getSandboxPath(absoluteAVMPath);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -875,77 +480,20 @@ public final class AVMUtil
|
||||
avmService.createDirectory(sb[0], sb[1]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update notification on the virtualisation server webapp as required for the specified path
|
||||
*
|
||||
* @param path Path to match against
|
||||
* @param force True to force update of server even if path does not match
|
||||
*/
|
||||
|
||||
public static void updateVServerWebapp(String path, boolean force)
|
||||
{
|
||||
if (force || VirtServerUtils.requiresUpdateNotification(path))
|
||||
{
|
||||
final int webappIndex = path.indexOf('/',
|
||||
path.indexOf(JNDIConstants.DIR_DEFAULT_APPBASE) +
|
||||
JNDIConstants.DIR_DEFAULT_APPBASE.length() + 1);
|
||||
|
||||
if (webappIndex != -1)
|
||||
{
|
||||
path = path.substring(0, webappIndex);
|
||||
}
|
||||
final VirtServerRegistry vServerRegistry = AVMUtil.getVirtServerRegistry();
|
||||
vServerRegistry.updateWebapp(-1, path, true);
|
||||
}
|
||||
WCMUtil.updateVServerWebapp(getVirtServerRegistry(), path, force);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removal notification on all the virtualisation server webapp as required by the specified path
|
||||
*
|
||||
* @param path Path to match against
|
||||
* @param force True to force update of server even if path does not match
|
||||
*/
|
||||
public static void removeAllVServerWebapps(String path, boolean force)
|
||||
{
|
||||
if (force || VirtServerUtils.requiresUpdateNotification(path))
|
||||
{
|
||||
final int webappIndex = path.indexOf('/',
|
||||
path.indexOf(JNDIConstants.DIR_DEFAULT_APPBASE) +
|
||||
JNDIConstants.DIR_DEFAULT_APPBASE.length() + 1);
|
||||
|
||||
if (webappIndex != -1)
|
||||
{
|
||||
path = path.substring(0, webappIndex);
|
||||
}
|
||||
final VirtServerRegistry vServerRegistry = AVMUtil.getVirtServerRegistry();
|
||||
vServerRegistry.removeAllWebapps(-1, path, true);
|
||||
}
|
||||
WCMUtil.removeAllVServerWebapps(getVirtServerRegistry(), path, force);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Removal notification on the virtualisation server webapp as required for the specified path
|
||||
*
|
||||
* @param path Path to match against
|
||||
* @param force True to force update of server even if path does not match
|
||||
*/
|
||||
public static void removeVServerWebapp(String path, boolean force)
|
||||
{
|
||||
if (force || VirtServerUtils.requiresUpdateNotification(path))
|
||||
{
|
||||
final int webappIndex = path.indexOf('/',
|
||||
path.indexOf(JNDIConstants.DIR_DEFAULT_APPBASE) +
|
||||
JNDIConstants.DIR_DEFAULT_APPBASE.length() + 1);
|
||||
|
||||
if (webappIndex != -1)
|
||||
{
|
||||
path = path.substring(0, webappIndex);
|
||||
}
|
||||
final VirtServerRegistry vServerRegistry = AVMUtil.getVirtServerRegistry();
|
||||
vServerRegistry.removeWebapp(-1, path, true);
|
||||
}
|
||||
WCMUtil.removeVServerWebapp(getVirtServerRegistry(), path, force);
|
||||
}
|
||||
|
||||
private static VirtServerRegistry getVirtServerRegistry()
|
||||
@@ -984,26 +532,14 @@ public final class AVMUtil
|
||||
}
|
||||
|
||||
// Component Separator.
|
||||
public static final String STORE_SEPARATOR = "--";
|
||||
public static final String STORE_SEPARATOR = WCMUtil.STORE_SEPARATOR;
|
||||
|
||||
// names of the stores representing the layers for an AVM website
|
||||
//XXXarielb this should be private
|
||||
public final static String STORE_WORKFLOW = "workflow";
|
||||
public final static String STORE_PREVIEW = "preview";
|
||||
|
||||
// servlet default webapp
|
||||
// Note: this webapp is mapped to the URL path ""
|
||||
public final static String DIR_ROOT = "ROOT";
|
||||
|
||||
public final static String SPACE_ICON_WEBSITE = "space-icon-website";
|
||||
|
||||
// web user role permissions
|
||||
public final static String ROLE_CONTENT_MANAGER = "ContentManager";
|
||||
public final static String ROLE_CONTENT_PUBLISHER = "ContentPublisher";
|
||||
public static final String STORE_WORKFLOW = WCMUtil.STORE_WORKFLOW;
|
||||
public static final String STORE_PREVIEW = WCMUtil.STORE_PREVIEW;
|
||||
|
||||
// pattern for absolute AVM Path
|
||||
private final static Pattern STORE_RELATIVE_PATH_PATTERN =
|
||||
Pattern.compile("[^:]+:(.+)");
|
||||
//private final static Pattern STORE_RELATIVE_PATH_PATTERN =
|
||||
// Pattern.compile("[^:]+:(.+)");
|
||||
|
||||
private final static Pattern WEBAPP_RELATIVE_PATH_PATTERN =
|
||||
Pattern.compile("([^:]+:/" + JNDIConstants.DIR_DEFAULT_WWW +
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -30,7 +30,13 @@ import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.Serializable;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
@@ -41,24 +47,25 @@ import org.alfresco.model.WCMWorkflowModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.repo.domain.PropertyValue;
|
||||
import org.alfresco.repo.security.authority.AuthorityDAO;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
import org.alfresco.service.cmr.avm.*;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.LayeringDescriptor;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.security.AuthorityService;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.cmr.workflow.*;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.GUID;
|
||||
import org.alfresco.wcm.sandbox.SandboxInfo;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.workflow.WorkflowUtil;
|
||||
|
@@ -44,6 +44,8 @@ import org.alfresco.service.cmr.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.wcm.webproject.WebProjectInfo;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.data.IDataContainer;
|
||||
@@ -67,6 +69,25 @@ public class CreateLayeredFolderDialog extends CreateFolderDialog
|
||||
protected String targetPath;
|
||||
protected List<SelectItem> webProjects;
|
||||
|
||||
transient protected WebProjectService wpService;
|
||||
|
||||
/**
|
||||
* @param wpService The WebProjectService to set.
|
||||
*/
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Dialog implementation
|
||||
|
||||
@@ -147,39 +168,18 @@ public class CreateLayeredFolderDialog extends CreateFolderDialog
|
||||
// get the current web project dns name
|
||||
String thisStoreName = this.avmBrowseBean.getWebProject().getStagingStore();
|
||||
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
List<WebProjectInfo> wpInfos = getWebProjectService().listWebProjects();
|
||||
|
||||
// construct the query to retrieve the web projects
|
||||
String path = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*";
|
||||
StringBuilder query = new StringBuilder(200);
|
||||
query.append("PATH:\"/").append(path).append("\"");
|
||||
query.append(" +TYPE:\"{").append(NamespaceService.WCMAPP_MODEL_1_0_URI).append("}webfolder\"");
|
||||
|
||||
ResultSet results = null;
|
||||
try
|
||||
this.webProjects = new ArrayList<SelectItem>(wpInfos.size());
|
||||
for (WebProjectInfo wpInfo : wpInfos)
|
||||
{
|
||||
// execute the query
|
||||
results = getSearchService().query(Repository.getStoreRef(),
|
||||
SearchService.LANGUAGE_LUCENE, query.toString());
|
||||
this.webProjects = new ArrayList<SelectItem>(results.length());
|
||||
for (ResultSetRow row : results)
|
||||
String name = wpInfo.getName();
|
||||
String dns = wpInfo.getStoreId();
|
||||
|
||||
// don't add ourself to the list of projects
|
||||
if (thisStoreName.equals(dns) == false)
|
||||
{
|
||||
NodeRef ref = row.getNodeRef();
|
||||
String name = (String)getNodeService().getProperty(ref, ContentModel.PROP_NAME);
|
||||
String dns = (String)getNodeService().getProperty(ref, WCMAppModel.PROP_AVMSTORE);
|
||||
|
||||
// don't add ourself to the list of projects
|
||||
if (thisStoreName.equals(dns) == false)
|
||||
{
|
||||
this.webProjects.add(new SelectItem(dns, name));
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (results != null)
|
||||
{
|
||||
results.close();
|
||||
this.webProjects.add(new SelectItem(dns, name));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -26,15 +26,9 @@ package org.alfresco.web.bean.wcm;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.model.ApplicationModel;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
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.repo.security.permissions.AccessDeniedException;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
|
||||
/**
|
||||
* Bean implementation for the AVM "Create Webapp Folder" dialog.
|
||||
@@ -48,7 +42,24 @@ public class CreateWebappDialog extends CreateFolderDialog
|
||||
|
||||
private static final long serialVersionUID = -3883601909422422829L;
|
||||
|
||||
protected String path;
|
||||
transient private WebProjectService wpService;
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean property getters and setters
|
||||
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String)
|
||||
@@ -56,49 +67,13 @@ public class CreateWebappDialog extends CreateFolderDialog
|
||||
@Override
|
||||
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
||||
{
|
||||
final String stagingStore = this.avmBrowseBean.getStagingStore();
|
||||
|
||||
if (SandboxFactory.isContentManager(stagingStore))
|
||||
Node websiteNode = this.avmBrowseBean.getWebsite();
|
||||
|
||||
if (websiteNode != null)
|
||||
{
|
||||
AuthenticationUtil.runAs(new RunAsWork<Object>(){
|
||||
|
||||
public Object doWork() throws Exception
|
||||
{
|
||||
final String parent = AVMUtil.buildSandboxRootPath( stagingStore );
|
||||
CreateWebappDialog.this.getAvmService().createDirectory(parent, CreateWebappDialog.this.name);
|
||||
|
||||
CreateWebappDialog.this.path = AVMNodeConverter.ExtendAVMPath(parent, CreateWebappDialog.this.name);
|
||||
CreateWebappDialog.this.getAvmService().addAspect(CreateWebappDialog.this.path, ApplicationModel.ASPECT_UIFACETS);
|
||||
CreateWebappDialog.this.getAvmService().addAspect(CreateWebappDialog.this.path, WCMAppModel.ASPECT_WEBAPP);
|
||||
if (CreateWebappDialog.this.description != null && CreateWebappDialog.this.description.length() != 0)
|
||||
{
|
||||
CreateWebappDialog.this.getAvmService().setNodeProperty(path,
|
||||
ContentModel.PROP_DESCRIPTION,
|
||||
new PropertyValue(DataTypeDefinition.TEXT,
|
||||
CreateWebappDialog.this.description));
|
||||
}
|
||||
|
||||
// Snapshot the store with the empty webapp
|
||||
CreateWebappDialog.this.getAvmService().createSnapshot(stagingStore, null, null);
|
||||
return null;
|
||||
}}, AuthenticationUtil.getSystemUserName());
|
||||
|
||||
getWebProjectService().createWebApp(websiteNode.getNodeRef(), this.name, this.description);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new AccessDeniedException("Only content managers may create new webapp folders");
|
||||
}
|
||||
|
||||
return outcome;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String doPostCommitProcessing(FacesContext context, String outcome)
|
||||
{
|
||||
// Tell the virtualization server about the new webapp.
|
||||
// e.g.: this.path = "mysite:/www/avm_webapps/mywebapp"
|
||||
AVMUtil.updateVServerWebapp(this.path, true);
|
||||
|
||||
|
||||
return outcome;
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -38,28 +38,21 @@ import javax.faces.model.DataModel;
|
||||
import javax.faces.model.ListDataModel;
|
||||
import javax.faces.model.SelectItem;
|
||||
|
||||
import org.alfresco.model.ApplicationModel;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.cmr.security.AuthorityType;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.cmr.security.PersonService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.DNSNameMangler;
|
||||
import org.alfresco.util.ExpiringValueCache;
|
||||
import org.alfresco.wcm.util.WCMUtil;
|
||||
import org.alfresco.wcm.webproject.WebProjectInfo;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.AlfrescoNavigationHandler;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
@@ -110,26 +103,29 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
protected final static Log logger = LogFactory.getLog(CreateWebsiteWizard.class);
|
||||
|
||||
protected boolean editMode = false;
|
||||
protected String dnsName;
|
||||
|
||||
// TODO refactor to WebProjectInfo
|
||||
protected String dnsName;
|
||||
protected String title;
|
||||
protected String name;
|
||||
protected String description;
|
||||
protected String webapp = WEBAPP_DEFAULT;
|
||||
protected String createFrom = null;
|
||||
protected boolean isSource;
|
||||
protected NodeRef wpNodeRef;
|
||||
|
||||
protected String[] sourceWebProject = null;
|
||||
protected ExpiringValueCache<List<UIListItem>> webProjectsList;
|
||||
protected List<SelectItem> webappsList;
|
||||
protected boolean isSource;
|
||||
protected boolean showAllSourceProjects;
|
||||
protected String websiteDescriptionAttribute;
|
||||
|
||||
transient private AVMService avmService;
|
||||
transient private WorkflowService workflowService;
|
||||
transient private PersonService personService;
|
||||
transient private AVMLockingService avmLockingService;
|
||||
transient private FormsService formsService;
|
||||
|
||||
transient private WebProjectService wpService;
|
||||
|
||||
/** set true when an option in the Create From screen is changed - this is used as an
|
||||
indicator to reload the wizard data model from the selected source web project */
|
||||
private boolean createFromValueChanged;
|
||||
@@ -165,9 +161,6 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
protected boolean inAddDeployServerMode = false;
|
||||
protected String addDeployServerType = WCMAppModel.CONSTRAINT_FILEDEPLOY;
|
||||
|
||||
/** Data for virtualization server notification */
|
||||
private SandboxInfo sandboxInfo;
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Wizard implementation
|
||||
|
||||
@@ -221,39 +214,25 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
// the Finish button can be pressed early in the steps - ensure the model is up-to-date
|
||||
updateModelOnCreateFromChange();
|
||||
|
||||
// create the website space in the correct parent folder
|
||||
final NodeRef websiteParent = WebProject.getWebsitesFolder();
|
||||
// if the user selected Create From existing web project we will branch from it
|
||||
NodeRef sourceNodeRef = null;
|
||||
if (CREATE_EXISTING.equals(this.createFrom) &&
|
||||
(this.sourceWebProject != null && this.sourceWebProject.length != 0))
|
||||
{
|
||||
sourceNodeRef = new NodeRef(this.sourceWebProject[0]);
|
||||
}
|
||||
|
||||
FileInfo fileInfo = this.getFileFolderService().create(
|
||||
websiteParent,
|
||||
this.name,
|
||||
WCMAppModel.TYPE_AVMWEBFOLDER);
|
||||
NodeRef nodeRef = fileInfo.getNodeRef();
|
||||
WebProjectInfo wpInfo = getWebProjectService().createWebProject(this.dnsName, this.name, this.title, this.description, this.webapp, this.isSource, sourceNodeRef);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created website folder node with name: " + this.name);
|
||||
String avmStore = wpInfo.getStoreId();
|
||||
NodeRef wpNodeRef = wpInfo.getNodeRef();
|
||||
|
||||
// TODO: check that this dns is unique by querying existing store properties for a match
|
||||
String avmStore = DNSNameMangler.MakeDNSName(this.dnsName);
|
||||
|
||||
// apply the uifacets aspect - icon, title and description props
|
||||
Map<QName, Serializable> uiFacetsProps = new HashMap<QName, Serializable>(4);
|
||||
uiFacetsProps.put(ApplicationModel.PROP_ICON, AVMUtil.SPACE_ICON_WEBSITE);
|
||||
uiFacetsProps.put(ContentModel.PROP_TITLE, this.title);
|
||||
uiFacetsProps.put(ContentModel.PROP_DESCRIPTION, this.description);
|
||||
getNodeService().addAspect(nodeRef, ApplicationModel.ASPECT_UIFACETS, uiFacetsProps);
|
||||
|
||||
// use as template source flag
|
||||
getNodeService().setProperty(nodeRef, WCMAppModel.PROP_ISSOURCE, this.isSource);
|
||||
|
||||
// set the default webapp name for the project
|
||||
String webapp = (this.webapp != null && this.webapp.length() != 0) ? this.webapp : WEBAPP_DEFAULT;
|
||||
getNodeService().setProperty(nodeRef, WCMAppModel.PROP_DEFAULTWEBAPP, webapp);
|
||||
final NodeRef websiteParent = getWebProjectService().getWebProjectsRoot();
|
||||
|
||||
// call a delegate wizard bean to provide invite user functionality
|
||||
InviteWebsiteUsersWizard wiz = getInviteUsersWizard();
|
||||
wiz.reset();
|
||||
wiz.setNode(new Node(nodeRef));
|
||||
wiz.setNode(new Node(wpNodeRef));
|
||||
wiz.setAvmStore(avmStore);
|
||||
wiz.setStandalone(false);
|
||||
// the wizard is responsible for notifying the invited users, setting the appropriate
|
||||
@@ -261,68 +240,16 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
outcome = wiz.finish();
|
||||
if (outcome != null)
|
||||
{
|
||||
// if the user selected Create From existing web project we will branch from it
|
||||
String branchStoreId = null;
|
||||
if (CREATE_EXISTING.equals(this.createFrom) &&
|
||||
(this.sourceWebProject != null && this.sourceWebProject.length != 0))
|
||||
{
|
||||
NodeRef sourceNodeRef = new NodeRef(this.sourceWebProject[0]);
|
||||
branchStoreId = (String)getNodeService().getProperty(sourceNodeRef, WCMAppModel.PROP_AVMSTORE);
|
||||
}
|
||||
|
||||
// create the AVM staging store to represent the newly created location website
|
||||
this.sandboxInfo = SandboxFactory.createStagingSandbox(avmStore, nodeRef, branchStoreId);
|
||||
|
||||
// create the default webapp folder under the hidden system folders
|
||||
if (branchStoreId == null)
|
||||
{
|
||||
String stagingStore = AVMUtil.buildStagingStoreName(avmStore);
|
||||
String stagingStoreRoot = AVMUtil.buildSandboxRootPath(stagingStore);
|
||||
getAvmService().createDirectory(stagingStoreRoot, webapp);
|
||||
getAvmService().addAspect(AVMNodeConverter.ExtendAVMPath(stagingStoreRoot, webapp),
|
||||
WCMAppModel.ASPECT_WEBAPP);
|
||||
}
|
||||
|
||||
// now the sandbox is created set the permissions masks for the store
|
||||
SandboxFactory.setStagingPermissionMasks(avmStore);
|
||||
|
||||
// set the property on the node to reference the root AVM store
|
||||
getNodeService().setProperty(nodeRef, WCMAppModel.PROP_AVMSTORE, avmStore);
|
||||
|
||||
// persist the forms, templates, workflows, workflow defaults and deployment
|
||||
// config to the model for this web project
|
||||
saveWebProjectModel(nodeRef);
|
||||
saveWebProjectModel(wpNodeRef);
|
||||
|
||||
// navigate to the Websites folder so we can see the newly created folder
|
||||
this.navigator.setCurrentNodeId(websiteParent.getId());
|
||||
|
||||
// inform the locking service about this new instance
|
||||
this.getAvmLockingService().addWebProject(avmStore);
|
||||
|
||||
outcome = AlfrescoNavigationHandler.CLOSE_WIZARD_OUTCOME;
|
||||
|
||||
// Snapshot the store with the empty webapp
|
||||
getAvmService().createSnapshot( avmStore, null, null);
|
||||
}
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.web.bean.dialog.BaseDialogBean#doPostCommitProcessing(javax.faces.context.FacesContext, java.lang.String)
|
||||
*/
|
||||
@Override
|
||||
protected String doPostCommitProcessing(FacesContext context, String outcome)
|
||||
{
|
||||
if (this.sandboxInfo != null)
|
||||
{
|
||||
// update the virtualisation server with the default ROOT webapp path
|
||||
// performed after the main txn has committed successfully
|
||||
String newStoreName = AVMUtil.buildStagingStoreName(sandboxInfo.getMainStoreName());
|
||||
|
||||
String path = AVMUtil.buildStoreWebappPath(newStoreName, WEBAPP_DEFAULT);
|
||||
|
||||
AVMUtil.updateVServerWebapp(path, true);
|
||||
}
|
||||
return outcome;
|
||||
}
|
||||
|
||||
@@ -471,17 +398,14 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
// simple properties are optionally loaded
|
||||
if (loadProperties)
|
||||
{
|
||||
Map<QName, Serializable> props = getNodeService().getProperties(nodeRef);
|
||||
this.name = (String)props.get(ContentModel.PROP_NAME);
|
||||
this.title = (String)props.get(ContentModel.PROP_TITLE);
|
||||
this.description = (String)props.get(ContentModel.PROP_DESCRIPTION);
|
||||
this.dnsName = (String)props.get(WCMAppModel.PROP_AVMSTORE);
|
||||
this.webapp = (String)props.get(WCMAppModel.PROP_DEFAULTWEBAPP);
|
||||
Boolean isSource = (Boolean)props.get(WCMAppModel.PROP_ISSOURCE);
|
||||
if (isSource != null)
|
||||
{
|
||||
this.isSource = isSource.booleanValue();
|
||||
}
|
||||
WebProjectInfo wpInfo = getWebProjectService().getWebProject(nodeRef);
|
||||
this.name = wpInfo.getName();
|
||||
this.title = wpInfo.getTitle();
|
||||
this.description = wpInfo.getDescription();
|
||||
this.dnsName = wpInfo.getStoreId();
|
||||
this.webapp = wpInfo.getDefaultWebApp();
|
||||
this.isSource = wpInfo.isTemplate();
|
||||
this.wpNodeRef = wpInfo.getNodeRef();
|
||||
}
|
||||
|
||||
if (loadUsers)
|
||||
@@ -490,13 +414,11 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
wiz.reset();
|
||||
|
||||
// load the users assigned to the web project
|
||||
List<ChildAssociationRef> userInfoRefs = getNodeService().getChildAssocs(
|
||||
nodeRef, WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
Map<String, String> userRoles = getWebProjectService().listWebUsers(nodeRef);
|
||||
for (Map.Entry<String, String> userRole : userRoles.entrySet())
|
||||
{
|
||||
NodeRef userRef = ref.getChildRef();
|
||||
String username = (String)getNodeService().getProperty(userRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
String userrole = (String)getNodeService().getProperty(userRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
String username = userRole.getKey();
|
||||
String userrole = userRole.getValue();
|
||||
wiz.addAuthorityWithRole(username, userrole);
|
||||
}
|
||||
}
|
||||
@@ -608,23 +530,6 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
// ------------------------------------------------------------------------------
|
||||
// Service setters
|
||||
|
||||
/**
|
||||
* @param avmService The AVMService to set.
|
||||
*/
|
||||
public void setAvmService(AVMService avmService)
|
||||
{
|
||||
this.avmService = avmService;
|
||||
}
|
||||
|
||||
protected AVMService getAvmService()
|
||||
{
|
||||
if (avmService == null)
|
||||
{
|
||||
avmService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getAVMService();
|
||||
}
|
||||
return avmService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param workflowService The WorkflowService to set.
|
||||
*/
|
||||
@@ -658,23 +563,6 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
}
|
||||
return personService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param avmLockingService The AVMLockingService to set
|
||||
*/
|
||||
public void setAvmLockingService(AVMLockingService avmLockingService)
|
||||
{
|
||||
this.avmLockingService = avmLockingService;
|
||||
}
|
||||
|
||||
protected AVMLockingService getAvmLockingService()
|
||||
{
|
||||
if (avmLockingService == null)
|
||||
{
|
||||
avmLockingService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getAVMLockingService();
|
||||
}
|
||||
return avmLockingService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param formsService The FormsService to set.
|
||||
@@ -693,7 +581,22 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
return formsService;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param wpService The WebProjectService to set.
|
||||
*/
|
||||
public void setWebProjectService(final WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = (WebProjectService) FacesHelper.getManagedBean(FacesContext.getCurrentInstance(), "WebProjectService");
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean getters and setters
|
||||
@@ -714,6 +617,14 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
this.editMode = editMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the web project node ref.
|
||||
*/
|
||||
protected NodeRef getWebProjectNodeRef()
|
||||
{
|
||||
return wpNodeRef;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the name.
|
||||
*/
|
||||
@@ -837,7 +748,7 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
}
|
||||
else
|
||||
{
|
||||
if (existingWebProject != null || existingWebProject.length != 0)
|
||||
if (existingWebProject != null && existingWebProject.length != 0)
|
||||
{
|
||||
this.createFromValueChanged = true;
|
||||
}
|
||||
@@ -884,45 +795,22 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
List<UIListItem> webProjects = this.webProjectsList.get();
|
||||
if (webProjects == null)
|
||||
{
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
|
||||
// construct the query to retrieve the web projects
|
||||
String path = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*";
|
||||
StringBuilder query = new StringBuilder(200);
|
||||
query.append("PATH:\"/").append(path).append("\"");
|
||||
query.append(" +TYPE:\"{").append(NamespaceService.WCMAPP_MODEL_1_0_URI).append("}webfolder\"");
|
||||
if (this.showAllSourceProjects == false)
|
||||
List<WebProjectInfo> wps = getWebProjectService().listWebProjects();
|
||||
webProjects = new ArrayList<UIListItem>(wps.size());
|
||||
for (WebProjectInfo wpInfo : wps)
|
||||
{
|
||||
// only query for web project templates by default
|
||||
query.append(" +@").append(Repository.escapeQName(WCMAppModel.PROP_ISSOURCE)).append(":true");
|
||||
}
|
||||
|
||||
ResultSet results = null;
|
||||
try
|
||||
{
|
||||
// execute the query
|
||||
results = getSearchService().query(Repository.getStoreRef(),
|
||||
SearchService.LANGUAGE_LUCENE, query.toString());
|
||||
webProjects = new ArrayList<UIListItem>(results.length());
|
||||
for (ResultSetRow row : results)
|
||||
if ((this.showAllSourceProjects == false) && (! wpInfo.isTemplate()))
|
||||
{
|
||||
NodeRef ref = row.getNodeRef();
|
||||
String name = (String)getNodeService().getProperty(ref, ContentModel.PROP_NAME);
|
||||
String desc = (String)getNodeService().getProperty(ref, ContentModel.PROP_DESCRIPTION);
|
||||
UIListItem item = new UIListItem();
|
||||
item.setLabel(name);
|
||||
item.setDescription(desc);
|
||||
item.setValue(ref.toString());
|
||||
item.setImage(WebResources.IMAGE_WEBPROJECT_32);
|
||||
webProjects.add(item);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (results != null)
|
||||
{
|
||||
results.close();
|
||||
// only query for web project templates by default
|
||||
continue;
|
||||
}
|
||||
|
||||
UIListItem item = new UIListItem();
|
||||
item.setLabel(wpInfo.getName());
|
||||
item.setDescription(wpInfo.getDescription());
|
||||
item.setValue(wpInfo.getNodeRef().toString());
|
||||
item.setImage(WebResources.IMAGE_WEBPROJECT_32);
|
||||
webProjects.add(item);
|
||||
}
|
||||
|
||||
this.webProjectsList.put(webProjects);
|
||||
@@ -1030,7 +918,7 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
if (foundCurrentUser == false)
|
||||
{
|
||||
buf.append(getInviteUsersWizard().buildLabelForUserAuthorityRole(
|
||||
currentUser, AVMUtil.ROLE_CONTENT_MANAGER));
|
||||
currentUser, WCMUtil.ROLE_CONTENT_MANAGER));
|
||||
}
|
||||
|
||||
return buildSummary(
|
||||
@@ -1060,7 +948,7 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
||||
}
|
||||
if (foundCurrentUser == false)
|
||||
{
|
||||
result.add(new UserWrapper(currentUser, AVMUtil.ROLE_CONTENT_MANAGER));
|
||||
result.add(new UserWrapper(currentUser, WCMUtil.ROLE_CONTENT_MANAGER));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -25,16 +25,12 @@
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.List;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.AlfrescoNavigationHandler;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||
@@ -54,10 +50,8 @@ public class DeleteSandboxDialog extends BaseDialogBean
|
||||
|
||||
private static final Log logger = LogFactory.getLog(DeleteSandboxDialog.class);
|
||||
|
||||
transient private AVMService avmService;
|
||||
protected AVMBrowseBean avmBrowseBean;
|
||||
transient private AVMLockingService avmLockingService;
|
||||
|
||||
transient private WebProjectService wpService;
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean property getters and setters
|
||||
@@ -69,42 +63,21 @@ public class DeleteSandboxDialog extends BaseDialogBean
|
||||
{
|
||||
this.avmBrowseBean = avmBrowseBean;
|
||||
}
|
||||
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param avmService The avmService to set.
|
||||
*/
|
||||
public void setAvmService(AVMService avmService)
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
this.avmService = avmService;
|
||||
}
|
||||
|
||||
protected AVMService getAvmService()
|
||||
{
|
||||
if (avmService == null)
|
||||
if (wpService == null)
|
||||
{
|
||||
avmService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getAVMService();
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return avmService;
|
||||
return wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param avmLockingService The AVMLockingService to set
|
||||
*/
|
||||
public void setAvmLockingService(AVMLockingService avmLockingService)
|
||||
{
|
||||
this.avmLockingService = avmLockingService;
|
||||
}
|
||||
|
||||
protected AVMLockingService getAvmLockingService()
|
||||
{
|
||||
if (avmLockingService == null)
|
||||
{
|
||||
avmLockingService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getAVMLockingService();
|
||||
}
|
||||
return avmLockingService;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Dialog implementation
|
||||
|
||||
@@ -112,76 +85,26 @@ public class DeleteSandboxDialog extends BaseDialogBean
|
||||
protected String finishImpl(FacesContext context, String outcome)
|
||||
throws Exception
|
||||
{
|
||||
// the username for the sandbox to delete
|
||||
// the username for the sandbox to delete (also uninvites from the web project)
|
||||
String username = this.avmBrowseBean.getUsername();
|
||||
if (username != null)
|
||||
{
|
||||
Node website = this.avmBrowseBean.getWebsite();
|
||||
String storeRoot = (String)website.getProperties().get(WCMAppModel.PROP_AVMSTORE);
|
||||
String mainStore = AVMUtil.buildUserMainStoreName(storeRoot, username);
|
||||
|
||||
// remove the store reference from the website folder meta-data
|
||||
List<ChildAssociationRef> userInfoRefs = this.getNodeService().getChildAssocs(
|
||||
website.getNodeRef(),
|
||||
WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
{
|
||||
NodeRef userInfoRef = ref.getChildRef();
|
||||
String user = (String)getNodeService().getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
|
||||
if (username.equals(user))
|
||||
{
|
||||
// found the sandbox to remove
|
||||
String path = AVMUtil.buildStoreWebappPath(mainStore, this.avmBrowseBean.getWebapp());
|
||||
|
||||
// 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.
|
||||
AVMUtil.removeAllVServerWebapps(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 the user main sandbox store from the system
|
||||
this.getAvmService().purgeStore(mainStore);
|
||||
// remove any locks this user may have
|
||||
this.getAvmLockingService().removeStoreLocks(mainStore);
|
||||
|
||||
// purge the user preview sandbox store from the system
|
||||
String previewStore = AVMUtil.buildUserPreviewStoreName(storeRoot, username);
|
||||
this.getAvmService().purgeStore(previewStore);
|
||||
// remove any locks this user may have
|
||||
this.getAvmLockingService().removeStoreLocks(previewStore);
|
||||
|
||||
// remove the association to this web project user meta-data
|
||||
this.getNodeService().removeChild(website.getNodeRef(), ref.getChildRef());
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
getWebProjectService().uninviteWebUser(website.getNodeRef(), username);
|
||||
|
||||
String wpStoreId = getWebProjectService().getWebProject(website.getNodeRef()).getStoreId();
|
||||
String mainStore = AVMUtil.buildUserMainStoreName(wpStoreId, username);
|
||||
|
||||
// if the sandbox is allocated to a test server release it
|
||||
NodeRef testServer = DeploymentUtil.findAllocatedTestServer(mainStore);
|
||||
if (testServer != null)
|
||||
{
|
||||
getNodeService().setProperty(testServer, WCMAppModel.PROP_DEPLOYSERVERALLOCATEDTO, null);
|
||||
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Released test server from user sandbox: " + mainStore);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -24,17 +24,9 @@
|
||||
*/
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.spaces.DeleteSpaceDialog;
|
||||
@@ -48,27 +40,23 @@ public class DeleteWebsiteDialog extends DeleteSpaceDialog
|
||||
{
|
||||
private static final long serialVersionUID = -3598950865168230942L;
|
||||
|
||||
transient private AVMService avmService;
|
||||
transient private WebProjectService wpService;
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean property getters and setters
|
||||
|
||||
/**
|
||||
* @param avmService
|
||||
* The AVMService to set.
|
||||
*/
|
||||
public void setAvmService(AVMService avmService)
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.avmService = avmService;
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected AVMService getAvmService()
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (avmService == null)
|
||||
{
|
||||
avmService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getAVMService();
|
||||
}
|
||||
return avmService;
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
@@ -80,88 +68,14 @@ public class DeleteWebsiteDialog extends DeleteSpaceDialog
|
||||
@Override
|
||||
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
||||
{
|
||||
Node websiteNode = this.browseBean.getActionSpace();
|
||||
Node websiteNode = this.browseBean.getActionSpace();
|
||||
|
||||
if (websiteNode != null)
|
||||
{
|
||||
// delete all attached website sandboxes in reverse order to the layering
|
||||
String storeRoot = (String) websiteNode.getProperties().get(WCMAppModel.PROP_AVMSTORE);
|
||||
|
||||
if (storeRoot != null)
|
||||
{
|
||||
// Notifiy virtualization server about removing this website
|
||||
//
|
||||
// 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 staging 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.
|
||||
//
|
||||
// It does not matter what webapp name we give here, so "/ROOT"
|
||||
// is as sensible as anything else. It's all going away.
|
||||
|
||||
String sandbox = AVMUtil.buildStagingStoreName(storeRoot);
|
||||
String path = AVMUtil.buildStoreWebappPath(sandbox, "/ROOT");
|
||||
AVMUtil.removeAllVServerWebapps(path, true);
|
||||
|
||||
// get the list of users who have a sandbox in the website
|
||||
List<ChildAssociationRef> userInfoRefs = getNodeService().getChildAssocs(websiteNode.getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
{
|
||||
String username = (String) getNodeService().getProperty(ref.getChildRef(), WCMAppModel.PROP_WEBUSERNAME);
|
||||
|
||||
// delete the preview store for this user
|
||||
deleteStore(AVMUtil.buildUserPreviewStoreName(storeRoot, username));
|
||||
|
||||
// delete the main store for this user
|
||||
deleteStore(AVMUtil.buildUserMainStoreName(storeRoot, username));
|
||||
}
|
||||
|
||||
// remove the main staging and preview stores
|
||||
deleteStore(AVMUtil.buildStagingPreviewStoreName(storeRoot));
|
||||
deleteStore(AVMUtil.buildStagingStoreName(storeRoot));
|
||||
}
|
||||
}
|
||||
|
||||
// use the super implementation to delete the node itself
|
||||
return super.finishImpl(context, outcome);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a store, checking for its existance first.
|
||||
*
|
||||
* @param store
|
||||
*/
|
||||
private void deleteStore(final String store)
|
||||
{
|
||||
// check it exists before we try to remove it
|
||||
if (this.getAvmService().getStore(store) != null)
|
||||
{
|
||||
if (SandboxFactory.isContentManager(store))
|
||||
{
|
||||
AuthenticationUtil.runAs(new RunAsWork<Object>(){
|
||||
|
||||
public Object doWork() throws Exception
|
||||
{
|
||||
DeleteWebsiteDialog.this.getAvmService().purgeStore(store);
|
||||
return null;
|
||||
}}, AuthenticationUtil.getSystemUserName());
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new AccessDeniedException("Only content managers may delete websites");
|
||||
}
|
||||
}
|
||||
if (websiteNode != null)
|
||||
{
|
||||
getWebProjectService().deleteWebProject(websiteNode.getNodeRef());
|
||||
}
|
||||
|
||||
return super.finishImpl(context, outcome);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -33,10 +33,10 @@ import javax.faces.model.SelectItem;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.wcm.webproject.WebProjectInfo;
|
||||
import org.alfresco.web.app.AlfrescoNavigationHandler;
|
||||
|
||||
/**
|
||||
@@ -89,15 +89,12 @@ public class EditWebsiteWizard extends CreateWebsiteWizard
|
||||
{
|
||||
if (this.webappsList == null)
|
||||
{
|
||||
// get directory listing to show webapps that can be selected
|
||||
Map<String, AVMNodeDescriptor> dirs = this.getAvmService().getDirectoryListing(
|
||||
-1, AVMUtil.buildSandboxRootPath(this.dnsName));
|
||||
|
||||
// create list of webapps
|
||||
this.webappsList = new ArrayList<SelectItem>(dirs.size());
|
||||
for (String dirName : dirs.keySet())
|
||||
List<String> webApps = getWebProjectService().listWebApps(getWebProjectNodeRef());
|
||||
this.webappsList = new ArrayList<SelectItem>(webApps.size());
|
||||
for (String webAppName : webApps)
|
||||
{
|
||||
this.webappsList.add(new SelectItem(dirName, dirName));
|
||||
this.webappsList.add(new SelectItem(webAppName, webAppName));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,11 +109,16 @@ public class EditWebsiteWizard extends CreateWebsiteWizard
|
||||
{
|
||||
NodeRef nodeRef = this.browseBean.getActionSpace().getNodeRef();
|
||||
|
||||
WebProjectInfo wpInfo = getWebProjectService().getWebProject(nodeRef);
|
||||
|
||||
// apply the name, title and description props
|
||||
getNodeService().setProperty(nodeRef, ContentModel.PROP_NAME, this.name);
|
||||
getNodeService().setProperty(nodeRef, ContentModel.PROP_TITLE, this.title);
|
||||
getNodeService().setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, this.description);
|
||||
getNodeService().setProperty(nodeRef, WCMAppModel.PROP_ISSOURCE, this.isSource);
|
||||
|
||||
wpInfo.setName(this.name);
|
||||
wpInfo.setTitle(this.title);
|
||||
wpInfo.setDescription(this.description);
|
||||
wpInfo.setIsTemplate(this.isSource);
|
||||
|
||||
getWebProjectService().updateWebProject(wpInfo);
|
||||
|
||||
// clear the existing settings for forms, template, workflows and deployment - then
|
||||
// the existing methods can be used to apply the modified and previous settings from scratch
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -24,26 +24,18 @@
|
||||
*/
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.security.AuthorityType;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.wcm.util.WCMUtil;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wizard.BaseInviteUsersWizard;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
|
||||
@@ -68,19 +60,21 @@ public class InviteWebsiteUsersWizard extends BaseInviteUsersWizard
|
||||
/** assume we are launching the wizard standalone */
|
||||
private boolean standalone = true;
|
||||
|
||||
/** AVM Browse Bean reference */
|
||||
protected AVMBrowseBean avmBrowseBean;
|
||||
transient private WebProjectService wpService;
|
||||
|
||||
|
||||
/** Data for virtualization server notification */
|
||||
private List<SandboxInfo> sandboxInfoList;
|
||||
|
||||
|
||||
/**
|
||||
* @param avmBrowseBean The AVMBrowseBean to set.
|
||||
*/
|
||||
public void setAvmBrowseBean(AVMBrowseBean avmBrowseBean)
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.avmBrowseBean = avmBrowseBean;
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -114,205 +108,17 @@ public class InviteWebsiteUsersWizard extends BaseInviteUsersWizard
|
||||
{
|
||||
super.finishImpl(context, outcome);
|
||||
|
||||
// break the permissions inheritance on the node so that only assigned users can access it
|
||||
NodeRef nodeRef = this.getNode().getNodeRef();
|
||||
this.getPermissionService().setInheritParentPermissions(nodeRef, false);
|
||||
|
||||
// create a sandbox for each user appropriately with permissions based on role
|
||||
// build a list of managers who will have full permissions on ALL staging areas
|
||||
List<String> managers = new ArrayList<String>(4);
|
||||
Set<String> existingUsers = new HashSet(8);
|
||||
if (isStandalone() == false)
|
||||
{
|
||||
// no website created yet - so we need to build the list of managers from the
|
||||
// invited users and the power user who is executing the create web project wizard
|
||||
boolean foundCurrentUser = false;
|
||||
String currentUser = Application.getCurrentUser(context).getUserName();
|
||||
|
||||
for (UserGroupRole userRole : this.userGroupRoles)
|
||||
{
|
||||
for (String userAuth : findNestedUserAuthorities(userRole.getAuthority()))
|
||||
{
|
||||
if (currentUser.equals(userAuth))
|
||||
{
|
||||
foundCurrentUser = true;
|
||||
}
|
||||
if (AVMUtil.ROLE_CONTENT_MANAGER.equals(userRole.getRole()))
|
||||
{
|
||||
managers.add(userAuth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (foundCurrentUser == false)
|
||||
{
|
||||
this.userGroupRoles.add(new UserGroupRole(currentUser, AVMUtil.ROLE_CONTENT_MANAGER, null));
|
||||
managers.add(currentUser);
|
||||
|
||||
// assign permissions explicitly for the current user
|
||||
this.getPermissionService().setPermission(
|
||||
nodeRef,
|
||||
currentUser,
|
||||
AVMUtil.ROLE_CONTENT_MANAGER,
|
||||
true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// website already exists - we are only adding to the existing sandboxes
|
||||
// so retrieve the list of managers from the existing users and the selected invitees
|
||||
for (UserGroupRole userRole : this.userGroupRoles)
|
||||
{
|
||||
for (String userAuth : findNestedUserAuthorities(userRole.getAuthority()))
|
||||
{
|
||||
if (AVMUtil.ROLE_CONTENT_MANAGER.equals(userRole.getRole()))
|
||||
{
|
||||
managers.add(userAuth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<ChildAssociationRef> userInfoRefs = this.getNodeService().getChildAssocs(
|
||||
getNode().getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
{
|
||||
NodeRef userInfoRef = ref.getChildRef();
|
||||
String username = (String)getNodeService().getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
String userrole = (String)getNodeService().getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
|
||||
if (AVMUtil.ROLE_CONTENT_MANAGER.equals(userrole) &&
|
||||
managers.contains(username) == false)
|
||||
{
|
||||
managers.add(username);
|
||||
}
|
||||
|
||||
// add each existing user to the exclude this - we cannot add them more than once!
|
||||
existingUsers.add(username);
|
||||
}
|
||||
}
|
||||
|
||||
// build the sandboxes now we have the manager list and complete user list
|
||||
// and create an association to a node to represent each invited user
|
||||
this.sandboxInfoList = new LinkedList<SandboxInfo>();
|
||||
|
||||
boolean managersUpdateRequired = false;
|
||||
Map<String, String> selectedInvitees = new HashMap<String, String>(this.userGroupRoles.size());
|
||||
for (UserGroupRole userRole : this.userGroupRoles)
|
||||
{
|
||||
for (String userAuth : findNestedUserAuthorities(userRole.getAuthority()))
|
||||
{
|
||||
// create the sandbox if the invited user does not already have one
|
||||
if (existingUsers.contains(userAuth) == false)
|
||||
{
|
||||
SandboxInfo info = SandboxFactory.createUserSandbox(
|
||||
getAvmStore(), managers, userAuth, userRole.getRole());
|
||||
|
||||
SandboxFactory.addStagingAreaUser(getAvmStore(), userAuth, userRole.getRole());
|
||||
|
||||
this.sandboxInfoList.add(info);
|
||||
|
||||
// create an app:webuser instance for each authority and assoc to the website node
|
||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(2, 1.0f);
|
||||
props.put(WCMAppModel.PROP_WEBUSERNAME, userAuth);
|
||||
props.put(WCMAppModel.PROP_WEBUSERROLE, userRole.getRole());
|
||||
this.getNodeService().createNode(getNode().getNodeRef(),
|
||||
WCMAppModel.ASSOC_WEBUSER,
|
||||
WCMAppModel.ASSOC_WEBUSER,
|
||||
WCMAppModel.TYPE_WEBUSER,
|
||||
props);
|
||||
|
||||
// if this new user is a manager, we'll need to update the manager permissions applied
|
||||
// to each existing user sandbox - to ensure that new managers have access to them
|
||||
managersUpdateRequired |= (AVMUtil.ROLE_CONTENT_MANAGER.equals(userRole.getRole()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isStandalone() == true && managersUpdateRequired == true)
|
||||
{
|
||||
// walk existing sandboxes and reapply manager permissions to include any new manager users
|
||||
List<ChildAssociationRef> userInfoRefs = this.getNodeService().getChildAssocs(
|
||||
getNode().getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
{
|
||||
NodeRef userInfoRef = ref.getChildRef();
|
||||
String username = (String)getNodeService().getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
if (existingUsers.contains(username))
|
||||
{
|
||||
// only need to modify the sandboxes we haven't just created
|
||||
SandboxFactory.updateSandboxManagers(getAvmStore(), managers, username);
|
||||
}
|
||||
}
|
||||
SandboxFactory.updateStagingAreaManagers(getAvmStore(), getNode().getNodeRef(), managers);
|
||||
selectedInvitees.put(userRole.getAuthority(), userRole.getRole());
|
||||
}
|
||||
|
||||
getWebProjectService().inviteWebUsersGroups(this.getNode().getNodeRef(), selectedInvitees);
|
||||
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle notification to the virtualization server
|
||||
* (this needs to occur after the sandbox is created in the main txn).
|
||||
*/
|
||||
@Override
|
||||
protected String doPostCommitProcessing(FacesContext context, String outcome)
|
||||
{
|
||||
// reload virtualisation server for webapp in this web project
|
||||
if (isStandalone())
|
||||
{
|
||||
for (SandboxInfo sandboxInfo : this.sandboxInfoList)
|
||||
{
|
||||
String newlyInvitedStoreName = AVMUtil.buildStagingStoreName(
|
||||
sandboxInfo.getMainStoreName());
|
||||
|
||||
String path = AVMUtil.buildStoreWebappPath(
|
||||
newlyInvitedStoreName, this.avmBrowseBean.getWebapp());
|
||||
|
||||
AVMUtil.updateVServerWebapp(path, true);
|
||||
}
|
||||
}
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all nested user authorities contained with an authority
|
||||
*
|
||||
* @param authority The authority to search, USER authorities are returned immediately, GROUP authorites
|
||||
* are recursively scanned for contained USER authorities.
|
||||
*
|
||||
* @return a Set of USER authorities
|
||||
*/
|
||||
private Set<String> findNestedUserAuthorities(String authority)
|
||||
{
|
||||
Set<String> users;
|
||||
|
||||
AuthorityType authType = AuthorityType.getAuthorityType(authority);
|
||||
if (authType.equals(AuthorityType.USER))
|
||||
{
|
||||
users = new HashSet<String>(1, 1.0f);
|
||||
if (this.getPersonService().personExists(authority) == true)
|
||||
{
|
||||
users.add(authority);
|
||||
}
|
||||
}
|
||||
else if (authType.equals(AuthorityType.GROUP))
|
||||
{
|
||||
// walk each member of the group
|
||||
users = this.getAuthorityService().getContainedAuthorities(AuthorityType.USER, authority, false);
|
||||
for (String userAuth : users)
|
||||
{
|
||||
if (this.getPersonService().personExists(userAuth) == false)
|
||||
{
|
||||
users.remove(authType);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
users = Collections.<String>emptySet();
|
||||
}
|
||||
|
||||
return users;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return summary text for the wizard
|
||||
*/
|
||||
@@ -336,7 +142,7 @@ public class InviteWebsiteUsersWizard extends BaseInviteUsersWizard
|
||||
if (isStandalone() == false && foundCurrentUser == false)
|
||||
{
|
||||
buf.append(buildLabelForUserAuthorityRole(
|
||||
currentUser, AVMUtil.ROLE_CONTENT_MANAGER));
|
||||
currentUser, WCMUtil.ROLE_CONTENT_MANAGER));
|
||||
}
|
||||
|
||||
return buildSummary(
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -35,7 +35,7 @@ import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.WCMModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.sandbox.SandboxConstants;
|
||||
import org.alfresco.wcm.sandbox.SandboxConstants;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.locking.AVMLock;
|
||||
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
|
||||
@@ -269,7 +269,7 @@ public class ManageChangeRequestTaskDialog extends ManageTaskDialog
|
||||
String userStoreName = AVMUtil.getStoreName(userStoreAvmPath);
|
||||
String stagingStoreName = this.getAvmService().getStoreProperty(userStoreName,
|
||||
SandboxConstants.PROP_WEBSITE_NAME).getStringValue();
|
||||
NodeRef webProjectRef = AVMUtil.getWebProjectNodeFromStore(stagingStoreName);
|
||||
NodeRef webProjectRef = getWebProjectService().findWebProjectNodeFromStore(stagingStoreName);
|
||||
|
||||
// update the UI context to the web project
|
||||
this.browseBean.clickSpace(webProjectRef);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -85,7 +85,7 @@ public class ManageReviewTaskDialog extends ManageTaskDialog
|
||||
|
||||
// get the web project noderef for the workflow store
|
||||
String stagingStore = AVMUtil.getStoreId(this.store);
|
||||
this.webProjectRef = AVMUtil.getWebProjectNodeFromStore(stagingStore);
|
||||
this.webProjectRef = getWebProjectService().findWebProjectNodeFromStore(stagingStore);
|
||||
|
||||
PropertyValue val = this.getAvmService().getStoreProperty(this.store,
|
||||
SandboxConstants.PROP_LINK_VALIDATION_REPORT);
|
||||
|
@@ -47,10 +47,14 @@ import org.alfresco.service.cmr.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
||||
import org.alfresco.service.cmr.search.SearchParameters;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.wcm.webproject.WebProjectInfo;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wizard.BaseWizardBean;
|
||||
import org.alfresco.web.data.IDataContainer;
|
||||
import org.alfresco.web.data.QuickSort;
|
||||
import org.alfresco.web.forms.Form;
|
||||
import org.alfresco.web.forms.FormInstanceData;
|
||||
import org.alfresco.web.forms.FormNotFoundException;
|
||||
@@ -80,6 +84,7 @@ public class RegenerateRenditionsWizard
|
||||
|
||||
private final static Log LOGGER = LogFactory.getLog(RegenerateRenditionsWizard.class);
|
||||
|
||||
transient protected WebProjectService wpService;
|
||||
transient private AVMLockingService avmLockingService;
|
||||
transient private AVMService avmService;
|
||||
transient private AVMSyncService avmSyncService;
|
||||
@@ -235,16 +240,20 @@ public class RegenerateRenditionsWizard
|
||||
|
||||
public List<SelectItem> getWebProjectChoices()
|
||||
{
|
||||
final List<WebProject> webProjects = WebProject.getWebProjects();
|
||||
final List<SelectItem> result = new ArrayList<SelectItem>(webProjects.size());
|
||||
for (final WebProject wp : webProjects)
|
||||
List<WebProjectInfo> wpInfos = getWebProjectService().listWebProjects();
|
||||
List<SelectItem> result = new ArrayList<SelectItem>(wpInfos.size());
|
||||
|
||||
QuickSort sorter = new QuickSort((List<WebProjectInfo>)wpInfos, "name", true, IDataContainer.SORT_CASEINSENSITIVE);
|
||||
sorter.sort();
|
||||
|
||||
for (WebProjectInfo wpInfo : wpInfos)
|
||||
{
|
||||
final String s = wp.getTitle();
|
||||
String s = wpInfo.getTitle();
|
||||
if (this.selectedWebProject == null)
|
||||
{
|
||||
this.selectedWebProject = wp;
|
||||
this.selectedWebProject = new WebProject(wpInfo.getNodeRef());
|
||||
}
|
||||
result.add(new SelectItem(wp.getNodeRef().toString(), s != null && s.length() != 0 ? s : wp.getName()));
|
||||
result.add(new SelectItem(wpInfo.getNodeRef().toString(), s != null && s.length() != 0 ? s : wpInfo.getName()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -362,6 +371,23 @@ public class RegenerateRenditionsWizard
|
||||
// ------------------------------------------------------------------------------
|
||||
// Service Injection
|
||||
|
||||
/**
|
||||
* @param wpService The WebProjectService to set.
|
||||
*/
|
||||
public void setWebProjectService(WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getWebProjectService();
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param avmService The AVMService to set.
|
||||
*/
|
||||
|
@@ -1,665 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program 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 General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
* As a special exception to the terms and conditions of version 2.0 of
|
||||
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||
* FLOSS exception. You should have recieved a copy of the text describing
|
||||
* the FLOSS exception, and it is also available here:
|
||||
* http://www.alfresco.com/legal/licensing"
|
||||
*/
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.config.JNDIConstants;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.domain.PropertyValue;
|
||||
import org.alfresco.sandbox.SandboxConstants;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
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.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.User;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Helper factory to create AVM sandbox structures.
|
||||
*
|
||||
* @author Kevin Roast
|
||||
*/
|
||||
public final class SandboxFactory
|
||||
{
|
||||
private static Log logger = LogFactory.getLog(SandboxFactory.class);
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
*/
|
||||
private SandboxFactory()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the staging sandbox for the named store.
|
||||
*
|
||||
* A staging sandbox is comprised of two stores, the first named 'storename-staging' with a
|
||||
* preview store named 'storename-preview' layered over the staging store.
|
||||
*
|
||||
* Various store meta-data properties are set including:
|
||||
* Identifier for store-types: .sandbox.staging.main and .sandbox.staging.preview
|
||||
* Store-id: .sandbox-id.<guid> (unique across all stores in the sandbox)
|
||||
* DNS: .dns.<store> = <path-to-webapps-root>
|
||||
* Website Name: .website.name = website name
|
||||
*
|
||||
* @param storeId The store name to create the sandbox for.
|
||||
* @param webProjectNodeRef The noderef for the webproject.
|
||||
* @param branchStoreId The ID of the store to branch this staging store from.
|
||||
*/
|
||||
public static SandboxInfo createStagingSandbox(String storeId,
|
||||
NodeRef webProjectNodeRef,
|
||||
String branchStoreId)
|
||||
{
|
||||
ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
AVMService avmService = services.getAVMService();
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
// create the 'staging' store for the website
|
||||
String stagingStoreName = AVMUtil.buildStagingStoreName(storeId);
|
||||
avmService.createStore(stagingStoreName);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created staging sandbox store: " + stagingStoreName);
|
||||
|
||||
// we can either branch from an existing staging store or create a new structure
|
||||
if (branchStoreId != null)
|
||||
{
|
||||
String branchStorePath = AVMUtil.buildStagingStoreName(branchStoreId) + ":/" +
|
||||
JNDIConstants.DIR_DEFAULT_WWW;
|
||||
avmService.createBranch(-1, branchStorePath,
|
||||
stagingStoreName + ":/", JNDIConstants.DIR_DEFAULT_WWW);
|
||||
}
|
||||
else
|
||||
{
|
||||
// create the system directories 'www' and 'avm_webapps'
|
||||
avmService.createDirectory(stagingStoreName + ":/", JNDIConstants.DIR_DEFAULT_WWW);
|
||||
avmService.createDirectory(AVMUtil.buildStoreRootPath(stagingStoreName),
|
||||
JNDIConstants.DIR_DEFAULT_APPBASE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set staging area permissions
|
||||
SandboxFactory.setStagingPermissions(storeId, webProjectNodeRef);
|
||||
|
||||
// Add permissions for layers
|
||||
|
||||
// tag the store with the store type
|
||||
avmService.setStoreProperty(stagingStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_STAGING_MAIN,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
avmService.setStoreProperty(stagingStoreName,
|
||||
SandboxConstants.PROP_WEB_PROJECT_NODE_REF,
|
||||
new PropertyValue(DataTypeDefinition.NODE_REF, webProjectNodeRef));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
tagStoreDNSPath(avmService, stagingStoreName, storeId);
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(stagingStoreName, null, null);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// create the 'preview' store for the website
|
||||
String previewStoreName = AVMUtil.buildStagingPreviewStoreName(storeId);
|
||||
avmService.createStore(previewStoreName);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created staging preview sandbox store: " + previewStoreName +
|
||||
" above " + stagingStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the staging area
|
||||
avmService.createLayeredDirectory(AVMUtil.buildStoreRootPath(stagingStoreName),
|
||||
previewStoreName + ":/",
|
||||
JNDIConstants.DIR_DEFAULT_WWW);
|
||||
|
||||
|
||||
// apply READ permissions for all users
|
||||
//dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(previewStoreName));
|
||||
//permissionService.setPermission(dirRef, PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
|
||||
// tag the store with the store type
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_STAGING_PREVIEW,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
tagStoreDNSPath(avmService, previewStoreName, storeId, "preview");
|
||||
|
||||
// The preview store depends on the main staging store (dist=1)
|
||||
tagStoreBackgroundLayer(avmService,previewStoreName,stagingStoreName,1);
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(previewStoreName, null, null);
|
||||
|
||||
|
||||
// tag all related stores to indicate that they are part of a single sandbox
|
||||
final QName sandboxIdProp = QName.createQName(SandboxConstants.PROP_SANDBOXID + GUID.generate());
|
||||
avmService.setStoreProperty(stagingStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
dumpStoreProperties(avmService, stagingStoreName);
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
|
||||
return new SandboxInfo( new String[] { stagingStoreName, previewStoreName } );
|
||||
}
|
||||
|
||||
public static void setStagingPermissions(String storeId,
|
||||
NodeRef webProjectNodeRef)
|
||||
{
|
||||
ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
NodeService nodeService = services.getNodeService();
|
||||
|
||||
String storeName = AVMUtil.buildStagingStoreName(storeId);
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.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);
|
||||
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);
|
||||
|
||||
permissionService.setPermission(dirRef, username, userrole, true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setStagingPermissionMasks(String storeId)
|
||||
{
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
ServiceRegistry services = Repository.getServiceRegistry(context);
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
String storeName = AVMUtil.buildStagingStoreName(storeId);
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(storeName));
|
||||
|
||||
// apply READ permissions for all users
|
||||
permissionService.setPermission(dirRef, PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
|
||||
// Set store permission masks
|
||||
String currentUser = Application.getCurrentUser(context).getUserName();
|
||||
permissionService.setPermission(dirRef.getStoreRef(), currentUser, PermissionService.CHANGE_PERMISSIONS, true);
|
||||
permissionService.setPermission(dirRef.getStoreRef(), currentUser, PermissionService.READ_PERMISSIONS, true);
|
||||
permissionService.setPermission(dirRef.getStoreRef(), PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
}
|
||||
|
||||
public static void updateStagingAreaManagers(String storeId,
|
||||
NodeRef webProjectNodeRef, final List<String> managers)
|
||||
{
|
||||
// The stores have the mask set in updateSandboxManagers
|
||||
String storeName = AVMUtil.buildStagingStoreName(storeId);
|
||||
ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(storeName));
|
||||
for (String manager : managers)
|
||||
{
|
||||
permissionService.setPermission(dirRef, manager, AVMUtil.ROLE_CONTENT_MANAGER, true);
|
||||
|
||||
// give the manager change permissions permission in the staging area store
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager,
|
||||
PermissionService.CHANGE_PERMISSIONS, true);
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager,
|
||||
PermissionService.READ_PERMISSIONS, true);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isContentManager(String storeId)
|
||||
{
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
ServiceRegistry services = Repository.getServiceRegistry(context);
|
||||
AVMService avmService = services.getAVMService();
|
||||
|
||||
String storeName = extractStagingAreaName(storeId);
|
||||
PropertyValue pValue = avmService.getStoreProperty(storeName, SandboxConstants.PROP_WEB_PROJECT_NODE_REF);
|
||||
|
||||
if (pValue != null)
|
||||
{
|
||||
NodeRef webProjectNodeRef = (NodeRef) pValue.getValue(DataTypeDefinition.NODE_REF);
|
||||
|
||||
User currentUser = Application.getCurrentUser(context);
|
||||
String currentUserRole = WebProject.getWebProjectUserRole(webProjectNodeRef, currentUser);
|
||||
return AVMUtil.ROLE_CONTENT_MANAGER.equals(currentUserRole);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static String extractStagingAreaName(String name)
|
||||
{
|
||||
int index = name.indexOf("--");
|
||||
if (index == -1)
|
||||
{
|
||||
return name;
|
||||
}
|
||||
return name.substring(0, index);
|
||||
}
|
||||
|
||||
public static void addStagingAreaUser(String storeId, String authority, String role)
|
||||
{
|
||||
// The stores have the mask set in updateSandboxManagers
|
||||
String storeName = AVMUtil.buildStagingStoreName(storeId);
|
||||
ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(storeName));
|
||||
permissionService.setPermission(dirRef, authority, role, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a user sandbox for the named store.
|
||||
*
|
||||
* A user sandbox is comprised of two stores, the first
|
||||
* named 'storename--username' layered over the staging store with a preview store
|
||||
* named 'storename--username--preview' layered over the main store.
|
||||
*
|
||||
* Various store meta-data properties are set including:
|
||||
* Identifier for store-types: .sandbox.author.main and .sandbox.author.preview
|
||||
* Store-id: .sandbox-id.<guid> (unique across all stores in the sandbox)
|
||||
* DNS: .dns.<store> = <path-to-webapps-root>
|
||||
* Website Name: .website.name = website name
|
||||
*
|
||||
* @param storeId The store id to create the sandbox for
|
||||
* @param managers The list of authorities who have ContentManager role in the website
|
||||
* @param username Username of the user to create the sandbox for
|
||||
* @param role Role permission for the user
|
||||
* @return Summary information regarding the sandbox
|
||||
*/
|
||||
public static SandboxInfo createUserSandbox(String storeId,
|
||||
List<String> managers,
|
||||
String username,
|
||||
String role)
|
||||
{
|
||||
ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
AVMService avmService = services.getAVMService();
|
||||
PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
// create the user 'main' store
|
||||
String userStoreName = AVMUtil.buildUserMainStoreName(storeId, username);
|
||||
String previewStoreName = AVMUtil.buildUserPreviewStoreName(storeId, username);
|
||||
|
||||
if (avmService.getStore(userStoreName) != null)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Not creating as store already exists: " + userStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { userStoreName, previewStoreName } );
|
||||
}
|
||||
|
||||
avmService.createStore(userStoreName);
|
||||
String stagingStoreName = AVMUtil.buildStagingStoreName(storeId);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created user sandbox store: " + userStoreName +
|
||||
" above staging store " + stagingStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the staging area
|
||||
avmService.createLayeredDirectory(AVMUtil.buildStoreRootPath(stagingStoreName),
|
||||
userStoreName + ":/",
|
||||
JNDIConstants.DIR_DEFAULT_WWW);
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(userStoreName));
|
||||
|
||||
// Apply access mask to the store (ACls are applie to the staging area)
|
||||
|
||||
// apply the user role permissions to the sandbox
|
||||
permissionService.setPermission(dirRef.getStoreRef(), username, PermissionService.ALL_PERMISSIONS, true);
|
||||
permissionService.setPermission(dirRef.getStoreRef(), PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
// apply the manager role permission for each manager in the web project
|
||||
for (String manager : managers)
|
||||
{
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager, AVMUtil.ROLE_CONTENT_MANAGER, true);
|
||||
}
|
||||
|
||||
// tag the store with the store type
|
||||
avmService.setStoreProperty(userStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_AUTHOR_MAIN,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the base name of the website so that corresponding
|
||||
// staging areas can be found.
|
||||
avmService.setStoreProperty(userStoreName,
|
||||
SandboxConstants.PROP_WEBSITE_NAME,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, storeId));
|
||||
|
||||
// tag the store, oddly enough, with its own store name for querying.
|
||||
avmService.setStoreProperty(userStoreName,
|
||||
QName.createQName(null, SandboxConstants.PROP_SANDBOX_STORE_PREFIX + userStoreName),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
tagStoreDNSPath(avmService, userStoreName, storeId, username);
|
||||
|
||||
// The user store depends on the main staging store (dist=1)
|
||||
tagStoreBackgroundLayer(avmService,userStoreName,stagingStoreName,1);
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(userStoreName, null, null);
|
||||
|
||||
// create the user 'preview' store
|
||||
avmService.createStore(previewStoreName);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created user preview sandbox store: " + previewStoreName +
|
||||
" above " + userStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the user 'main' store
|
||||
avmService.createLayeredDirectory(AVMUtil.buildStoreRootPath(userStoreName),
|
||||
previewStoreName + ":/",
|
||||
JNDIConstants.DIR_DEFAULT_WWW);
|
||||
dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(previewStoreName));
|
||||
|
||||
// Apply access mask to the store (ACls are applied to the staging area)
|
||||
|
||||
// apply the user role permissions to the sandbox
|
||||
permissionService.setPermission(dirRef.getStoreRef(), username, PermissionService.ALL_PERMISSIONS, true);
|
||||
permissionService.setPermission(dirRef.getStoreRef(), PermissionService.ALL_AUTHORITIES, PermissionService.READ, true);
|
||||
// apply the manager role permission for each manager in the web project
|
||||
for (String manager : managers)
|
||||
{
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager, AVMUtil.ROLE_CONTENT_MANAGER, true);
|
||||
}
|
||||
|
||||
// tag the store with the store type
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_AUTHOR_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
|
||||
tagStoreDNSPath(avmService, previewStoreName, storeId, username, "preview");
|
||||
|
||||
// The preview user store depends on the main user store (dist=1)
|
||||
tagStoreBackgroundLayer(avmService,previewStoreName, userStoreName,1);
|
||||
|
||||
// The preview user store depends on the main staging store (dist=2)
|
||||
tagStoreBackgroundLayer(avmService,previewStoreName, stagingStoreName,2);
|
||||
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(previewStoreName, null, null);
|
||||
|
||||
|
||||
// tag all related stores to indicate that they are part of a single sandbox
|
||||
QName sandboxIdProp = QName.createQName(null, SandboxConstants.PROP_SANDBOXID + GUID.generate());
|
||||
avmService.setStoreProperty(userStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
dumpStoreProperties(avmService, userStoreName);
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { userStoreName, previewStoreName } );
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a workflow sandbox for the named store.
|
||||
*
|
||||
* Various store meta-data properties are set including:
|
||||
* Identifier for store-types: .sandbox.workflow.main and .sandbox.workflow.preview
|
||||
* Store-id: .sandbox-id.<guid> (unique across all stores in the sandbox)
|
||||
* DNS: .dns.<store> = <path-to-webapps-root>
|
||||
* Website Name: .website.name = website name
|
||||
*
|
||||
* @param storeId The id of the store to create a sandbox for
|
||||
* @return Information about the sandbox
|
||||
*/
|
||||
public static SandboxInfo createWorkflowSandbox(final String storeId)
|
||||
{
|
||||
final ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
final AVMService avmService = services.getAVMService();
|
||||
|
||||
final String stagingStoreName = AVMUtil.buildStagingStoreName(storeId);
|
||||
|
||||
// create the workflow 'main' store
|
||||
final String packageName = AVMUtil.STORE_WORKFLOW + "-" + GUID.generate();
|
||||
final String mainStoreName =
|
||||
AVMUtil.buildWorkflowMainStoreName(storeId, packageName);
|
||||
|
||||
avmService.createStore(mainStoreName);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created workflow sandbox store: " + mainStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the staging area
|
||||
avmService.createLayeredDirectory(AVMUtil.buildStoreRootPath(stagingStoreName),
|
||||
mainStoreName + ":/",
|
||||
JNDIConstants.DIR_DEFAULT_WWW);
|
||||
|
||||
// tag the store with the store type
|
||||
avmService.setStoreProperty(mainStoreName,
|
||||
SandboxConstants.PROP_SANDBOX_WORKFLOW_MAIN,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the base name of the website so that corresponding
|
||||
// staging areas can be found.
|
||||
avmService.setStoreProperty(mainStoreName,
|
||||
SandboxConstants.PROP_WEBSITE_NAME,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, storeId));
|
||||
|
||||
// tag the store, oddly enough, with its own store name for querying.
|
||||
avmService.setStoreProperty(mainStoreName,
|
||||
QName.createQName(null, SandboxConstants.PROP_SANDBOX_STORE_PREFIX + mainStoreName),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
// tag the store with the DNS name property
|
||||
tagStoreDNSPath(avmService, mainStoreName, storeId, packageName);
|
||||
|
||||
|
||||
// The main workflow store depends on the main staging store (dist=1)
|
||||
tagStoreBackgroundLayer(avmService,mainStoreName, stagingStoreName ,1);
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(mainStoreName, null, null);
|
||||
|
||||
// create the workflow 'preview' store
|
||||
final String previewStoreName =
|
||||
AVMUtil.buildWorkflowPreviewStoreName(storeId, packageName);
|
||||
avmService.createStore(previewStoreName);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Created workflow sandbox preview store: " + previewStoreName);
|
||||
|
||||
// create a layered directory pointing to 'www' in the workflow 'main' store
|
||||
avmService.createLayeredDirectory(AVMUtil.buildStoreRootPath(mainStoreName),
|
||||
previewStoreName + ":/",
|
||||
JNDIConstants.DIR_DEFAULT_WWW);
|
||||
|
||||
// tag the store with the store type
|
||||
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
|
||||
tagStoreDNSPath(avmService, previewStoreName, storeId, packageName, "preview");
|
||||
|
||||
|
||||
// The preview worfkflow store depends on the main workflow store (dist=1)
|
||||
tagStoreBackgroundLayer(avmService,previewStoreName, mainStoreName,1);
|
||||
|
||||
// The preview workflow store depends on the main staging store (dist=2)
|
||||
tagStoreBackgroundLayer(avmService,previewStoreName, stagingStoreName,2);
|
||||
|
||||
|
||||
// snapshot the store
|
||||
avmService.createSnapshot(previewStoreName, null, null);
|
||||
|
||||
|
||||
// tag all related stores to indicate that they are part of a single sandbox
|
||||
final QName sandboxIdProp = QName.createQName(SandboxConstants.PROP_SANDBOXID + GUID.generate());
|
||||
avmService.setStoreProperty(mainStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
avmService.setStoreProperty(previewStoreName,
|
||||
sandboxIdProp,
|
||||
new PropertyValue(DataTypeDefinition.TEXT, null));
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
dumpStoreProperties(avmService, mainStoreName);
|
||||
dumpStoreProperties(avmService, previewStoreName);
|
||||
}
|
||||
return new SandboxInfo( new String[] { mainStoreName, previewStoreName } );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the permissions for the list of sandbox managers applied to a user sandbox.
|
||||
* <p>
|
||||
* Ensures that all managers in the list have full WRITE access to the specified user stores.
|
||||
*
|
||||
* @param storeId The store id of the sandbox to update
|
||||
* @param managers The list of authorities who have ContentManager role in the web project
|
||||
* @param username Username of the user sandbox to update
|
||||
*/
|
||||
public static void updateSandboxManagers(
|
||||
final String storeId, final List<String> managers, final String username)
|
||||
{
|
||||
final ServiceRegistry services = Repository.getServiceRegistry(FacesContext.getCurrentInstance());
|
||||
final PermissionService permissionService = services.getPermissionService();
|
||||
|
||||
final String userStoreName = AVMUtil.buildUserMainStoreName(storeId, username);
|
||||
final String previewStoreName = AVMUtil.buildUserPreviewStoreName(storeId, username);
|
||||
|
||||
// Apply masks to the stores
|
||||
|
||||
// apply the manager role permission to the user main sandbox for each manager
|
||||
NodeRef dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(userStoreName));
|
||||
for (String manager : managers)
|
||||
{
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager, AVMUtil.ROLE_CONTENT_MANAGER, true);
|
||||
}
|
||||
|
||||
// apply the manager role permission to the user preview sandbox for each manager
|
||||
dirRef = AVMNodeConverter.ToNodeRef(-1, AVMUtil.buildStoreRootPath(previewStoreName));
|
||||
for (String manager : managers)
|
||||
{
|
||||
permissionService.setPermission(dirRef.getStoreRef(), manager, AVMUtil.ROLE_CONTENT_MANAGER, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag a named store with a DNS path meta-data attribute.
|
||||
* The DNS meta-data attribute is set to the system path 'store:/www/avm_webapps'
|
||||
*
|
||||
* @param store Name of the store to tag
|
||||
*/
|
||||
private static void tagStoreDNSPath(AVMService avmService, String store, String... components)
|
||||
{
|
||||
String path = AVMUtil.buildSandboxRootPath(store);
|
||||
// DNS name mangle the property name - can only contain value DNS characters!
|
||||
String dnsProp = SandboxConstants.PROP_DNS + DNSNameMangler.MakeDNSName(components);
|
||||
avmService.setStoreProperty(store, QName.createQName(null, dnsProp),
|
||||
new PropertyValue(DataTypeDefinition.TEXT, path));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tags a store with a property that indicates one of its
|
||||
* backgroundStore layers, and the distance of that layer.
|
||||
* This function must be called separately for each background
|
||||
* store; for example the "mysite--alice--preview" store had
|
||||
* as its immediate background "mysite--alice", which itself had
|
||||
* as its background store "mysite", you'd make a sequence of
|
||||
* calls like this:
|
||||
*
|
||||
* <pre>
|
||||
* tagStoreBackgroundLayer("mysite--alice", "mysite", 1);
|
||||
* tagStoreBackgroundLayer("mysite--alice--preview", "mysite--alice", 1);
|
||||
* tagStoreBackgroundLayer("mysite--alice--preview", "mysite", 2);
|
||||
* </pre>
|
||||
*
|
||||
* This make it easy for other parts of the system to determine
|
||||
* which stores depend on others directly or indirectly (which is
|
||||
* useful for reloading virtualized webapps).
|
||||
*
|
||||
* @param store Name of the store to tag
|
||||
* @param backgroundStore Name of store's background store
|
||||
* @param distance Distance from store.
|
||||
* The backgroundStore 'mysite' is 1 away from the store 'mysite--alice'
|
||||
* but 2 away from the store 'mysite--alice--preview'.
|
||||
*/
|
||||
private static void tagStoreBackgroundLayer(AVMService avmService,
|
||||
String store,
|
||||
String backgroundStore,
|
||||
int distance)
|
||||
{
|
||||
String prop_key = SandboxConstants.PROP_BACKGROUND_LAYER + backgroundStore;
|
||||
avmService.setStoreProperty(store, QName.createQName(null, prop_key),
|
||||
new PropertyValue(DataTypeDefinition.INT, distance));
|
||||
}
|
||||
|
||||
/**
|
||||
* Debug helper method to dump the properties of a store
|
||||
*
|
||||
* @param store Store name to dump properties for
|
||||
*/
|
||||
private static void dumpStoreProperties(AVMService avmService, String store)
|
||||
{
|
||||
logger.debug("Store " + store);
|
||||
Map<QName, PropertyValue> props = avmService.getStoreProperties(store);
|
||||
for (QName name : props.keySet())
|
||||
{
|
||||
logger.debug(" " + name + ": " + props.get(name));
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program 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 General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
* As a special exception to the terms and conditions of version 2.0 of
|
||||
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||
* FLOSS exception. You should have recieved a copy of the text describing
|
||||
* the FLOSS exception, and it is also available here:
|
||||
* http://www.alfresco.com/legal/licensing"
|
||||
*/
|
||||
package org.alfresco.web.bean.wcm;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Provides information about a sandbox created by SandboxFactory.
|
||||
*/
|
||||
public final class SandboxInfo implements Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 3615436375385857404L;
|
||||
|
||||
String [] store_names_;
|
||||
public SandboxInfo(String [] store_names)
|
||||
{
|
||||
store_names_ = store_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of names of the stores within this sandbox.
|
||||
* The "main" store should come first in this list;
|
||||
* any other stores should appear in the order that
|
||||
* they are overlaid on "main" (e.g.: any "preview"
|
||||
* layers should come afterward, in "lowest first" order).
|
||||
* <p>
|
||||
* Note: all sandboxes must have a "main" layer.
|
||||
*/
|
||||
public String [] getStoreNames() { return store_names_; }
|
||||
|
||||
/**
|
||||
* The name of the "main" store within this sandbox.
|
||||
*/
|
||||
public String getMainStoreName() { return store_names_[0]; }
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -69,6 +69,8 @@ import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.ISO8601DateFormat;
|
||||
import org.alfresco.util.NameMatcher;
|
||||
import org.alfresco.util.VirtServerUtils;
|
||||
import org.alfresco.wcm.sandbox.SandboxFactory;
|
||||
import org.alfresco.wcm.sandbox.SandboxInfo;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.servlet.DownloadContentServlet;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
@@ -135,6 +137,7 @@ public class SubmitDialog extends BaseDialogBean
|
||||
transient private AVMSyncService avmSyncService;
|
||||
transient private AVMLockingService avmLockingService;
|
||||
transient private FormsService formsService;
|
||||
transient private SandboxFactory sandboxFactory;
|
||||
|
||||
transient private NameMatcher nameMatcher;
|
||||
|
||||
@@ -258,6 +261,21 @@ public class SubmitDialog extends BaseDialogBean
|
||||
return formsService;
|
||||
}
|
||||
|
||||
// TODO - refactor ... push down into sandbox service (submit to workflow)
|
||||
public void setSandboxFactory(final SandboxFactory sandboxFactory)
|
||||
{
|
||||
this.sandboxFactory = sandboxFactory;
|
||||
}
|
||||
|
||||
protected SandboxFactory getSandboxFactory()
|
||||
{
|
||||
if (sandboxFactory == null)
|
||||
{
|
||||
sandboxFactory = (SandboxFactory) FacesHelper.getManagedBean(FacesContext.getCurrentInstance(), "SandboxFactory");
|
||||
}
|
||||
return sandboxFactory;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @see org.alfresco.web.bean.dialog.BaseDialogBean#init(java.util.Map)
|
||||
@@ -544,7 +562,7 @@ public class SubmitDialog extends BaseDialogBean
|
||||
if (this.workflowParams != null)
|
||||
{
|
||||
// Create workflow sandbox for workflow package
|
||||
this.sandboxInfo = SandboxFactory.createWorkflowSandbox(
|
||||
this.sandboxInfo = sandboxFactory.createWorkflowSandbox(
|
||||
this.avmBrowseBean.getStagingStore());
|
||||
|
||||
// create container for our avm workflow package
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -33,26 +33,18 @@ import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.sandbox.SandboxConstants;
|
||||
import org.alfresco.service.ServiceRegistry;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
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.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.ResultSetRow;
|
||||
import org.alfresco.service.cmr.search.SearchParameters;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.wcm.sandbox.SandboxConstants;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.User;
|
||||
import org.alfresco.web.data.IDataContainer;
|
||||
import org.alfresco.web.data.QuickSort;
|
||||
import org.alfresco.web.forms.Form;
|
||||
@@ -188,11 +180,9 @@ public class WebProject implements Serializable
|
||||
|
||||
private final static Log LOGGER = LogFactory.getLog(WebProject.class);
|
||||
|
||||
private static NodeRef websitesFolder;
|
||||
private final NodeRef nodeRef;
|
||||
private String storeId = null;
|
||||
private Boolean hasWorkflow = null;
|
||||
private Map<String, String> userRoles = new HashMap<String, String>(16, 1.0f);
|
||||
|
||||
public WebProject(final NodeRef nodeRef)
|
||||
{
|
||||
@@ -238,10 +228,12 @@ public class WebProject implements Serializable
|
||||
* Returns the name of the web project.
|
||||
*
|
||||
* @return the name of the web project.
|
||||
* @deprecated
|
||||
*/
|
||||
public String getName()
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
// TODO refactor out ...
|
||||
final NodeService nodeService = getServiceRegistry().getNodeService();
|
||||
return (String)nodeService.getProperty(this.nodeRef, ContentModel.PROP_NAME);
|
||||
}
|
||||
|
||||
@@ -249,10 +241,12 @@ public class WebProject implements Serializable
|
||||
* Returns the title of the web project.
|
||||
*
|
||||
* @return the title of the web project.
|
||||
* @deprecated
|
||||
*/
|
||||
public String getTitle()
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
// TODO refactor out ...
|
||||
final NodeService nodeService = getServiceRegistry().getNodeService();
|
||||
return (String)nodeService.getProperty(this.nodeRef, ContentModel.PROP_TITLE);
|
||||
}
|
||||
|
||||
@@ -260,10 +254,12 @@ public class WebProject implements Serializable
|
||||
* Returns the description of the web project.
|
||||
*
|
||||
* @return the description of the web project.
|
||||
* @deprecated
|
||||
*/
|
||||
public String getDescription()
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
// TODO refactor out ...
|
||||
final NodeService nodeService = getServiceRegistry().getNodeService();
|
||||
return (String)nodeService.getProperty(this.nodeRef, ContentModel.PROP_DESCRIPTION);
|
||||
}
|
||||
|
||||
@@ -271,12 +267,14 @@ public class WebProject implements Serializable
|
||||
* Returns the store id for this web project.
|
||||
*
|
||||
* @return the store id for this web project.
|
||||
* @deprecated
|
||||
*/
|
||||
public String getStoreId()
|
||||
{
|
||||
// TODO refactor out ...
|
||||
if (this.storeId == null)
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
final NodeService nodeService = getServiceRegistry().getNodeService();
|
||||
this.storeId = (String)nodeService.getProperty(this.nodeRef, WCMAppModel.PROP_AVMSTORE);
|
||||
}
|
||||
return this.storeId;
|
||||
@@ -286,9 +284,11 @@ public class WebProject implements Serializable
|
||||
* Returns the staging store name.
|
||||
*
|
||||
* @return the staging store name.
|
||||
* @deprecated
|
||||
*/
|
||||
public String getStagingStore()
|
||||
{
|
||||
// TODO refactor out ...
|
||||
return AVMUtil.buildStagingStoreName(this.getStoreId());
|
||||
}
|
||||
|
||||
@@ -299,7 +299,7 @@ public class WebProject implements Serializable
|
||||
*/
|
||||
public List<Form> getForms()
|
||||
{
|
||||
final List forms = new ArrayList(this.getFormsImpl().values());
|
||||
final List<Form> forms = new ArrayList<Form>(this.getFormsImpl().values());
|
||||
final QuickSort sorter = new QuickSort(forms, "name", true, IDataContainer.SORT_CASEINSENSITIVE);
|
||||
sorter.sort();
|
||||
return Collections.unmodifiableList(forms);
|
||||
@@ -362,166 +362,6 @@ public class WebProject implements Serializable
|
||||
return this.hasWorkflow.booleanValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns <tt>true</tt> if the user is a manager of this web project.
|
||||
*
|
||||
* @param user the user
|
||||
* @return <tt>true</tt> if the user is a manager, <tt>false</tt> otherwise.
|
||||
* @exception NullPointerException if the user is null.
|
||||
*/
|
||||
public boolean isManager(final User user)
|
||||
{
|
||||
String userrole;
|
||||
String username = user.getUserName();
|
||||
synchronized (userRoles)
|
||||
{
|
||||
userrole = userRoles.get(username);
|
||||
if (userrole == null)
|
||||
{
|
||||
userrole = WebProject.getWebProjectUserRole(nodeRef, user);
|
||||
userRoles.put(username, userrole);
|
||||
}
|
||||
}
|
||||
return AVMUtil.ROLE_CONTENT_MANAGER.equals(userrole);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the role of this user in the given Web Project, or null for no assigned role
|
||||
*/
|
||||
public static String getWebProjectUserRole(NodeRef webProjectRef, User user)
|
||||
{
|
||||
String userrole = null;
|
||||
|
||||
long start = 0;
|
||||
if (LOGGER.isDebugEnabled())
|
||||
{
|
||||
start = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
if (user.isAdmin())
|
||||
{
|
||||
// fake the Content Manager role for an admin user
|
||||
userrole = AVMUtil.ROLE_CONTENT_MANAGER;
|
||||
}
|
||||
else
|
||||
{
|
||||
NodeService nodeService = WebProject.getServiceRegistry().getNodeService();
|
||||
|
||||
NodeRef roleRef = findUserRoleNodeRef(webProjectRef, user);
|
||||
if (roleRef != null)
|
||||
{
|
||||
userrole = (String)nodeService.getProperty(roleRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGGER.warn("getWebProjectUserRole: user role not found for " + user);
|
||||
}
|
||||
}
|
||||
|
||||
if (LOGGER.isDebugEnabled())
|
||||
{
|
||||
LOGGER.debug("getWebProjectUserRole: " + user.getUserName() + " " + userrole + " in " + (System.currentTimeMillis()-start) + " ms");
|
||||
}
|
||||
|
||||
return userrole;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a Lucene search to return a NodeRef to the node representing the the User Role
|
||||
* within the given WebProject.
|
||||
*
|
||||
* @param webProjectRef Web Project to search against
|
||||
* @param user User to test against
|
||||
*
|
||||
* @return NodeRef of the User Role node or null if none found
|
||||
*/
|
||||
public static NodeRef findUserRoleNodeRef(NodeRef webProjectRef, User user)
|
||||
{
|
||||
SearchService searchService = WebProject.getServiceRegistry().getSearchService();
|
||||
|
||||
StringBuilder query = new StringBuilder(128);
|
||||
query.append("+PARENT:\"").append(webProjectRef).append("\" ");
|
||||
query.append("+TYPE:\"").append(WCMAppModel.TYPE_WEBUSER).append("\" ");
|
||||
query.append("+@").append(NamespaceService.WCMAPP_MODEL_PREFIX).append("\\:username:\"");
|
||||
query.append(user.getUserName());
|
||||
query.append("\"");
|
||||
|
||||
ResultSet resultSet = searchService.query(
|
||||
Repository.getStoreRef(),
|
||||
SearchService.LANGUAGE_LUCENE,
|
||||
query.toString());
|
||||
List<NodeRef> nodes = resultSet.getNodeRefs();
|
||||
|
||||
return (nodes.size() == 1 ? nodes.get(0) : null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default webapp for this web project.
|
||||
*
|
||||
* @return the default webapp for this web project.
|
||||
*/
|
||||
public String getDefaultWebapp()
|
||||
{
|
||||
final ServiceRegistry serviceRegistry = this.getServiceRegistry();
|
||||
final NodeService nodeService = serviceRegistry.getNodeService();
|
||||
return (String)
|
||||
nodeService.getProperty(this.nodeRef, WCMAppModel.PROP_DEFAULTWEBAPP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to get the ID of the 'Websites' system folder
|
||||
*
|
||||
* @return ID of the 'Websites' system folder
|
||||
*
|
||||
* @throws AlfrescoRuntimeException if unable to find the required folder
|
||||
*/
|
||||
public synchronized static NodeRef getWebsitesFolder()
|
||||
{
|
||||
if (WebProject.websitesFolder == null)
|
||||
{
|
||||
// get the template from the special Content Templates folder
|
||||
final FacesContext fc = FacesContext.getCurrentInstance();
|
||||
final String xpath = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc);
|
||||
|
||||
final NodeRef rootNodeRef = WebProject.getServiceRegistry().getNodeService().getRootNode(Repository.getStoreRef());
|
||||
final NamespaceService resolver = Repository.getServiceRegistry(fc).getNamespaceService();
|
||||
final List<NodeRef> results = WebProject.getServiceRegistry().getSearchService().selectNodes(rootNodeRef, xpath, null, resolver, false);
|
||||
if (results.size() == 1)
|
||||
{
|
||||
WebProject.websitesFolder = new NodeRef(Repository.getStoreRef(), results.get(0).getId());
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Unable to find 'Websites' system folder at: " + xpath);
|
||||
}
|
||||
}
|
||||
|
||||
return WebProject.websitesFolder;
|
||||
}
|
||||
|
||||
public static List<WebProject> getWebProjects()
|
||||
{
|
||||
final ServiceRegistry serviceRegistry = WebProject.getServiceRegistry();
|
||||
final SearchParameters sp = new SearchParameters();
|
||||
sp.addStore(Repository.getStoreRef());
|
||||
sp.setLanguage(SearchService.LANGUAGE_LUCENE);
|
||||
sp.setQuery("+TYPE:\"" + WCMAppModel.TYPE_AVMWEBFOLDER +
|
||||
"\" +PARENT:\"" + WebProject.getWebsitesFolder() + "\"");
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("running query [" + sp.getQuery() + "]");
|
||||
final ResultSet rs = serviceRegistry.getSearchService().query(sp);
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("received " + rs.length() + " results");
|
||||
final List<WebProject> result = new ArrayList<WebProject>(rs.length());
|
||||
for (ResultSetRow row : rs)
|
||||
{
|
||||
result.add(new WebProject(row.getNodeRef()));
|
||||
}
|
||||
QuickSort sorter = new QuickSort((List)result, "name", true, IDataContainer.SORT_CASEINSENSITIVE);
|
||||
sorter.sort();
|
||||
return result;
|
||||
}
|
||||
|
||||
private Map<String, Form> getFormsImpl()
|
||||
{
|
||||
final ServiceRegistry serviceRegistry = this.getServiceRegistry();
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@@ -38,16 +38,11 @@ import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ApplicationModel;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.model.WCMModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.repo.template.AVMTemplateNode;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
@@ -57,8 +52,8 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTransition;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.AlfrescoNavigationHandler;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
@@ -89,6 +84,7 @@ public class ManageTaskDialog extends BaseDialogBean
|
||||
transient private WorkflowService workflowService;
|
||||
transient private AVMService avmService;
|
||||
transient private AVMSyncService avmSyncService;
|
||||
transient private WebProjectService wpService;
|
||||
protected Node taskNode;
|
||||
transient private WorkflowTask task;
|
||||
transient private WorkflowInstance workflowInstance;
|
||||
@@ -799,6 +795,23 @@ public class ManageTaskDialog extends BaseDialogBean
|
||||
return avmSyncService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param wpService The WebProjectService to set.
|
||||
*/
|
||||
public void setWebProjectService(final WebProjectService wpService)
|
||||
{
|
||||
this.wpService = wpService;
|
||||
}
|
||||
|
||||
protected WebProjectService getWebProjectService()
|
||||
{
|
||||
if (wpService == null)
|
||||
{
|
||||
wpService = (WebProjectService) FacesHelper.getManagedBean(FacesContext.getCurrentInstance(), "WebProjectService");
|
||||
}
|
||||
return wpService;
|
||||
}
|
||||
|
||||
protected WorkflowTask getWorkflowTask()
|
||||
{
|
||||
if (task == null)
|
||||
|
@@ -52,7 +52,6 @@ import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wcm.AVMCompareUtils;
|
||||
import org.alfresco.web.bean.wcm.AVMUtil;
|
||||
import org.alfresco.web.bean.wcm.DeploymentUtil;
|
||||
import org.alfresco.web.ui.common.ComponentConstants;
|
||||
import org.alfresco.web.ui.common.ConstantMethodBinding;
|
||||
@@ -233,7 +232,7 @@ public class UISandboxSnapshots extends SelfRenderingComponent
|
||||
|
||||
// determine whether the deploy action should be shown
|
||||
boolean showDeployAction = false;
|
||||
NodeRef webProjectRef = AVMUtil.getWebProjectNodeFromStore(sandbox);
|
||||
NodeRef webProjectRef = Repository.getServiceRegistry(context).getWebProjectService().findWebProjectNodeFromStore(sandbox);
|
||||
List<NodeRef> deployToServers = DeploymentUtil.findLiveServers(webProjectRef);
|
||||
if (deployToServers != null && deployToServers.size() > 0)
|
||||
{
|
||||
|
@@ -52,13 +52,13 @@ import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||
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.AccessStatus;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.util.NameMatcher;
|
||||
import org.alfresco.wcm.util.WCMUtil;
|
||||
import org.alfresco.wcm.webproject.WebProjectService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.app.servlet.DownloadContentServlet;
|
||||
import org.alfresco.web.app.servlet.FacesHelper;
|
||||
@@ -301,6 +301,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
|
||||
|
||||
ResourceBundle bundle = Application.getBundle(context);
|
||||
AVMService avmService = getAVMService(context);
|
||||
WebProjectService wpService = getWebProjectService(context);
|
||||
NodeService nodeService = getNodeService(context);
|
||||
PermissionService permissionService = getPermissionService(context);
|
||||
AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(context, AVMBrowseBean.BEAN_NAME);
|
||||
@@ -321,19 +322,29 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
|
||||
// find out the current user role in the web project
|
||||
User currentUser = Application.getCurrentUser(context);
|
||||
String currentUserName = currentUser.getUserName();
|
||||
String currentUserRole = WebProject.getWebProjectUserRole(websiteRef, currentUser);
|
||||
String currentUserRole = wpService.getWebUserRole(websiteRef, currentUserName);
|
||||
|
||||
// sort the user list alphabetically and insert the current user at the top of the list
|
||||
List<UserRoleWrapper> userRoleWrappers;
|
||||
if (showAllSandboxes)
|
||||
{
|
||||
List<ChildAssociationRef> userInfoRefs = nodeService.getChildAssocs(
|
||||
websiteRef, WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL);
|
||||
userRoleWrappers = buildSortedUserRoles(nodeService, currentUserName, userInfoRefs);
|
||||
// TODO refactor with new SandboxService
|
||||
Map<String, String> userRoles = null;
|
||||
if (currentUserRole.equals(WCMUtil.ROLE_CONTENT_MANAGER))
|
||||
{
|
||||
userRoles = wpService.listWebUsers(websiteRef);
|
||||
}
|
||||
else
|
||||
{
|
||||
userRoles = new HashMap<String, String>(1);
|
||||
userRoles.put(currentUserName, currentUserRole);
|
||||
}
|
||||
|
||||
userRoleWrappers = buildSortedUserRoles(nodeService, currentUserName, userRoles);
|
||||
}
|
||||
else
|
||||
{
|
||||
userRoleWrappers = buildCurrentUserRole(nodeService, websiteRef, currentUser);
|
||||
userRoleWrappers = buildCurrentUserRole(wpService, websiteRef, currentUserName);
|
||||
}
|
||||
|
||||
// determine whether the check links action should be shown
|
||||
@@ -619,16 +630,15 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
|
||||
* is inserted at the top of the list if present.
|
||||
*/
|
||||
private static List<UserRoleWrapper> buildSortedUserRoles(
|
||||
NodeService nodeService, String currentUser, List<ChildAssociationRef> userInfoRefs)
|
||||
NodeService nodeService, String currentUser, Map<String, String> userRoles)
|
||||
{
|
||||
// build a list of wrappers to hold the fields we need for each user and role
|
||||
UserRoleWrapper currentUserWrapper = null;
|
||||
List<UserRoleWrapper> wrappers = new LinkedList<UserRoleWrapper>();
|
||||
for (ChildAssociationRef ref : userInfoRefs)
|
||||
for (Map.Entry<String, String> userRole : userRoles.entrySet())
|
||||
{
|
||||
NodeRef userInfoRef = ref.getChildRef();
|
||||
String username = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
String userrole = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
String username = userRole.getKey();
|
||||
String userrole = userRole.getValue();
|
||||
|
||||
UserRoleWrapper wrapper = new UserRoleWrapper(username, userrole);
|
||||
|
||||
@@ -660,18 +670,15 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
|
||||
* Build a list containing one item representing the current user role for the website.
|
||||
*/
|
||||
private static List<UserRoleWrapper> buildCurrentUserRole(
|
||||
NodeService nodeService, NodeRef webProjectRef, User user)
|
||||
WebProjectService wpService, NodeRef webProjectRef, String username)
|
||||
{
|
||||
// build a list of wrappers to hold the fields we need for each user and role
|
||||
List<UserRoleWrapper> wrappers = new ArrayList<UserRoleWrapper>(0);
|
||||
NodeRef userInfoRef = WebProject.findUserRoleNodeRef(webProjectRef, user);
|
||||
if (userInfoRef != null)
|
||||
String userrole = wpService.getWebUserRole(webProjectRef, username);
|
||||
if (userrole != null)
|
||||
{
|
||||
wrappers = new ArrayList<UserRoleWrapper>(1);
|
||||
|
||||
String username = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME);
|
||||
String userrole = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE);
|
||||
|
||||
|
||||
UserRoleWrapper wrapper = new UserRoleWrapper(username, userrole);
|
||||
wrapper.IsCurrentUser = true;
|
||||
wrappers.add(0, wrapper);
|
||||
@@ -1319,6 +1326,11 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
|
||||
return menu;
|
||||
}
|
||||
|
||||
private WebProjectService getWebProjectService(FacesContext fc)
|
||||
{
|
||||
return (WebProjectService)FacesContextUtils.getRequiredWebApplicationContext(fc).getBean("WebProjectService");
|
||||
}
|
||||
|
||||
private AVMService getAVMService(FacesContext fc)
|
||||
{
|
||||
return (AVMService)FacesContextUtils.getRequiredWebApplicationContext(fc).getBean("AVMLockingAwareService");
|
||||
|
Reference in New Issue
Block a user