fr.paris.lutece.plugins.mylutece.modules.database.authentication.web.GroupJspBean.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.plugins.mylutece.modules.database.authentication.web.GroupJspBean.java

Source

/*
 * Copyright (c) 2002-2014, Mairie de Paris
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice
 *     and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice
 *     and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *
 *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * License 1.0
 */
package fr.paris.lutece.plugins.mylutece.modules.database.authentication.web;

import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseHome;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUser;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUserFilter;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUserHome;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.Group;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupFilter;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupHome;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupRoleHome;
import fr.paris.lutece.plugins.mylutece.modules.database.authentication.service.DatabaseService;
import fr.paris.lutece.portal.business.role.Role;
import fr.paris.lutece.portal.business.role.RoleHome;
import fr.paris.lutece.portal.service.message.AdminMessage;
import fr.paris.lutece.portal.service.message.AdminMessageService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppPathService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
import fr.paris.lutece.portal.web.constants.Messages;
import fr.paris.lutece.portal.web.constants.Parameters;
import fr.paris.lutece.portal.web.util.LocalizedPaginator;
import fr.paris.lutece.util.ReferenceItem;
import fr.paris.lutece.util.ReferenceList;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.html.ItemNavigator;
import fr.paris.lutece.util.html.Paginator;
import fr.paris.lutece.util.sort.AttributeComparator;
import fr.paris.lutece.util.url.UrlItem;

import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * This class provides the user interface to manage Lutece group features ( manage, create, modify, remove )
 */
public class GroupJspBean extends PluginAdminPageJspBean {
    // Right
    public static final String RIGHT_GROUPS_MANAGEMENT = "DATABASE_GROUPS_MANAGEMENT";

    // Constants
    private static final String QUESTION_MARK = "?";
    private static final String EQUAL = "=";
    private static final String AMPERSAND = "&";
    private static final String SPACE = " ";
    private static final String OPEN_BRACKET = "(";
    private static final String CLOSED_BRACKET = ")";
    private static final String SHARP = "#";

    // JSP
    private static final String JSP_URL_DO_REMOVE_GROUP = "jsp/admin/plugins/mylutece/modules/database/DoRemoveGroup.jsp";
    private static final String JSP_URL_MODIFY_GROUP = "jsp/admin/plugins/mylutece/modules/database/ModifyGroup.jsp";
    private static final String JSP_URL_MANAGE_ROLES_GROUP = "jsp/admin/plugins/mylutece/modules/database/ManageRolesGroup.jsp";
    private static final String JSP_URL_MANAGE_USERS_GROUP = "jsp/admin/plugins/mylutece/modules/database/ManageUsersGroup.jsp";
    private static final String JSP_MODIFY_GROUP = "ModifyGroup.jsp";
    private static final String JSP_MANAGE_ROLES_GROUP = "ManageRolesGroup.jsp";
    private static final String JSP_MANAGE_GROUPS = "ManageGroups.jsp";
    private static final String JSP_MANAGE_USERS_GROUP = "ManageUsersGroup.jsp";

    //Markers
    private static final String MARK_GROUPS_LIST = "groups_list";
    private static final String MARK_GROUP = "group";
    private static final String MARK_ROLES_LIST = "role_list";
    private static final String MARK_ROLES_LIST_FOR_GROUP = "group_role_list";
    private static final String MARK_PAGINATOR = "paginator";
    private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
    private static final String MARK_ITEM_NAVIGATOR = "item_navigator";
    private static final String MARK_SEARCH_IS_SEARCH = "search_is_search";
    private static final String MARK_SORT_SEARCH_ATTRIBUTE = "sort_search_attribute";
    private static final String MARK_SEARCH_GROUP_FILTER = "search_group_filter";
    private static final String MARK_AVAILABLE_USERS = "available_users";
    private static final String MARK_ASSIGNED_USERS = "assigned_users";
    private static final String MARK_ASSIGNED_USERS_NUMBER = "assigned_users_number";

