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.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   * Created by The eXo Platform SARL
54   * Author : Hoang Van Hung
55   *          hunghvit@gmail.com
56   * Apr 7, 2009
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 }