View Javadoc
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.plugins.profiles.web.views;
35  
36  import fr.paris.lutece.api.user.User;
37  import fr.paris.lutece.plugins.profiles.business.Profile;
38  import fr.paris.lutece.plugins.profiles.business.ProfileFilter;
39  import fr.paris.lutece.plugins.profiles.business.views.View;
40  import fr.paris.lutece.plugins.profiles.business.views.ViewAction;
41  import fr.paris.lutece.plugins.profiles.business.views.ViewFilter;
42  import fr.paris.lutece.plugins.profiles.service.IProfilesService;
43  import fr.paris.lutece.plugins.profiles.service.action.IViewActionService;
44  import fr.paris.lutece.plugins.profiles.service.views.IViewsService;
45  import fr.paris.lutece.plugins.profiles.service.views.ViewsResourceIdService;
46  import fr.paris.lutece.plugins.profiles.utils.constants.ProfilesConstants;
47  import fr.paris.lutece.portal.business.dashboard.DashboardFactory;
48  import fr.paris.lutece.portal.business.rbac.RBAC;
49  import fr.paris.lutece.portal.service.dashboard.DashboardService;
50  import fr.paris.lutece.portal.service.dashboard.IDashboardComponent;
51  import fr.paris.lutece.portal.service.message.AdminMessage;
52  import fr.paris.lutece.portal.service.message.AdminMessageService;
53  import fr.paris.lutece.portal.service.rbac.RBACService;
54  import fr.paris.lutece.portal.service.spring.SpringContextService;
55  import fr.paris.lutece.portal.service.template.AppTemplateService;
56  import fr.paris.lutece.portal.service.util.AppLogService;
57  import fr.paris.lutece.portal.service.util.AppPathService;
58  import fr.paris.lutece.portal.service.util.AppPropertiesService;
59  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
60  import fr.paris.lutece.portal.web.constants.Messages;
61  import fr.paris.lutece.portal.web.constants.Parameters;
62  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
63  import fr.paris.lutece.util.ReferenceItem;
64  import fr.paris.lutece.util.ReferenceList;
65  import fr.paris.lutece.util.html.AbstractPaginator;
66  import fr.paris.lutece.util.html.HtmlTemplate;
67  import fr.paris.lutece.util.html.ItemNavigator;
68  import fr.paris.lutece.util.sort.AttributeComparator;
69  import fr.paris.lutece.util.string.StringUtil;
70  import fr.paris.lutece.util.url.UrlItem;
71  
72  import java.util.ArrayList;
73  import java.util.Collections;
74  import java.util.HashMap;
75  import java.util.List;
76  import java.util.Map;
77  
78  import javax.servlet.http.HttpServletRequest;
79  
80  import org.apache.commons.lang3.StringUtils;
81  
82  /**
83   * 
84   * class ViewsJspBean
85   * 
86   */
87  public class ViewsJspBean extends PluginAdminPageJspBean
88  {
89  
90      public static final String RIGHT_MANAGE_VIEWS = "PROFILES_VIEWS_MANAGEMENT";
91  
92      private static final long serialVersionUID = -17732197055870793L;
93  
94      // TEMPLATES
95      private static final String TEMPLATE_MANAGE_VIEWS = "admin/plugins/profiles/views/manage_views.html";
96      private static final String TEMPLATE_CREATE_VIEW = "admin/plugins/profiles/views/create_view.html";
97      private static final String TEMPLATE_MODIFY_VIEW = "admin/plugins/profiles/views/modify_view.html";
98      private static final String TEMPLATE_ASSIGN_PROFILES_VIEW = "admin/plugins/profiles/views/assign_profiles_view.html";
99      private static final String TEMPLATE_MANAGE_DASHBOARDS = "admin/plugins/profiles/views/manage_dashboards.html";
100 
101     // JSP
102     private static final String JSP_MANAGE_VIEWS = "ManageViews.jsp";
103     private static final String JSP_URL_DO_REMOVE_VIEW = "jsp/admin/plugins/profiles/DoRemoveView.jsp";
104     private static final String JSP_URL_MODIFY_VIEW = "jsp/admin/plugins/profiles/ModifyView.jsp";
105     private static final String JSP_URL_ASSIGN_PROFILES_VIEW = "jsp/admin/plugins/profiles/AssignProfilesView.jsp";
106     private static final String JSP_ASSIGN_PROFILES_VIEW = "AssignProfilesView.jsp";
107     private static final String JSP_URL_MANAGE_DASHBOARDS = "jsp/admin/plugins/profiles/ManageDashboards.jsp";
108     private static final String JSP_MANAGE_DASHBOARDS = "ManageDashboards.jsp";
109 
110     // VARIABLES
111     private int _nItemsPerPage;
112     private int _nDefaultItemsPerPage;
113     private String _strCurrentPageIndex;
114     private Map<String, ItemNavigator> _itemNavigators = new HashMap<>( );
115     private IViewsService _viewsService = SpringContextService.getBean( ProfilesConstants.BEAN_VIEWS_SERVICE );
116     private IViewActionService _viewActionService = SpringContextService.getBean( ProfilesConstants.BEAN_VIEW_ACTION_SERVICE );
117     private IProfilesService _profilesService = SpringContextService.getBean( ProfilesConstants.BEAN_PROFILES_SERVICE );
118     private ViewFilter _vFilter;
119 
120     /**
121      * Return views management
122      * 
123      * @param request
124      *            The Http request
125      * @return Html views management page
126      */
127     public String getManageViews( HttpServletRequest request )
128     {
129         setPageTitleProperty( ProfilesConstants.PROPERTY_MANAGE_VIEWS_PAGETITLE );
130 
131         // Reinit session
132         reinitItemNavigators( );
133 
134         // FILTER
135         _vFilter = new ViewFilter( );
136 
137         boolean bIsSearch = _vFilter.setFilter( request );
138 
139         List<View> filteredViews = _viewsService.findViewsByFilter( _vFilter, getPlugin( ) );
140 
141         // SORT
142         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
143         String strAscSort = null;
144 
145         if ( strSortedAttributeName != null )
146         {
147             strAscSort = request.getParameter( Parameters.SORTED_ASC );
148 
149             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
150 
151             Collections.sort( filteredViews, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
152         }
153 
154         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
155         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( ProfilesConstants.PROPERTY_ITEM_PER_PAGE, 50 );
156         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
157 
158         String strURL = getHomeUrl( request );
159         UrlItem url = new UrlItem( strURL );
160 
161         if ( strSortedAttributeName != null )
162         {
163             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
164         }
165 
166         if ( strAscSort != null )
167         {
168             url.addParameter( Parameters.SORTED_ASC, strAscSort );
169         }
170 
171         String strSortSearchAttribute = StringUtils.EMPTY;
172 
173         if ( bIsSearch )
174         {
175             _vFilter.setUrlAttributes( url );
176             strSortSearchAttribute = ProfilesConstants.AMPERSAND + _vFilter.getUrlAttributes( );
177         }
178 
179         // PAGINATOR
180         LocalizedPaginator<View> paginator = new LocalizedPaginator<>( filteredViews, _nItemsPerPage, url.getUrl( ), AbstractPaginator.PARAMETER_PAGE_INDEX,
181                 _strCurrentPageIndex, getLocale( ) );
182 
183         // PERMISSIONS
184         for ( View view : filteredViews )
185         {
186             List<ViewAction> listActions = _viewActionService.selectActionsList( getLocale( ), getPlugin( ) );
187             listActions = (List<ViewAction>) RBACService.getAuthorizedActionsCollection( listActions, view, (User) getUser( ) );
188             view.setActions( listActions );
189         }
190 
191         boolean bPermission = RBACService.isAuthorized( View.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID, ViewsResourceIdService.PERMISSION_CREATE_VIEW,
192                 (User) getUser( ) );
193 
194         Map<String, Object> model = new HashMap<>( );
195         model.put( ProfilesConstants.MARK_NB_ITEMS_PER_PAGE, StringUtils.EMPTY + _nItemsPerPage );
196         model.put( ProfilesConstants.MARK_PAGINATOR, paginator );
197         model.put( ProfilesConstants.MARK_LIST_VIEWS, paginator.getPageItems( ) );
198         model.put( ProfilesConstants.MARK_SEARCH_FILTER, _vFilter );
199         model.put( ProfilesConstants.MARK_SEARCH_IS_SEARCH, bIsSearch );
200         model.put( ProfilesConstants.MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute );
201         model.put( ProfilesConstants.MARK_PERMISSION, bPermission );
202 
203         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_VIEWS, getLocale( ), model );
204 
205         return getAdminPage( templateList.getHtml( ) );
206     }
207 
208     /* CREATE VIEW */
209 
210     /**
211      * Returns the view creation form
212      * 
213      * @param request
214      *            The Http request
215      * @return Html creation form
216      */
217     public String getCreateView( HttpServletRequest request )
218     {
219         setPageTitleProperty( ProfilesConstants.PROPERTY_CREATE_VIEW_PAGETITLE );
220 
221         Map<String, Object> model = new HashMap<>( );
222 
223         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_VIEW, getLocale( ), model );
224 
225         return getAdminPage( template.getHtml( ) );
226     }
227 
228     /**
229      * Process the data capture form of a new view
230      * 
231      * @param request
232      *            The HTTP Request
233      * @return The Jsp URL of the process result
234      */
235     public String doCreateView( HttpServletRequest request )
236     {
237         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID, ViewsResourceIdService.PERMISSION_CREATE_VIEW, (User) getUser( ) ) )
238         {
239             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
240         }
241 
242         String strKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
243         String strDescription = request.getParameter( ProfilesConstants.PARAMETER_VIEW_DESCRIPTION );
244 
245         if ( StringUtils.isBlank( strKey ) )
246         {
247             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
248         }
249 
250         if ( StringUtils.isBlank( strDescription ) )
251         {
252             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
253         }
254 
255         // Check if the view already exists
256         if ( _viewsService.checkExistView( strKey, getPlugin( ) ) )
257         {
258             return AdminMessageService.getMessageUrl( request, ProfilesConstants.MESSAGE_VIEW_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
259         }
260 
261         // Check if strKey contains accentuated characters
262         if ( !StringUtil.checkCodeKey( strKey ) )
263         {
264             return AdminMessageService.getMessageUrl( request, ProfilesConstants.MESSAGE_ACCENTUATED_CHARACTER, AdminMessage.TYPE_STOP );
265         }
266 
267         View/plugins/profiles/business/views/View.html#View">View view = new View( );
268         view.setKey( strKey.trim( ) );
269         view.setDescription( strDescription );
270         _viewsService.create( view, getPlugin( ) );
271 
272         return JSP_MANAGE_VIEWS;
273     }
274 
275     /* REMOVE VIEW */
276 
277     /**
278      * Returns the confirmation to remove the view
279      * 
280      * @param request
281      *            The Http request
282      * @return the confirmation page
283      */
284     public String getConfirmRemoveView( HttpServletRequest request )
285     {
286         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
287 
288         UrlItem url = new UrlItem( JSP_URL_DO_REMOVE_VIEW );
289         url.addParameter( ProfilesConstants.PARAMETER_VIEW_KEY, strViewKey );
290 
291         return AdminMessageService.getMessageUrl( request, ProfilesConstants.MESSAGE_CONFIRM_REMOVE_VIEW, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
292     }
293 
294     /**
295      * Remove a view
296      * 
297      * @param request
298      *            The Http request
299      * @return Html form
300      */
301     public String doRemoveView( HttpServletRequest request )
302     {
303         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
304 
305         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_DELETE_VIEW, (User) getUser( ) ) )
306         {
307             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
308         }
309 
310         _viewsService.removeProfiles( strViewKey, getPlugin( ) );
311         _viewsService.removeDashboards( strViewKey, getPlugin( ) );
312         _viewsService.remove( strViewKey, getPlugin( ) );
313 
314         return JSP_MANAGE_VIEWS;
315     }
316 
317     /* MODIFY VIEW */
318 
319     /**
320      * Returns the form for view modification
321      * 
322      * @param request
323      *            The Http request
324      * @return Html form
325      */
326     public String getModifyView( HttpServletRequest request )
327     {
328         setPageTitleProperty( ProfilesConstants.PROPERTY_MODIFY_PROFILE_PAGETITLE );
329 
330         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
331         View view = _viewsService.findByPrimaryKey( strViewKey, getPlugin( ) );
332 
333         String strPermission = ViewsResourceIdService.PERMISSION_MODIFY_VIEW;
334         boolean bPermission = RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, strPermission, (User) getUser( ) );
335         String strBaseUrl = AppPathService.getBaseUrl( request ) + JSP_URL_MODIFY_VIEW;
336         UrlItem url = new UrlItem( strBaseUrl );
337 
338         // ITEM NAVIGATION
339         setItemNavigator( ProfilesConstants.PARAMETER_MODIFY_VIEW, view, url );
340 
341         // PERMISSIONS
342         List<ViewAction> listActions = _viewsService.getListActions( getUser( ), view, strPermission, getLocale( ), getPlugin( ) );
343         view.setActions( listActions );
344 
345         Map<String, Object> model = new HashMap<>( );
346         model.put( ProfilesConstants.MARK_VIEW, view );
347         model.put( ProfilesConstants.MARK_ITEM_NAVIGATOR, _itemNavigators.get( ProfilesConstants.PARAMETER_MODIFY_VIEW ) );
348         model.put( ProfilesConstants.MARK_PERMISSION, bPermission );
349 
350         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_VIEW, getLocale( ), model );
351 
352         return getAdminPage( template.getHtml( ) );
353     }
354 
355     /**
356      * Update a view
357      * 
358      * @param request
359      *            The Http request
360      * @return Html form
361      */
362     public String doModifyView( HttpServletRequest request )
363     {
364         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
365 
366         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_MODIFY_VIEW, (User) getUser( ) ) )
367         {
368             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
369         }
370 
371         String strDescription = request.getParameter( ProfilesConstants.PARAMETER_VIEW_DESCRIPTION );
372 
373         if ( StringUtils.isBlank( strDescription ) )
374         {
375             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
376         }
377 
378         View/plugins/profiles/business/views/View.html#View">View view = new View( );
379         view.setKey( strViewKey.trim( ) );
380         view.setDescription( strDescription );
381         _viewsService.update( view, getPlugin( ) );
382 
383         return JSP_MANAGE_VIEWS;
384     }
385 
386     /* ASSIGN PROFILES */
387 
388     /**
389      * Returns the user assignation form
390      * 
391      * @param request
392      *            The Http request
393      * @return the html code for display the modes list
394      */
395     public String getAssignProfilesView( HttpServletRequest request )
396     {
397         Map<String, Object> model = new HashMap<>( );
398         setPageTitleProperty( ProfilesConstants.PROPERTY_ASSIGN_PROFILES_VIEW_PAGETITLE );
399 
400         String strBaseUrl = AppPathService.getBaseUrl( request ) + JSP_URL_ASSIGN_PROFILES_VIEW;
401         UrlItem url = new UrlItem( strBaseUrl );
402 
403         // VIEW
404         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
405         View view = _viewsService.findByPrimaryKey( strViewKey, getPlugin( ) );
406 
407         // ASSIGNED PROFILES
408         List<Profile> listAssignedProfiles = new ArrayList<>( );
409 
410         for ( Profile profile : _viewsService.getProfilesListForView( strViewKey, getPlugin( ) ) )
411         {
412             profile = _profilesService.findByPrimaryKey( profile.getKey( ), getPlugin( ) );
413             listAssignedProfiles.add( profile );
414         }
415 
416         // FILTERED PROFILES
417         ProfileFilterfiles/business/ProfileFilter.html#ProfileFilter">ProfileFilter pFilter = new ProfileFilter( );
418         List<Profile> listFilteredProfiles = new ArrayList<>( );
419         boolean bIsSearch = pFilter.setFilter( request );
420 
421         for ( Profile filteredProfile : _profilesService.findProfilesByFilter( pFilter, getPlugin( ) ) )
422         {
423             for ( Profile profile : listAssignedProfiles )
424             {
425                 if ( filteredProfile.getKey( ).equals( profile.getKey( ) ) )
426                 {
427                     listFilteredProfiles.add( profile );
428                 }
429             }
430         }
431 
432         String strSortSearchAttribute = StringUtils.EMPTY;
433 
434         if ( bIsSearch )
435         {
436             pFilter.setUrlAttributes( url );
437             strSortSearchAttribute = ProfilesConstants.AMPERSAND + pFilter.getUrlAttributes( );
438         }
439 
440         // AVAILABLE PROFILES
441         ReferenceList listAvailableProfiles = new ReferenceList( );
442         ReferenceItem itemProfile = null;
443         boolean bAssigned;
444 
445         for ( Profile profile : _profilesService.findAll( getPlugin( ) ) )
446         {
447             itemProfile = new ReferenceItem( );
448             itemProfile.setCode( profile.getKey( ) );
449             itemProfile.setName( profile.getKey( ) );
450             bAssigned = false;
451 
452             for ( Profile assignedProfile : listAssignedProfiles )
453             {
454                 if ( assignedProfile.getKey( ).equals( itemProfile.getCode( ) ) )
455                 {
456                     bAssigned = true;
457 
458                     break;
459                 }
460             }
461 
462             if ( !bAssigned )
463             {
464                 listAvailableProfiles.add( itemProfile );
465             }
466         }
467 
468         // SORT
469         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
470         String strAscSort = null;
471 
472         if ( strSortedAttributeName != null )
473         {
474             strAscSort = request.getParameter( Parameters.SORTED_ASC );
475 
476             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
477 
478             Collections.sort( listFilteredProfiles, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
479         }
480 
481         _strCurrentPageIndex = AbstractPaginator.getPageIndex( request, AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
482         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( ProfilesConstants.PROPERTY_ITEM_PER_PAGE, 50 );
483         _nItemsPerPage = AbstractPaginator.getItemsPerPage( request, AbstractPaginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
484 
485         if ( strSortedAttributeName != null )
486         {
487             url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
488         }
489 
490         if ( strAscSort != null )
491         {
492             url.addParameter( Parameters.SORTED_ASC, strAscSort );
493         }
494 
495         String strPermission = ViewsResourceIdService.PERMISSION_MANAGE_PROFILES_ASSIGNMENT;
496         boolean bPermission = RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, strPermission, (User) getUser( ) );
497 
498         // ITEM NAVIGATION
499         setItemNavigator( ProfilesConstants.PARAMETER_ASSIGN_PROFILE, view, url );
500 
501         // PAGINATOR
502         url.addParameter( ProfilesConstants.PARAMETER_PROFILE_KEY, view.getKey( ) );
503 
504         LocalizedPaginator<Profile> paginator = new LocalizedPaginator<>( listFilteredProfiles, _nItemsPerPage, url.getUrl( ),
505                 AbstractPaginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
506 
507         // PERMISSIONS
508         List<ViewAction> listActions = _viewsService.getListActions( getUser( ), view, strPermission, getLocale( ), getPlugin( ) );
509         view.setActions( listActions );
510 
511         model.put( ProfilesConstants.MARK_VIEW, view );
512         model.put( ProfilesConstants.MARK_AVAILABLE_LIST, listAvailableProfiles );
513         model.put( ProfilesConstants.MARK_ASSIGNED_LIST, paginator.getPageItems( ) );
514         model.put( ProfilesConstants.MARK_ASSIGNED_NUMBER, listAssignedProfiles.size( ) );
515         model.put( ProfilesConstants.MARK_ITEM_NAVIGATOR, _itemNavigators.get( ProfilesConstants.PARAMETER_ASSIGN_PROFILE ) );
516         model.put( ProfilesConstants.MARK_NB_ITEMS_PER_PAGE, StringUtils.EMPTY + _nItemsPerPage );
517         model.put( ProfilesConstants.MARK_PAGINATOR, paginator );
518         model.put( ProfilesConstants.MARK_PERMISSION, bPermission );
519         model.put( ProfilesConstants.MARK_SEARCH_FILTER, pFilter );
520         model.put( ProfilesConstants.MARK_SEARCH_IS_SEARCH, bIsSearch );
521         model.put( ProfilesConstants.MARK_LOCALE, getUser( ).getLocale( ) );
522         model.put( ProfilesConstants.MARK_SORT_SEARCH_ATTRIBUTE, strSortSearchAttribute );
523 
524         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_ASSIGN_PROFILES_VIEW, getLocale( ), model );
525 
526         return getAdminPage( template.getHtml( ) );
527     }
528 
529     /**
530      * Process the data capture form for assign users to a profile
531      * 
532      * @param request
533      *            The HTTP Request
534      * @return The Jsp URL of the process result
535      */
536     public String doAssignProfilesView( HttpServletRequest request )
537     {
538         String strReturn;
539 
540         String strActionCancel = request.getParameter( ProfilesConstants.PARAMETER_CANCEL );
541 
542         if ( strActionCancel != null )
543         {
544             strReturn = JSP_MANAGE_VIEWS;
545         }
546         else
547         {
548             String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
549 
550             if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_MANAGE_PROFILES_ASSIGNMENT, (User) getUser( ) ) )
551             {
552                 return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
553             }
554 
555             // retrieve the selected portlets ids
556             String [ ] arrayProfileKeys = request.getParameterValues( ProfilesConstants.PARAMETER_PROFILES_LIST );
557 
558             if ( arrayProfileKeys != null )
559             {
560                 for ( int i = 0; i < arrayProfileKeys.length; i++ )
561                 {
562                     String strProfileKey = arrayProfileKeys [i];
563                     Profile profile = _profilesService.findByPrimaryKey( strProfileKey, getPlugin( ) );
564 
565                     if ( !_viewsService.hasView( strProfileKey, getPlugin( ) ) )
566                     {
567                         _viewsService.addProfileForView( strViewKey, strProfileKey, getPlugin( ) );
568                     }
569                     else
570                     {
571                         Object [ ] args = {
572                                 profile.getKey( )
573                         };
574 
575                         return AdminMessageService.getMessageUrl( request, ProfilesConstants.PROPERTY_NO_MULTIPLE_VIEWS, args, AdminMessage.TYPE_STOP );
576                     }
577                 }
578             }
579 
580             strReturn = JSP_ASSIGN_PROFILES_VIEW + ProfilesConstants.INTERROGATION_MARK + ProfilesConstants.PARAMETER_VIEW_KEY + ProfilesConstants.EQUAL
581                     + strViewKey;
582         }
583 
584         return strReturn;
585     }
586 
587     /**
588      * unassigns users from profile
589      * 
590      * @param request
591      *            The HttpRequest
592      * @return the HTML code of list assignations
593      */
594     public String doUnassignProfileView( HttpServletRequest request )
595     {
596         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
597 
598         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_MANAGE_PROFILES_ASSIGNMENT, (User) getUser( ) ) )
599         {
600             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
601         }
602 
603         String strProfileKey = request.getParameter( ProfilesConstants.PARAMETER_PROFILE_KEY );
604         String strAnchor = request.getParameter( ProfilesConstants.PARAMETER_ANCHOR );
605 
606         // Remove profile
607         _viewsService.removeProfileFromView( strViewKey, strProfileKey, getPlugin( ) );
608 
609         return JSP_ASSIGN_PROFILES_VIEW + ProfilesConstants.INTERROGATION_MARK + ProfilesConstants.PARAMETER_VIEW_KEY + ProfilesConstants.EQUAL + strViewKey
610                 + ProfilesConstants.SHARP + strAnchor;
611     }
612 
613     /* DASHBOARD POSITIONS */
614 
615     /**
616      * Get the dashboard positions management interface
617      * 
618      * @param request
619      *            HttpServletRequest
620      * @return the html form
621      */
622     public String getManageDashboards( HttpServletRequest request )
623     {
624         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
625         View view = _viewsService.findByPrimaryKey( strViewKey, getPlugin( ) );
626 
627         Map<String, Object> model = new HashMap<>( );
628 
629         String strPermission = ViewsResourceIdService.PERMISSION_MANAGE_DASHBOARDS;
630         boolean bPermission = RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, strPermission, (User) getUser( ) );
631 
632         String strBaseUrl = AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_DASHBOARDS;
633         UrlItem url = new UrlItem( strBaseUrl );
634 
635         // ITEM NAVIGATION
636         setItemNavigator( ProfilesConstants.PARAMETER_ASSIGN_DASHBOARD, view, url );
637 
638         // PERMISSIONS
639         List<ViewAction> listActions = _viewsService.getListActions( getUser( ), view, strPermission, getLocale( ), getPlugin( ) );
640         view.setActions( listActions );
641 
642         Map<String, List<IDashboardComponent>> mapDashboards = _viewsService.getAllSetDashboards( strViewKey, getUser( ), getPlugin( ) );
643         model.put( ProfilesConstants.MARK_MAP_DASHBOARDS, mapDashboards );
644 
645         List<IDashboardComponent> listNotSetDashboards = _viewsService.getNotSetDashboards( strViewKey, getUser( ), getPlugin( ) );
646         model.put( ProfilesConstants.MARK_NOT_SET_DASHBOARDS, listNotSetDashboards );
647 
648         model.put( ProfilesConstants.MARK_COLUMN_COUNT, DashboardService.getInstance( ).getColumnCount( ) );
649         model.put( ProfilesConstants.MARK_MAP_AVAILABLE_ORDERS, _viewsService.getMapAvailableOrders( getPlugin( ) ) );
650         model.put( ProfilesConstants.MARK_LIST_AVAILABLE_COLUMNS, _viewsService.getListAvailableColumns( ) );
651         model.put( ProfilesConstants.MARK_MAP_COLUMN_ORDER_STATUS, _viewsService.getOrderedColumnsStatus( strViewKey, getPlugin( ) ) );
652 
653         model.put( ProfilesConstants.MARK_VIEW, view );
654         model.put( ProfilesConstants.MARK_PERMISSION, bPermission );
655         model.put( ProfilesConstants.MARK_ITEM_NAVIGATOR, _itemNavigators.get( ProfilesConstants.PARAMETER_ASSIGN_DASHBOARD ) );
656 
657         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_DASHBOARDS, getLocale( ), model );
658 
659         return getAdminPage( template.getHtml( ) );
660     }
661 
662     /**
663      * Reorders columns
664      * 
665      * @param request
666      *            the request
667      * @return url
668      */
669     public String doReorderColumn( HttpServletRequest request )
670     {
671         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
672 
673         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_MANAGE_DASHBOARDS, (User) getUser( ) ) )
674         {
675             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
676         }
677 
678         String strColumnName = request.getParameter( ProfilesConstants.PARAMETER_COLUMN );
679 
680         if ( StringUtils.isBlank( strColumnName ) )
681         {
682             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
683         }
684 
685         int nColumn = 0;
686 
687         try
688         {
689             nColumn = Integer.parseInt( strColumnName );
690         }
691         catch( NumberFormatException nfe )
692         {
693             AppLogService.error( "ViewJspBean.doReorderColumn : " + nfe.getMessage( ), nfe );
694 
695             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
696         }
697 
698         _viewsService.doReorderColumn( strViewKey, nColumn, getPlugin( ) );
699 
700         return JSP_MANAGE_DASHBOARDS + ProfilesConstants.INTERROGATION_MARK + ProfilesConstants.PARAMETER_VIEW_KEY + ProfilesConstants.EQUAL + strViewKey;
701     }
702 
703     /**
704      * Moves the dashboard
705      * 
706      * @param request
707      *            the request
708      * @return url
709      */
710     public String doMoveDashboard( HttpServletRequest request )
711     {
712         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
713 
714         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_MANAGE_DASHBOARDS, (User) getUser( ) ) )
715         {
716             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
717         }
718 
719         String strDashboardName = request.getParameter( ProfilesConstants.PARAMETER_DASHBOARD_NAME );
720 
721         if ( StringUtils.isBlank( strDashboardName ) )
722         {
723             return AdminMessageService.getMessageUrl( request, ProfilesConstants.MESSAGE_DASHBOARD_NOT_FOUND, AdminMessage.TYPE_STOP );
724         }
725 
726         // retrieve dashboard from database. If not found, will use Spring.
727         IDashboardComponent dashboard = _viewsService.findDashboard( strDashboardName, strViewKey, getPlugin( ) );
728         int nOldOrder = 0;
729         int nOldColumn = 0;
730         boolean bCreate = false;
731 
732         if ( dashboard == null )
733         {
734             bCreate = true;
735 
736             if ( AppLogService.isDebugEnabled( ) )
737             {
738                 AppLogService.debug( "Dashboard " + strDashboardName + " has no property set. Retrieving from SpringContext" );
739             }
740 
741             dashboard = DashboardFactory.getDashboardComponent( strDashboardName );
742 
743             if ( dashboard == null )
744             {
745                 return AdminMessageService.getMessageUrl( request, ProfilesConstants.MESSAGE_DASHBOARD_NOT_FOUND, AdminMessage.TYPE_STOP );
746             }
747         }
748         else
749         {
750             nOldOrder = dashboard.getOrder( );
751             nOldColumn = dashboard.getZone( );
752         }
753 
754         // set order and column
755         String strOrder = request.getParameter( ProfilesConstants.PARAMETER_DASHBOARD_ORDER );
756         String strColumn = request.getParameter( ProfilesConstants.PARAMETER_DASHBOARD_COLUMN );
757 
758         if ( StringUtils.isBlank( strOrder ) && StringUtils.isBlank( strColumn ) )
759         {
760             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
761         }
762 
763         int nOrder = StringUtil.getIntValue( strOrder, -1 );
764         int nColumn = StringUtil.getIntValue( strColumn, -1 );
765 
766         if ( ( nOrder == -1 ) || ( nColumn == -1 ) )
767         {
768             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
769         }
770 
771         dashboard.setOrder( nOrder );
772         dashboard.setZone( nColumn );
773 
774         _viewsService.doMoveDashboard( dashboard, nOldColumn, nOldOrder, bCreate, strViewKey, getPlugin( ) );
775 
776         return JSP_MANAGE_DASHBOARDS + ProfilesConstants.INTERROGATION_MARK + ProfilesConstants.PARAMETER_VIEW_KEY + ProfilesConstants.EQUAL + strViewKey;
777     }
778 
779     /**
780      * Unset the column
781      * 
782      * @param request
783      *            the request
784      * @return url
785      */
786     public String doUnsetColumn( HttpServletRequest request )
787     {
788         String strViewKey = request.getParameter( ProfilesConstants.PARAMETER_VIEW_KEY );
789 
790         if ( !RBACService.isAuthorized( View.RESOURCE_TYPE, strViewKey, ViewsResourceIdService.PERMISSION_DELETE_VIEW, (User) getUser( ) ) )
791         {
792             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_STOP );
793         }
794 
795         String strDashboardName = request.getParameter( ProfilesConstants.PARAMETER_DASHBOARD_NAME );
796 
797         _viewsService.removeDashboard( strViewKey, strDashboardName, getPlugin( ) );
798 
799         return JSP_MANAGE_DASHBOARDS + ProfilesConstants.INTERROGATION_MARK + ProfilesConstants.PARAMETER_VIEW_KEY + ProfilesConstants.EQUAL + strViewKey;
800     }
801 
802     /**
803      * Get the item navigator
804      * 
805      * @param strItemNavigatorKey
806      *            the item navigator key
807      * @param view
808      *            the view
809      * @param url
810      *            the url
811      */
812     private void setItemNavigator( String strItemNavigatorKey, View view, UrlItem url )
813     {
814         ItemNavigator itemNavigator = _itemNavigators.get( strItemNavigatorKey );
815 
816         if ( itemNavigator == null )
817         {
818             if ( _vFilter == null )
819             {
820                 _vFilter = new ViewFilter( );
821             }
822 
823             itemNavigator = _viewsService.getItemNavigator( _vFilter, view, url );
824         }
825         else
826         {
827             itemNavigator.setCurrentItemId( view.getKey( ) );
828         }
829 
830         _itemNavigators.put( strItemNavigatorKey, itemNavigator );
831     }
832 
833     /**
834      * Reinit the item navigator
835      */
836     private void reinitItemNavigators( )
837     {
838         _itemNavigators = new HashMap<>( );
839     }
840 }