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  
22  import javax.jcr.AccessDeniedException;
23  import javax.jcr.Node;
24  import javax.jcr.RepositoryException;
25  import javax.jcr.Session;
26  
27  import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
28  import org.exoplatform.ecm.webui.selector.UISelectable;
29  import org.exoplatform.ecm.webui.tree.UINodeTreeBuilder;
30  import org.exoplatform.services.jcr.RepositoryService;
31  import org.exoplatform.services.jcr.core.ManageableRepository;
32  import org.exoplatform.services.log.ExoLogger;
33  import org.exoplatform.services.log.Log;
34  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
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.UIBreadcumbs;
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.EventListener;
43  import org.exoplatform.webui.form.UIForm;
44  import org.exoplatform.webui.form.UIFormInputInfo;
45  import org.exoplatform.webui.form.UIFormSelectBox;
46  
47  /**
48   * Created by The eXo Platform SARL
49   * Author : Dang Van Minh
50   *          minh.dang@exoplatform.com
51   * Jun 21, 2007 2:32:49 PM
52   */
53  @ComponentConfig(
54                   lifecycle = UIFormLifecycle.class,
55                   template = "classpath:groovy/ecm/webui/form/UIFormWithoutAction.gtmpl",
56                   events = {
57                     @EventConfig(listeners = UIWorkspaceList.ChangeWorkspaceActionListener.class),
58                     @EventConfig(listeners = UIWorkspaceList.AddRootNodeActionListener.class)
59                   }
60      )
61  public class UIWorkspaceList extends UIForm {
62  
63    static private String WORKSPACE_NAME = "workspaceName";
64    static private String ROOT_NODE_INFO = "rootNodeInfo";
65    static private String ROOT_NODE_PATH = "rootNodePath";
66  
67    private List<String> wsList_;
68    private boolean isShowSystem_ = true;
69  
70    private static final Log LOG = ExoLogger.getLogger(UIWorkspaceList.class.getName());
71  
72    public UIWorkspaceList() throws Exception {
73      List<SelectItemOption<String>> wsList = new ArrayList<SelectItemOption<String>>();
74      UIFormSelectBox uiWorkspaceList = new UIFormSelectBox(WORKSPACE_NAME, WORKSPACE_NAME, wsList);
75      uiWorkspaceList.setOnChange("ChangeWorkspace");
76      addUIFormInput(uiWorkspaceList);
77      UIFormInputSetWithAction rootNodeInfo = new UIFormInputSetWithAction(ROOT_NODE_INFO);
78      rootNodeInfo.addUIFormInput(new UIFormInputInfo(ROOT_NODE_PATH, ROOT_NODE_PATH, null));
79      String[] actionInfor = {"AddRootNode"};
80      rootNodeInfo.setActionInfo(ROOT_NODE_PATH, actionInfor);
81      rootNodeInfo.showActionInfo(true);
82      rootNodeInfo.setRendered(false);
83      addUIComponentInput(rootNodeInfo);
84    }
85  
86    public void setIsShowSystem(boolean isShowSystem) { isShowSystem_ = isShowSystem; }
87  
88    public boolean isShowSystemWorkspace() { return isShowSystem_; }
89  
90    public void setShowRootPathSelect(boolean isRender) {
91      UIFormInputSetWithAction uiInputAction = getChildById(ROOT_NODE_INFO);
92      uiInputAction.setRendered(isRender);
93    }
94  
95    public void setWorkspaceList() throws Exception {
96      wsList_ = new ArrayList<String>();
97      RepositoryService repositoryService = getApplicationComponent(RepositoryService.class);
98      String[] wsNames = repositoryService.getCurrentRepository().getWorkspaceNames();
99  
100     String systemWsName = repositoryService.getCurrentRepository()
101         .getConfiguration()
102         .getSystemWorkspaceName();
103     List<SelectItemOption<String>> workspace = new ArrayList<SelectItemOption<String>>();
104     for (String wsName : wsNames) {
105       Node rootNode = null;
106       try {
107         rootNode = getRootNode(wsName);
108       } catch(AccessDeniedException ex) {
109         continue;
110       } catch(RepositoryException ex) {
111         continue;
112       }    		
113       if (!isShowSystem_) {
114         if (!wsName.equals(systemWsName)) {
115           workspace.add(new SelectItemOption<String>(wsName, wsName));
116           wsList_.add(wsName);
117         }
118       } else {
119         workspace.add(new SelectItemOption<String>(wsName, wsName));
120         wsList_.add(wsName);
121       }      
122     }
123     UIFormSelectBox uiWorkspaceList = getUIFormSelectBox(WORKSPACE_NAME);
124     uiWorkspaceList.setOptions(workspace);
125     UIOneNodePathSelector uiBrowser = getParent();
126     if (uiBrowser.getWorkspaceName() != null) {
127       if (wsList_.contains(uiBrowser.getWorkspaceName())) {
128         uiWorkspaceList.setValue(uiBrowser.getWorkspaceName());
129       }
130     }
131   }  
132 
133   public void setIsDisable(String wsName, boolean isDisable) {
134     if(wsList_.contains(wsName)) getUIFormSelectBox(WORKSPACE_NAME).setValue(wsName);
135     getUIFormSelectBox(WORKSPACE_NAME).setDisabled(isDisable);
136   }
137 
138   private Node getRootNode(String workspaceName) throws RepositoryException {
139     RepositoryService repositoryService = getApplicationComponent(RepositoryService.class);
140     ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
141     return WCMCoreUtils.getUserSessionProvider().getSession(workspaceName, manageableRepository).getRootNode();
142   }
143 
144   static public class ChangeWorkspaceActionListener extends EventListener<UIWorkspaceList> {
145     public void execute(Event<UIWorkspaceList> event) throws Exception {
146       UIWorkspaceList uiWorkspaceList = event.getSource();
147       UIOneNodePathSelector uiJBrowser = uiWorkspaceList.getParent();
148       String wsName = uiWorkspaceList.getUIFormSelectBox(WORKSPACE_NAME).getValue();
149       uiJBrowser.setWorkspaceName(wsName);
150       UINodeTreeBuilder uiTreeBuilder = uiJBrowser.getChild(UINodeTreeBuilder.class);
151       UIBreadcumbs uiBreadcumbs = uiJBrowser.getChild(UIBreadcumbs.class);
152       if (uiBreadcumbs != null) uiBreadcumbs.getPath().clear();
153       UIApplication uiApp = uiWorkspaceList.getAncestorOfType(UIApplication.class);
154       try {
155         uiTreeBuilder.setRootTreeNode(uiWorkspaceList.getRootNode(wsName));      
156       } catch(Exception e) {
157         if (LOG.isErrorEnabled()) {
158           LOG.error("An unexpected error occurs", e);
159         }
160         return;
161       }
162 
163       uiTreeBuilder.buildTree();
164       event.getRequestContext().addUIComponentToUpdateByAjax(uiJBrowser);
165     }
166   }
167 
168   static public class AddRootNodeActionListener extends EventListener<UIWorkspaceList> {
169     public void execute(Event<UIWorkspaceList> event) throws Exception {
170       UIWorkspaceList uiWorkspaceList = event.getSource();
171       UIOneNodePathSelector uiJBrowser = uiWorkspaceList.getParent();
172       String returnField = uiJBrowser.getReturnFieldName();
173       String workspaceName = uiJBrowser.getWorkspaceName();
174       RepositoryService repositoryService = uiWorkspaceList.getApplicationComponent(RepositoryService.class);
175       ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
176       Session session = WCMCoreUtils.getSystemSessionProvider().getSession(workspaceName, manageableRepository);
177       String value = session.getRootNode().getPath();
178       if (!uiJBrowser.isDisable()) {
179         StringBuffer sb = new StringBuffer();
180         sb.append(uiJBrowser.getWorkspaceName()).append(":").append(value);
181         value = sb.toString();
182       }
183       ((UISelectable)uiJBrowser.getSourceComponent()).doSelect(returnField, value);
184     }
185   }
186 }