    // Parameters
    private static final String PARAMETER_GROUP_KEY = "group_key";
    private static final String PARAMETER_GROUP_DESCRIPTION = "group_description";
    private static final String PARAMETER_ROLE_KEY = "role_key";
    private static final String PARAMETER_CANCEL = "cancel";
    private static final String PARAMETER_MYLUTECE_DATABASE_USER_ID = "mylutece_database_user_id";
    private static final String PARAMETER_ANCHOR = "anchor";
    private static final String PARAMETER_AVAILABLE_USERS = "available_users";
    private static final String PARAMETER_MODIFY_GROUP = "modify_group";
    private static final String PARAMETER_ASSIGN_USER = "assign_user";
    private static final String PARAMETER_ASSIGN_ROLE = "assign_role";

    // Templates
    private static final String TEMPLATE_MANAGE_GROUPS = "admin/plugins/mylutece/modules/database/manage_groups.html";
    private static final String TEMPLATE_CREATE_GROUP = "admin/plugins/mylutece/modules/database/create_group.html";
    private static final String TEMPLATE_GROUP_MODIFY = "admin/plugins/mylutece/modules/database/modify_group.html";
    private static final String TEMPLATE_MANAGE_ROLES_GROUP = "admin/plugins/mylutece/modules/database/manage_roles_group.html";
    private static final String TEMPLATE_MANAGE_USERS_GROUP = "admin/plugins/mylutece/modules/database/manage_users_group.html";

    // Properties
    private static final String PROPERTY_PAGE_TITLE_CREATE_GROUP = "module.mylutece.database.create_group.pageTitle";
    private static final String PROPERTY_PAGE_TITLE_MODIFY_GROUP = "module.mylutece.database.modify_group.pageTitle";
    private static final String PROPERTY_PAGE_TITLE_MANAGE_ROLES_GROUP = "module.mylutece.database.manage_roles_group.pageTitle";
    private static final String PROPERTY_GROUPS_PER_PAGE = "paginator.groups.itemsPerPage";
    private static final String PROPERTY_PAGE_TITLE_MANAGE_USERS_GROUP = "module.mylutece.database.manage_users_group.pageTitle";
    private static final String PROPERTY_USERS_PER_PAGE = "paginator.users.itemsPerPage";

    // Message
    private static final String MESSAGE_GROUP_EXIST = "module.mylutece.database.message.groupExist";
    private static final String MESSAGE_CONFIRM_REMOVE = "module.mylutece.database.message.confirmRemoveGroup";
    private static final String MESSAGE_ERROR_MODIFY = "module.mylutece.database.message.errorModifyGroup";
    private static final String MESSAGE_ERROR_REMOVE = "module.mylutece.database.message.errorRemoveGroup";
    private static final String MESSAGE_ERROR_MANAGE_GROUPS = "module.mylutece.database.message.errorManageGroups";
    private int _nItemsPerPage;
    private int _nDefaultItemsPerPage;
    private String _strCurrentPageIndex;
    private Map<String, ItemNavigator> _itemNavigators = new HashMap<String, ItemNavigator>();
    private GroupFilter _gFilter;
    private String _strSortedAttributeName;
    private boolean _bIsAscSort;
    private DatabaseService _databaseService = DatabaseService.getService();

    /**
     * Creates a new GroupJspBean object.
     */
    public GroupJspBean() {
    }

