View Javadoc
1   /*
2    * Copyright (c) 2002-2021, 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.plugins.mylutece.modules.database.authentication.web;
35  
36  import fr.paris.lutece.api.user.User;
37  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseHome;
38  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUser;
39  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUserFilter;
40  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.DatabaseUserHome;
41  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.Group;
42  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupFilter;
43  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupHome;
44  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.business.GroupRoleHome;
45  import fr.paris.lutece.plugins.mylutece.modules.database.authentication.service.DatabaseService;
46  import fr.paris.lutece.portal.business.role.Role;
47  import fr.paris.lutece.portal.business.role.RoleHome;
48  import fr.paris.lutece.portal.service.message.AdminMessage;
49  import fr.paris.lutece.portal.service.message.AdminMessageService;
50  import fr.paris.lutece.portal.service.template.AppTemplateService;
51  import fr.paris.lutece.portal.service.util.AppPathService;
52  import fr.paris.lutece.portal.service.util.AppPropertiesService;
53  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
54  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
55  import fr.paris.lutece.portal.web.constants.Messages;
56  import fr.paris.lutece.portal.web.constants.Parameters;
57  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
58  import fr.paris.lutece.util.ReferenceItem;
59  import fr.paris.lutece.util.ReferenceList;
60  import fr.paris.lutece.util.html.AbstractPaginator;
61  import fr.paris.lutece.util.html.HtmlTemplate;
62  import fr.paris.lutece.util.html.ItemNavigator;
63  import fr.paris.lutece.util.sort.AttributeComparator;
64  import fr.paris.lutece.util.url.UrlItem;
65  
66  import org.apache.commons.collections.CollectionUtils;
67  import org.apache.commons.lang3.StringUtils;
68  
69  import java.util.ArrayList;
70  import java.util.Collection;
71  import java.util.Collections;
72  import java.util.HashMap;
73  import java.util.List;
74  import java.util.Map;
75  
76  import javax.servlet.http.HttpServletRequest;
77  
78  /**
79   * This class provides the user interface to manage Lutece group features ( manage, create, modify, remove )
80   */
81  public class GroupJspBean extends PluginAdminPageJspBean
82  {
83      private static final long serialVersionUID = -3940937010700725590L;
84  
85      // Right
86      public static final String RIGHT_GROUPS_MANAGEMENT = "DATABASE_GROUPS_MANAGEMENT";
87  
88      // Constants
89      private static final String QUESTION_MARK = "?";
90      private static final String EQUAL = "=";
91      private static final String AMPERSAND = "&";
92      private static final String SPACE = " ";
93      private static final String OPEN_BRACKET = "(";
94      private static final String CLOSED_BRACKET = ")";
95      private static final String SHARP = "#";
96  
97      // JSP
98      private static final String JSP_URL_DO_REMOVE_GROUP = "jsp/admin/plugins/mylutece/modules/database/DoRemoveGroup.jsp";
99      private static final String JSP_URL_MODIFY_GROUP = "jsp/admin/plugins/mylutece/modules/database/ModifyGroup.jsp";
100     private static final String JSP_URL_MANAGE_ROLES_GROUP = "jsp/admin/plugins/mylutece/modules/database/ManageRolesGroup.jsp";
101     private static final String JSP_URL_MANAGE_USERS_GROUP = "jsp/admin/plugins/mylutece/modules/database/ManageUsersGroup.jsp";
102     private static final String JSP_MODIFY_GROUP = "ModifyGroup.jsp";
103     private static final String JSP_MANAGE_ROLES_GROUP = "ManageRolesGroup.jsp";
104     private static final String JSP_MANAGE_GROUPS = "ManageGroups.jsp";
105     private static final String JSP_MANAGE_USERS_GROUP = "ManageUsersGroup.jsp";
106 
107     // Markers
108     private static final String MARK_GROUPS_LIST = "groups_list";
109     private static final String MARK_GROUP = "group";
110     private static final String MARK_ROLES_LIST = "role_list";
111     private static final String MARK_ROLES_LIST_FOR_GROUP = "group_role_list";
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_ITEM_NAVIGATOR = "item_navigator";
115     private static final String MARK_SEARCH_IS_SEARCH = "search_is_search";
116     private static final String MARK_SORT_SEARCH_ATTRIBUTE = "sort_search_attribute";
117     private static final String MARK_SEARCH_GROUP_FILTER = "search_group_filter";
118     private static final String MARK_AVAILABLE_USERS = "available_users";
119     private static final String MARK_ASSIGNED_USERS = "assigned_users";
120     private static final String MARK_ASSIGNED_USERS_NUMBER = "assigned_users_number";
121 
122     // Parameters
123     private static final String PARAMETER_GROUP_KEY = "group_key";
124     private static final String PARAMETER_GROUP_DESCRIPTION = "group_description";
125     private static final String PARAMETER_ROLE_KEY = "role_key";
126     private static final String PARAMETER_CANCEL = "cancel";
127     private static final String PARAMETER_MYLUTECE_DATABASE_USER_ID = "mylutece_database_user_id";
128     private static final String PARAMETER_ANCHOR = "anchor";
129     private static final String PARAMETER_AVAILABLE_USERS = "available_users";
130     private static final String PARAMETER_MODIFY_GROUP = "modify_group";
131     private static final String PARAMETER_ASSIGN_USER = "assign_user";
132     private static final String PARAMETER_ASSIGN_ROLE = "assign_role";
133 
134     // Templates
135     private static final String TEMPLATE_MANAGE_GROUPS = "admin/plugins/mylutece/modules/database/manage_groups.html";
136     private static final String TEMPLATE_CREATE_GROUP = "admin/plugins/mylutece/modules/database/create_group.html";
137     private static final String TEMPLATE_GROUP_MODIFY = "admin/plugins/mylutece/modules/database/modify_group.html";
138     private static final String TEMPLATE_MANAGE_ROLES_GROUP = "admin/plugins/mylutece/modules/database/manage_roles_group.html";
139     private static final String TEMPLATE_MANAGE_USERS_GROUP = "admin/plugins/mylutece/modules/database/manage_users_group.html";
140 
141     // Properties
142     private static final String PROPERTY_PAGE_TITLE_CREATE_GROUP = "module.mylutece.database.create_group.pageTitle";
143     private static final String PROPERTY_PAGE_TITLE_MODIFY_GROUP = "module.mylutece.database.modify_group.pageTitle";
144     private static final String PROPERTY_PAGE_TITLE_MANAGE_ROLES_GROUP = "module.mylutece.database.manage_roles_group.pageTitle";
145     private static final String PROPERTY_GROUPS_PER_PAGE = "paginator.groups.itemsPerPage";
146     private static final String PROPERTY_PAGE_TITLE_MANAGE_USERS_GROUP = "module.mylutece.database.manage_users_group.pageTitle";
147     private static final String PROPERTY_USERS_PER_PAGE = "paginator.users.itemsPerPage";
148 
149     // Message
150     private static final String MESSAGE_GROUP_EXIST = "module.mylutece.database.message.groupExist";
151     private static final String MESSAGE_CONFIRM_REMOVE = "module.mylutece.database.message.confirmRemoveGroup";
152     private static final String MESSAGE_ERROR_MODIFY = "module.mylutece.database.message.errorModifyGroup";
153     private static final String MESSAGE_ERROR_REMOVE = "module.mylutece.database.message.errorRemoveGroup";
154     private static final String MESSAGE_ERROR_MANAGE_GROUPS = "module.mylutece.database.message.errorManageGroups";
155     private int _nItemsPerPage;
156     private int _nDefaultItemsPerPage;
157     private String _strCurrentPageIndex;
158     private Map<String, ItemNavigator> _itemNavigators = new HashMap<>( );
159     private GroupFilter _gFilter;
160     private String _strSortedAttributeName;
161     private boolean _bIsAscSort;
162     private DatabaseService _databaseService = DatabaseService.getService( );
163 
164     /**
165      * Returns Group management form
166      * 
167      * @param request
168      *            The Http request
169      * @return Html form
170      */
171     public String getManageGroups( HttpServletRequest request )
172     {
173         setPageTitleProperty( null );
174 
175         // Reinit session
176         reinitItemNavigators( );
177 
178         List<Group> listGroups = getAuthorizedGroups( );
179 
180         // FILTER
181         _gFilter = new GroupFilter( );
182 
183         boolean bIsSearch = _gFilter.setGroupFilter( request );
184         List<Group> listFilteredGroups = GroupHome.findByFilter( _gFilter, getPlugin( ) );
185         List<Group> listAvailableGroups = new ArrayList<>( );
186 
187         for ( Group filteredGroup : listFilteredGroups )
188         {
189             for ( Group group : listGroups )
190             {
191                 if ( filteredGroup.getGroupKey( ).equals( group.getGroupKey( ) ) )
192                 {
193                     listAvailableGroups.add( group );
194                 }
195             }
196         }
197 
198         // SORT
199         _strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
200 
201         String strAscSort = null;
202 
203         if ( _strSortedAttributeName != null )
204         {
205             strAscSort = request.getParameter( Parameters.SORTED_ASC );
206 
207             _bIsAscSort = Boolean.parseBoolean( strAscSort );
208 
209             Collections.sort( listAvailableGroups, new AttributeComparator( _strSortedAttributeName, _bIsAscSort ) );
210         }
211 
212         String strURL = getHomeUrl( request );
213         UrlItem url = new UrlItem( strURL );
214 
215         if ( _strSortedAttributeName != null )
216         {
217             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, _strSortedAttributeName );
218         }
219 
220         if ( strAscSort != null )
221         {
222             url.addParameter( Parameters.SORTED_ASC, strAscSort );
223         }
224 
225         String strSortSearchAttribute = StringUtils.EMPTY;
226 
227         if ( bIsSearch )
228         {
229             _gFilter.setUrlAttributes( url );
230 
231             if ( StringUtils.isNotBlank( _gFilter.getUrlAttributes( ) ) )
232             {
233                 strSortSearchAttribute = AMPERSAND + _gFilter.getUrlAttributes( );
234             }
235         }
236 
237         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_GROUPS_PER_PAGE, 50 );
238         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
239         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
240 
241         LocalizedPaginator<Group> paginator = new LocalizedPaginator<>( listAvailableGroups, _nItemsPerPage, url.getUrl( ),
242                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
243 
244         Map<String, Object> model = new HashMap<>( );
245         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
246         model.put( MARK_PAGINATOR, paginator );
247         model.put( MARK_GROUPS_LIST, paginator.getPageItems( ) );
248         model.put( MARK_SEARCH_IS_SEARCH, bIsSearch );
249         model.put( MARK_SEARCH_GROUP_FILTER, _gFilter );
250         model.put( MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute );
251 
252         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_GROUPS, getLocale( ), model );
253 
254         return getAdminPage( template.getHtml( ) );
255     }
256 
257     /**
258      * Insert a new group
259      * 
260      * @param request
261      *            The HTTP request
262      * @return String The html code page
263      */
264     public String getCreateGroup( HttpServletRequest request )
265     {
266         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE_GROUP );
267 
268         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_GROUP, getLocale( ) );
269 
270         return getAdminPage( template.getHtml( ) );
271     }
272 
273     /**
274      * Create Group
275      * 
276      * @param request
277      *            The HTTP request
278      * @return String The url page
279      */
280     public String doCreateGroup( HttpServletRequest request )
281     {
282         String strGroupKey = request.getParameter( PARAMETER_GROUP_KEY );
283         String strGroupDescription = request.getParameter( PARAMETER_GROUP_DESCRIPTION );
284 
285         // Mandatory field
286         if ( strGroupKey.length( ) == 0 )
287         {
288             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
289         }
290 
291         // check if group exist
292         if ( GroupHome.findByPrimaryKey( strGroupKey, getPlugin( ) ) != null )
293         {
294             return AdminMessageService.getMessageUrl( request, MESSAGE_GROUP_EXIST, AdminMessage.TYPE_STOP );
295         }
296 
297         Grouptece/plugins/mylutece/modules/database/authentication/business/Group.html#Group">Group group = new Group( );
298         group.setGroupKey( strGroupKey );
299         group.setGroupDescription( strGroupDescription );
300         GroupHome.create( group, getPlugin( ) );
301 
302         return getHomeUrl( request );
303     }
304 
305     /**
306      *
307      * @param request
308      *            The HTTP request
309      * @return String The html code page
310      */
311     public String getModifyGroup( HttpServletRequest request )
312     {
313         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY_GROUP );
314 
315         Group selectedGroup = getGroupFromRequest( request );
316 
317         if ( selectedGroup == null )
318         {
319             return getCreateGroup( request );
320         }
321 
322         // ASSIGNED USERS NUMBER
323         List<DatabaseUser> listAllAssignedUsers = DatabaseHome.findGroupUsersFromGroupKey( selectedGroup.getGroupKey( ), getPlugin( ) );
324         int nAssignedUsersNumber = listAllAssignedUsers.size( );
325 
326         // ITEM NAVIGATION
327         setItemNavigator( PARAMETER_MODIFY_GROUP, selectedGroup.getGroupKey( ), AppPathService.getBaseUrl( request ) + JSP_URL_MODIFY_GROUP );
328 
329         Map<String, Object> model = new HashMap<>( );
330         model.put( MARK_GROUP, selectedGroup );
331         model.put( MARK_ITEM_NAVIGATOR, _itemNavigators.get( PARAMETER_MODIFY_GROUP ) );
332         model.put( MARK_ASSIGNED_USERS_NUMBER, nAssignedUsersNumber );
333 
334         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_GROUP_MODIFY, getLocale( ), model );
335 
336         return getAdminPage( template.getHtml( ) );
337     }
338 
339     /**
340      * Modify group
341      * 
342      * @param request
343      *            The HTTP request
344      * @return String The url page
345      */
346     public String doModifyGroup( HttpServletRequest request )
347     {
348         String strReturn;
349 
350         String strActionCancel = request.getParameter( PARAMETER_CANCEL );
351 
352         if ( strActionCancel != null )
353         {
354             strReturn = JSP_MANAGE_GROUPS;
355         }
356         else
357         {
358             String strGroupKey = request.getParameter( PARAMETER_GROUP_KEY );
359             String strGroupDescription = request.getParameter( PARAMETER_GROUP_DESCRIPTION );
360 
361             Group group = getGroupFromRequest( request );
362 
363             if ( group == null )
364             {
365                 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_MODIFY, AdminMessage.TYPE_ERROR );
366             }
367 
368             // Mandatory field
369             if ( strGroupKey.length( ) == 0 )
370             {
371                 return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
372             }
373 
374             group.setGroupKey( strGroupKey );
375             group.setGroupDescription( strGroupDescription );
376             GroupHome.update( group, getPlugin( ) );
377             strReturn = JSP_MODIFY_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + group.getGroupKey( );
378         }
379 
380         return strReturn;
381     }
382 
383     /**
384      * confirm Delete Group
385      * 
386      * @param request
387      *            The HTTP request
388      * @return String The html code page
389      */
390     public String getRemoveGroup( HttpServletRequest request )
391     {
392         UrlItem url = new UrlItem( JSP_URL_DO_REMOVE_GROUP );
393         url.addParameter( PARAMETER_GROUP_KEY, request.getParameter( PARAMETER_GROUP_KEY ) );
394 
395         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
396     }
397 
398     /**
399      * Delete Group
400      * 
401      * @param request
402      *            The HTTP request
403      * @return String The url page
404      */
405     public String doRemoveGroup( HttpServletRequest request )
406     {
407         Group group = getGroupFromRequest( request );
408 
409         if ( group == null )
410         {
411             return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_REMOVE, AdminMessage.TYPE_ERROR );
412         }
413 
414         GroupHome.remove( group.getGroupKey( ), getPlugin( ) );
415 
416         return getHomeUrl( request );
417     }
418 
419     /**
420      * Returns roles management form for a specified group
421      *
422      * @param request
423      *            The Http request
424      * @return Html form
425      */
426     public String getManageRolesGroup( HttpServletRequest request )
427     {
428         setPageTitleProperty( PROPERTY_PAGE_TITLE_MANAGE_ROLES_GROUP );
429 
430         Group selectedGroup = getGroupFromRequest( request );
431 
432         if ( selectedGroup == null )
433         {
434             return getManageGroups( request );
435         }
436 
437         // ASSIGNED USERS NUMBER
438         List<DatabaseUser> listAllAssignedUsers = DatabaseHome.findGroupUsersFromGroupKey( selectedGroup.getGroupKey( ), getPlugin( ) );
439         int nAssignedUsersNumber = listAllAssignedUsers.size( );
440 
441         Collection<Role> allRoleList = RoleHome.findAll( );
442         allRoleList = AdminWorkgroupService.getAuthorizedCollection( allRoleList, (User) getUser( ) );
443 
444         List<String> groupRoleKeyList = GroupRoleHome.findGroupRoles( selectedGroup.getGroupKey( ), getPlugin( ) );
445         Collection<Role> groupRoleList = new ArrayList<>( );
446 
447         for ( String strRoleKey : groupRoleKeyList )
448         {
449             for ( Role role : allRoleList )
450             {
451                 if ( role.getRole( ).equals( strRoleKey ) )
452                 {
453                     groupRoleList.add( RoleHome.findByPrimaryKey( strRoleKey ) );
454                 }
455             }
456         }
457 
458         // ITEM NAVIGATION
459         setItemNavigator( PARAMETER_ASSIGN_ROLE, selectedGroup.getGroupKey( ), AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ROLES_GROUP );
460 
461         Map<String, Object> model = new HashMap<>( );
462         model.put( MARK_ROLES_LIST, allRoleList );
463         model.put( MARK_ROLES_LIST_FOR_GROUP, groupRoleList );
464         model.put( MARK_GROUP, selectedGroup );
465         model.put( MARK_ITEM_NAVIGATOR, _itemNavigators.get( PARAMETER_ASSIGN_ROLE ) );
466         model.put( MARK_ASSIGNED_USERS_NUMBER, nAssignedUsersNumber );
467 
468         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_ROLES_GROUP, getLocale( ), model );
469 
470         return getAdminPage( template.getHtml( ) );
471     }
472 
473     /**
474      * Process assignation roles for a specified group
475      *
476      * @param request
477      *            The Http request
478      * @return Html form
479      */
480     public String doAssignRoleGroup( HttpServletRequest request )
481     {
482         String strReturn;
483 
484         String strActionCancel = request.getParameter( PARAMETER_CANCEL );
485 
486         if ( strActionCancel != null )
487         {
488             strReturn = JSP_MANAGE_GROUPS;
489         }
490         else
491         {
492             // get group
493             Group group = getGroupFromRequest( request );
494 
495             if ( group == null )
496             {
497                 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_MANAGE_GROUPS, AdminMessage.TYPE_ERROR );
498             }
499 
500             String [ ] roleArray = request.getParameterValues( PARAMETER_ROLE_KEY );
501 
502             GroupRoleHome.removeRoles( group.getGroupKey( ), getPlugin( ) );
503 
504             if ( roleArray != null )
505             {
506                 for ( int i = 0; i < roleArray.length; i++ )
507                 {
508                     GroupRoleHome.addRole( group.getGroupKey( ), roleArray [i], getPlugin( ) );
509                 }
510             }
511 
512             strReturn = JSP_MANAGE_ROLES_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + group.getGroupKey( );
513         }
514 
515         return strReturn;
516     }
517 
518     /**
519      *
520      * @param request
521      *            The HTTP request
522      * @return the group
523      */
524     private Group getGroupFromRequest( HttpServletRequest request )
525     {
526         String strGroupKey = request.getParameter( PARAMETER_GROUP_KEY );
527 
528         if ( ( strGroupKey == null ) || ( strGroupKey.length( ) == 0 ) )
529         {
530             return null;
531         }
532 
533         return GroupHome.findByPrimaryKey( strGroupKey, getPlugin( ) );
534     }
535 
536     /**
537      * Get the list of authorized group
538      * 
539      * @return a list of groups
540      */
541     private List<Group> getAuthorizedGroups( )
542     {
543         Collection<Group> allGroupList = GroupHome.findAll( getPlugin( ) );
544         List<Group> groupList = new ArrayList<>( );
545 
546         for ( Group group : allGroupList )
547         {
548             List<String> groupRoleKeyList = GroupRoleHome.findGroupRoles( group.getGroupKey( ), getPlugin( ) );
549 
550             if ( CollectionUtils.isEmpty( groupRoleKeyList ) )
551             {
552                 groupList.add( group );
553 
554                 continue;
555             }
556 
557             for ( String groupRoleKey : groupRoleKeyList )
558             {
559                 Role role = RoleHome.findByPrimaryKey( groupRoleKey );
560 
561                 if ( AdminWorkgroupService.isAuthorized( role, (User) getUser( ) ) )
562                 {
563                     groupList.add( group );
564 
565                     break;
566                 }
567             }
568         }
569 
570         return groupList;
571     }
572 
573     /**
574      * Returns users management formfor a specified group
575      * 
576      * @param request
577      *            HttpServletRequest
578      * @return Html form
579      */
580     public String getManageUsersGroup( HttpServletRequest request )
581     {
582         setPageTitleProperty( PROPERTY_PAGE_TITLE_MANAGE_USERS_GROUP );
583 
584         Map<String, Object> model = new HashMap<>( );
585         String strURL = AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_USERS_GROUP;
586         UrlItem url = new UrlItem( strURL );
587 
588         // SELECTED GROUP
589         Group selectedGroup = getGroupFromRequest( request );
590 
591         if ( selectedGroup == null )
592         {
593             return getManageGroups( request );
594         }
595 
596         // ASSIGNED USERS
597         List<DatabaseUser> listAllAssignedUsers = DatabaseHome.findGroupUsersFromGroupKey( selectedGroup.getGroupKey( ), getPlugin( ) );
598         List<DatabaseUser> listAssignedUsers = getListAssignedUsers( listAllAssignedUsers );
599 
600         DatabaseUserFilterutece/modules/database/authentication/business/DatabaseUserFilter.html#DatabaseUserFilter">DatabaseUserFilter duFilter = new DatabaseUserFilter( );
601         boolean bIsSearch = duFilter.setDatabaseUserFilter( request );
602         List<DatabaseUser> listFilteredUsers = _databaseService.getFilteredUsersInterface( duFilter, bIsSearch, listAssignedUsers, request, model, url );
603 
604         // AVAILABLE USERS
605         ReferenceList listAvailableUsers = getAvailableUsers( listAssignedUsers );
606 
607         // SORT
608         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
609         String strAscSort = null;
610 
611         if ( strSortedAttributeName != null )
612         {
613             strAscSort = request.getParameter( Parameters.SORTED_ASC );
614 
615             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
616 
617             Collections.sort( listFilteredUsers, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
618         }
619 
620         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
621         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_USERS_PER_PAGE, 50 );
622         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
623 
624         if ( strSortedAttributeName != null )
625         {
626             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
627         }
628 
629         if ( strAscSort != null )
630         {
631             url.addParameter( Parameters.SORTED_ASC, strAscSort );
632         }
633 
634         // ITEM NAVIGATION
635         setItemNavigator( PARAMETER_ASSIGN_USER, selectedGroup.getGroupKey( ), url.getUrl( ) );
636 
637         LocalizedPaginator<DatabaseUser> paginator = new LocalizedPaginator<>( listFilteredUsers, _nItemsPerPage, url.getUrl( ),
638                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
639 
640         model.put( MARK_GROUP, selectedGroup );
641         model.put( MARK_ITEM_NAVIGATOR, _itemNavigators.get( PARAMETER_ASSIGN_USER ) );
642         model.put( MARK_PAGINATOR, paginator );
643         model.put( MARK_NB_ITEMS_PER_PAGE, Integer.toString( _nItemsPerPage ) );
644         model.put( MARK_AVAILABLE_USERS, listAvailableUsers );
645         model.put( MARK_ASSIGNED_USERS, paginator.getPageItems( ) );
646         model.put( MARK_ASSIGNED_USERS_NUMBER, listAllAssignedUsers.size( ) );
647 
648         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_USERS_GROUP, getLocale( ), model );
649 
650         return getAdminPage( template.getHtml( ) );
651     }
652 
653     /**
654      * Assign users to a group
655      * 
656      * @param request
657      *            HttpServletRequest
658      * @return JSP return
659      */
660     public String doAssignUsersGroup( HttpServletRequest request )
661     {
662         String strReturn;
663 
664         String strActionCancel = request.getParameter( PARAMETER_CANCEL );
665 
666         if ( strActionCancel != null )
667         {
668             strReturn = JSP_MANAGE_GROUPS;
669         }
670         else
671         {
672             Group selectedGroup = getGroupFromRequest( request );
673 
674             if ( selectedGroup == null )
675             {
676                 return getCreateGroup( request );
677             }
678 
679             // retrieve the selected portlets ids
680             String [ ] arrayUsersIds = request.getParameterValues( PARAMETER_AVAILABLE_USERS );
681 
682             if ( ( arrayUsersIds != null ) )
683             {
684                 for ( int i = 0; i < arrayUsersIds.length; i++ )
685                 {
686                     int nUserId = Integer.parseInt( arrayUsersIds [i] );
687                     DatabaseUser user = DatabaseUserHome.findByPrimaryKey( nUserId, getPlugin( ) );
688                     DatabaseHome.addGroupForUser( user.getUserId( ), selectedGroup.getGroupKey( ), getPlugin( ) );
689                 }
690             }
691 
692             strReturn = JSP_MANAGE_USERS_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + selectedGroup.getGroupKey( );
693         }
694 
695         return strReturn;
696     }
697 
698     /**
699      * Unassign user from a given group
700      * 
701      * @param request
702      *            HttpServletRequest
703      * @return JSP return
704      */
705     public String doUnAssignUserGroup( HttpServletRequest request )
706     {
707         Group selectedGroup = getGroupFromRequest( request );
708 
709         if ( selectedGroup == null )
710         {
711             return getCreateGroup( request );
712         }
713 
714         int nIdUser = Integer.parseInt( request.getParameter( PARAMETER_MYLUTECE_DATABASE_USER_ID ) );
715         String strAnchor = request.getParameter( PARAMETER_ANCHOR );
716 
717         DatabaseUser user = DatabaseUserHome.findByPrimaryKey( nIdUser, getPlugin( ) );
718 
719         if ( user != null )
720         {
721             DatabaseHome.removeGroupsForUser( user.getUserId( ), getPlugin( ) );
722         }
723 
724         return JSP_MANAGE_USERS_GROUP + QUESTION_MARK + PARAMETER_GROUP_KEY + EQUAL + selectedGroup.getGroupKey( ) + SHARP + strAnchor;
725     }
726 
727     /**
728      * Get the list of assigned user to the given group
729      * 
730      * @param listAllAssignedUsers
731      *            the list of all assigned userse
732      * @return a list of {@link DatabaseUser}
733      */
734     private List<DatabaseUser> getListAssignedUsers( List<DatabaseUser> listAllAssignedUsers )
735     {
736         List<DatabaseUser> listAssignedUsers = new ArrayList<>( );
737 
738         for ( DatabaseUser user : listAllAssignedUsers )
739         {
740             if ( _databaseService.isAuthorized( user, getUser( ), getPlugin( ) ) )
741             {
742                 listAssignedUsers.add( user );
743             }
744         }
745 
746         return listAssignedUsers;
747     }
748 
749     /**
750      * Get the list of avaivable users
751      * 
752      * @param listAssignedUsers
753      *            the list of assigned users
754      * @return a {@link ReferenceList}
755      */
756     private ReferenceList getAvailableUsers( List<DatabaseUser> listAssignedUsers )
757     {
758         ReferenceList listAvailableUsers = new ReferenceList( );
759 
760         for ( DatabaseUser user : DatabaseUserHome.findDatabaseUsersList( getPlugin( ) ) )
761         {
762             boolean bIsAvailable = Boolean.TRUE;
763 
764             for ( DatabaseUser assignedUser : listAssignedUsers )
765             {
766                 if ( !_databaseService.isAuthorized( user, getUser( ), getPlugin( ) ) || ( user.getUserId( ) == assignedUser.getUserId( ) ) )
767                 {
768                     bIsAvailable = Boolean.FALSE;
769 
770                     break;
771                 }
772             }
773 
774             if ( bIsAvailable )
775             {
776                 ReferenceItem userItem = new ReferenceItem( );
777                 userItem.setCode( String.valueOf( user.getUserId( ) ) );
778                 userItem.setName( user.getLastName( ) + SPACE + user.getFirstName( ) + SPACE + OPEN_BRACKET + user.getLogin( ) + CLOSED_BRACKET );
779                 listAvailableUsers.add( userItem );
780             }
781         }
782 
783         return listAvailableUsers;
784     }
785 
786     /**
787      * Set the item navigator
788      * 
789      * @param strItemNavigatorKey
790      *            The item navigator key
791      * @param strGroupKey
792      *            the group key
793      * @param strUrl
794      *            the url
795      */
796     private void setItemNavigator( String strItemNavigatorKey, String strGroupKey, String strUrl )
797     {
798         ItemNavigator itemNavigator = _itemNavigators.get( strItemNavigatorKey );
799 
800         if ( itemNavigator == null )
801         {
802             List<Group> listGroups = getAuthorizedGroups( );
803 
804             // FILTER
805             if ( _gFilter == null )
806             {
807                 _gFilter = new GroupFilter( );
808             }
809 
810             List<Group> listFilteredGroups = GroupHome.findByFilter( _gFilter, getPlugin( ) );
811             List<Group> listAvailableGroups = new ArrayList<>( );
812 
813             for ( Group filteredGroup : listFilteredGroups )
814             {
815                 for ( Group group : listGroups )
816                 {
817                     if ( filteredGroup.getGroupKey( ).equals( group.getGroupKey( ) ) )
818                     {
819                         listAvailableGroups.add( group );
820                     }
821                 }
822             }
823 
824             // SORT
825             if ( StringUtils.isNotBlank( _strSortedAttributeName ) )
826             {
827                 Collections.sort( listAvailableGroups, new AttributeComparator( _strSortedAttributeName, _bIsAscSort ) );
828             }
829 
830             List<String> listIdsDatabaseUser = new ArrayList<>( );
831             int nCurrentItemId = 0;
832             int nIndex = 0;
833 
834             for ( Group group : listAvailableGroups )
835             {
836                 if ( group != null )
837                 {
838                     listIdsDatabaseUser.add( group.getGroupKey( ) );
839 
840                     if ( group.getGroupKey( ).equals( strGroupKey ) )
841                     {
842                         nCurrentItemId = nIndex;
843                     }
844 
845                     nIndex++;
846                 }
847             }
848 
849             itemNavigator = new ItemNavigator( listIdsDatabaseUser, nCurrentItemId, strUrl, PARAMETER_GROUP_KEY );
850         }
851         else
852         {
853             itemNavigator.setCurrentItemId( strGroupKey );
854         }
855 
856         _itemNavigators.put( strItemNavigatorKey, itemNavigator );
857     }
858 
859     /**
860      * Reinit the item navigator
861      */
862     private void reinitItemNavigators( )
863     {
864         _itemNavigators = new HashMap<>( );
865         _strSortedAttributeName = StringUtils.EMPTY;
866         _bIsAscSort = true;
867     }
868 }