View Javadoc
1   /*
2    * Copyright (c) 2002-2025, 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  
36  import java.util.ArrayList;
37  import java.util.Collection;
38  import java.util.Collections;
39  import java.util.HashMap;
40  import java.util.List;
41  import java.util.Map;
42  import java.util.stream.Collectors;
43  
44  import javax.servlet.http.HttpServletRequest;
45  
46  import org.apache.commons.collections.CollectionUtils;
47  import org.apache.commons.lang3.StringUtils;
48  
49  import fr.paris.lutece.portal.business.right.Level;
50  import fr.paris.lutece.portal.business.right.LevelHome;
51  import fr.paris.lutece.portal.business.user.AdminUser;
52  import fr.paris.lutece.portal.business.user.AdminUserHome;
53  import fr.paris.lutece.portal.business.workgroup.AdminWorkgroup;
54  import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupFilter;
55  import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupHome;
56  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
57  import fr.paris.lutece.portal.service.admin.AdminUserService;
58  import fr.paris.lutece.portal.service.message.AdminMessage;
59  import fr.paris.lutece.portal.service.message.AdminMessageService;
60  import fr.paris.lutece.portal.service.security.SecurityTokenService;
61  import fr.paris.lutece.portal.service.template.AppTemplateService;
62  import fr.paris.lutece.portal.service.util.AppPathService;
63  import fr.paris.lutece.portal.service.util.AppPropertiesService;
64  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
65  import fr.paris.lutece.portal.service.workgroup.WorkgroupRemovalListenerService;
66  import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
67  import fr.paris.lutece.portal.web.constants.Messages;
68  import fr.paris.lutece.portal.web.constants.Parameters;
69  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
70  import fr.paris.lutece.util.ReferenceItem;
71  import fr.paris.lutece.util.ReferenceList;
72  import fr.paris.lutece.util.html.AbstractPaginator;
73  import fr.paris.lutece.util.html.HtmlTemplate;
74  import fr.paris.lutece.util.html.ItemNavigator;
75  import fr.paris.lutece.util.sort.AttributeComparator;
76  import fr.paris.lutece.util.string.StringUtil;
77  import fr.paris.lutece.util.url.UrlItem;
78  
79  /**
80   * AdminWorkgroup Jsp Bean
81   */
82  public class AdminWorkgroupJspBean extends AdminFeaturesPageJspBean
83  {
84      // Rights
85      /**
86       * Right to manage workgroups
87       */
88      public static final String RIGHT_MANAGE_WORKGROUPS = "CORE_WORKGROUPS_MANAGEMENT";
89  
90      /**
91       * Serial version UID
92       */
93      private static final long serialVersionUID = 5945178935890410656L;
94  
95      // Templates
96      private static final String TEMPLATE_MANAGE_WORGROUPS = "admin/workgroup/manage_workgroups.html";
97      private static final String TEMPLATE_CREATE_WORKGROUP = "admin/workgroup/create_workgroup.html";
98      private static final String TEMPLATE_MODIFY_WORKGROUP = "admin/workgroup/modify_workgroup.html";
99      private static final String TEMPLATE_ASSIGN_USERS = "admin/workgroup/assign_users_workgroup.html";
100     private static final String JSP_PATH = "jsp/admin/workgroup/";
101 
102     // Markers Freemarker
103     private static final String MARK_WORKGROUPS_LIST = "workgroups_list";
104     private static final String MARK_WORKGROUP = "workgroup";
105     private static final String MARK_USERS_LIST = "users_list";
106     private static final String MARK_ASSIGNED_USERS_LIST = "assigned_users_list";
107     private static final String MARK_ASSIGNED_USERS_NUMBER = "assigned_users_number";
108     private static final String MARK_SEARCH_IS_SEARCH = "search_is_search";
109     private static final String MARK_SEARCH_ADMIN_WORKGROUP_FILTER = "search_admin_workgroup_filter";
110     private static final String MARK_USER_LEVELS_LIST = "user_levels";
111     private static final String MARK_ITEM_NAVIGATOR = "item_navigator";
112     private static final String MARK_PAGINATOR = "paginator";
113     private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
114     private static final String MARK_SORT_SEARCH_ATTRIBUTE = "sort_search_attribute";
115 
116     // Properties
117     private static final String PROPERTY_CREATE_WORKGROUP_PAGETITLE = "portal.workgroup.create_workgroup.pageTitle";
118     private static final String PROPERTY_MODIFY_WORKGROUP_PAGETITLE = "portal.workgroup.modify_workgroup.pageTitle";
119     private static final String PROPERTY_ASSIGN_USERS_PAGETITLE = "portal.workgroup.assign_users.pageTitle";
120     private static final String PROPERTY_MANAGE_WORKGROUPS_PAGETITLE = "portal.workgroup.manage_workgroups.pageTitle";
121     private static final String PROPERTY_USERS_PER_PAGE = "paginator.user.itemsPerPage";
122 
123     // Parameters
124     private static final String PARAMETER_WORKGROUP_KEY = "workgroup_key";
125     private static final String PARAMETER_WORKGROUP_DESCRIPTION = "workgroup_description";
126     private static final String PARAMETER_USERS_LIST = "list_users";
127     private static final String PARAMETER_ID_USER = "id_user";
128     private static final String PARAMETER_ANCHOR = "anchor";
129 
130     // JSP
131     private static final String JSP_MANAGE_WORKGROUPS = "ManageWorkgroups.jsp";
132     private static final String JSP_ASSIGN_USERS_TO_WORKGROUPS = "AssignUsersWorkgroup.jsp";
133     private static final String JSP_URL_REMOVE_WORKGROUP = "jsp/admin/workgroup/DoRemoveWorkgroup.jsp";
134     private static final String JSP_URL_ASSIGN_USERS_TO_WORKGROUPS = "jsp/admin/workgroup/AssignUsersWorkgroup.jsp";
135 
136     // Messages
137     private static final String MESSAGE_WORKGROUP_ALREADY_EXIST = "portal.workgroup.message.workgroupAlreadyExist";
138     private static final String MESSAGE_CONFIRM_REMOVE = "portal.workgroup.message.confirmRemove";
139     private static final String MESSAGE_WORKGROUP_ALREADY_USED = "portal.workgroup.message.workgroupAlreadyUsed";
140     private static final String MESSAGE_CANNOT_REMOVE_WORKGROUP = "portal.workgroup.message.cannotRemoveWorkgroup";
141     private static final String MESSAGE_WORKGROUP_ACCENTUATED_CHARACTER = "portal.workgroup.message.accentuatedCharacter";
142     private int _nItemsPerPage;
143     private int _nDefaultItemsPerPage;
144     private String _strCurrentPageIndex;
145     private ItemNavigator _itemNavigator;
146 
147     /**
148      * Get the workgroups management page. This page provides the list of all existing workgroups.
149      * 
150      * @param request
151      *            the http request
152      * @return the html code for the workgroup management page
153      */
154     public String getManageWorkgroups( HttpServletRequest request )
155     {
156         setPageTitleProperty( PROPERTY_MANAGE_WORKGROUPS_PAGETITLE );
157 
158         // Reinit session
159         reinitItemNavigator( );
160 
161         // FILTER
162         AdminWorkgroupFilteroup/AdminWorkgroupFilter.html#AdminWorkgroupFilter">AdminWorkgroupFilter awFilter = new AdminWorkgroupFilter( );
163         boolean bIsSearch = awFilter.setAdminWorkgroupFilter( request );
164 
165         List<AdminWorkgroup> listFilteredWorkgroups = (List<AdminWorkgroup>) AdminWorkgroupHome.findByFilter( awFilter );
166 
167         HashMap<String, Object> model = new HashMap<>( );
168 
169         if ( !getUser( ).isAdmin( ) )
170         {
171             listFilteredWorkgroups = (List<AdminWorkgroup>) AdminWorkgroupService.getAuthorizedCollection( listFilteredWorkgroups, getUser( ) );
172         }
173 
174         // SORT
175         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
176         String strAscSort = null;
177 
178         if ( strSortedAttributeName != null )
179         {
180             strAscSort = request.getParameter( Parameters.SORTED_ASC );
181 
182             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
183 
184             Collections.sort( listFilteredWorkgroups, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
185         }
186 
187         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
188         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_USERS_PER_PAGE, 50 );
189         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
190 
191         String strURL = getHomeUrl( request );
192         UrlItem/url/UrlItem.html#UrlItem">UrlItem url = new UrlItem( strURL );
193 
194         if ( strSortedAttributeName != null )
195         {
196             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
197         }
198 
199         if ( strAscSort != null )
200         {
201             url.addParameter( Parameters.SORTED_ASC, strAscSort );
202         }
203 
204         String strSortSearchAttribute = "";
205 
206         if ( bIsSearch )
207         {
208             awFilter.setUrlAttributes( url );
209 
210             if ( !awFilter.getUrlAttributes( ).equals( "" ) )
211             {
212                 strSortSearchAttribute = "&" + awFilter.getUrlAttributes( );
213             }
214         }
215 
216         // PAGINATOR
217         LocalizedPaginator<AdminWorkgroup> paginator = new LocalizedPaginator<>( listFilteredWorkgroups, _nItemsPerPage, url.getUrl( ),
218                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
219 
220         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
221         model.put( MARK_PAGINATOR, paginator );
222         model.put( MARK_WORKGROUPS_LIST, paginator.getPageItems( ) );
223         model.put( MARK_SEARCH_IS_SEARCH, bIsSearch );
224         model.put( MARK_SEARCH_ADMIN_WORKGROUP_FILTER, awFilter );
225         model.put( MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute );
226 
227         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_WORGROUPS, getLocale( ), model );
228 
229         return getAdminPage( template.getHtml( ) );
230     }
231 
232     /**
233      * Returns the data capture form of a new Workgroup
234      *
235      * @param request
236      *            The HTTP Request
237      * @return The HTML form
238      */
239     public String getCreateWorkgroup( HttpServletRequest request )
240     {
241         setPageTitleProperty( PROPERTY_CREATE_WORKGROUP_PAGETITLE );
242 
243         Map<String, Object> model = new HashMap<>( 1 );
244         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_CREATE_WORKGROUP ) );
245 
246         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_WORKGROUP, getLocale( ), model );
247 
248         return getAdminPage( template.getHtml( ) );
249     }
250 
251     /**
252      * Process the data capture form of a new workgroup
253      *
254      * @param request
255      *            The HTTP Request
256      * @return The Jsp URL of the process result
257      * @throws AccessDeniedException
258      *             if the security token is invalid
259      */
260     public String doCreateWorkgroup( HttpServletRequest request ) throws AccessDeniedException
261     {
262         String strKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
263         String strDescription = request.getParameter( PARAMETER_WORKGROUP_DESCRIPTION );
264 
265         if ( ( strKey == null ) || ( strKey.equals( "" ) ) )
266         {
267             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
268         }
269 
270         if ( ( strDescription == null ) || ( strDescription.equals( "" ) ) )
271         {
272             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
273         }
274 
275         // Check if workgroup already exist
276         if ( Boolean.TRUE.equals( AdminWorkgroupHome.checkExistWorkgroup( strKey ) ) )
277         {
278             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ALREADY_EXIST, AdminMessage.TYPE_STOP );
279         }
280 
281         // Check if strKey contains accentuated caracters
282         if ( !StringUtil.checkCodeKey( strKey ) )
283         {
284             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ACCENTUATED_CHARACTER, AdminMessage.TYPE_STOP );
285         }
286         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_CREATE_WORKGROUP ) )
287         {
288             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
289         }
290 
291         AdminWorkgroupoup/AdminWorkgroup.html#AdminWorkgroup">AdminWorkgroup adminWorkgroup = new AdminWorkgroup( );
292         adminWorkgroup.setKey( strKey.trim( ) );
293         adminWorkgroup.setDescription( strDescription );
294         AdminWorkgroupHome.create( adminWorkgroup );
295         AdminWorkgroupHome.addUserForWorkgroup( getUser( ), strKey );
296 
297         if( !getUser().getUserWorkgroups().contains( strKey ) )
298         {
299             getUser().getUserWorkgroups().add( strKey );
300         }
301 
302         return JSP_MANAGE_WORKGROUPS;
303     }
304 
305     /**
306      * Returns the page of confirmation for deleting a workgroup
307      *
308      * @param request
309      *            The Http Request
310      * @return the confirmation url
311      */
312     public String getConfirmRemoveWorkgroup( HttpServletRequest request )
313     {
314         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
315         String strUrlRemove = JSP_URL_REMOVE_WORKGROUP;
316         Map<String, Object> parameters = new HashMap<>( );
317         parameters.put( PARAMETER_WORKGROUP_KEY, strWorkgroupKey );
318         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_URL_REMOVE_WORKGROUP ) );
319 
320         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE, null, null, strUrlRemove, null, AdminMessage.TYPE_CONFIRMATION, parameters, JSP_PATH+JSP_MANAGE_WORKGROUPS );
321     }
322 
323     /**
324      * Process to the confirmation of deleting a workgroup
325      *
326      * @param request
327      *            The Http Request
328      * @return the HTML page
329      * @throws AccessDeniedException
330      *             if the security token is invalid
331      */
332     public String doRemoveWorkgroup( HttpServletRequest request ) throws AccessDeniedException
333     {
334         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
335         ArrayList<String> listErrors = new ArrayList<>( );
336 
337         if ( CollectionUtils.isNotEmpty( AdminWorkgroupHome.getUserListForWorkgroup( strWorkgroupKey ) ) )
338         {
339             return AdminMessageService.getMessageUrl( request, MESSAGE_WORKGROUP_ALREADY_USED, JSP_PATH+JSP_MANAGE_WORKGROUPS, AdminMessage.TYPE_STOP );
340         }
341 
342         if ( !WorkgroupRemovalListenerService.getService( ).checkForRemoval( strWorkgroupKey, listErrors, getLocale( ) ) )
343         {
344             String strCause = AdminMessageService.getFormattedList( listErrors, getLocale( ) );
345             Object [ ] args = {
346                     strCause
347             };
348 
349             return AdminMessageService.getMessageUrl( request, MESSAGE_CANNOT_REMOVE_WORKGROUP, args, JSP_PATH+JSP_MANAGE_WORKGROUPS, AdminMessage.TYPE_STOP );
350         }
351         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_URL_REMOVE_WORKGROUP ) )
352         {
353             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
354         }
355 
356         AdminWorkgroupHome.remove( strWorkgroupKey );
357 
358         return JSP_MANAGE_WORKGROUPS;
359     }
360 
361     /**
362      * Returns the form to update info about a Workgroup
363      *
364      * @param request
365      *            The Http request
366      * @return The HTML form to update info
367      */
368     public String getModifyWorkgroup( HttpServletRequest request )
369     {
370         setPageTitleProperty( PROPERTY_MODIFY_WORKGROUP_PAGETITLE );
371 
372         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
373 
374         AdminWorkgroup workgroup = AdminWorkgroupHome.findByPrimaryKey( strWorkgroupKey );
375 
376         if ( workgroup == null )
377         {
378             return getManageWorkgroups( request );
379         }
380 
381         HashMap<String, Object> model = new HashMap<>( );
382         model.put( MARK_WORKGROUP, workgroup );
383         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_MODIFY_WORKGROUP ) );
384         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_WORKGROUP, getLocale( ), model );
385 
386         return getAdminPage( template.getHtml( ) );
387     }
388 
389     /**
390      * Process the data capture form for modify a workgroup
391      *
392      * @param request
393      *            The HTTP Request
394      * @return The Jsp URL of the process result
395      * @throws AccessDeniedException
396      *             if the security token is invalid
397      */
398     public String doModifyWorkgroup( HttpServletRequest request ) throws AccessDeniedException
399     {
400         String strWorgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
401         String strDescription = request.getParameter( PARAMETER_WORKGROUP_DESCRIPTION );
402 
403         if ( StringUtils.isEmpty( strDescription ) )
404         {
405             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
406         }
407         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_MODIFY_WORKGROUP ) )
408         {
409             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
410         }
411 
412         AdminWorkgroupoup/AdminWorkgroup.html#AdminWorkgroup">AdminWorkgroup adminWorkgroup = new AdminWorkgroup( );
413         adminWorkgroup.setKey( strWorgroupKey );
414         adminWorkgroup.setDescription( strDescription );
415         AdminWorkgroupHome.update( adminWorkgroup );
416 
417         return JSP_MANAGE_WORKGROUPS;
418     }
419 
420     /**
421      * Returns the users assignation form
422      *
423      * @param request
424      *            The Http request
425      * @return the html code for display the modes list
426      */
427     public String getAssignUsers( HttpServletRequest request )
428     {
429         Map<String, Object> model = new HashMap<>( );
430         setPageTitleProperty( PROPERTY_ASSIGN_USERS_PAGETITLE );
431 
432         String strBaseUrl = AppPathService.getBaseUrl( request ) + JSP_URL_ASSIGN_USERS_TO_WORKGROUPS;
433         UrlItem/url/UrlItem.html#UrlItem">UrlItem url = new UrlItem( strBaseUrl );
434 
435         // WORKGROUP
436         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
437         AdminWorkgroup adminWorkgroup = AdminWorkgroupHome.findByPrimaryKey( strWorkgroupKey );
438 
439         if ( adminWorkgroup == null )
440         {
441             return getManageWorkgroups( request );
442         }
443 
444         // ASSIGNED USERS
445         // Add users with higher level then connected user or add all users if connected
446         // user is administrator
447         List<AdminUser> listAssignedUsers = AdminWorkgroupHome.getUserListForWorkgroup( strWorkgroupKey ).stream( )
448                 .filter( this::isUserHigherThanConnectedUser ).collect( Collectors.toList( ) );
449 
450         List<AdminUser> listFilteredUsers = AdminUserService.getFilteredUsersInterface( listAssignedUsers, request, model, url );
451 
452         // AVAILABLE USERS
453         ReferenceListst.html#ReferenceList">ReferenceList listUsers = new ReferenceList( );
454 
455         for ( AdminUser user : AdminUserHome.findUserList( ) )
456         {
457             final ReferenceItemtem.html#ReferenceItem">ReferenceItem itemUser = new ReferenceItem( );
458             itemUser.setCode( Integer.toString( user.getUserId( ) ) );
459             itemUser.setName( user.getLastName( ) + " " + user.getFirstName( ) + " (" + user.getAccessCode( ) + ")" );
460 
461             boolean bAssigned = listAssignedUsers.stream( )
462                     .anyMatch( assignedUser -> Integer.toString( assignedUser.getUserId( ) ).equals( itemUser.getCode( ) ) );
463 
464             // Add users with higher level then connected user or add all users if connected
465             // user is administrator
466             if ( !bAssigned && isUserHigherThanConnectedUser( user ) )
467             {
468                 listUsers.add( itemUser );
469             }
470         }
471 
472         // SORT
473         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
474         String strAscSort = null;
475 
476         if ( strSortedAttributeName != null )
477         {
478             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
479 
480             strAscSort = request.getParameter( Parameters.SORTED_ASC );
481 
482             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
483 
484             Collections.sort( listFilteredUsers, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
485         }
486 
487         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
488         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_USERS_PER_PAGE, 50 );
489         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
490 
491         if ( strAscSort != null )
492         {
493             url.addParameter( Parameters.SORTED_ASC, strAscSort );
494         }
495 
496         // ITEM NAVIGATION
497         setItemNavigator( strWorkgroupKey, url.getUrl( ) );
498 
499         // PAGINATOR
500         url.addParameter( PARAMETER_WORKGROUP_KEY, adminWorkgroup.getKey( ) );
501 
502         LocalizedPaginator<AdminUser> paginator = new LocalizedPaginator<>( listFilteredUsers, _nItemsPerPage, url.getUrl( ),
503                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
504 
505         // USER LEVEL
506         Collection<Level> filteredLevels = new ArrayList<>( );
507 
508         for ( Level level : LevelHome.getLevelsList( ) )
509         {
510             if ( getUser( ).isAdmin( ) || getUser( ).hasRights( level.getId( ) ) )
511             {
512                 filteredLevels.add( level );
513             }
514         }
515 
516         model.put( MARK_WORKGROUP, adminWorkgroup );
517         model.put( MARK_USERS_LIST, listUsers );
518         model.put( MARK_ASSIGNED_USERS_LIST, paginator.getPageItems( ) );
519         model.put( MARK_ASSIGNED_USERS_NUMBER, listAssignedUsers.size( ) );
520         model.put( MARK_USER_LEVELS_LIST, filteredLevels );
521         model.put( MARK_ITEM_NAVIGATOR, _itemNavigator );
522         model.put( MARK_PAGINATOR, paginator );
523         model.put( MARK_NB_ITEMS_PER_PAGE, Integer.toString( _nItemsPerPage ) );
524         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_ASSIGN_USERS ) );
525 
526         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_ASSIGN_USERS, getLocale( ), model );
527 
528         return getAdminPage( template.getHtml( ) );
529     }
530 
531     /**
532      * Process the data capture form for assign users to a workgroup
533      *
534      * @param request
535      *            The HTTP Request
536      * @return The Jsp URL of the process result
537      * @throws AccessDeniedException
538      *             if the security token is invalid
539      */
540     public String doAssignUsers( HttpServletRequest request ) throws AccessDeniedException
541     {
542         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_ASSIGN_USERS ) )
543         {
544             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
545         }
546         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
547 
548         // retrieve the selected portlets ids
549         String [ ] arrayUsersIds = request.getParameterValues( PARAMETER_USERS_LIST );
550 
551         if ( ( arrayUsersIds != null ) )
552         {
553             for ( int i = 0; i < arrayUsersIds.length; i++ )
554             {
555                 int nUserId = Integer.parseInt( arrayUsersIds [i] );
556                 AdminUser user = AdminUserHome.findByPrimaryKey( nUserId );
557 
558                 if ( !AdminWorkgroupHome.isUserInWorkgroup( user, strWorkgroupKey ) )
559                 {
560                     AdminWorkgroupHome.addUserForWorkgroup( user, strWorkgroupKey );
561                 }
562             }
563         }
564 
565         return JSP_ASSIGN_USERS_TO_WORKGROUPS + "?" + PARAMETER_WORKGROUP_KEY + "=" + strWorkgroupKey;
566     }
567 
568     /**
569      * unassigns user from workgroup
570      * 
571      * @param request
572      *            The HttpRequest
573      * @return the HTML code of list assignations
574      * @throws AccessDeniedException
575      *             if the security token is invalid
576      */
577     public String doUnAssignUser( HttpServletRequest request ) throws AccessDeniedException
578     {
579         if ( !SecurityTokenService.getInstance( ).validate( request, TEMPLATE_ASSIGN_USERS ) )
580         {
581             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
582         }
583         String strWorkgroupKey = request.getParameter( PARAMETER_WORKGROUP_KEY );
584         int nIdUser = Integer.parseInt( request.getParameter( PARAMETER_ID_USER ) );
585         String strAnchor = request.getParameter( PARAMETER_ANCHOR );
586 
587         AdminUser adminUser = AdminUserHome.findByPrimaryKey( nIdUser );
588 
589         if ( adminUser != null )
590         {
591             AdminWorkgroupHome.removeUserFromWorkgroup( adminUser, strWorkgroupKey );
592         }
593 
594         return JSP_ASSIGN_USERS_TO_WORKGROUPS + "?" + PARAMETER_WORKGROUP_KEY + "=" + strWorkgroupKey + "#" + strAnchor;
595     }
596 
597     /**
598      * Get the item navigator
599      * 
600      * @param strWorkgroupKey
601      *            the workgroup key
602      * @param strUrl
603      *            the url
604      */
605     private void setItemNavigator( String strWorkgroupKey, String strUrl )
606     {
607         if ( _itemNavigator == null )
608         {
609             List<String> listWorkgroupKeys = new ArrayList<>( );
610             int nCurrentItemId = 0;
611             int nIndex = 0;
612 
613             for ( AdminWorkgroup workgroup : AdminWorkgroupHome.findAll( ) )
614             {
615                 if ( ( workgroup != null ) && StringUtils.isNotBlank( workgroup.getKey( ) ) )
616                 {
617                     listWorkgroupKeys.add( workgroup.getKey( ) );
618 
619                     if ( workgroup.getKey( ).equals( strWorkgroupKey ) )
620                     {
621                         nCurrentItemId = nIndex;
622                     }
623 
624                     nIndex++;
625                 }
626             }
627 
628             _itemNavigator = new ItemNavigator( listWorkgroupKeys, nCurrentItemId, strUrl, PARAMETER_WORKGROUP_KEY );
629         }
630         else
631         {
632             _itemNavigator.setCurrentItemId( strWorkgroupKey );
633         }
634     }
635 
636     /**
637      * Reinit the item navigator
638      */
639     private void reinitItemNavigator( )
640     {
641         _itemNavigator = null;
642     }
643 }