mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Initial version of a "copy to web project" action
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5387 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -41,11 +41,15 @@ import javax.faces.event.ActionEvent;
|
||||
import javax.faces.event.FacesEvent;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wcm.AVMConstants;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
import org.alfresco.web.ui.common.WebResources;
|
||||
|
||||
@@ -81,6 +85,9 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
/** currently browsing node id */
|
||||
protected String navigationId = null;
|
||||
|
||||
/** current AVM store being browsed */
|
||||
protected String avmStore = null;
|
||||
|
||||
/** id of the initially selected item, if value is not set */
|
||||
protected String initialSelectionId = null;
|
||||
|
||||
@@ -157,6 +164,7 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
this.navigationId = (String)values[4];
|
||||
this.initialSelectionId = (String)values[5];
|
||||
this.disabled = (Boolean)values[6];
|
||||
this.avmStore = (String)values[7];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -164,7 +172,7 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
*/
|
||||
public Object saveState(FacesContext context)
|
||||
{
|
||||
Object values[] = new Object[7];
|
||||
Object values[] = new Object[8];
|
||||
// standard component attributes are saved by the super class
|
||||
values[0] = super.saveState(context);
|
||||
values[1] = this.label;
|
||||
@@ -173,6 +181,7 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
values[4] = this.navigationId;
|
||||
values[5] = this.initialSelectionId;
|
||||
values[6] = this.disabled;
|
||||
values[7] = this.avmStore;
|
||||
return (values);
|
||||
}
|
||||
|
||||
@@ -219,7 +228,17 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
String selection = (String)requestMap.get(getClientId(context) + OPTION);
|
||||
if (selection != null && selection.length() != 0)
|
||||
{
|
||||
((EditableValueHolder)this).setSubmittedValue(new NodeRef(Repository.getStoreRef(), selection));
|
||||
if (selection.startsWith("-1;"))
|
||||
{
|
||||
String translatedPath = selection.substring(3);
|
||||
String path = translatedPath.replace(';', '/');
|
||||
String avmPath = this.avmStore + ":/" + path;
|
||||
((EditableValueHolder)this).setSubmittedValue(AVMNodeConverter.ToNodeRef(-1, avmPath));
|
||||
}
|
||||
else
|
||||
{
|
||||
((EditableValueHolder)this).setSubmittedValue(new NodeRef(Repository.getStoreRef(), selection));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -358,7 +377,16 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
}
|
||||
else
|
||||
{
|
||||
label = Repository.getNameForNode(service, value);
|
||||
if (value.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM))
|
||||
{
|
||||
Pair<Integer, String> avmNode = AVMNodeConverter.ToAVMVersionPath(value);
|
||||
String avmPath = avmNode.getSecond();
|
||||
label = avmPath.substring(avmPath.indexOf(AVMConstants.DIR_ROOT)+4);
|
||||
}
|
||||
else
|
||||
{
|
||||
label = Repository.getNameForNode(service, value);
|
||||
}
|
||||
showValueInHiddenField = true;
|
||||
}
|
||||
|
||||
@@ -392,6 +420,12 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
if (value != null)
|
||||
{
|
||||
fieldValue = encodeFieldValues(theMode, value.getId());
|
||||
|
||||
// setup the avmStore if the value represents an avm path
|
||||
if (value.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM))
|
||||
{
|
||||
this.avmStore = value.getStoreRef().getIdentifier();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -514,10 +548,9 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
buf.append("/></td><td>");
|
||||
|
||||
// get the name for the child and output as link
|
||||
NodeRef childNodeRef = new NodeRef(Repository.getStoreRef(), childId);
|
||||
String name = Repository.getNameForNode(service, childNodeRef);
|
||||
String name = Repository.getNameForNode(service, childRef);
|
||||
String prefixHtml = null;
|
||||
String icon = getItemIcon(context, childNodeRef);
|
||||
String icon = getItemIcon(context, childRef);
|
||||
if (icon != null)
|
||||
{
|
||||
prefixHtml = "<span style='padding-right:4px'>" +
|
||||
@@ -801,6 +834,7 @@ public abstract class AbstractItemSelector extends UIInput
|
||||
/**
|
||||
* Class representing the clicking of a breadcrumb element.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public static class ItemSelectorEvent extends ActionEvent
|
||||
{
|
||||
public ItemSelectorEvent(UIComponent component, int mode, String id)
|
||||
|
@@ -0,0 +1,221 @@
|
||||
/*
|
||||
* 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.ui.repo.component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
import org.alfresco.config.JNDIConstants;
|
||||
import org.alfresco.model.ApplicationModel;
|
||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||
import org.alfresco.service.cmr.avm.AVMService;
|
||||
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
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.namespace.NamespaceService;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.wcm.AVMConstants;
|
||||
import org.alfresco.web.bean.wcm.WebProject;
|
||||
import org.alfresco.web.ui.repo.WebResources;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Selector component for folders within a Web Project.
|
||||
*
|
||||
* @author gavinc
|
||||
*/
|
||||
public class UIWebProjectFolderSelector extends AbstractItemSelector
|
||||
{
|
||||
private static final Log logger = LogFactory.getLog(UIWebProjectFolderSelector.class);
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Component Impl
|
||||
|
||||
public String getFamily()
|
||||
{
|
||||
return "org.alfresco.faces.WebProjectFolderSelector";
|
||||
}
|
||||
|
||||
public String getDefaultLabel()
|
||||
{
|
||||
return Application.getMessage(FacesContext.getCurrentInstance(), "select_web_project_folder");
|
||||
}
|
||||
|
||||
public String getParentNodeId(FacesContext context)
|
||||
{
|
||||
String id = null;
|
||||
|
||||
if (this.navigationId != null && this.navigationId.startsWith("-1;"))
|
||||
{
|
||||
String rootPath = "-1;" + JNDIConstants.DIR_DEFAULT_WWW + ";" + JNDIConstants.DIR_DEFAULT_APPBASE +
|
||||
";" + AVMConstants.DIR_ROOT;
|
||||
|
||||
if (this.navigationId.equals(rootPath) == false)
|
||||
{
|
||||
// remove the last part of the path
|
||||
String parentPath = this.navigationId.substring(0,
|
||||
this.navigationId.lastIndexOf(';'));
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Parent of " + this.navigationId + " is: " + parentPath);
|
||||
|
||||
id = parentPath;
|
||||
}
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
public Collection<NodeRef> getChildrenForNode(FacesContext context)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Getting children for: " + this.navigationId);
|
||||
|
||||
List<NodeRef> folders = new ArrayList<NodeRef>();
|
||||
|
||||
if (this.navigationId.startsWith("-1;"))
|
||||
{
|
||||
// if we are within the web project folder structure calculate the
|
||||
// current path and get the children
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Getting children for path: " + this.navigationId +
|
||||
" in store: " + this.avmStore);
|
||||
|
||||
// remove the -1; from the beginning of the path and change ; for /
|
||||
String translatedPath = this.navigationId.substring(3);
|
||||
String path = translatedPath.replace(';', '/');
|
||||
|
||||
String avmPath = this.avmStore + ":/" + path;
|
||||
addChildrenForPath(context, avmPath, folders);
|
||||
}
|
||||
else
|
||||
{
|
||||
// get the root children for the sandbox of the current user
|
||||
WebProject webProject = new WebProject(new NodeRef(Repository.getStoreRef(), this.navigationId));
|
||||
this.avmStore = AVMConstants.buildUserMainStoreName(webProject.getStoreId(),
|
||||
Application.getCurrentUser(context).getUserName());
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Getting children for store: " + this.avmStore);
|
||||
|
||||
String rootPath = AVMConstants.buildStoreWebappPath(this.avmStore, AVMConstants.DIR_ROOT);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Root path for store: "+ rootPath);
|
||||
|
||||
addChildrenForPath(context, rootPath, folders);
|
||||
}
|
||||
|
||||
return folders;
|
||||
}
|
||||
|
||||
public Collection<NodeRef> getRootChildren(FacesContext context)
|
||||
{
|
||||
// query for all nodes under the "Web Projects" foler in company home.
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
String xpath = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*";
|
||||
NodeRef rootNodeRef = getNodeService(fc).getRootNode(Repository.getStoreRef());
|
||||
NamespaceService resolver = Repository.getServiceRegistry(fc).getNamespaceService();
|
||||
SearchService searchService = Repository.getServiceRegistry(fc).getSearchService();
|
||||
List<NodeRef> nodes = searchService.selectNodes(rootNodeRef, xpath, null, resolver, false);
|
||||
|
||||
// filter the web projects i.e. only show those available to the current user
|
||||
AVMService avmService = Repository.getServiceRegistry(context).getAVMService();
|
||||
PermissionService permissionService = Repository.getServiceRegistry(context).getPermissionService();
|
||||
String currentUserName = Application.getCurrentUser(context).getUserName();
|
||||
List<NodeRef> webProjects = new ArrayList<NodeRef>(nodes.size());
|
||||
for (NodeRef node : nodes)
|
||||
{
|
||||
// see if the user has AddChildren permission on the Web Project node
|
||||
if (permissionService.hasPermission(node, PermissionService.ADD_CHILDREN) == AccessStatus.ALLOWED)
|
||||
{
|
||||
// if they have AddChildren there is probably a sandbox but check to make
|
||||
// sure as it could have been deleted
|
||||
WebProject webProject = new WebProject(node);
|
||||
String storeName = AVMConstants.buildUserMainStoreName(webProject.getStoreId(),
|
||||
currentUserName);
|
||||
AVMStoreDescriptor storeDesc = avmService.getStore(storeName);
|
||||
if (storeDesc != null)
|
||||
{
|
||||
// if we found a store (sandbox) for the user add to the list
|
||||
webProjects.add(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return webProjects;
|
||||
}
|
||||
|
||||
public String getItemIcon(FacesContext context, NodeRef ref)
|
||||
{
|
||||
String icon = (String)getNodeService(context).getProperty(ref, ApplicationModel.PROP_ICON);
|
||||
if (icon != null)
|
||||
{
|
||||
icon = "/images/icons/" + icon + "-16.gif";
|
||||
}
|
||||
else
|
||||
{
|
||||
icon = WebResources.IMAGE_SPACE;
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds any child folders of the given path to the given list of children
|
||||
*
|
||||
* @param context Faces context
|
||||
* @param path The path to get children of
|
||||
* @param children The list of child folders
|
||||
*/
|
||||
protected void addChildrenForPath(FacesContext context, String path, List<NodeRef> children)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Retrieving children for path: " + path);
|
||||
|
||||
// get directory listing for the given path and convert to NodeRef's
|
||||
AVMService avmService = Repository.getServiceRegistry(context).getAVMService();
|
||||
Map<String, AVMNodeDescriptor> nodes = avmService.getDirectoryListing(-1, path);
|
||||
for (String name : nodes.keySet())
|
||||
{
|
||||
AVMNodeDescriptor avmRef = nodes.get(name);
|
||||
NodeRef node = AVMNodeConverter.ToNodeRef(-1, avmRef.getPath());
|
||||
|
||||
// only add folders
|
||||
if (avmRef.isDirectory())
|
||||
{
|
||||
children.add(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user