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.List;
22
23 import javax.jcr.Node;
24 import javax.jcr.NodeIterator;
25 import javax.jcr.PathNotFoundException;
26 import javax.jcr.ReferentialIntegrityException;
27
28 import org.exoplatform.commons.utils.LazyPageList;
29 import org.exoplatform.commons.utils.ListAccess;
30 import org.exoplatform.commons.utils.ListAccessImpl;
31 import org.exoplatform.ecm.webui.component.admin.taxonomy.action.UIActionForm;
32 import org.exoplatform.ecm.webui.component.admin.taxonomy.action.UIActionTaxonomyManager;
33 import org.exoplatform.ecm.webui.component.admin.taxonomy.info.UIPermissionForm;
34 import org.exoplatform.ecm.webui.component.admin.taxonomy.info.UIPermissionInfo;
35 import org.exoplatform.ecm.webui.component.admin.taxonomy.info.UIPermissionManager;
36 import org.exoplatform.services.cms.clipboard.jcr.model.ClipboardCommand;
37 import org.exoplatform.services.cms.taxonomy.TaxonomyService;
38 import org.exoplatform.services.cms.taxonomy.TaxonomyTreeData;
39 import org.exoplatform.services.log.ExoLogger;
40 import org.exoplatform.services.log.Log;
41 import org.exoplatform.services.wcm.core.NodeLocation;
42 import org.exoplatform.web.application.ApplicationMessage;
43 import org.exoplatform.webui.config.annotation.ComponentConfig;
44 import org.exoplatform.webui.config.annotation.EventConfig;
45 import org.exoplatform.webui.core.UIApplication;
46 import org.exoplatform.webui.core.UIContainer;
47 import org.exoplatform.webui.core.UIPageIterator;
48 import org.exoplatform.webui.core.UIPopupContainer;
49 import org.exoplatform.webui.event.Event;
50 import org.exoplatform.webui.event.EventListener;
51
52
53
54
55
56
57
58
59 @ComponentConfig(
60 template = "app:/groovy/webui/component/admin/taxonomy/UITaxonomyTreeWorkingArea.gtmpl",
61 events = {
62 @EventConfig(listeners = UITaxonomyTreeWorkingArea.PreviousActionListener.class),
63 @EventConfig(listeners = UITaxonomyTreeWorkingArea.AddActionListener.class),
64 @EventConfig(listeners = UITaxonomyTreeWorkingArea.RemoveActionListener.class,
65 confirm = "UITaxonomyManager.msg.confirm-delete"),
66 @EventConfig(listeners = UITaxonomyTreeWorkingArea.CopyActionListener.class),
67 @EventConfig(listeners = UITaxonomyTreeWorkingArea.PasteActionListener.class),
68 @EventConfig(listeners = UITaxonomyTreeWorkingArea.CutActionListener.class),
69 @EventConfig(listeners = UITaxonomyTreeWorkingArea.ViewPermissionActionListener.class)
70 }
71 )
72
73 public class UITaxonomyTreeWorkingArea extends UIContainer {
74 private UIPageIterator uiPageIterator_;
75
76 private List<NodeLocation> taxonomyNodes_;
77 private static final Log LOG = ExoLogger.getLogger(UITaxonomyTreeWorkingArea.class.getName());
78 private ClipboardCommand clipboard_ = new ClipboardCommand();
79
80 private String selectedPath_;
81
82 private String[] acceptedNodeTypes = {};
83
84 private String[] actions_ = { "Previous" };
85 public UITaxonomyTreeWorkingArea() throws Exception {
86 uiPageIterator_ = addChild(UIPageIterator.class, null, "UICategoriesSelect");
87 }
88
89 public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
90
91 public void updateGrid() throws Exception {
92 ListAccess<Object> nodeList = new ListAccessImpl<Object>(Object.class, getNodeList());
93 LazyPageList<Object> dataPageList = new LazyPageList<Object>(nodeList, 10);
94 uiPageIterator_.setPageList(dataPageList);
95 }
96
97 public String[] getActions() {return actions_;}
98
99 public List getListNodes() throws Exception {
100 return NodeLocation.getNodeListByLocationList(uiPageIterator_.getCurrentPageData());
101 }
102
103 public void setNodeList(List<Node> nodes) {
104 taxonomyNodes_ = NodeLocation.getLocationsByNodeList(nodes);
105 }
106 public List getNodeList() {return taxonomyNodes_; }
107
108 public boolean isRootNode() throws Exception {
109 UITaxonomyTreeCreateChild uiManager = getParent();
110 String selectedPath = uiManager.getSelectedPath();
111 if (selectedPath == null)
112 selectedPath = uiManager.getRootNode().getPath();
113 if (selectedPath.equals(uiManager.getRootNode().getPath()))
114 return true;
115 return false;
116 }
117
118 boolean matchNodeType(Node node) throws Exception {
119 if(acceptedNodeTypes == null || acceptedNodeTypes.length == 0) return true;
120 for(String nodeType: acceptedNodeTypes) {
121 if(node.isNodeType(nodeType)) return true;
122 }
123 return false;
124 }
125
126 public void update() throws Exception {
127 UITaxonomyTreeCreateChild uiManager = getParent();
128 if (selectedPath_ != null) {
129 try {
130 Node selectedTaxonomy = uiManager.getNodeByPath(selectedPath_);
131 NodeIterator nodeIter = selectedTaxonomy.getNodes();
132 List<Node> listNodes = new ArrayList<Node>();
133 while (nodeIter.hasNext()) {
134 Node node = nodeIter.nextNode();
135 if (matchNodeType(node))
136 listNodes.add(node);
137 }
138 setNodeList(listNodes);
139 } catch (PathNotFoundException e) {
140 if (LOG.isWarnEnabled()) {
141 LOG.warn(e.getMessage());
142 }
143 }
144 }
145 updateGrid();
146 }
147
148 public String[] getAcceptedNodeTypes() {
149 return acceptedNodeTypes;
150 }
151
152 public void setAcceptedNodeTypes(String[] acceptedNodeTypes) {
153 this.acceptedNodeTypes = acceptedNodeTypes;
154 }
155
156 public void setSelectedPath(String selectedPath) { selectedPath_ = selectedPath; }
157
158 public static class AddActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
159 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
160 UITaxonomyTreeWorkingArea uiTreeWorkingArea = event.getSource();
161 String path = event.getRequestContext().getRequestParameter(OBJECTID);
162 UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiTreeWorkingArea.getParent();
163 uiTaxonomyTreeCreateChild.initPopup(path);
164 event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTreeCreateChild);
165 }
166 }
167
168 public static class RemoveActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
169 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
170 UITaxonomyTreeWorkingArea uiTreeWorkingArea = event.getSource();
171 UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiTreeWorkingArea.getParent();
172 UIApplication uiApp = uiTreeWorkingArea.getAncestorOfType(UIApplication.class);
173 String path = event.getRequestContext().getRequestParameter(OBJECTID);
174 Node selectedNode = uiTaxonomyTreeCreateChild.getNodeByPath(path);
175 try {
176 uiTreeWorkingArea.setSelectedPath(selectedNode.getParent().getPath());
177 uiTreeWorkingArea.getApplicationComponent(TaxonomyService.class)
178 .removeTaxonomyNode(uiTaxonomyTreeCreateChild.getWorkspace(), path);
179 } catch (ReferentialIntegrityException ref) {
180 Object[] arg = { path };
181 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.reference-exception",
182 arg, ApplicationMessage.WARNING));
183
184 return;
185 } catch (Exception e) {
186 if (LOG.isErrorEnabled()) {
187 LOG.error("Unexpected error", e);
188 }
189 Object[] arg = { path };
190 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.path-error", arg,
191 ApplicationMessage.WARNING));
192
193 return;
194 }
195 if (uiTaxonomyTreeCreateChild.getChildById("TaxonomyPopupCreateChild") != null) {
196 uiTaxonomyTreeCreateChild.removeChildById("TaxonomyPopupCreateChild");
197 }
198 uiTreeWorkingArea.update();
199 event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTreeCreateChild);
200 }
201 }
202
203 public static class CopyActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
204 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
205 UITaxonomyTreeWorkingArea uiManager = event.getSource();
206 String realPath = event.getRequestContext().getRequestParameter(OBJECTID);
207 uiManager.clipboard_ = new ClipboardCommand();
208 uiManager.clipboard_.setType(ClipboardCommand.COPY);
209 uiManager.clipboard_.setSrcPath(realPath);
210 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
211 }
212 }
213
214 public static class PasteActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
215 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
216 UITaxonomyTreeWorkingArea uiWorkingArea = event.getSource();
217 UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiWorkingArea.getParent();
218 UITaxonomyTreeContainer uiTaxonomyTreeContainer = uiWorkingArea
219 .getAncestorOfType(UITaxonomyTreeContainer.class);
220 TaxonomyTreeData taxoTreeData = uiTaxonomyTreeContainer.getTaxonomyTreeData();
221 String realPath = event.getRequestContext().getRequestParameter(OBJECTID);
222 UIApplication uiApp = uiWorkingArea.getAncestorOfType(UIApplication.class);
223 String type = uiWorkingArea.clipboard_.getType();
224 String srcPath = uiWorkingArea.clipboard_.getSrcPath();
225 if (type == null || srcPath == null) {
226 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.can-not-paste", null,
227 ApplicationMessage.WARNING));
228
229 return;
230 }
231 if (type.equals(ClipboardCommand.CUT) && realPath.equals(srcPath)) {
232 Object[] arg = { realPath };
233 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.node-is-cutting", arg,
234 ApplicationMessage.WARNING));
235
236 return;
237 }
238 String destPath = realPath + srcPath.substring(srcPath.lastIndexOf("/"));
239 Node realNode = uiTaxonomyTreeCreateChild.getNodeByPath(realPath);
240 if (realNode.hasNode(srcPath.substring(srcPath.lastIndexOf("/") + 1))) {
241 Object[] args = { srcPath.substring(srcPath.lastIndexOf("/") + 1) };
242 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.exist", args,
243 ApplicationMessage.WARNING));
244
245 return;
246 }
247 TaxonomyService taxonomyService = uiWorkingArea
248 .getApplicationComponent(TaxonomyService.class);
249 try {
250 taxonomyService.moveTaxonomyNode(taxoTreeData.getTaxoTreeWorkspace(),
251 srcPath,
252 destPath,
253 type);
254 UITaxonomyTreeBrowser uiTaxonomyTreeBrowser = uiTaxonomyTreeCreateChild.getChild(UITaxonomyTreeBrowser.class);
255 if ((uiTaxonomyTreeBrowser != null) && (uiTaxonomyTreeBrowser.getSelectedNode() != null))
256 uiWorkingArea.setSelectedPath(uiTaxonomyTreeBrowser.getSelectedNode().getPath());
257 uiTaxonomyTreeCreateChild.update();
258 } catch (Exception e) {
259 uiApp.addMessage(new ApplicationMessage("UITaxonomyWorkingArea.msg.referential-integrity",
260 null, ApplicationMessage.WARNING));
261
262 return;
263 }
264 event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTreeCreateChild);
265 }
266 }
267
268 public static class CutActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
269 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
270 UITaxonomyTreeWorkingArea uiManager = event.getSource();
271 String realPath = event.getRequestContext().getRequestParameter(OBJECTID);
272 uiManager.clipboard_.setType(ClipboardCommand.CUT);
273 uiManager.clipboard_.setSrcPath(realPath);
274 event.getRequestContext().addUIComponentToUpdateByAjax(uiManager);
275 }
276 }
277
278 public static class ViewPermissionActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
279 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
280 UITaxonomyTreeWorkingArea uiManager = event.getSource();
281 UITaxonomyTreeCreateChild uiTaxonomyTreeCreateChild = uiManager.getParent();
282 String path = event.getRequestContext().getRequestParameter(OBJECTID);
283 UIPopupContainer uiPopupContainer =
284 uiTaxonomyTreeCreateChild.initPopupPermission(UITaxonomyTreeCreateChild.PERMISSION_ID_POPUP);
285 UIPermissionManager uiPerMan = uiPopupContainer.createUIComponent(UIPermissionManager.class, null, null);
286 uiPerMan.getChild(UIPermissionInfo.class).setCurrentNode(uiTaxonomyTreeCreateChild.getNodeByPath(path));
287 uiPerMan.getChild(UIPermissionForm.class).setCurrentNode(uiTaxonomyTreeCreateChild.getNodeByPath(path));
288 uiPopupContainer.activate(uiPerMan, 650,550);
289 uiPopupContainer.setRendered(true);
290 uiPerMan.checkPermissonInfo(uiTaxonomyTreeCreateChild.getNodeByPath(path));
291 }
292 }
293
294 public static class PreviousActionListener extends EventListener<UITaxonomyTreeWorkingArea> {
295 public void execute(Event<UITaxonomyTreeWorkingArea> event) throws Exception {
296 UITaxonomyTreeContainer uiTaxonomyTreeContainer = event.getSource().getAncestorOfType(UITaxonomyTreeContainer.class);
297 UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeContainer.getAncestorOfType(UITaxonomyManagerTrees.class);
298 TaxonomyTreeData taxonomyTreeData = uiTaxonomyTreeContainer.getTaxonomyTreeData();
299 UIActionTaxonomyManager uiActionTaxonomyManager = uiTaxonomyTreeContainer.getChild(UIActionTaxonomyManager.class);
300 UIActionForm uiActionForm = uiActionTaxonomyManager.getChild(UIActionForm.class);
301 uiActionForm.createNewAction(null, TaxonomyTreeData.ACTION_TAXONOMY_TREE, true);
302 uiActionForm.setWorkspace(taxonomyTreeData.getTaxoTreeWorkspace());
303 uiTaxonomyTreeContainer.viewStep(3);
304 event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees);
305 }
306 }
307
308 }