1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
38
39
40
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