/***************************************************************************
* Copyright (C) 2003-2009 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.component.admin.taxonomy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import org.exoplatform.ecm.webui.tree.UINodeTree;
import org.exoplatform.ecm.webui.utils.PermissionUtil;
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.UIContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : Hoang Van Hung
* hunghvit@gmail.com
* Apr 7, 2009
*/
@ComponentConfig(
template = "app:/groovy/webui/component/admin/taxonomy/UITaxonomyTree.gtmpl",
events = @EventConfig(listeners = UITaxonomyTreeBrowser.ChangeNodeActionListener.class)
)
public class UITaxonomyTreeBrowser extends UIContainer {
private NodeLocation currentNode_;
private NodeLocation rootNode_ = null;
private String rootPath_;
private String[] acceptedNodeTypes = {};
public UITaxonomyTreeBrowser() throws Exception {
UINodeTree tree = addChild(UINodeTree.class, null, "UITaxonomyTreeBrowser");
tree.setBeanLabelField("name");
tree.setBeanIdField("path");
}
public void update() throws Exception {
UITaxonomyTreeCreateChild uiManager = getParent();
rootNode_ = NodeLocation.getNodeLocationByNode(uiManager.getRootNode());
rootPath_ = rootNode_.getPath();
}
public Node getRootNode() {
return NodeLocation.getNodeByLocation(rootNode_);
}
public String[] getAcceptedNodeTypes() {
return acceptedNodeTypes;
}
public void setAcceptedNodeTypes(String[] acceptedNodeTypes) {
this.acceptedNodeTypes = acceptedNodeTypes;
}
public boolean matchNodeType(Node node) throws Exception {
if(acceptedNodeTypes == null || acceptedNodeTypes.length == 0) return true;
for(String nodeType: acceptedNodeTypes) {
if(node.isNodeType(nodeType)) return true;
}
return false;
}
public void buildTree() throws Exception {
Iterator sibbling = null;
Iterator children = null;
UITaxonomyTreeCreateChild uiManager = getParent();
List<Node> taxonomyList = new ArrayList<Node>();
if(rootNode_ == null ) {
update();
currentNode_ = rootNode_;
children = getRootNode().getNodes();
changeNode(getRootNode());
}
UINodeTree tree = getChildById("UITaxonomyTreeBrowser");
Node nodeSelected = getSelectedNode();
if(nodeSelected.getPath().equals(rootPath_)) {
children = nodeSelected.getNodes();
}
tree.setSelected(nodeSelected);
if(nodeSelected.getDepth() > 0) {
tree.setParentSelected(nodeSelected.getParent());
sibbling = nodeSelected.getParent().getNodes();
children = nodeSelected.getNodes();
} else {
tree.setParentSelected(nodeSelected);
sibbling = nodeSelected.getNodes();
}
List<Node> sibblingList = new ArrayList<Node>();
List<Node> childrenList = new ArrayList<Node>();
if(nodeSelected.getPath().equals(uiManager.getTaxonomyTreeNode().getPath())) {
sibbling = nodeSelected.getNodes();
}
while(sibbling.hasNext()) {
Node sibblingNode = (Node)sibbling.next();
if(!matchNodeType(sibblingNode)) continue;
if(PermissionUtil.canRead(sibblingNode) && !sibblingNode.isNodeType("exo:hiddenable")) {
sibblingList.add(sibblingNode);
}
}
if(nodeSelected.getPath().equals(rootPath_)) {
taxonomyList.add(uiManager.getTaxonomyTreeNode());
children = taxonomyList.iterator();
}
if(children != null) {
while(children.hasNext()) {
Node childrenNode = (Node)children.next();
if(!matchNodeType(childrenNode)) continue;
if(PermissionUtil.canRead(childrenNode) && !childrenNode.isNodeType("exo:hiddenable")) {
childrenList.add(childrenNode);
}
}
}
if(nodeSelected.getPath().equals(rootPath_)) tree.setSibbling(childrenList);
else tree.setSibbling(sibblingList);
tree.setChildren(childrenList);
}
public void renderChildren() throws Exception {
buildTree();
super.renderChildren();
}
public String getRootPath() { return rootPath_; }
public void setNodeSelect(String path) throws Exception {
UITaxonomyTreeCreateChild uiManager = getParent();
currentNode_ = NodeLocation.getNodeLocationByNode(uiManager.getNodeByPath(path));
if (!rootNode_.getPath().equals("/"))
if (getRootNode().getParent().getPath().equals(path))
currentNode_ = rootNode_;
uiManager.setSelectedPath(currentNode_.getPath());
changeNode(NodeLocation.getNodeByLocation(currentNode_));
}
public void changeNode(Node nodeSelected) throws Exception {
List<Node> nodes = new ArrayList<Node>();
NodeIterator nodeIter = nodeSelected.getNodes();
List<Node> rootTaxonomyList = new ArrayList<Node>();
UITaxonomyTreeCreateChild uiTaxonomyManager = getParent();
while(nodeIter.hasNext()) {
nodes.add(nodeIter.nextNode());
}
if(nodeSelected.getPath().equals(rootPath_)) {
rootTaxonomyList.add(uiTaxonomyManager.getTaxonomyTreeNode());
nodes = rootTaxonomyList;
}
UITaxonomyTreeCreateChild uiManager = getParent();
UITaxonomyTreeWorkingArea uiTreeWorkingArea = uiManager.getChild(UITaxonomyTreeWorkingArea.class);
List<Node> lstNode = new ArrayList<Node>();
for (Node node : nodes) {
if (uiTreeWorkingArea.matchNodeType(node))
lstNode.add(node);
}
uiTreeWorkingArea.setNodeList(lstNode);
uiTreeWorkingArea.updateGrid();
}
public Node getSelectedNode() {
if(currentNode_ == null) return getRootNode();
return NodeLocation.getNodeByLocation(currentNode_);
}
public static class ChangeNodeActionListener extends EventListener<UITaxonomyTreeBrowser> {
public void execute(Event<UITaxonomyTreeBrowser> event) throws Exception {
UITaxonomyTreeBrowser uiTaxonomyTreeBrowser = event.getSource();
String uri = event.getRequestContext().getRequestParameter(OBJECTID) ;
uiTaxonomyTreeBrowser.setNodeSelect(uri);
UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiTaxonomyTreeBrowser.getParent();
uiTaxonomyTreeCreateChild.onChange(uiTaxonomyTreeBrowser.getSelectedNode());
event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTreeCreateChild);
}
}
}