    /**
     * Returns Group management form
     * @param request The Http request
     * @return Html form
     */
    public String getManageGroups(HttpServletRequest request) {
        setPageTitleProperty(null);

        // Reinit session
        reinitItemNavigators();

        List<Group> listGroups = getAuthorizedGroups();

        // FILTER
        _gFilter = new GroupFilter();

        boolean bIsSearch = _gFilter.setGroupFilter(request);
        List<Group> listFilteredGroups = GroupHome.findByFilter(_gFilter, getPlugin());
        List<Group> listAvailableGroups = new ArrayList<Group>();

        for (Group filteredGroup : listFilteredGroups) {
            for (Group group : listGroups) {
                if (filteredGroup.getGroupKey().equals(group.getGroupKey())) {
                    listAvailableGroups.add(group);
                }
            }
        }

        // SORT
        _strSortedAttributeName = request.getParameter(Parameters.SORTED_ATTRIBUTE_NAME);

        String strAscSort = null;

        if (_strSortedAttributeName != null) {
            strAscSort = request.getParameter(Parameters.SORTED_ASC);

            _bIsAscSort = Boolean.parseBoolean(strAscSort);

            Collections.sort(listAvailableGroups, new AttributeComparator(_strSortedAttributeName, _bIsAscSort));
        }

        String strURL = getHomeUrl(request);
        UrlItem url = new UrlItem(strURL);

        if (_strSortedAttributeName != null) {
            url.addParameter(Parameters.SORTED_ATTRIBUTE_NAME, _strSortedAttributeName);
        }

        if (strAscSort != null) {
            url.addParameter(Parameters.SORTED_ASC, strAscSort);
        }

        String strSortSearchAttribute = StringUtils.EMPTY;

        if (bIsSearch) {
            _gFilter.setUrlAttributes(url);

            if (StringUtils.isNotBlank(_gFilter.getUrlAttributes())) {
                strSortSearchAttribute = AMPERSAND + _gFilter.getUrlAttributes();
            }
        }

        _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt(PROPERTY_GROUPS_PER_PAGE, 50);
        _strCurrentPageIndex = Paginator.getPageIndex(request, Paginator.PARAMETER_PAGE_INDEX,
                _strCurrentPageIndex);
        _nItemsPerPage = Paginator.getItemsPerPage(request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
                _nDefaultItemsPerPage);

        LocalizedPaginator<Group> paginator = new LocalizedPaginator<Group>(listAvailableGroups, _nItemsPerPage,
                url.getUrl(), Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale());

        Map<String, Object> model = new HashMap<String, Object>();
        model.put(MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage);
        model.put(MARK_PAGINATOR, paginator);
        model.put(MARK_GROUPS_LIST, paginator.getPageItems());
        model.put(MARK_SEARCH_IS_SEARCH, bIsSearch);
        model.put(MARK_SEARCH_GROUP_FILTER, _gFilter);
        model.put(MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_GROUPS, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Insert a new group
     * @param request The HTTP request
     * @return String The html code page
     */
    public String getCreateGroup(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_CREATE_GROUP);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_CREATE_GROUP, getLocale());

        return getAdminPage(template.getHtml());
    }

    /**
     * Create Group
     * @param request The HTTP request
     * @return String The url page
     */
    public String doCreateGroup(HttpServletRequest request) {
        String strGroupKey = request.getParameter(PARAMETER_GROUP_KEY);
        String strGroupDescription = request.getParameter(PARAMETER_GROUP_DESCRIPTION);

        // Mandatory field
        if (strGroupKey.length() == 0) {
            return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP);
        }

        // check if group exist
        if (GroupHome.findByPrimaryKey(strGroupKey, getPlugin()) != null) {
            return AdminMessageService.getMessageUrl(request, MESSAGE_GROUP_EXIST, AdminMessage.TYPE_STOP);
        }

        Group group = new Group();
        group.setGroupKey(strGroupKey);
        group.setGroupDescription(strGroupDescription);
        GroupHome.create(group, getPlugin());

