View Javadoc
1   /***************************************************************************
2    * Copyright (C) 2003-2009 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   *
17   **************************************************************************/
18  package org.exoplatform.ecm.webui.component.admin.taxonomy;
19  
20  import java.util.ArrayList;
21  import java.util.Iterator;
22  import java.util.List;
23  
24  import javax.jcr.Node;
25  import javax.jcr.NodeIterator;
26  
27  import org.exoplatform.ecm.webui.tree.UINodeTree;
28  import org.exoplatform.ecm.webui.utils.PermissionUtil;
29  import org.exoplatform.services.wcm.core.NodeLocation;
30  import org.exoplatform.webui.config.annotation.ComponentConfig;
31  import org.exoplatform.webui.config.annotation.EventConfig;
32  import org.exoplatform.webui.core.UIContainer;
33  import org.exoplatform.webui.event.Event;
34  import org.exoplatform.webui.event.EventListener;
35  
36  /**
37   * Created by The eXo Platform SARL
38   * Author : Hoang Van Hung
39   *          hunghvit@gmail.com
40   * Apr 7, 2009
41   */
42  
43  @ComponentConfig(
44      template =  "app:/groovy/webui/component/admin/taxonomy/UITaxonomyTree.gtmpl",
45      events = @EventConfig(listeners = UITaxonomyTreeBrowser.ChangeNodeActionListener.class)
46  )
47  public class UITaxonomyTreeBrowser extends UIContainer {
48  
49    private NodeLocation currentNode_;
50    private NodeLocation rootNode_ = null;
51    private String rootPath_;
52    private String[] acceptedNodeTypes = {};
53  
54    public UITaxonomyTreeBrowser() throws Exception {
55      UINodeTree tree = addChild(UINodeTree.class, null, "UITaxonomyTreeBrowser");
56      tree.setBeanLabelField("name");
57      tree.setBeanIdField("path");
58    }
59  
60    public void update() throws Exception {
61      UITaxonomyTreeCreateChild uiManager = getParent();
62      rootNode_ = NodeLocation.getNodeLocationByNode(uiManager.getRootNode());
63      rootPath_ = rootNode_.getPath();
64    }
65  
66    public Node getRootNode() { 
67      return NodeLocation.getNodeByLocation(rootNode_);  
68    }
69  
70    public String[] getAcceptedNodeTypes() {
71      return acceptedNodeTypes;
72    }
73  
74    public void setAcceptedNodeTypes(String[] acceptedNodeTypes) {
75      this.acceptedNodeTypes = acceptedNodeTypes;
76    }
77  
78    public boolean matchNodeType(Node node) throws Exception {
79      if(acceptedNodeTypes == null || acceptedNodeTypes.length == 0) return true;
80      for(String nodeType: acceptedNodeTypes) {
81        if(node.isNodeType(nodeType)) return true;
82      }
83      return false;
84    }
85  
86    public void buildTree() throws Exception {
87      Iterator sibbling = null;
88      Iterator children = null;
89      UITaxonomyTreeCreateChild uiManager = getParent();
90      List<Node> taxonomyList = new ArrayList<Node>();
91      if(rootNode_ == null ) {
92        update();
93        currentNode_ = rootNode_;
94        children = getRootNode().getNodes();
95        changeNode(getRootNode());
96      }
97      UINodeTree tree = getChildById("UITaxonomyTreeBrowser");
98      Node nodeSelected = getSelectedNode();
99      if(nodeSelected.getPath().equals(rootPath_)) {
100       children = nodeSelected.getNodes();
101     }
102     tree.setSelected(nodeSelected);
103     if(nodeSelected.getDepth() > 0) {
104       tree.setParentSelected(nodeSelected.getParent());
105       sibbling = nodeSelected.getParent().getNodes();
106       children = nodeSelected.getNodes();
107     } else {
108       tree.setParentSelected(nodeSelected);
109       sibbling = nodeSelected.getNodes();
110     }
111     List<Node> sibblingList = new ArrayList<Node>();
112     List<Node> childrenList = new ArrayList<Node>();
113     if(nodeSelected.getPath().equals(uiManager.getTaxonomyTreeNode().getPath())) {
114       sibbling = nodeSelected.getNodes();
115     }
116     while(sibbling.hasNext()) {
117       Node sibblingNode = (Node)sibbling.next();
118       if(!matchNodeType(sibblingNode)) continue;
119       if(PermissionUtil.canRead(sibblingNode) && !sibblingNode.isNodeType("exo:hiddenable")) {
120         sibblingList.add(sibblingNode);
121       }
122     }
123     if(nodeSelected.getPath().equals(rootPath_)) {
124       taxonomyList.add(uiManager.getTaxonomyTreeNode());
125       children = taxonomyList.iterator();
126     }
127 
128     if(children != null) {
129       while(children.hasNext()) {
130         Node childrenNode = (Node)children.next();
131         if(!matchNodeType(childrenNode)) continue;
132         if(PermissionUtil.canRead(childrenNode) && !childrenNode.isNodeType("exo:hiddenable")) {
133           childrenList.add(childrenNode);
134         }
135       }
136     }
137     if(nodeSelected.getPath().equals(rootPath_)) tree.setSibbling(childrenList);
138     else tree.setSibbling(sibblingList);
139     tree.setChildren(childrenList);
140   }
141 
142   public void renderChildren() throws Exception {
143     buildTree();
144     super.renderChildren();
145   }
146 
147   public String getRootPath() { return rootPath_; }
148 
149   public void setNodeSelect(String path) throws Exception {
150     UITaxonomyTreeCreateChild uiManager = getParent();
151     currentNode_ = NodeLocation.getNodeLocationByNode(uiManager.getNodeByPath(path));
152     if (!rootNode_.getPath().equals("/"))
153       if (getRootNode().getParent().getPath().equals(path))
154         currentNode_ = rootNode_;
155     uiManager.setSelectedPath(currentNode_.getPath());
156     changeNode(NodeLocation.getNodeByLocation(currentNode_));
157   }
158 
159   public void changeNode(Node nodeSelected) throws Exception {
160     List<Node> nodes = new ArrayList<Node>();
161     NodeIterator nodeIter = nodeSelected.getNodes();
162     List<Node> rootTaxonomyList = new ArrayList<Node>();
163     UITaxonomyTreeCreateChild uiTaxonomyManager = getParent();
164     while(nodeIter.hasNext()) {
165       nodes.add(nodeIter.nextNode());
166     }
167     if(nodeSelected.getPath().equals(rootPath_)) {
168       rootTaxonomyList.add(uiTaxonomyManager.getTaxonomyTreeNode());
169       nodes = rootTaxonomyList;
170     }
171 
172     UITaxonomyTreeCreateChild uiManager = getParent();
173     UITaxonomyTreeWorkingArea uiTreeWorkingArea = uiManager.getChild(UITaxonomyTreeWorkingArea.class);
174     List<Node> lstNode = new ArrayList<Node>();
175     for (Node node : nodes) {
176       if (uiTreeWorkingArea.matchNodeType(node))
177         lstNode.add(node);
178     }
179     uiTreeWorkingArea.setNodeList(lstNode);
180     uiTreeWorkingArea.updateGrid();
181   }
182 
183   public Node getSelectedNode() {
184     if(currentNode_ == null) return getRootNode();
185     return NodeLocation.getNodeByLocation(currentNode_);
186   }
187 
188   public static class ChangeNodeActionListener extends EventListener<UITaxonomyTreeBrowser> {
189     public void execute(Event<UITaxonomyTreeBrowser> event) throws Exception {
190       UITaxonomyTreeBrowser uiTaxonomyTreeBrowser = event.getSource();
191       String uri = event.getRequestContext().getRequestParameter(OBJECTID) ;
192       uiTaxonomyTreeBrowser.setNodeSelect(uri);
193       UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiTaxonomyTreeBrowser.getParent();
194       uiTaxonomyTreeCreateChild.onChange(uiTaxonomyTreeBrowser.getSelectedNode());
195       event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTreeCreateChild);
196     }
197   }
198 }
199