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.Collections;
22  import java.util.Comparator;
23  import java.util.List;
24  
25  import org.exoplatform.ecm.webui.component.admin.taxonomy.tree.info.UIPermissionTreeManager;
26  import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
27  import org.exoplatform.ecm.webui.form.validator.ECMNameValidator;
28  import org.exoplatform.ecm.webui.utils.Utils;
29  import org.exoplatform.services.cms.BasePath;
30  import org.exoplatform.services.cms.taxonomy.TaxonomyService;
31  import org.exoplatform.services.cms.taxonomy.TaxonomyTreeData;
32  import org.exoplatform.services.jcr.RepositoryService;
33  import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
34  import org.exoplatform.web.application.ApplicationMessage;
35  import org.exoplatform.webui.config.annotation.ComponentConfig;
36  import org.exoplatform.webui.config.annotation.EventConfig;
37  import org.exoplatform.webui.core.UIApplication;
38  import org.exoplatform.webui.core.UIPopupWindow;
39  import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
40  import org.exoplatform.webui.core.model.SelectItemOption;
41  import org.exoplatform.webui.event.Event;
42  import org.exoplatform.webui.event.Event.Phase;
43  import org.exoplatform.webui.event.EventListener;
44  import org.exoplatform.webui.form.UIForm;
45  import org.exoplatform.webui.form.UIFormInputBase;
46  import org.exoplatform.webui.form.UIFormSelectBox;
47  import org.exoplatform.webui.form.UIFormStringInput;
48  import org.exoplatform.webui.form.validator.MandatoryValidator;
49  
50  
51  /**
52   * Created by The eXo Platform SARL
53   * Author : Hoang Van Hung
54   *          hunghvit@gmail.com
55   * Apr 9, 2009
56   */
57  
58  @ComponentConfig(
59                   lifecycle = UIFormLifecycle.class,
60                   template =  "system:/groovy/webui/form/UIForm.gtmpl",
61                   events = {
62                     @EventConfig(listeners = UITaxonomyTreeMainForm.ChangeActionListener.class, phase = Phase.DECODE),
63                     @EventConfig(listeners = UITaxonomyTreeMainForm.ResetActionListener.class, phase = Phase.DECODE),
64                     @EventConfig(listeners = UITaxonomyTreeMainForm.CancelActionListener.class, phase=Phase.DECODE),
65                     @EventConfig(listeners = UITaxonomyTreeMainForm.AddPathActionListener.class, phase = Phase.DECODE),
66                     @EventConfig(listeners = UITaxonomyTreeMainForm.NextViewPermissionActionListener.class)
67                   }
68      )
69  
70  public class UITaxonomyTreeMainForm extends UIForm {
71  
72    public static final String FIELD_NAME       = "TaxoTreeName";
73  
74    public static final String FIELD_WORKSPACE  = "TaxoTreeWorkspace";
75  
76    public static final String FIELD_HOMEPATH   = "TaxoTreeHomePath";
77  
78    public UITaxonomyTreeMainForm() throws Exception {
79      addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null)
80      .addValidator(MandatoryValidator.class).addValidator(ECMNameValidator.class));
81      UIFormSelectBox uiSelectWorkspace = new UIFormSelectBox(FIELD_WORKSPACE, FIELD_WORKSPACE, null);
82      addChild(uiSelectWorkspace);
83      uiSelectWorkspace.setOnChange("Change");
84      UIFormInputSetWithAction uiActionHomePath = new UIFormInputSetWithAction("TaxonomyTreeHomePath");
85      uiActionHomePath.addUIFormInput(new UIFormStringInput(FIELD_HOMEPATH, FIELD_HOMEPATH, null)
86      .setReadOnly(true));
87      uiActionHomePath.setActionInfo(FIELD_HOMEPATH, new String[] { "AddPath" });
88      addUIComponentInput(uiActionHomePath);
89      setActions(new String[] {"NextViewPermission","Reset"});
90    }
91  
92    public void update(TaxonomyTreeData taxonomyTree) throws Exception {
93      String[] wsNames = getApplicationComponent(RepositoryService.class)
94          .getCurrentRepository().getWorkspaceNames();
95      List<SelectItemOption<String>> workspace = new ArrayList<SelectItemOption<String>>();
96      String systemWorkspace = getAncestorOfType(UITaxonomyManagerTrees.class).getSystemWorkspaceName();
97      String dmsSystemWorkspace = getAncestorOfType(UITaxonomyManagerTrees.class).getDmsSystemWorkspaceName();
98  
99      for(String wsName : wsNames) {
100       if (!systemWorkspace.equals(wsName))
101         workspace.add(new SelectItemOption<String>(wsName, wsName));
102     }
103     if (taxonomyTree == null) taxonomyTree = new TaxonomyTreeData();
104 
105     //sort workspace
106     Comparator<SelectItemOption<String>> comparator = new Comparator<SelectItemOption<String>>(){
107       @Override
108       public int compare(SelectItemOption<String> option1, SelectItemOption<String> option2) {
109         try {
110           return option1.getValue().compareToIgnoreCase(option2.getValue());
111         }catch (Exception ex){
112           return 0;
113         }
114       }
115     };
116     Collections.sort(workspace, comparator);
117     UIFormSelectBox uiSelectBox = getUIFormSelectBox(FIELD_WORKSPACE).setOptions(workspace);
118     if (taxonomyTree.getTaxoTreeWorkspace() == null) {
119       taxonomyTree.setTaxoTreeWorkspace(dmsSystemWorkspace);
120     }
121     uiSelectBox.setValue(taxonomyTree.getTaxoTreeWorkspace());
122     UIFormInputBase<String> inputName = findComponentById(FIELD_NAME);
123     UIFormInputBase<String> inputHomePath = findComponentById(FIELD_HOMEPATH);
124     String treeName = taxonomyTree.getTaxoTreeName();
125     //Check edit
126     TaxonomyTreeData taxonomyTreeData = ((UITaxonomyTreeContainer)getParent()).getTaxonomyTreeData();
127     if (taxonomyTreeData == null || !taxonomyTreeData.isEdit())
128       inputName.setValue(treeName);
129     else
130       inputName.setValue(taxonomyTreeData.getTaxoTreeName());
131     inputHomePath.setValue(taxonomyTree.getTaxoTreeHomePath());
132     getUIStringInput(FIELD_NAME).setReadOnly(false);
133     if((taxonomyTree != null && taxonomyTree.isEdit()) || (taxonomyTreeData != null && taxonomyTreeData.isEdit())) {
134       getUIStringInput(FIELD_NAME).setReadOnly(true);
135     }
136   }
137 
138   int checkForm() throws Exception {
139     UIFormStringInput input = getChildById(FIELD_WORKSPACE);
140     if (input == null || input.getValue() == null || input.getValue().length() == 0) {
141       return 1;
142     }
143     UIFormSelectBox selectBox = getChildById(FIELD_WORKSPACE);
144     UIFormInputBase<String> inputHomePath = findComponentById(FIELD_HOMEPATH);
145     String homePath = "";
146     if (inputHomePath != null && inputHomePath.getValue() != null) {
147       homePath = inputHomePath.getValue().toString();
148     }
149     String dmsSysWorkspace = getAncestorOfType(UITaxonomyManagerTrees.class).getDmsSystemWorkspaceName();
150     String workspace = selectBox.getValue();
151     if (homePath.length() == 0) {
152       if (!dmsSysWorkspace.equals(workspace)) {
153         return 2;
154       }
155     }
156     return 0;
157   }
158 
159   public static class AddPathActionListener extends EventListener<UITaxonomyTreeMainForm> {
160     public void execute(Event<UITaxonomyTreeMainForm> event) throws Exception {
161       UITaxonomyTreeMainForm uiTaxonomyTreeForm = event.getSource();
162       UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeForm.getAncestorOfType(UITaxonomyManagerTrees.class);
163       String workspace =
164           uiTaxonomyTreeForm.getUIFormSelectBox(FIELD_WORKSPACE).getValue();
165       uiTaxonomyManagerTrees.initPopupJCRBrowser(workspace, true);
166       event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees);
167     }
168   }
169 
170   public static class ChangeActionListener extends EventListener<UITaxonomyTreeMainForm> {
171     public void execute(Event<UITaxonomyTreeMainForm> event) throws Exception {
172       UITaxonomyTreeMainForm uiTaxonomyTreeMainForm = event.getSource();
173       UITaxonomyTreeContainer uiTaxonomyTreeContainer = uiTaxonomyTreeMainForm.getParent();
174       UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeMainForm.getAncestorOfType(UITaxonomyManagerTrees.class);
175       uiTaxonomyTreeMainForm.getUIStringInput(FIELD_HOMEPATH).setValue("");
176       TaxonomyTreeData taxonomyTreeData = uiTaxonomyTreeContainer.getTaxonomyTreeData();
177       UIFormSelectBox selectBox = uiTaxonomyTreeMainForm.getChildById(FIELD_WORKSPACE);
178       taxonomyTreeData.setTaxoTreeHomePath("");
179       taxonomyTreeData.setTaxoTreeWorkspace(selectBox.getValue());
180 
181       String dmsSysWorkspace = uiTaxonomyManagerTrees.getDmsSystemWorkspaceName();
182       UIFormInputSetWithAction uiActionHomePath = uiTaxonomyTreeMainForm.getChildById("TaxonomyTreeHomePath");
183       uiActionHomePath.removeChildById(FIELD_HOMEPATH);
184       if (!selectBox.getValue().equals(dmsSysWorkspace)) {
185         uiActionHomePath.addUIFormInput(new UIFormStringInput(FIELD_HOMEPATH, FIELD_HOMEPATH, null).
186                                         addValidator(MandatoryValidator.class).setReadOnly(true));
187       } else {
188         uiActionHomePath.addUIFormInput(new UIFormStringInput(FIELD_HOMEPATH, FIELD_HOMEPATH, null).setReadOnly(true));
189       }
190       event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees);
191     }
192   }
193 
194   public static class NextViewPermissionActionListener extends EventListener<UITaxonomyTreeMainForm> {
195     public void execute(Event<UITaxonomyTreeMainForm> event) throws Exception {
196       UITaxonomyTreeMainForm uiTaxonomyTreeMainForm = event.getSource();
197       UITaxonomyTreeContainer uiTaxonomyTreeContainer = uiTaxonomyTreeMainForm.getParent();
198       TaxonomyTreeData taxonomyTreeData = uiTaxonomyTreeContainer.getTaxonomyTreeData();
199       UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeContainer.getAncestorOfType(UITaxonomyManagerTrees.class);
200       UIApplication uiApp = uiTaxonomyTreeContainer.getAncestorOfType(UIApplication.class);
201       int validateCode = uiTaxonomyTreeMainForm.checkForm();
202       if (validateCode == 1) {
203         uiApp.addMessage(new ApplicationMessage("UITaxonomyTreeMainForm.msg.name-emty", null,
204                                                 ApplicationMessage.WARNING));
205 
206         return;
207       } else if (validateCode == 2) {
208         uiApp.addMessage(new ApplicationMessage("UITaxonomyTreeMainForm.msg.homepath-emty", null,
209                                                 ApplicationMessage.WARNING));
210 
211         return;
212       }
213 
214       UIFormInputBase<String> inputName = uiTaxonomyTreeMainForm.findComponentById(FIELD_NAME);     
215       String name = inputName.getValue().toString().trim();
216 
217       TaxonomyService taxonomyService = uiTaxonomyTreeMainForm.getApplicationComponent(TaxonomyService.class);
218       if (taxonomyService.hasTaxonomyTree(name) && !taxonomyTreeData.isEdit()) {
219         uiApp.addMessage(new ApplicationMessage("UITaxonomyTreeMainForm.msg.taxonomytree-existed", null,
220                                                 ApplicationMessage.WARNING));
221 
222         return;
223       }
224 
225       UIFormSelectBox selectBox = uiTaxonomyTreeMainForm.getChildById(FIELD_WORKSPACE);
226       UIFormInputBase<String> inputHomePath = uiTaxonomyTreeMainForm.findComponentById(FIELD_HOMEPATH);
227       String homePath = "";
228       if (inputHomePath != null && inputHomePath.getValue() != null) homePath =inputHomePath.getValue().toString();
229       NodeHierarchyCreator nodeHierarchyCreator = uiTaxonomyTreeMainForm.getApplicationComponent(NodeHierarchyCreator.class);
230       String treeDefinitionPath = nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_DEFINITION_PATH);
231       if ((homePath.length() > 0) && (treeDefinitionPath != null)
232           && (treeDefinitionPath.length() > 0) && (homePath.equals(treeDefinitionPath))) {
233         uiApp.addMessage(new ApplicationMessage("UITaxonomyTreeMainForm.msg.no-right-target-path", null,
234                                                 ApplicationMessage.WARNING));
235 
236         return;
237       }
238       UIPermissionTreeManager uiPermissionManage = uiTaxonomyTreeContainer.getChild(UIPermissionTreeManager.class);
239       taxonomyTreeData.setTaxoTreeName(name);
240       taxonomyTreeData.setTaxoTreeHomePath(homePath.trim());
241       taxonomyTreeData.setTaxoTreeWorkspace(selectBox.getValue());
242       uiTaxonomyTreeContainer.viewStep(2);
243       uiPermissionManage.update();
244       event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees);
245     }
246   }
247 
248   public static class ResetActionListener extends EventListener<UITaxonomyTreeMainForm> {
249     public void execute(Event<UITaxonomyTreeMainForm> event) throws Exception {
250       UITaxonomyTreeMainForm uiTaxonomyTreeForm = event.getSource();
251       UITaxonomyManagerTrees uiTaxonomyManagerTrees = uiTaxonomyTreeForm.getAncestorOfType(UITaxonomyManagerTrees.class);
252       uiTaxonomyTreeForm.getUIStringInput(FIELD_NAME).setValue("");
253       uiTaxonomyTreeForm.getUIStringInput(FIELD_HOMEPATH).setValue("");
254       uiTaxonomyTreeForm.update(null);
255       event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyManagerTrees);
256     }
257   }
258 
259   static  public class CancelActionListener extends EventListener<UITaxonomyTreeMainForm> {
260     public void execute(Event<UITaxonomyTreeMainForm> event) throws Exception {
261       UITaxonomyTreeMainForm uiTaxonomyTreeForm = event.getSource();
262       UITaxonomyTreeContainer uiContainer = uiTaxonomyTreeForm.getAncestorOfType(UITaxonomyTreeContainer.class);
263       UIPopupWindow uiPopupWindow = uiContainer.getParent();
264       uiPopupWindow.setRendered(false) ;
265       event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow) ;
266     }
267   }
268 
269 }