View Javadoc
1   /***************************************************************************
2    * Copyright 2001-2008 The eXo Platform SARL         All rights reserved.  *
3    * Please look at license.txt in info directory for more license detail.   *
4    **************************************************************************/
5   package org.exoplatform.ecm.webui.selector;
6   
7   import java.util.ArrayList;
8   import java.util.Collection;
9   import java.util.Collections;
10  import java.util.List;
11  
12  import org.exoplatform.services.organization.Group;
13  import org.exoplatform.services.organization.MembershipType;
14  import org.exoplatform.services.organization.OrganizationService;
15  import org.exoplatform.services.security.IdentityConstants;
16  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
17  import org.exoplatform.webui.config.annotation.ComponentConfig;
18  import org.exoplatform.webui.config.annotation.ComponentConfigs;
19  import org.exoplatform.webui.config.annotation.EventConfig;
20  import org.exoplatform.webui.core.UIBreadcumbs;
21  import org.exoplatform.webui.core.UIBreadcumbs.LocalPath;
22  import org.exoplatform.webui.core.UIComponent;
23  import org.exoplatform.webui.core.UIContainer;
24  import org.exoplatform.webui.core.UIPopupWindow;
25  import org.exoplatform.webui.core.UITree;
26  import org.exoplatform.webui.event.Event;
27  import org.exoplatform.webui.event.EventListener;
28  import org.exoplatform.webui.form.UIForm;
29  
30  /**
31   * Created by The eXo Platform SARL
32   * Author : Hoang Van Hung
33   *          hunghvit@gmail.com
34   * Dec 10, 2008
35   */
36  
37  @ComponentConfigs( {
38    @ComponentConfig(
39        template = "classpath:groovy/ecm/webui/UIMemberSelector.gtmpl",
40        events = {
41          @EventConfig(listeners = UIGroupMemberSelector.ChangeNodeActionListener.class),
42          @EventConfig(listeners = UIGroupMemberSelector.SelectMembershipActionListener.class),
43          @EventConfig(listeners = UIGroupMemberSelector.SelectPathActionListener.class),
44          @EventConfig(listeners = UIGroupMemberSelector.AddAnyPermissionActionListener.class)
45        }),
46    @ComponentConfig(
47        type = UITree.class,
48        id = "UITreeMembershipSelector",
49        template = "system:/groovy/webui/core/UITree.gtmpl",
50        events = @EventConfig(listeners = UITree.ChangeNodeActionListener.class)),
51    @ComponentConfig(
52        type = UIBreadcumbs.class,
53        id = "BreadcumbMembershipSelector",
54        template = "system:/groovy/webui/core/UIBreadcumbs.gtmpl",
55        events = @EventConfig(listeners = UIBreadcumbs.SelectPathActionListener.class))
56    }
57  )
58  
59  public class UIGroupMemberSelector extends UIContainer implements ComponentSelector{
60  
61    /** The Constant defaultValue. */
62    final static public String defaultValue    = "/admin";
63  
64    /** The ui component. */
65    private UIComponent        uiComponent;
66  
67    /** The return field name. */
68    private String             returnFieldName = null;
69  
70    /** The is selected membership. */
71    private boolean            isSelectedMembership = true;
72  
73    /** The is selected user. */
74    private boolean            isSelectedUser;
75  
76    /** The is use popup. */
77    private boolean             isUsePopup      = true;
78  
79    /** Show/hide Add AnyPermission form   */
80    private boolean             isShowAnyPermission = true;
81  
82    private Group selectGroup_;
83  
84    private List<String> listMemberhip;
85  
86    public UIGroupMemberSelector() throws Exception {
87      addChild(UIAnyPermission.class, null, "UIQueriesAnyPermission");
88      UIBreadcumbs uiBreadcumbs = addChild(UIBreadcumbs.class, "BreadcumbMembershipSelector", "BreadcumbMembershipSelector") ;
89      UITree tree = addChild(UITree.class, "UITreeMembershipSelector", "TreeMembershipSelector");
90      OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
91      Collection<?> sibblingsGroup = service.getGroupHandler().findGroups(null);
92  
93      Collection<?> collection = service.getMembershipTypeHandler().findMembershipTypes();
94      listMemberhip  = new ArrayList<String>(5);
95      for(Object obj : collection){
96        listMemberhip.add(((MembershipType)obj).getName());
97      }
98      if (!listMemberhip.contains("*")) listMemberhip.add("*");
99      Collections.sort(listMemberhip);
100     tree.setSibbling((List)sibblingsGroup);
101     tree.setIcon("GroupAdminIcon");
102     tree.setSelectedIcon("PortalIcon");
103     tree.setBeanIdField("id");
104     tree.setBeanLabelField("label");
105     uiBreadcumbs.setBreadcumbsStyle("UIExplorerHistoryPath") ;
106   }
107 
108   public Group getCurrentGroup() { return selectGroup_ ; }
109 
110   public List<String> getListMemberhip() { return listMemberhip; }
111 
112   public void changeGroup(String groupId) throws Exception {
113     OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
114     UIBreadcumbs uiBreadcumb = getChild(UIBreadcumbs.class);
115     uiBreadcumb.setPath(getPath(null, groupId)) ;
116 
117     UITree tree = getChild(UITree.class);
118     Collection<?> sibblingGroup;
119 
120     if(groupId == null) {
121       sibblingGroup = service.getGroupHandler().findGroups(null);
122       tree.setSibbling((List)sibblingGroup);
123       tree.setChildren(null);
124       tree.setSelected(null);
125       selectGroup_ = null;
126       return;
127     }
128 
129     selectGroup_ = service.getGroupHandler().findGroupById(groupId);
130     String parentGroupId = null;
131     if(selectGroup_ != null) parentGroupId = selectGroup_.getParentId();
132     Group parentGroup = null ;
133     if(parentGroupId != null) parentGroup = service.getGroupHandler().findGroupById(parentGroupId);
134 
135     Collection childrenGroup = service.getGroupHandler().findGroups(selectGroup_);
136     sibblingGroup = service.getGroupHandler().findGroups(parentGroup);
137 
138     tree.setSibbling((List)sibblingGroup);
139     tree.setChildren((List)childrenGroup);
140     tree.setSelected(selectGroup_);
141     tree.setParentSelected(parentGroup);
142   }
143 
144   private List<LocalPath> getPath(List<LocalPath> list, String id) throws Exception {
145     if(list == null) list = new ArrayList<LocalPath>(5);
146     if(id == null) return list;
147     OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
148     Group group = service.getGroupHandler().findGroupById(id);
149     if(group == null) return list;
150     list.add(0, new LocalPath(group.getId(), group.getLabel()));
151     getPath(list, group.getParentId());
152     return list ;
153   }
154 
155   @SuppressWarnings("unchecked")
156   public List<String> getListGroup() throws Exception {
157     OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
158     List<String> listGroup = new ArrayList<String>();
159     if(getCurrentGroup() == null) return null;
160     Collection<Group> groups = service.getGroupHandler().findGroups(getCurrentGroup());
161     if(groups.size() > 0) {
162       for (Object child : groups) {
163         Group childGroup = (Group)child;
164         listGroup.add(childGroup.getId()) ;
165       }
166     }
167     return listGroup;
168 
169   }
170   /**
171    * Gets the return component.
172    *
173    * @return the return component
174    */
175 
176   public UIComponent getSourceComponent() {
177     return uiComponent;
178   }
179 
180   /**
181    * Gets the return field.
182    *
183    * @return the return field
184    */
185   public String getReturnField() {
186     return returnFieldName;
187   }
188 
189   public void setIsUsePopup(boolean isUsePopup) { this.isUsePopup = isUsePopup; }
190 
191   public boolean isUsePopup() { return isUsePopup; }
192 
193   /**
194    * Sets the selected user.
195    *
196    * @param bool the new selected user
197    */
198   public void setSelectedUser(boolean bool) {
199     isSelectedUser = bool;
200   }
201 
202   /**
203    * Checks if is selected user.
204    *
205    * @return true, if is selected user
206    */
207   public boolean isSelectedUser() {
208     return isSelectedUser;
209   }
210 
211   /**
212    * Sets the selected membership.
213    *
214    * @param bool the new selected membership
215    */
216   public void setSelectedMembership(boolean bool) {
217     isSelectedMembership = bool;
218   }
219 
220   /**
221    * Checks if is selected membership.
222    *
223    * @return true, if is selected membership
224    */
225   public boolean isSelectedMembership() {
226     return isSelectedMembership;
227   }
228 
229   public void setSourceComponent(UIComponent uicomponent, String[] initParams) {
230     uiComponent = uicomponent;
231     if (initParams == null || initParams.length == 0)
232       return;
233     for (int i = 0; i < initParams.length; i++) {
234       if (initParams[i].indexOf("returnField") > -1) {
235         String[] array = initParams[i].split("=");
236         returnFieldName = array[1];
237         break;
238       }
239       returnFieldName = initParams[0];
240     }
241   }
242 
243   public String event(String name, String beanId) throws Exception {
244     UIForm uiForm = getAncestorOfType(UIForm.class) ;
245     if(uiForm != null) return uiForm.event(name, getId(), beanId);
246     return super.event(name, beanId);
247   }
248 
249   static  public class ChangeNodeActionListener extends EventListener<UITree> {
250     public void execute(Event<UITree> event) throws Exception {
251       UIGroupMemberSelector uiGroupMemberSelector = event.getSource().getParent();
252       String groupId = event.getRequestContext().getRequestParameter(OBJECTID);
253       uiGroupMemberSelector.changeGroup(groupId);
254       event.getRequestContext().addUIComponentToUpdateByAjax(uiGroupMemberSelector);
255     }
256   }
257 
258   static  public class SelectMembershipActionListener extends EventListener<UIGroupMemberSelector> {
259     public void execute(Event<UIGroupMemberSelector> event) throws Exception {
260       UIGroupMemberSelector uiGroupMemberSelector = event.getSource();
261       if (uiGroupMemberSelector.getCurrentGroup() == null)
262         return;
263       String groupId = uiGroupMemberSelector.getCurrentGroup().getId();
264       String permission = event.getRequestContext().getRequestParameter(OBJECTID);
265       String value = "";
266       if(uiGroupMemberSelector.isSelectedUser()) {
267         value = permission;
268       } else {
269         value = permission + ":" + groupId;
270       }
271       String returnField = uiGroupMemberSelector.getReturnField();
272       ((UISelectable) uiGroupMemberSelector.getSourceComponent()).doSelect(returnField, value);
273       if (uiGroupMemberSelector.isUsePopup) {
274         UIPopupWindow uiPopup = uiGroupMemberSelector.getParent();
275         uiPopup.setShow(false);
276         UIComponent uicomp = uiGroupMemberSelector.getSourceComponent().getParent();
277         event.getRequestContext().addUIComponentToUpdateByAjax(uicomp);
278         if (!uiPopup.getId().equals("PopupComponent"))
279           event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup);
280       } else {
281         event.getRequestContext().addUIComponentToUpdateByAjax(
282             uiGroupMemberSelector.getSourceComponent());
283       }
284     }
285   }
286 
287   /**
288    * The listener interface for receiving selectPathAction events. The class
289    * that is interested in processing a selectPathAction event implements this
290    * interface, and the object created with that class is registered with a
291    * component using the component's
292    * <code>addSelectPathActionListener</code> method. When
293    * the selectPathAction event occurs, that object's appropriate
294    * method is invoked.
295    */
296   static  public class SelectPathActionListener extends EventListener<UIBreadcumbs> {
297     public void execute(Event<UIBreadcumbs> event) throws Exception {
298       UIBreadcumbs uiBreadcumbs = event.getSource();
299       UIGroupMemberSelector uiGroupMemberSelector = uiBreadcumbs.getParent();
300       String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
301       uiBreadcumbs.setSelectPath(objectId);
302       String selectGroupId = uiBreadcumbs.getSelectLocalPath().getId();
303       uiGroupMemberSelector.changeGroup(selectGroupId);
304       if (uiGroupMemberSelector.isUsePopup) {
305         UIPopupWindow uiPopup = uiBreadcumbs.getAncestorOfType(UIPopupWindow.class);
306         uiPopup.setShow(true);
307         uiPopup.setShowMask(true);
308       }
309       event.getRequestContext().addUIComponentToUpdateByAjax(uiGroupMemberSelector);
310     }
311   }
312 
313   static public class AddAnyPermissionActionListener extends EventListener<UIAnyPermission> {
314     public void execute(Event<UIAnyPermission> event) throws Exception {
315       UIAnyPermission uiAnyPermission = event.getSource();
316       UIGroupMemberSelector uiGroupMemberSelector = uiAnyPermission.getParent();
317       String returnField = uiGroupMemberSelector.getReturnField();
318       String value = IdentityConstants.ANY;
319       ((UISelectable)uiGroupMemberSelector.getSourceComponent()).doSelect(returnField, value);
320       if (uiGroupMemberSelector.isUsePopup()) {
321         UIPopupWindow uiPopup = uiGroupMemberSelector.getParent();
322         uiPopup.setShow(false);
323         UIComponent uicomp = uiGroupMemberSelector.getSourceComponent().getParent();
324         event.getRequestContext().addUIComponentToUpdateByAjax(uicomp);
325         if (!uiPopup.getId().equals("PopupComponent"))
326           event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup);
327       } else {
328         event.getRequestContext().addUIComponentToUpdateByAjax(
329             uiGroupMemberSelector.getSourceComponent());
330       }
331     }
332   }
333 
334   /**
335    * Check show/hide form to set any permission
336    * @return
337    */
338   public boolean isShowAnyPermission() {
339     return isShowAnyPermission;
340   }
341 
342   /**
343    * Set show/hide any permission form
344    * @param isShowAnyPermission
345    * isShowAnyPermission =  true: Show form  <br>
346    * isShowAnyPermission =  false: Hide form
347    */
348   public void setShowAnyPermission(boolean isShowAnyPermission) {
349     this.isShowAnyPermission = isShowAnyPermission;
350   }
351 }