AdminWorkgroupJspBean.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of Paris
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  *  1. Redistributions of source code must retain the above copyright notice
  10.  *     and the following disclaimer.
  11.  *
  12.  *  2. Redistributions in binary form must reproduce the above copyright notice
  13.  *     and the following disclaimer in the documentation and/or other materials
  14.  *     provided with the distribution.
  15.  *
  16.  *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
  17.  *     contributors may be used to endorse or promote products derived from
  18.  *     this software without specific prior written permission.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  24.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30.  * POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * License 1.0
  33.  */
  34. package fr.paris.lutece.portal.web.workgroup;

  35. import java.util.ArrayList;
  36. import java.util.Collection;
  37. import java.util.Collections;
  38. import java.util.HashMap;
  39. import java.util.List;
  40. import java.util.Map;
  41. import java.util.stream.Collectors;

  42. import javax.servlet.http.HttpServletRequest;

  43. import org.apache.commons.collections.CollectionUtils;
  44. import org.apache.commons.lang3.StringUtils;

  45. import fr.paris.lutece.portal.business.right.Level;
  46. import fr.paris.lutece.portal.business.right.LevelHome;
  47. import fr.paris.lutece.portal.business.user.AdminUser;
  48. import fr.paris.lutece.portal.business.user.AdminUserHome;
  49. import fr.paris.lutece.portal.business.workgroup.AdminWorkgroup;
  50. import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupFilter;
  51. import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupHome;
  52. import fr.paris.lutece.portal.service.admin.AccessDeniedException;
  53. import fr.paris.lutece.portal.service.admin.AdminUserService;
  54. import fr.paris.lutece.portal.service.message.AdminMessage;
  55. import fr.paris.lutece.portal.service.message.AdminMessageService;
  56. import fr.paris.lutece.portal.service.security.SecurityTokenService;
  57. import fr.paris.lutece.portal.service.template.AppTemplateService;
  58. import fr.paris.lutece.portal.service.util.AppPathService;
  59. import fr.paris.lutece.portal.service.util.AppPropertiesService;
  60. import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
  61. import fr.paris.lutece.portal.service.workgroup.WorkgroupRemovalListenerService;
  62. import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
  63. import fr.paris.lutece.portal.web.constants.Messages;
  64. import fr.paris.lutece.portal.web.constants.Parameters;
  65. import fr.paris.lutece.portal.web.util.LocalizedPaginator;
  66. import fr.paris.lutece.util.ReferenceItem;
  67. import fr.paris.lutece.util.ReferenceList;
  68. import fr.paris.lutece.util.html.AbstractPaginator;
  69. import fr.paris.lutece.util.html.HtmlTemplate;
  70. import fr.paris.lutece.util.html.ItemNavigator;
  71. import fr.paris.lutece.util.sort.AttributeComparator;
  72. import fr.paris.lutece.util.string.StringUtil;
  73. import fr.paris.lutece.util.url.UrlItem;

  74. /**
  75.  * AdminWorkgroup Jsp Bean
  76.  */
  77. public class AdminWorkgroupJspBean extends AdminFeaturesPageJspBean
  78. {
  79.     // Rights
  80.     /**
  81.      * Right to manage workgroups
  82.      */
  83.     public static final String RIGHT_MANAGE_WORKGROUPS = "CORE_WORKGROUPS_MANAGEMENT";

  84.     /**
  85.      * Serial version UID
  86.      */
  87.     private static final long serialVersionUID = 5945178935890410656L;

  88.     // Templates
  89.     private static final String TEMPLATE_MANAGE_WORGROUPS = "admin/workgroup/manage_workgroups.html";
  90.     private static final String TEMPLATE_CREATE_WORKGROUP = "admin/workgroup/create_workgroup.html";
  91.     private static final String TEMPLATE_MODIFY_WORKGROUP = "admin/workgroup/modify_workgroup.html";
  92.     private static final String TEMPLATE_ASSIGN_USERS = "admin/workgroup/assign_users_workgroup.html";

  93.     // Markers Freemarker
  94.     private static final String MARK_WORKGROUPS_LIST = "workgroups_list";
  95.     private static final String MARK_WORKGROUP = "workgroup";
  96.     private static final String MARK_USERS_LIST = "users_list";
  97.     private static final String MARK_ASSIGNED_USERS_LIST = "assigned_users_list";
  98.     private static final String MARK_ASSIGNED_USERS_NUMBER = "assigned_users_number";
  99.     private static final String MARK_SEARCH_IS_SEARCH = "search_is_search";
  100.     private static final String MARK_SEARCH_ADMIN_WORKGROUP_FILTER = "search_admin_workgroup_filter";
  101.     private static final String MARK_USER_LEVELS_LIST = "user_levels";
  102.     private static final String MARK_ITEM_NAVIGATOR = "item_navigator";
  103.     private static final String MARK_PAGINATOR = "paginator";
  104.     private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
  105.     private static final String MARK_SORT_SEARCH_ATTRIBUTE = "sort_search_attribute";

  106.     // Properties
  107.     private static final String PROPERTY_CREATE_WORKGROUP_PAGETITLE = "portal.workgroup.create_workgroup.pageTitle";
  108.     private static final String PROPERTY_MODIFY_WORKGROUP_PAGETITLE = "portal.workgroup.modify_workgroup.pageTitle";
  109.     private static final String PROPERTY_ASSIGN_USERS_PAGETITLE = "portal.workgroup.assign_users.pageTitle";
  110.     private static final String PROPERTY_MANAGE_WORKGROUPS_PAGETITLE = "portal.workgroup.manage_workgroups.pageTitle";
  111.     private static final String PROPERTY_USERS_PER_PAGE = "paginator.user.itemsPerPage";

  112.     // Parameters
  113.     private static final String PARAMETER_WORKGROUP_KEY = "workgroup_key";
  114.     private static final String PARAMETER_WORKGROUP_DESCRIPTION = "workgroup_description";
  115.     private static final String PARAMETER_USERS_LIST = "list_users";
  116.     private static final String PARAMETER_ID_USER = "id_user";
  117.     private static final String PARAMETER_ANCHOR = "anchor";

  118.     // JSP
  119.     private static final String JSP_MANAGE_WORKGROUPS = "ManageWorkgroups.jsp";
  120.     private static final String JSP_ASSIGN_USERS_TO_WORKGROUPS = "AssignUsersWorkgroup.jsp";
  121.     private static final String JSP_URL_REMOVE_WORKGROUP = "jsp/admin/workgroup/DoRemoveWorkgroup.jsp";
  122.     private static final String JSP_URL_ASSIGN_USERS_TO_WORKGROUPS = "jsp/admin/workgroup/AssignUsersWorkgroup.jsp";

  123.     // Messages
  124.     private static final String MESSAGE_WORKGROUP_ALREADY_EXIST = "portal.workgroup.message.workgroupAlreadyExist";
  125.     private static final String MESSAGE_CONFIRM_REMOVE = "portal.workgroup.message.confirmRemove";
  126.     private static final String MESSAGE_WORKGROUP_ALREADY_USED = "portal.workgroup.message.workgroupAlreadyUsed";
  127.     private static final String MESSAGE_CANNOT_REMOVE_WORKGROUP = "portal.workgroup.message.cannotRemoveWorkgroup";
  128.     private static final String MESSAGE_WORKGROUP_ACCENTUATED_CHARACTER = "portal.workgroup.message.accentuatedCharacter";
  129.     private int _nItemsPerPage;
  130.     private int _nDefaultItemsPerPage;
  131.     private String _strCurrentPageIndex;
  132.     private ItemNavigator _itemNavigator;

  133.     /**
  134.      * Get the workgroups management page. This page provides the list of all existing workgroups.
  135.      *
  136.      * @param request
  137.      *            the http request
  138.      * @return the html code for the workgroup management page
  139.      */
  140.     public String getManageWorkgroups( HttpServletRequest request )
  141.     {
  142.         setPageTitleProperty( PROPERTY_MANAGE_WORKGROUPS_PAGETITLE );

  143.         // Reinit session
  144.         reinitItemNavigator( );

  145.         // FILTER
  146.         AdminWorkgroupFilter awFilter = new AdminWorkgroupFilter( );
  147.         boolean bIsSearch = awFilter.setAdminWorkgroupFilter( request );

  148.         List<AdminWorkgroup> listFilteredWorkgroups = (List<AdminWorkgroup>) AdminWorkgroupHome.findByFilter( awFilter );

  149.         HashMap<String, Object> model = new HashMap<>( );

  150.         if ( !getUser( ).isAdmin( ) )
  151.         {
  152.             listFilteredWorkgroups = (List<AdminWorkgroup>) AdminWorkgroupService.getAuthorizedCollection( listFilteredWorkgroups, getUser( ) );
  153.         }

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

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

  160.             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );

  161.             Collections.sort( listFilteredWorkgroups, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
  162.         }

  163.         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
  164.         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_USERS_PER_PAGE, 50 );
  165.         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );

  166.         String strURL = getHomeUrl( request );
  167.         UrlItem url = new UrlItem( strURL );

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

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

  176.         String strSortSearchAttribute = "";

  177.         if ( bIsSearch )
  178.         {
  179.             awFilter.setUrlAttributes( url );

  180.             if ( !awFilter.getUrlAttributes( ).equals( "" ) )
  181.             {
  182.                 strSortSearchAttribute = "&" + awFilter.getUrlAttributes( );
  183.             }
  184.         }

  185.         // PAGINATOR
  186.         LocalizedPaginator<AdminWorkgroup> paginator = new LocalizedPaginator<>( listFilteredWorkgroups, _nItemsPerPage, url.getUrl( ),
  187.                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );

  188.         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
  189.         model.put( MARK_PAGINATOR, paginator );
  190.         model.put( MARK_WORKGROUPS_LIST, paginator.getPageItems( ) );
  191.         model.put( MARK_SEARCH_IS_SEARCH, bIsSearch );
  192.         model.put( MARK_SEARCH_ADMIN_WORKGROUP_FILTER, awFilter );
  193.         model.put( MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute );

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

  195.         return getAdminPage( template.getHtml( ) );
  196.     }

  197.     /**
  198.      * Returns the data capture form of a new Workgroup
  199.      *
  200.      * @param request
  201.      *            The HTTP Request
  202.      * @return The HTML form
  203.      */
  204.     public String getCreateWorkgroup( HttpServletRequest request )
  205.     {
  206.         setPageTitleProperty( PROPERTY_CREATE_WORKGROUP_PAGETITLE );

  207.         Map<String, Object> model = new HashMap<>( 1 );
  208.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_CREATE_WORKGROUP ) );

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

  210.         return getAdminPage( template.getHtml( ) );
  211.     }

  212.     /**
  213.      * Process the data capture form of a new workgroup
  214.      *
  215.      * @param request
  216.      *            The HTTP Request
  217.      * @return The Jsp URL of the process result
  218.      * @throws AccessDeniedException
  219.      *             if the security token is invalid
  220.      */
  221.     public String doCreateWorkgroup( HttpServletRequest request ) throws AccessDeniedException
  222.     {
  223.         String strKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  224.         String strDescription = request.getParameter( PARAMETER_WORKGROUP_DESCRIPTION );

  225.         if ( ( strKey == null ) || ( strKey.equals( "" ) ) )
  226.         {
  227.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  228.         }

  229.         if ( ( strDescription == null ) || ( strDescription.equals( "" ) ) )
  230.         {
  231.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  232.         }

  233.         // Check if workgroup already exist
  234.         if ( Boolean.TRUE.equals( AdminWorkgroupHome.checkExistWorkgroup( strKey ) ) )
  235.         {
  236.             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ALREADY_EXIST, AdminMessage.TYPE_STOP );
  237.         }

  238.         // Check if strKey contains accentuated caracters
  239.         if ( !StringUtil.checkCodeKey( strKey ) )
  240.         {
  241.             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ACCENTUATED_CHARACTER, AdminMessage.TYPE_STOP );
  242.         }
  243.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_CREATE_WORKGROUP ) )
  244.         {
  245.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  246.         }

  247.         AdminWorkgroup adminWorkgroup = new AdminWorkgroup( );
  248.         adminWorkgroup.setKey( strKey.trim( ) );
  249.         adminWorkgroup.setDescription( strDescription );
  250.         AdminWorkgroupHome.create( adminWorkgroup );
  251.         AdminWorkgroupHome.addUserForWorkgroup( getUser( ), strKey );

  252.         return JSP_MANAGE_WORKGROUPS;
  253.     }

  254.     /**
  255.      * Returns the page of confirmation for deleting a workgroup
  256.      *
  257.      * @param request
  258.      *            The Http Request
  259.      * @return the confirmation url
  260.      */
  261.     public String getConfirmRemoveWorkgroup( HttpServletRequest request )
  262.     {
  263.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  264.         String strUrlRemove = JSP_URL_REMOVE_WORKGROUP;
  265.         Map<String, String> parameters = new HashMap<>( );
  266.         parameters.put( PARAMETER_WORKGROUP_KEY, strWorkgroupKey );
  267.         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_URL_REMOVE_WORKGROUP ) );

  268.         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE, strUrlRemove, AdminMessage.TYPE_CONFIRMATION, parameters );
  269.     }

  270.     /**
  271.      * Process to the confirmation of deleting a workgroup
  272.      *
  273.      * @param request
  274.      *            The Http Request
  275.      * @return the HTML page
  276.      * @throws AccessDeniedException
  277.      *             if the security token is invalid
  278.      */
  279.     public String doRemoveWorkgroup( HttpServletRequest request ) throws AccessDeniedException
  280.     {
  281.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  282.         ArrayList<String> listErrors = new ArrayList<>( );

  283.         if ( CollectionUtils.isNotEmpty( AdminWorkgroupHome.getUserListForWorkgroup( strWorkgroupKey ) ) )
  284.         {
  285.             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ALREADY_USED, AdminMessage.TYPE_STOP );
  286.         }

  287.         if ( !WorkgroupRemovalListenerService.getService( ).checkForRemoval( strWorkgroupKey, listErrors, getLocale( ) ) )
  288.         {
  289.             String strCause = AdminMessageService.getFormattedList( listErrors, getLocale( ) );
  290.             Object [ ] args = {
  291.                     strCause
  292.             };

  293.             return AdminMessageService.getMessageUrl( request, MESSAGE_CANNOT_REMOVE_WORKGROUP, args, AdminMessage.TYPE_STOP );
  294.         }
  295.         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_URL_REMOVE_WORKGROUP ) )
  296.         {
  297.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  298.         }

  299.         AdminWorkgroupHome.remove( strWorkgroupKey );

  300.         return JSP_MANAGE_WORKGROUPS;
  301.     }

  302.     /**
  303.      * Returns the form to update info about a Workgroup
  304.      *
  305.      * @param request
  306.      *            The Http request
  307.      * @return The HTML form to update info
  308.      */
  309.     public String getModifyWorkgroup( HttpServletRequest request )
  310.     {
  311.         setPageTitleProperty( PROPERTY_MODIFY_WORKGROUP_PAGETITLE );

  312.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );

  313.         AdminWorkgroup workgroup = AdminWorkgroupHome.findByPrimaryKey( strWorkgroupKey );

  314.         if ( workgroup == null )
  315.         {
  316.             return getManageWorkgroups( request );
  317.         }

  318.         HashMap<String, Object> model = new HashMap<>( );
  319.         model.put( MARK_WORKGROUP, workgroup );
  320.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_MODIFY_WORKGROUP ) );
  321.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_WORKGROUP, getLocale( ), model );

  322.         return getAdminPage( template.getHtml( ) );
  323.     }

  324.     /**
  325.      * Process the data capture form for modify a workgroup
  326.      *
  327.      * @param request
  328.      *            The HTTP Request
  329.      * @return The Jsp URL of the process result
  330.      * @throws AccessDeniedException
  331.      *             if the security token is invalid
  332.      */
  333.     public String doModifyWorkgroup( HttpServletRequest request ) throws AccessDeniedException
  334.     {
  335.         String strWorgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  336.         String strDescription = request.getParameter( PARAMETER_WORKGROUP_DESCRIPTION );

  337.         if ( StringUtils.isEmpty( strDescription ) )
  338.         {
  339.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  340.         }
  341.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_MODIFY_WORKGROUP ) )
  342.         {
  343.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  344.         }

  345.         AdminWorkgroup adminWorkgroup = new AdminWorkgroup( );
  346.         adminWorkgroup.setKey( strWorgroupKey );
  347.         adminWorkgroup.setDescription( strDescription );
  348.         AdminWorkgroupHome.update( adminWorkgroup );

  349.         return JSP_MANAGE_WORKGROUPS;
  350.     }

  351.     /**
  352.      * Returns the users assignation form
  353.      *
  354.      * @param request
  355.      *            The Http request
  356.      * @return the html code for display the modes list
  357.      */
  358.     public String getAssignUsers( HttpServletRequest request )
  359.     {
  360.         Map<String, Object> model = new HashMap<>( );
  361.         setPageTitleProperty( PROPERTY_ASSIGN_USERS_PAGETITLE );

  362.         String strBaseUrl = AppPathService.getBaseUrl( request ) + JSP_URL_ASSIGN_USERS_TO_WORKGROUPS;
  363.         UrlItem url = new UrlItem( strBaseUrl );

  364.         // WORKGROUP
  365.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  366.         AdminWorkgroup adminWorkgroup = AdminWorkgroupHome.findByPrimaryKey( strWorkgroupKey );

  367.         if ( adminWorkgroup == null )
  368.         {
  369.             return getManageWorkgroups( request );
  370.         }

  371.         // ASSIGNED USERS
  372.         // Add users with higher level then connected user or add all users if connected
  373.         // user is administrator
  374.         List<AdminUser> listAssignedUsers = AdminWorkgroupHome.getUserListForWorkgroup( strWorkgroupKey ).stream( )
  375.                 .filter( this::isUserHigherThanConnectedUser ).collect( Collectors.toList( ) );

  376.         List<AdminUser> listFilteredUsers = AdminUserService.getFilteredUsersInterface( listAssignedUsers, request, model, url );

  377.         // AVAILABLE USERS
  378.         ReferenceList listUsers = new ReferenceList( );

  379.         for ( AdminUser user : AdminUserHome.findUserList( ) )
  380.         {
  381.             final ReferenceItem itemUser = new ReferenceItem( );
  382.             itemUser.setCode( Integer.toString( user.getUserId( ) ) );
  383.             itemUser.setName( user.getLastName( ) + " " + user.getFirstName( ) + " (" + user.getAccessCode( ) + ")" );

  384.             boolean bAssigned = listAssignedUsers.stream( )
  385.                     .anyMatch( assignedUser -> Integer.toString( assignedUser.getUserId( ) ).equals( itemUser.getCode( ) ) );

  386.             // Add users with higher level then connected user or add all users if connected
  387.             // user is administrator
  388.             if ( !bAssigned && isUserHigherThanConnectedUser( user ) )
  389.             {
  390.                 listUsers.add( itemUser );
  391.             }
  392.         }

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

  396.         if ( strSortedAttributeName != null )
  397.         {
  398.             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );

  399.             strAscSort = request.getParameter( Parameters.SORTED_ASC );

  400.             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );

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

  403.         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
  404.         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_USERS_PER_PAGE, 50 );
  405.         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );

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

  410.         // ITEM NAVIGATION
  411.         setItemNavigator( strWorkgroupKey, url.getUrl( ) );

  412.         // PAGINATOR
  413.         url.addParameter( PARAMETER_WORKGROUP_KEY, adminWorkgroup.getKey( ) );

  414.         LocalizedPaginator<AdminUser> paginator = new LocalizedPaginator<>( listFilteredUsers, _nItemsPerPage, url.getUrl( ),
  415.                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );

  416.         // USER LEVEL
  417.         Collection<Level> filteredLevels = new ArrayList<>( );

  418.         for ( Level level : LevelHome.getLevelsList( ) )
  419.         {
  420.             if ( getUser( ).isAdmin( ) || getUser( ).hasRights( level.getId( ) ) )
  421.             {
  422.                 filteredLevels.add( level );
  423.             }
  424.         }

  425.         model.put( MARK_WORKGROUP, adminWorkgroup );
  426.         model.put( MARK_USERS_LIST, listUsers );
  427.         model.put( MARK_ASSIGNED_USERS_LIST, paginator.getPageItems( ) );
  428.         model.put( MARK_ASSIGNED_USERS_NUMBER, listAssignedUsers.size( ) );
  429.         model.put( MARK_USER_LEVELS_LIST, filteredLevels );
  430.         model.put( MARK_ITEM_NAVIGATOR, _itemNavigator );
  431.         model.put( MARK_PAGINATOR, paginator );
  432.         model.put( MARK_NB_ITEMS_PER_PAGE, Integer.toString( _nItemsPerPage ) );
  433.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_ASSIGN_USERS ) );

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

  435.         return getAdminPage( template.getHtml( ) );
  436.     }

  437.     /**
  438.      * Process the data capture form for assign users to a workgroup
  439.      *
  440.      * @param request
  441.      *            The HTTP Request
  442.      * @return The Jsp URL of the process result
  443.      * @throws AccessDeniedException
  444.      *             if the security token is invalid
  445.      */
  446.     public String doAssignUsers( HttpServletRequest request ) throws AccessDeniedException
  447.     {
  448.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_ASSIGN_USERS ) )
  449.         {
  450.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  451.         }
  452.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );

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

  455.         if ( ( arrayUsersIds != null ) )
  456.         {
  457.             for ( int i = 0; i < arrayUsersIds.length; i++ )
  458.             {
  459.                 int nUserId = Integer.parseInt( arrayUsersIds [i] );
  460.                 AdminUser user = AdminUserHome.findByPrimaryKey( nUserId );

  461.                 if ( !AdminWorkgroupHome.isUserInWorkgroup( user, strWorkgroupKey ) )
  462.                 {
  463.                     AdminWorkgroupHome.addUserForWorkgroup( user, strWorkgroupKey );
  464.                 }
  465.             }
  466.         }

  467.         return JSP_ASSIGN_USERS_TO_WORKGROUPS + "?" + PARAMETER_WORKGROUP_KEY + "=" + strWorkgroupKey;
  468.     }

  469.     /**
  470.      * unassigns user from workgroup
  471.      *
  472.      * @param request
  473.      *            The HttpRequest
  474.      * @return the HTML code of list assignations
  475.      * @throws AccessDeniedException
  476.      *             if the security token is invalid
  477.      */
  478.     public String doUnAssignUser( HttpServletRequest request ) throws AccessDeniedException
  479.     {
  480.         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_ASSIGN_USERS ) )
  481.         {
  482.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  483.         }
  484.         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
  485.         int nIdUser = Integer.parseInt( request.getParameter( PARAMETER_ID_USER ) );
  486.         String strAnchor = request.getParameter( PARAMETER_ANCHOR );

  487.         AdminUser adminUser = AdminUserHome.findByPrimaryKey( nIdUser );

  488.         if ( adminUser != null )
  489.         {
  490.             AdminWorkgroupHome.removeUserFromWorkgroup( adminUser, strWorkgroupKey );
  491.         }

  492.         return JSP_ASSIGN_USERS_TO_WORKGROUPS + "?" + PARAMETER_WORKGROUP_KEY + "=" + strWorkgroupKey + "#" + strAnchor;
  493.     }

  494.     /**
  495.      * Get the item navigator
  496.      *
  497.      * @param strWorkgroupKey
  498.      *            the workgroup key
  499.      * @param strUrl
  500.      *            the url
  501.      */
  502.     private void setItemNavigator( String strWorkgroupKey, String strUrl )
  503.     {
  504.         if ( _itemNavigator == null )
  505.         {
  506.             List<String> listWorkgroupKeys = new ArrayList<>( );
  507.             int nCurrentItemId = 0;
  508.             int nIndex = 0;

  509.             for ( AdminWorkgroup workgroup : AdminWorkgroupHome.findAll( ) )
  510.             {
  511.                 if ( ( workgroup != null ) && StringUtils.isNotBlank( workgroup.getKey( ) ) )
  512.                 {
  513.                     listWorkgroupKeys.add( workgroup.getKey( ) );

  514.                     if ( workgroup.getKey( ).equals( strWorkgroupKey ) )
  515.                     {
  516.                         nCurrentItemId = nIndex;
  517.                     }

  518.                     nIndex++;
  519.                 }
  520.             }

  521.             _itemNavigator = new ItemNavigator( listWorkgroupKeys, nCurrentItemId, strUrl, PARAMETER_WORKGROUP_KEY );
  522.         }
  523.         else
  524.         {
  525.             _itemNavigator.setCurrentItemId( strWorkgroupKey );
  526.         }
  527.     }

  528.     /**
  529.      * Reinit the item navigator
  530.      */
  531.     private void reinitItemNavigator( )
  532.     {
  533.         _itemNavigator = null;
  534.     }
  535. }