UIGroupMemberSelector.java
/***************************************************************************
* Copyright 2001-2008 The eXo Platform SARL All rights reserved. *
* Please look at license.txt in info directory for more license detail. *
**************************************************************************/
package org.exoplatform.ecm.webui.selector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.exoplatform.services.organization.Group;
import org.exoplatform.services.organization.MembershipType;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIBreadcumbs;
import org.exoplatform.webui.core.UIBreadcumbs.LocalPath;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.UITree;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
/**
* Created by The eXo Platform SARL
* Author : Hoang Van Hung
* hunghvit@gmail.com
* Dec 10, 2008
*/
@ComponentConfigs( {
@ComponentConfig(
template = "classpath:groovy/ecm/webui/UIMemberSelector.gtmpl",
events = {
@EventConfig(listeners = UIGroupMemberSelector.ChangeNodeActionListener.class),
@EventConfig(listeners = UIGroupMemberSelector.SelectMembershipActionListener.class),
@EventConfig(listeners = UIGroupMemberSelector.SelectPathActionListener.class),
@EventConfig(listeners = UIGroupMemberSelector.AddAnyPermissionActionListener.class)
}),
@ComponentConfig(
type = UITree.class,
id = "UITreeMembershipSelector",
template = "system:/groovy/webui/core/UITree.gtmpl",
events = @EventConfig(listeners = UITree.ChangeNodeActionListener.class)),
@ComponentConfig(
type = UIBreadcumbs.class,
id = "BreadcumbMembershipSelector",
template = "system:/groovy/webui/core/UIBreadcumbs.gtmpl",
events = @EventConfig(listeners = UIBreadcumbs.SelectPathActionListener.class))
}
)
public class UIGroupMemberSelector extends UIContainer implements ComponentSelector{
/** The Constant defaultValue. */
final static public String defaultValue = "/admin";
/** The ui component. */
private UIComponent uiComponent;
/** The return field name. */
private String returnFieldName = null;
/** The is selected membership. */
private boolean isSelectedMembership = true;
/** The is selected user. */
private boolean isSelectedUser;
/** The is use popup. */
private boolean isUsePopup = true;
/** Show/hide Add AnyPermission form */
private boolean isShowAnyPermission = true;
private Group selectGroup_;
private List<String> listMemberhip;
public UIGroupMemberSelector() throws Exception {
addChild(UIAnyPermission.class, null, "UIQueriesAnyPermission");
UIBreadcumbs uiBreadcumbs = addChild(UIBreadcumbs.class, "BreadcumbMembershipSelector", "BreadcumbMembershipSelector") ;
UITree tree = addChild(UITree.class, "UITreeMembershipSelector", "TreeMembershipSelector");
OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
Collection<?> sibblingsGroup = service.getGroupHandler().findGroups(null);
Collection<?> collection = service.getMembershipTypeHandler().findMembershipTypes();
listMemberhip = new ArrayList<String>(5);
for(Object obj : collection){
listMemberhip.add(((MembershipType)obj).getName());
}
if (!listMemberhip.contains("*")) listMemberhip.add("*");
Collections.sort(listMemberhip);
tree.setSibbling((List)sibblingsGroup);
tree.setIcon("GroupAdminIcon");
tree.setSelectedIcon("PortalIcon");
tree.setBeanIdField("id");
tree.setBeanLabelField("label");
uiBreadcumbs.setBreadcumbsStyle("UIExplorerHistoryPath") ;
}
public Group getCurrentGroup() { return selectGroup_ ; }
public List<String> getListMemberhip() { return listMemberhip; }
public void changeGroup(String groupId) throws Exception {
OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
UIBreadcumbs uiBreadcumb = getChild(UIBreadcumbs.class);
uiBreadcumb.setPath(getPath(null, groupId)) ;
UITree tree = getChild(UITree.class);
Collection<?> sibblingGroup;
if(groupId == null) {
sibblingGroup = service.getGroupHandler().findGroups(null);
tree.setSibbling((List)sibblingGroup);
tree.setChildren(null);
tree.setSelected(null);
selectGroup_ = null;
return;
}
selectGroup_ = service.getGroupHandler().findGroupById(groupId);
String parentGroupId = null;
if(selectGroup_ != null) parentGroupId = selectGroup_.getParentId();
Group parentGroup = null ;
if(parentGroupId != null) parentGroup = service.getGroupHandler().findGroupById(parentGroupId);
Collection childrenGroup = service.getGroupHandler().findGroups(selectGroup_);
sibblingGroup = service.getGroupHandler().findGroups(parentGroup);
tree.setSibbling((List)sibblingGroup);
tree.setChildren((List)childrenGroup);
tree.setSelected(selectGroup_);
tree.setParentSelected(parentGroup);
}
private List<LocalPath> getPath(List<LocalPath> list, String id) throws Exception {
if(list == null) list = new ArrayList<LocalPath>(5);
if(id == null) return list;
OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
Group group = service.getGroupHandler().findGroupById(id);
if(group == null) return list;
list.add(0, new LocalPath(group.getId(), group.getLabel()));
getPath(list, group.getParentId());
return list ;
}
@SuppressWarnings("unchecked")
public List<String> getListGroup() throws Exception {
OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
List<String> listGroup = new ArrayList<String>();
if(getCurrentGroup() == null) return null;
Collection<Group> groups = service.getGroupHandler().findGroups(getCurrentGroup());
if(groups.size() > 0) {
for (Object child : groups) {
Group childGroup = (Group)child;
listGroup.add(childGroup.getId()) ;
}
}
return listGroup;
}
/**
* Gets the return component.
*
* @return the return component
*/
public UIComponent getSourceComponent() {
return uiComponent;
}
/**
* Gets the return field.
*
* @return the return field
*/
public String getReturnField() {
return returnFieldName;
}
public void setIsUsePopup(boolean isUsePopup) { this.isUsePopup = isUsePopup; }
public boolean isUsePopup() { return isUsePopup; }
/**
* Sets the selected user.
*
* @param bool the new selected user
*/
public void setSelectedUser(boolean bool) {
isSelectedUser = bool;
}
/**
* Checks if is selected user.
*
* @return true, if is selected user
*/
public boolean isSelectedUser() {
return isSelectedUser;
}
/**
* Sets the selected membership.
*
* @param bool the new selected membership
*/
public void setSelectedMembership(boolean bool) {
isSelectedMembership = bool;
}
/**
* Checks if is selected membership.
*
* @return true, if is selected membership
*/
public boolean isSelectedMembership() {
return isSelectedMembership;
}
public void setSourceComponent(UIComponent uicomponent, String[] initParams) {
uiComponent = uicomponent;
if (initParams == null || initParams.length == 0)
return;
for (int i = 0; i < initParams.length; i++) {
if (initParams[i].indexOf("returnField") > -1) {
String[] array = initParams[i].split("=");
returnFieldName = array[1];
break;
}
returnFieldName = initParams[0];
}
}
public String event(String name, String beanId) throws Exception {
UIForm uiForm = getAncestorOfType(UIForm.class) ;
if(uiForm != null) return uiForm.event(name, getId(), beanId);
return super.event(name, beanId);
}
static public class ChangeNodeActionListener extends EventListener<UITree> {
public void execute(Event<UITree> event) throws Exception {
UIGroupMemberSelector uiGroupMemberSelector = event.getSource().getParent();
String groupId = event.getRequestContext().getRequestParameter(OBJECTID);
uiGroupMemberSelector.changeGroup(groupId);
event.getRequestContext().addUIComponentToUpdateByAjax(uiGroupMemberSelector);
}
}
static public class SelectMembershipActionListener extends EventListener<UIGroupMemberSelector> {
public void execute(Event<UIGroupMemberSelector> event) throws Exception {
UIGroupMemberSelector uiGroupMemberSelector = event.getSource();
if (uiGroupMemberSelector.getCurrentGroup() == null)
return;
String groupId = uiGroupMemberSelector.getCurrentGroup().getId();
String permission = event.getRequestContext().getRequestParameter(OBJECTID);
String value = "";
if(uiGroupMemberSelector.isSelectedUser()) {
value = permission;
} else {
value = permission + ":" + groupId;
}
String returnField = uiGroupMemberSelector.getReturnField();
((UISelectable) uiGroupMemberSelector.getSourceComponent()).doSelect(returnField, value);
if (uiGroupMemberSelector.isUsePopup) {
UIPopupWindow uiPopup = uiGroupMemberSelector.getParent();
uiPopup.setShow(false);
UIComponent uicomp = uiGroupMemberSelector.getSourceComponent().getParent();
event.getRequestContext().addUIComponentToUpdateByAjax(uicomp);
if (!uiPopup.getId().equals("PopupComponent"))
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup);
} else {
event.getRequestContext().addUIComponentToUpdateByAjax(
uiGroupMemberSelector.getSourceComponent());
}
}
}
/**
* The listener interface for receiving selectPathAction events. The class
* that is interested in processing a selectPathAction event implements this
* interface, and the object created with that class is registered with a
* component using the component's
* <code>addSelectPathActionListener</code> method. When
* the selectPathAction event occurs, that object's appropriate
* method is invoked.
*/
static public class SelectPathActionListener extends EventListener<UIBreadcumbs> {
public void execute(Event<UIBreadcumbs> event) throws Exception {
UIBreadcumbs uiBreadcumbs = event.getSource();
UIGroupMemberSelector uiGroupMemberSelector = uiBreadcumbs.getParent();
String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
uiBreadcumbs.setSelectPath(objectId);
String selectGroupId = uiBreadcumbs.getSelectLocalPath().getId();
uiGroupMemberSelector.changeGroup(selectGroupId);
if (uiGroupMemberSelector.isUsePopup) {
UIPopupWindow uiPopup = uiBreadcumbs.getAncestorOfType(UIPopupWindow.class);
uiPopup.setShow(true);
uiPopup.setShowMask(true);
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiGroupMemberSelector);
}
}
static public class AddAnyPermissionActionListener extends EventListener<UIAnyPermission> {
public void execute(Event<UIAnyPermission> event) throws Exception {
UIAnyPermission uiAnyPermission = event.getSource();
UIGroupMemberSelector uiGroupMemberSelector = uiAnyPermission.getParent();
String returnField = uiGroupMemberSelector.getReturnField();
String value = IdentityConstants.ANY;
((UISelectable)uiGroupMemberSelector.getSourceComponent()).doSelect(returnField, value);
if (uiGroupMemberSelector.isUsePopup()) {
UIPopupWindow uiPopup = uiGroupMemberSelector.getParent();
uiPopup.setShow(false);
UIComponent uicomp = uiGroupMemberSelector.getSourceComponent().getParent();
event.getRequestContext().addUIComponentToUpdateByAjax(uicomp);
if (!uiPopup.getId().equals("PopupComponent"))
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup);
} else {
event.getRequestContext().addUIComponentToUpdateByAjax(
uiGroupMemberSelector.getSourceComponent());
}
}
}
/**
* Check show/hide form to set any permission
* @return
*/
public boolean isShowAnyPermission() {
return isShowAnyPermission;
}
/**
* Set show/hide any permission form
* @param isShowAnyPermission
* isShowAnyPermission = true: Show form <br>
* isShowAnyPermission = false: Hide form
*/
public void setShowAnyPermission(boolean isShowAnyPermission) {
this.isShowAnyPermission = isShowAnyPermission;
}
}