View Javadoc
1   /*
2    * Copyright (C) 2003-2007 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  package org.exoplatform.ecm.webui.tree.selectone;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  import java.util.MissingResourceException;
22  import java.util.ResourceBundle;
23  
24  import javax.jcr.AccessDeniedException;
25  import javax.jcr.Node;
26  import javax.jcr.RepositoryException;
27  
28  import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
29  import org.exoplatform.ecm.webui.selector.UISelectable;
30  import org.exoplatform.ecm.webui.tree.UIBaseNodeTreeSelector;
31  import org.exoplatform.ecm.webui.tree.UITreeTaxonomyBuilder;
32  import org.exoplatform.portal.webui.util.Util;
33  import org.exoplatform.services.cms.taxonomy.TaxonomyService;
34  import org.exoplatform.services.jcr.RepositoryService;
35  import org.exoplatform.services.jcr.core.ManageableRepository;
36  import org.exoplatform.services.jcr.ext.common.SessionProvider;
37  import org.exoplatform.services.log.ExoLogger;
38  import org.exoplatform.services.log.Log;
39  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
40  import org.exoplatform.web.application.ApplicationMessage;
41  import org.exoplatform.web.application.RequestContext;
42  import org.exoplatform.webui.config.annotation.ComponentConfig;
43  import org.exoplatform.webui.config.annotation.EventConfig;
44  import org.exoplatform.webui.core.UIApplication;
45  import org.exoplatform.webui.core.UIBreadcumbs;
46  import org.exoplatform.webui.core.UIComponent;
47  import org.exoplatform.webui.core.UIPopupWindow;
48  import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
49  import org.exoplatform.webui.core.model.SelectItemOption;
50  import org.exoplatform.webui.event.Event;
51  import org.exoplatform.webui.event.EventListener;
52  import org.exoplatform.webui.form.UIForm;
53  import org.exoplatform.webui.form.UIFormInputInfo;
54  import org.exoplatform.webui.form.UIFormSelectBox;
55  
56  /**
57   * Created by The eXo Platform SARL
58   * Author : Dang Van Minh
59   *          minh.dang@exoplatform.com
60   * Jun 21, 2007 2:32:49 PM
61   */
62  @ComponentConfig(
63      lifecycle = UIFormLifecycle.class,
64      template = "classpath:groovy/ecm/webui/form/UIFormWithoutAction.gtmpl",
65      events = {
66        @EventConfig(listeners = UITreeTaxonomyList.ChangeTaxonomyTreeActionListener.class),
67        @EventConfig(listeners = UITreeTaxonomyList.AddRootNodeActionListener.class)
68      }
69  )
70  public class UITreeTaxonomyList extends UIForm {
71  
72    static private String ROOT_NODE_INFO = "rootNodeInfo";
73    static private String ROOT_NODE_PATH = "rootNodePath";
74    public static String TAXONOMY_TREE = "taxonomyTree";
75    private static final Log LOG  = ExoLogger.getLogger(UITreeTaxonomyList.class.getName());
76    private boolean isShowSystem_ = true;
77  
78    public UITreeTaxonomyList() throws Exception {
79      List<SelectItemOption<String>> taxonomyTreeList = new ArrayList<SelectItemOption<String>>();
80      UIFormSelectBox uiTaxonomyTreeList = new UIFormSelectBox(TAXONOMY_TREE, TAXONOMY_TREE, taxonomyTreeList);
81      uiTaxonomyTreeList.setOnChange("ChangeTaxonomyTree");
82      addUIFormInput(uiTaxonomyTreeList);
83  
84      UIFormInputSetWithAction rootNodeInfo = new UIFormInputSetWithAction(ROOT_NODE_INFO);
85      rootNodeInfo.addUIFormInput(new UIFormInputInfo(ROOT_NODE_PATH, ROOT_NODE_PATH, null));
86      String[] actionInfor = {"AddRootNode"};
87      rootNodeInfo.setActionInfo(ROOT_NODE_PATH, actionInfor);
88      rootNodeInfo.showActionInfo(true);
89      rootNodeInfo.setRendered(true);
90      addUIComponentInput(rootNodeInfo);
91    }
92  
93    public void setIsShowSystem(boolean isShowSystem) { isShowSystem_ = isShowSystem; }
94  
95    public boolean isShowSystemWorkspace() { return isShowSystem_; }
96  
97    public void setShowRootPathSelect(boolean isRender) {
98      UIFormInputSetWithAction uiInputAction = getChildById(ROOT_NODE_INFO);
99      uiInputAction.setRendered(isRender);
100   }
101 
102   private String getTaxonomyLabel(String taxonomyTree) {
103     String display = taxonomyTree;
104     RequestContext context = Util.getPortalRequestContext();
105     ResourceBundle res = context.getApplicationResourceBundle();
106     try {
107       return res.getString(("eXoTaxonomies.").concat(taxonomyTree).concat(".label"));
108     } catch (MissingResourceException me) {
109       return display;
110     }
111   }
112   
113   public void setTaxonomyTreeList() throws Exception {
114     TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class);
115     List<Node> listNode = taxonomyService.getAllTaxonomyTrees();
116     List<SelectItemOption<String>> taxonomyTree = new ArrayList<SelectItemOption<String>>();
117     for(Node itemNode : listNode) {
118       taxonomyTree.add(new SelectItemOption<String>(getTaxonomyLabel(itemNode.getName()), itemNode.getName()));
119     }
120     UIFormSelectBox uiTreeTaxonomyList = getUIFormSelectBox(TAXONOMY_TREE);
121     uiTreeTaxonomyList.setOptions(taxonomyTree);
122   }  
123 
124   private Node getRootNode(String workspaceName, String pathNode) throws RepositoryException {
125     RepositoryService repositoryService = getApplicationComponent(RepositoryService.class);
126     ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
127     SessionProvider sessionProvider = WCMCoreUtils.getUserSessionProvider();
128     return (Node) sessionProvider.getSession(workspaceName, manageableRepository).getItem(pathNode);
129   }
130 
131   static public class ChangeTaxonomyTreeActionListener extends EventListener<UITreeTaxonomyList> {
132     public void execute(Event<UITreeTaxonomyList> event) throws Exception {
133       UITreeTaxonomyList uiTreeTaxonomyList = event.getSource();
134       UIOneTaxonomySelector uiOneTaxonomySelector = uiTreeTaxonomyList.getParent();
135       String taxoTreeName = uiTreeTaxonomyList.getUIFormSelectBox(TAXONOMY_TREE).getValue();
136       Node taxoTreeNode = uiOneTaxonomySelector.getTaxoTreeNode(taxoTreeName);
137       String workspaceName = taxoTreeNode.getSession().getWorkspace().getName();
138       String pathTaxonomy = taxoTreeNode.getPath();
139       UIApplication uiApp = uiTreeTaxonomyList.getAncestorOfType(UIApplication.class);
140       if (taxoTreeNode.hasNodes()) {
141         uiOneTaxonomySelector.setWorkspaceName(workspaceName);
142         uiOneTaxonomySelector.setRootTaxonomyName(taxoTreeNode.getName());
143         uiOneTaxonomySelector.setRootTreePath(taxoTreeNode.getPath());
144         UIBreadcumbs uiBreadcumbs = uiOneTaxonomySelector.getChildById("BreadcumbOneTaxonomy");
145         uiBreadcumbs.getPath().clear();
146         UITreeTaxonomyBuilder uiTreeJCRExplorer = uiOneTaxonomySelector.getChild(UITreeTaxonomyBuilder.class);
147         try {
148           uiTreeJCRExplorer.setRootTreeNode(uiTreeTaxonomyList.getRootNode(workspaceName, pathTaxonomy));
149           uiTreeJCRExplorer.buildTree();
150         } catch (AccessDeniedException ade) {
151           UIFormSelectBox uiTaxonomyTree = uiTreeTaxonomyList.getUIFormSelectBox(TAXONOMY_TREE);
152           List<SelectItemOption<String>> taxonomyTree = uiTaxonomyTree.getOptions();
153           if (taxonomyTree != null && taxonomyTree.size() > 0)
154             uiTaxonomyTree.setValue(taxonomyTree.get(0).getValue());
155 
156           uiApp.addMessage(new ApplicationMessage("UIWorkspaceList.msg.AccessDeniedException", null, ApplicationMessage.WARNING));
157           event.getRequestContext().addUIComponentToUpdateByAjax(uiTaxonomyTree.getParent());
158           return;
159         } catch(Exception e) {
160           if (LOG.isErrorEnabled()) {
161             LOG.error("Unexpected error", e);
162           }
163           return;
164         }
165       } else {
166         UIFormSelectBox uiTaxonomyTree = uiTreeTaxonomyList.getUIFormSelectBox(TAXONOMY_TREE);
167         List<SelectItemOption<String>> taxonomyTree = uiTaxonomyTree.getOptions();
168         if (taxonomyTree != null && taxonomyTree.size() > 0)
169           uiTaxonomyTree.setValue(taxonomyTree.get(0).getValue());
170         uiApp.addMessage(new ApplicationMessage("UITreeTaxonomyList.msg.NoChild", null, ApplicationMessage.WARNING));
171         return;
172       }
173       event.getRequestContext().addUIComponentToUpdateByAjax(uiOneTaxonomySelector);
174     }
175   }
176 
177   static public class AddRootNodeActionListener extends EventListener<UITreeTaxonomyList> {
178     public void execute(Event<UITreeTaxonomyList> event) throws Exception {
179       UITreeTaxonomyList uiTreeTaxonomyList = event.getSource();
180       String taxoTreeName = uiTreeTaxonomyList.getUIFormSelectBox(TAXONOMY_TREE).getValue();
181       UIOneTaxonomySelector uiTaxonomySelector = uiTreeTaxonomyList.getParent();
182       String returnField = ((UIBaseNodeTreeSelector) uiTaxonomySelector).getReturnFieldName();
183       ((UISelectable)((UIBaseNodeTreeSelector) uiTaxonomySelector).getSourceComponent()).doSelect(returnField, taxoTreeName) ;
184       UIComponent uiComponent = uiTaxonomySelector.getParent();
185       if (uiComponent instanceof UIPopupWindow) {
186         ((UIPopupWindow)uiComponent).setShow(false);
187         ((UIPopupWindow)uiComponent).setRendered(false);
188         event.getRequestContext().addUIComponentToUpdateByAjax(uiComponent);
189       }
190       UIComponent component = uiTaxonomySelector.getSourceComponent().getParent();
191       if (component != null) {
192         event.getRequestContext().addUIComponentToUpdateByAjax(component);
193       }
194     }
195   }
196 }