UISelectPathPanel.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* 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, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.webui.tree.selectone;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeType;
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.commons.utils.ListAccessImpl;
import org.exoplatform.ecm.webui.comparator.NodeTitleComparator;
import org.exoplatform.ecm.webui.selector.UISelectable;
import org.exoplatform.ecm.webui.tree.UIBaseNodeTreeSelector;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.portal.webui.container.UIContainer;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.ecm.publication.PublicationService;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIBreadcumbs;
import org.exoplatform.webui.core.UIBreadcumbs.LocalPath;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SAS
* @author : Hoa.Pham
* hoa.pham@exoplatform.com
* Jun 23, 2008
*/
@ComponentConfig(
template = "classpath:groovy/ecm/webui/tree/selectone/UISelectPathPanel.gtmpl",
events = {
@EventConfig(listeners = UISelectPathPanel.SelectActionListener.class)
}
)
public class UISelectPathPanel extends UIContainer {
private UIPageIterator uiPageIterator_;
public String[] acceptedMimeTypes = {};
protected NodeLocation parentNode;
private String[] acceptedNodeTypes = {};
private String[] exceptedNodeTypes = {};
private String[] defaultExceptedNodeTypes = {};
private boolean allowPublish = false;
private PublicationService publicationService_ = null;
private List<String> templates_ = null;
private boolean _showTrashHomeNode = true;
public UISelectPathPanel() throws Exception {
uiPageIterator_ = addChild(UIPageIterator.class, null, "UISelectPathIterate");
}
public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
public boolean isAllowPublish() {
return allowPublish;
}
public void setShowTrashHomeNode(boolean value) {
_showTrashHomeNode = value;
}
public void setAllowPublish(boolean allowPublish, PublicationService publicationService, List<String> templates) {
this.allowPublish = allowPublish;
publicationService_ = publicationService;
templates_ = templates;
}
private void addNodePublish(List<Node> listNode, Node node, PublicationService publicationService) throws Exception {
if (isAllowPublish()) {
NodeType nt = node.getPrimaryNodeType();
if (templates_.contains(nt.getName())) {
Node nodecheck = publicationService.getNodePublish(node, null);
if (nodecheck != null) {
listNode.add(nodecheck);
}
} else {
listNode.add(node);
}
} else {
listNode.add(node);
}
}
public void setParentNode(Node node) {
this.parentNode = NodeLocation.getNodeLocationByNode(node);
}
public Node getParentNode() {
return NodeLocation.getNodeByLocation(parentNode);
}
public String[] getAcceptedNodeTypes() { return acceptedNodeTypes; }
public void setAcceptedNodeTypes(String[] acceptedNodeTypes) {
this.acceptedNodeTypes = acceptedNodeTypes;
}
public String[] getExceptedNodeTypes() { return exceptedNodeTypes; }
public void setExceptedNodeTypes(String[] exceptedNodeTypes) {
this.exceptedNodeTypes = exceptedNodeTypes;
}
public String[] getDefaultExceptedNodeTypes() { return defaultExceptedNodeTypes; }
public void setDefaultExceptedNodeTypes(String[] defaultExceptedNodeTypes) {
this.defaultExceptedNodeTypes = defaultExceptedNodeTypes;
}
public String[] getAcceptedMimeTypes() { return acceptedMimeTypes; }
public void setAcceptedMimeTypes(String[] acceptedMimeTypes) { this.acceptedMimeTypes = acceptedMimeTypes; }
public List getSelectableNodes() throws Exception {
return NodeLocation.getNodeListByLocationList(uiPageIterator_.getCurrentPageData());
}
public void updateGrid() throws Exception {
ListAccess<Object> selectableNodeList = new ListAccessImpl<Object>(Object.class,
NodeLocation.getLocationsByNodeList(getListSelectableNodes()));
LazyPageList<Object> objPageList = new LazyPageList<Object>(selectableNodeList, 10);
uiPageIterator_.setPageList(objPageList);
}
public List<Node> getListSelectableNodes() throws Exception {
List<Node> list = new ArrayList<Node>();
if (parentNode == null) return list;
Node realNode = Utils.getNodeSymLink(NodeLocation.getNodeByLocation(parentNode));
for (NodeIterator iterator = realNode.getNodes();iterator.hasNext();) {
Node child = iterator.nextNode();
if(child.isNodeType("exo:hiddenable") || !child.isCheckedOut()) continue;
if(Utils.isTrashHomeNode(child) && !_showTrashHomeNode) continue;
if(matchMimeType(Utils.getNodeSymLink(child)) && matchNodeType(Utils.getNodeSymLink(child)) && !isExceptedNodeType(child)) {
list.add(child);
}
}
Collections.sort(list, new NodeTitleComparator(NodeTitleComparator.ASCENDING_ORDER));
List<Node> listNodeCheck = new ArrayList<Node>();
for (Node node : list) {
addNodePublish(listNodeCheck, node, publicationService_);
}
return listNodeCheck;
}
protected boolean matchNodeType(Node node) throws Exception {
if(acceptedNodeTypes == null || acceptedNodeTypes.length == 0) return true;
for(String nodeType: acceptedNodeTypes) {
if((node != null) && node.isNodeType(nodeType)) return true;
}
return false;
}
protected boolean isExceptedNodeType(Node node) throws RepositoryException {
if(defaultExceptedNodeTypes.length > 0) {
for(String nodeType: defaultExceptedNodeTypes) {
if((node != null) && node.isNodeType(nodeType)) return true;
}
}
if(exceptedNodeTypes == null || exceptedNodeTypes.length == 0) return false;
for(String nodeType: exceptedNodeTypes) {
if((node != null) && node.isNodeType(nodeType)) return true;
}
return false;
}
protected boolean matchMimeType(Node node) throws Exception {
if(acceptedMimeTypes == null || acceptedMimeTypes.length == 0) return true;
if(!node.isNodeType("nt:file")) return true;
String mimeType = node.getNode("jcr:content").getProperty("jcr:mimeType").getString();
for(String type: acceptedMimeTypes) {
if(type.equalsIgnoreCase(mimeType))
return true;
}
return false;
}
public String getPathTaxonomy() throws Exception {
NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class);
return nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH);
}
public String getDisplayName(Node node) throws RepositoryException {
return node.getName();
}
static public class SelectActionListener extends EventListener<UISelectPathPanel> {
public void execute(Event<UISelectPathPanel> event) throws Exception {
UISelectPathPanel uiSelectPathPanel = event.getSource();
UIContainer uiTreeSelector = uiSelectPathPanel.getParent();
UIBreadcumbs uiBreadcumbs = uiTreeSelector.getChild(UIBreadcumbs.class);
StringBuffer breadcumbsPaths = new StringBuffer();
for(LocalPath iterLocalPath: uiBreadcumbs.getPath()) {
breadcumbsPaths.append("/").append(iterLocalPath.getId());
}
StringBuffer sbPath = new StringBuffer();
String objectid = event.getRequestContext().getRequestParameter(OBJECTID);
sbPath.append(breadcumbsPaths).append(objectid.substring(objectid.lastIndexOf("/")));
if(uiTreeSelector instanceof UIOneNodePathSelector) {
if(!((UIOneNodePathSelector)uiTreeSelector).isDisable()) {
sbPath.insert(0, ":").insert(0, ((UIOneNodePathSelector)uiTreeSelector).getWorkspaceName());
}
}
String returnField = ((UIBaseNodeTreeSelector)uiTreeSelector).getReturnFieldName();
((UISelectable)((UIBaseNodeTreeSelector)uiTreeSelector).getSourceComponent()).doSelect(returnField, sbPath.toString()) ;
UIComponent uiOneNodePathSelector = uiSelectPathPanel.getParent();
if (uiOneNodePathSelector instanceof UIOneNodePathSelector) {
UIComponent uiComponent = uiOneNodePathSelector.getParent();
if (uiComponent instanceof UIPopupWindow) {
UIComponent uiParentOfPopup = uiComponent.getParent();
((UIPopupWindow)uiComponent).setShow(false);
((UIPopupWindow)uiComponent).setRendered(false);
if(uiParentOfPopup != null) {
event.getRequestContext().addUIComponentToUpdateByAjax(uiParentOfPopup);
}
}
UIComponent component = ((UIOneNodePathSelector)uiOneNodePathSelector).getSourceComponent().getParent();
if (component != null) {
event.getRequestContext().addUIComponentToUpdateByAjax(component);
}
}
}
}
}