        return getHomeUrl(request);
    }

    /**
    *
    * @param request The HTTP request
    * @return String The html code page
    */
    public String getModifyGroup(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MODIFY_GROUP);

        Group selectedGroup = getGroupFromRequest(request);

        if (selectedGroup == null) {
            return getCreateGroup(request);
        }

        // ASSIGNED USERS NUMBER
        List<DatabaseUser> listAllAssignedUsers = DatabaseHome
                .findGroupUsersFromGroupKey(selectedGroup.getGroupKey(), getPlugin());
        int nAssignedUsersNumber = listAllAssignedUsers.size();

        // ITEM NAVIGATION
        setItemNavigator(PARAMETER_MODIFY_GROUP, selectedGroup.getGroupKey(),
                AppPathService.getBaseUrl(request) + JSP_URL_MODIFY_GROUP);

        Map<String, Object> model = new HashMap<String, Object>();
        model.put(MARK_GROUP, selectedGroup);
        model.put(MARK_ITEM_NAVIGATOR, _itemNavigators.get(PARAMETER_MODIFY_GROUP));
        model.put(MARK_ASSIGNED_USERS_NUMBER, nAssignedUsersNumber);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_GROUP_MODIFY, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Modify group
     * @param request The HTTP request
     * @return String The url page
     */
    public String doModifyGroup(HttpServletRequest request) {
        String strReturn;

        String strActionCancel = request.getParameter(PARAMETER_CANCEL);

        if (strActionCancel != null) {
            strReturn = JSP_MANAGE_GROUPS;
        } else {
            String strGroupKey = request.getParameter(PARAMETER_GROUP_KEY);
            String strGroupDescription = request.getParameter(PARAMETER_GROUP_DESCRIPTION);

            Group group = getGroupFromRequest(request);

            if (group == null) {
                return AdminMessageService.getMessageUrl(request, MESSAGE_ERROR_MODIFY, AdminMessage.TYPE_ERROR);
            }

            // Mandatory field
            if (strGroupKey.length() == 0) {
                return AdminMessageService.getMessageUrl(request, Messages.MANDATORY_FIELDS,
                        AdminMessage.TYPE_STOP);
            }

            group.setGroupKey(strGroupKey);
            group.setGroupDescription(strGroupDescription);
            GroupHome.update(group, getPlugin());
            strReturn = JSP_MODIFY_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + group.getGroupKey();
        }

        return strReturn;
    }

    /**
     * confirm Delete Group
     * @param request The HTTP request
     * @return String The html code page
     */
    public String getRemoveGroup(HttpServletRequest request) {
        UrlItem url = new UrlItem(JSP_URL_DO_REMOVE_GROUP);
        url.addParameter(PARAMETER_GROUP_KEY, request.getParameter(PARAMETER_GROUP_KEY));

        return AdminMessageService.getMessageUrl(request, MESSAGE_CONFIRM_REMOVE, url.getUrl(),
                AdminMessage.TYPE_CONFIRMATION);
    }

    /**
     * Delete Group
     * @param request The HTTP request
     * @return String The url page
     */
    public String doRemoveGroup(HttpServletRequest request) {
        Group group = getGroupFromRequest(request);

        if (group == null) {
            return AdminMessageService.getMessageUrl(request, MESSAGE_ERROR_REMOVE, AdminMessage.TYPE_ERROR);
        }

        GroupHome.remove(group.getGroupKey(), getPlugin());

        return getHomeUrl(request);
    }

    /**
     * Returns roles management form for a specified group
     *
     * @param request The Http request
     * @return Html form
     */
    public String getManageRolesGroup(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MANAGE_ROLES_GROUP);

        Group selectedGroup = getGroupFromRequest(request);

        if (selectedGroup == null) {
            return getManageGroups(request);
        }

        // ASSIGNED USERS NUMBER
        List<DatabaseUser> listAllAssignedUsers = DatabaseHome
                .findGroupUsersFromGroupKey(selectedGroup.getGroupKey(), getPlugin());
        int nAssignedUsersNumber = listAllAssignedUsers.size();

        Collection<Role> allRoleList = RoleHome.findAll();
        allRoleList = AdminWorkgroupService.getAuthorizedCollection(allRoleList, getUser());

        List<String> groupRoleKeyList = GroupRoleHome.findGroupRoles(selectedGroup.getGroupKey(), getPlugin());
        Collection<Role> groupRoleList = new ArrayList<Role>();

        for (String strRoleKey : groupRoleKeyList) {
            for (Role role : allRoleList) {
                if (role.getRole().equals(strRoleKey)) {
                    groupRoleList.add(RoleHome.findByPrimaryKey(strRoleKey));
                }
            }
        }

        // ITEM NAVIGATION
        setItemNavigator(PARAMETER_ASSIGN_ROLE, selectedGroup.getGroupKey(),
                AppPathService.getBaseUrl(request) + JSP_URL_MANAGE_ROLES_GROUP);

        Map<String, Object> model = new HashMap<String, Object>();
        model.put(MARK_ROLES_LIST, allRoleList);
        model.put(MARK_ROLES_LIST_FOR_GROUP, groupRoleList);
        model.put(MARK_GROUP, selectedGroup);
        model.put(MARK_ITEM_NAVIGATOR, _itemNavigators.get(PARAMETER_ASSIGN_ROLE));
        model.put(MARK_ASSIGNED_USERS_NUMBER, nAssignedUsersNumber);

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_ROLES_GROUP, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Process assignation roles for a specified group
     *
     * @param request The Http request
     * @return Html form
     */
    public String doAssignRoleGroup(HttpServletRequest request) {
        String strReturn;

        String strActionCancel = request.getParameter(PARAMETER_CANCEL);

        if (strActionCancel != null) {
            strReturn = JSP_MANAGE_GROUPS;
        } else {
            //get group
            Group group = getGroupFromRequest(request);

            if (group == null) {
                return AdminMessageService.getMessageUrl(request, MESSAGE_ERROR_MANAGE_GROUPS,
                        AdminMessage.TYPE_ERROR);
            }

            String[] roleArray = request.getParameterValues(PARAMETER_ROLE_KEY);

            GroupRoleHome.removeRoles(group.getGroupKey(), getPlugin());

            if (roleArray != null) {
                for (int i = 0; i < roleArray.length; i++) {
                    GroupRoleHome.addRole(group.getGroupKey(), roleArray[i], getPlugin());
                }
            }

            strReturn = JSP_MANAGE_ROLES_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + group.getGroupKey();
        }

        return strReturn;
    }

    /**
    *
    * @param request The HTTP request
    * @return the group
    */
    private Group getGroupFromRequest(HttpServletRequest request) {
        String strGroupKey = request.getParameter(PARAMETER_GROUP_KEY);

        if ((strGroupKey == null) || (strGroupKey.length() == 0)) {
            return null;
        }

        Group group = GroupHome.findByPrimaryKey(strGroupKey, getPlugin());

        return group;
    }

    /**
     * Get the list of authorized group
     * @return a list of groups
     */
    private List<Group> getAuthorizedGroups() {
        Collection<Group> allGroupList = GroupHome.findAll(getPlugin());
        List<Group> groupList = new ArrayList<Group>();

        for (Group group : allGroupList) {
            List<String> groupRoleKeyList = GroupRoleHome.findGroupRoles(group.getGroupKey(), getPlugin());

            if (groupRoleKeyList.size() == 0) {
                groupList.add(group);

                continue;
            }

            for (String groupRoleKey : groupRoleKeyList) {
                Role role = RoleHome.findByPrimaryKey(groupRoleKey);

                if (AdminWorkgroupService.isAuthorized(role, getUser())) {
                    groupList.add(group);

                    break;
                }
            }
        }

        return groupList;
    }

    /**
     * Returns users management formfor a specified group
     * @param request HttpServletRequest
     * @return Html form
     */
    public String getManageUsersGroup(HttpServletRequest request) {
        setPageTitleProperty(PROPERTY_PAGE_TITLE_MANAGE_USERS_GROUP);

        Map<String, Object> model = new HashMap<String, Object>();
        String strURL = AppPathService.getBaseUrl(request) + JSP_URL_MANAGE_USERS_GROUP;
        UrlItem url = new UrlItem(strURL);

        // SELECTED GROUP
        Group selectedGroup = getGroupFromRequest(request);

        if (selectedGroup == null) {
            return getManageGroups(request);
        }

        // ASSIGNED USERS
        List<DatabaseUser> listAllAssignedUsers = DatabaseHome
                .findGroupUsersFromGroupKey(selectedGroup.getGroupKey(), getPlugin());
        List<DatabaseUser> listAssignedUsers = getListAssignedUsers(listAllAssignedUsers);

        DatabaseUserFilter duFilter = new DatabaseUserFilter();
        boolean bIsSearch = duFilter.setDatabaseUserFilter(request);
        List<DatabaseUser> listFilteredUsers = _databaseService.getFilteredUsersInterface(duFilter, bIsSearch,
                listAssignedUsers, request, model, url);

        // AVAILABLE USERS
        ReferenceList listAvailableUsers = getAvailableUsers(listAssignedUsers);

        // SORT
        String strSortedAttributeName = request.getParameter(Parameters.SORTED_ATTRIBUTE_NAME);
        String strAscSort = null;

        if (strSortedAttributeName != null) {
            strAscSort = request.getParameter(Parameters.SORTED_ASC);

            boolean bIsAscSort = Boolean.parseBoolean(strAscSort);

            Collections.sort(listFilteredUsers, new AttributeComparator(strSortedAttributeName, bIsAscSort));
        }

        _strCurrentPageIndex = Paginator.getPageIndex(request, Paginator.PARAMETER_PAGE_INDEX,
                _strCurrentPageIndex);
        _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt(PROPERTY_USERS_PER_PAGE, 50);
        _nItemsPerPage = Paginator.getItemsPerPage(request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
                _nDefaultItemsPerPage);

        if (strSortedAttributeName != null) {
            url.addParameter(Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName);
        }

        if (strAscSort != null) {
            url.addParameter(Parameters.SORTED_ASC, strAscSort);
        }

        // ITEM NAVIGATION
        setItemNavigator(PARAMETER_ASSIGN_USER, selectedGroup.getGroupKey(), url.getUrl());

        LocalizedPaginator<DatabaseUser> paginator = new LocalizedPaginator<DatabaseUser>(listFilteredUsers,
                _nItemsPerPage, url.getUrl(), Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale());

        model.put(MARK_GROUP, selectedGroup);
        model.put(MARK_ITEM_NAVIGATOR, _itemNavigators.get(PARAMETER_ASSIGN_USER));
        model.put(MARK_PAGINATOR, paginator);
        model.put(MARK_NB_ITEMS_PER_PAGE, Integer.toString(_nItemsPerPage));
        model.put(MARK_AVAILABLE_USERS, listAvailableUsers);
        model.put(MARK_ASSIGNED_USERS, paginator.getPageItems());
        model.put(MARK_ASSIGNED_USERS_NUMBER, listAllAssignedUsers.size());

        HtmlTemplate template = AppTemplateService.getTemplate(TEMPLATE_MANAGE_USERS_GROUP, getLocale(), model);

        return getAdminPage(template.getHtml());
    }

    /**
     * Assign users to a group
     * @param request HttpServletRequest
     * @return JSP return
     */
    public String doAssignUsersGroup(HttpServletRequest request) {
        String strReturn;

        String strActionCancel = request.getParameter(PARAMETER_CANCEL);

        if (strActionCancel != null) {
            strReturn = JSP_MANAGE_GROUPS;
        } else {
            Group selectedGroup = getGroupFromRequest(request);

            if (selectedGroup == null) {
                return getCreateGroup(request);
            }

            //retrieve the selected portlets ids
            String[] arrayUsersIds = request.getParameterValues(PARAMETER_AVAILABLE_USERS);

            if ((arrayUsersIds != null)) {
                for (int i = 0; i < arrayUsersIds.length; i++) {
                    int nUserId = Integer.parseInt(arrayUsersIds[i]);
                    DatabaseUser user = DatabaseUserHome.findByPrimaryKey(nUserId, getPlugin());
                    DatabaseHome.addGroupForUser(user.getUserId(), selectedGroup.getGroupKey(), getPlugin());
                }
            }

            strReturn = JSP_MANAGE_USERS_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL
                    + selectedGroup.getGroupKey();
        }

        return strReturn;
    }

    /**
     * Unassign user from a given group
     * @param request HttpServletRequest
     * @return JSP return
     */
    public String doUnAssignUserGroup(HttpServletRequest request) {
        Group selectedGroup = getGroupFromRequest(request);

        if (selectedGroup == null) {
            return getCreateGroup(request);
        }

        int nIdUser = Integer.parseInt(request.getParameter(PARAMETER_MYLUTECE_DATABASE_USER_ID));
        String strAnchor = request.getParameter(PARAMETER_ANCHOR);

        DatabaseUser user = DatabaseUserHome.findByPrimaryKey(nIdUser, getPlugin());

        if (user != null) {
            DatabaseHome.removeGroupsForUser(user.getUserId(), getPlugin());
        }

        return JSP_MANAGE_USERS_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + selectedGroup.getGroupKey()
                + SHARP + strAnchor;
    }

    /**
     * Get the list of assigned user to the given group
     * @param listAllAssignedUsers the list of all assigned userse
     * @return a list of {@link DatabaseUser}
     */
    private List<DatabaseUser> getListAssignedUsers(List<DatabaseUser> listAllAssignedUsers) {
        List<DatabaseUser> listAssignedUsers = new ArrayList<DatabaseUser>();

        for (DatabaseUser user : listAllAssignedUsers) {
            if (_databaseService.isAuthorized(user, getUser(), getPlugin())) {
                listAssignedUsers.add(user);
            }
        }

        return listAssignedUsers;
    }

    /**
     * Get the list of avaivable users
     * @param listAssignedUsers the list of assigned users
     * @return a {@link ReferenceList}
     */
    private ReferenceList getAvailableUsers(List<DatabaseUser> listAssignedUsers) {
        ReferenceList listAvailableUsers = new ReferenceList();

        for (DatabaseUser user : DatabaseUserHome.findDatabaseUsersList(getPlugin())) {
            boolean bIsAvailable = Boolean.TRUE;

            for (DatabaseUser assignedUser : listAssignedUsers) {
                if (!_databaseService.isAuthorized(user, getUser(), getPlugin())
                        || (user.getUserId() == assignedUser.getUserId())) {
                    bIsAvailable = Boolean.FALSE;

                    break;
                }
            }

            if (bIsAvailable) {
                ReferenceItem userItem = new ReferenceItem();
                userItem.setCode(String.valueOf(user.getUserId()));
                userItem.setName(user.getLastName() + SPACE + user.getFirstName() + SPACE + OPEN_BRACKET
                        + user.getLogin() + CLOSED_BRACKET);
                listAvailableUsers.add(userItem);
            }
        }

        return listAvailableUsers;
    }

    /**
     * Set the item navigator
     * @param strItemNavigatorKey The item navigator key
     * @param strGroupKey the group key
     * @param strUrl the url
     */
    private void setItemNavigator(String strItemNavigatorKey, String strGroupKey, String strUrl) {
        ItemNavigator itemNavigator = _itemNavigators.get(strItemNavigatorKey);

        if (itemNavigator == null) {
            List<Group> listGroups = getAuthorizedGroups();

            // FILTER
            if (_gFilter == null) {
                _gFilter = new GroupFilter();
            }

            List<Group> listFilteredGroups = GroupHome.findByFilter(_gFilter, getPlugin());
            List<Group> listAvailableGroups = new ArrayList<Group>();

            for (Group filteredGroup : listFilteredGroups) {
                for (Group group : listGroups) {
                    if (filteredGroup.getGroupKey().equals(group.getGroupKey())) {
                        listAvailableGroups.add(group);
                    }
                }
            }

            // SORT
            if (StringUtils.isNotBlank(_strSortedAttributeName)) {
                Collections.sort(listAvailableGroups,
                        new AttributeComparator(_strSortedAttributeName, _bIsAscSort));
            }

            List<String> listIdsDatabaseUser = new ArrayList<String>();
            int nCurrentItemId = 0;
            int nIndex = 0;

            for (Group group : listAvailableGroups) {
                if (group != null) {
                    listIdsDatabaseUser.add(group.getGroupKey());

                    if (group.getGroupKey().equals(strGroupKey)) {
                        nCurrentItemId = nIndex;
                    }

                    nIndex++;
                }
            }

            itemNavigator = new ItemNavigator(listIdsDatabaseUser, nCurrentItemId, strUrl, PARAMETER_GROUP_KEY);
        } else {
            itemNavigator.setCurrentItemId(strGroupKey);
        }

        _itemNavigators.put(strItemNavigatorKey, itemNavigator);
    }

    /**
     * Reinit the item navigator
     */
    private void reinitItemNavigators() {
        _itemNavigators = new HashMap<String, ItemNavigator>();
        _strSortedAttributeName = StringUtils.EMPTY;
        _bIsAscSort = true;
    }
}