View Javadoc
1   /*
2    * Copyright (c) 2002-2014, Mairie de 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.extend.modules.actionbar.web;
35  
36  import fr.paris.lutece.plugins.extend.modules.actionbar.business.ActionButton;
37  import fr.paris.lutece.plugins.extend.modules.actionbar.service.ActionbarResourceIdService;
38  import fr.paris.lutece.plugins.extend.modules.actionbar.service.ActionbarService;
39  import fr.paris.lutece.plugins.extend.service.type.ExtendableResourceTypeService;
40  import fr.paris.lutece.plugins.extend.service.type.IExtendableResourceTypeService;
41  import fr.paris.lutece.portal.business.user.AdminUser;
42  import fr.paris.lutece.portal.service.admin.AdminUserService;
43  import fr.paris.lutece.portal.service.i18n.I18nService;
44  import fr.paris.lutece.portal.service.message.AdminMessage;
45  import fr.paris.lutece.portal.service.message.AdminMessageService;
46  import fr.paris.lutece.portal.service.rbac.RBACService;
47  import fr.paris.lutece.portal.service.spring.SpringContextService;
48  import fr.paris.lutece.portal.service.template.AppTemplateService;
49  import fr.paris.lutece.portal.service.util.AppPathService;
50  import fr.paris.lutece.portal.service.util.AppPropertiesService;
51  import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
52  import fr.paris.lutece.portal.web.pluginaction.DefaultPluginActionResult;
53  import fr.paris.lutece.portal.web.pluginaction.IPluginActionResult;
54  import fr.paris.lutece.util.ReferenceItem;
55  import fr.paris.lutece.util.ReferenceList;
56  import fr.paris.lutece.util.datatable.DataTableManager;
57  import fr.paris.lutece.util.html.HtmlTemplate;
58  import fr.paris.lutece.util.url.UrlItem;
59  
60  import java.util.HashMap;
61  import java.util.Locale;
62  import java.util.Map;
63  
64  import javax.inject.Inject;
65  import javax.servlet.http.HttpServletRequest;
66  
67  import org.apache.commons.lang.StringUtils;
68  
69  
70  /**
71   * JspBean of ActionBar plugin.
72   */
73  public class ActionbarJspBean extends AdminFeaturesPageJspBean
74  {
75      /**
76       * Right to manage action buttons
77       */
78      public static final String MANAGE_ACTION_BUTTONS = "MANAGE_ACTION_BUTTONS";
79  
80      /**
81       * Serial version UID
82       */
83      private static final long serialVersionUID = 3580512845617771375L;
84  
85      // PARAMETERS
86      private static final String PARAMETER_ACTION_NAME = "name";
87      private static final String PARAMETER_ACTION_ORDER = "order";
88      //    private static final String PARAMETER_RESOURCE_TYPE = "resourceType";
89      private static final String PARAMETER_CANCEL = "cancel";
90      private static final String PARAMETER_ID_ACTION_BUTTON = "id_action";
91      private static final String PARAM_NAME = "name";
92      private static final String PARAM_HTML_CONTENT = "html_content";
93      private static final String PARAM_RESOURCE_TYPE = "resourceType";
94      private static final String PARAM_MOVE_UP = "moveUp";
95  
96      // PROPERTIES
97      private static final String PROPERTY_MANAGE_ACTION_BUTTONS_PAGE_TITLE = "module.extend.actionbar.adminFeature.manage_action_buttons.pageTitle";
98      private static final String PROPERTY_ADD_ACTION_BUTTON_PAGE_TITLE = "module.extend.actionbar.adminFeature.add_action_button.pageTitle";
99      private static final String PROPERTY_MODIFY_ACTION_BUTTON_PAGE_TITLE = "module.extend.actionbar.adminFeature.modify_action_button.pageTitle";
100     private static final String PROPERTY_DEFAULT_ITEMS_PER_PAGE = "module.extend.actionbar.manage_action_buttons.itemsPerPage";
101 
102     // MARKS
103     private static final String MARK_DATA_TABLE_MANAGER = "dataTableManager";
104     private static final String MARK_PERMISSIONS = "permissions";
105     private static final String MARK_LOCALE = "locale";
106     private static final String MARK_WEBAPP_URL = "webapp_url";
107     private static final String MARK_ACTION_BUTTON = "action_button";
108     private static final String MARK_RESOURCE_TYPES = "resourceTypes";
109     private static final String MARK_LAST_ORDER = "last_order";
110 
111     // MESSAGES
112     private static final String MESSAGE_LABEL_ACTION_NAME = "module.extend.actionbar.manage_action_buttons.actionbutton.name";
113     private static final String MESSAGE_LABEL_ACTION_ORDER = "module.extend.actionbar.manage_action_buttons.actionbutton.order";
114     //    private static final String MESSAGE_LABEL_RESOURCE_TYPE = "module.extend.actionbar.manage_action_buttons.actionbutton.resourceType";
115     private static final String MESSAGE_LABEL_ACTION = "module.extend.actionbar.manage_action_buttons.actionbutton.action";
116     private static final String MESSAGE_UNAUTHORIZED_ACTION = "extend.message.unauthorizedAction";
117     private static final String MESSAGE_CONFIRM_REMOVE_SOCIALHUB = "module.extend.actionbar.remove_action_button.confirmRemoveActionButton";
118     private static final String MESSAGE_MANDATORY_FIELDS = "portal.util.message.mandatoryFields";
119     private static final String MESSAGE_ACTION_BUTTON_NOT_FOUND = "module.extend.actionbar.manage_action_buttons.actionbutton.actionButtonNotFound";
120     private static final String MESSAGE_LABEL_EVERY_RESOURCE_TYPE = "module.extend.actionbar.add_action_button.everyResourceType";
121 
122     // TEMPLATES
123     private static final String TEMPLATE_MANAGE_ACTION_BUTTONS = "admin/plugins/extend/modules/actionbar/manage_action_buttons.html";
124     private static final String TEMPLATE_ADD_ACTION_BUTTON = "admin/plugins/extend/modules/actionbar/add_action_button.html";
125     private static final String TEMPLATE_MODIFY_ACTION_BUTTON = "admin/plugins/extend/modules/actionbar/modify_action_button.html";
126 
127     // URLS
128     private static final String JSP_URL_MANAGE_ACTION_BUTTONS = "jsp/admin/plugins/extend/modules/actionbar/GetManageActionButtons.jsp";
129     private static final String JSP_URL_REMOVE_ACTION_BUTTON = "jsp/admin/plugins/extend/modules/actionbar/DoRemoveActionButton.jsp";
130 
131     // local variables
132     @Inject
133     private ActionbarService _actionbarService = SpringContextService.getBean( ActionbarService.BEAN_NAME );
134     private IExtendableResourceTypeService _resourceTypeService = SpringContextService
135             .getBean( ExtendableResourceTypeService.BEAN_SERVICE );
136     private DataTableManager<ActionButton> _dataTableManager;
137 
138     /**
139      * Get the manage action buttons page.
140      * @param request The request
141      * @return The HTML content to display
142      */
143     public String getManageActionButtons( HttpServletRequest request )
144     {
145         setPageTitleProperty( PROPERTY_MANAGE_ACTION_BUTTONS_PAGE_TITLE );
146 
147         if ( _dataTableManager == null )
148         {
149             _dataTableManager = new DataTableManager<ActionButton>( JSP_URL_MANAGE_ACTION_BUTTONS,
150                     JSP_URL_MANAGE_ACTION_BUTTONS, AppPropertiesService.getPropertyInt(
151                             PROPERTY_DEFAULT_ITEMS_PER_PAGE, 50 ), true );
152             _dataTableManager.addColumn( MESSAGE_LABEL_ACTION_NAME, PARAMETER_ACTION_NAME, true );
153             _dataTableManager.addColumn( MESSAGE_LABEL_ACTION_ORDER, PARAMETER_ACTION_ORDER, true );
154             //            _dataTableManager.addColumn( MESSAGE_LABEL_RESOURCE_TYPE, PARAMETER_RESOURCE_TYPE, true );
155             _dataTableManager.addActionColumn( MESSAGE_LABEL_ACTION );
156         }
157         _dataTableManager.filterSortAndPaginate( request, _actionbarService.findAllActionButtons( ) );
158 
159         Map<String, Object> model = new HashMap<String, Object>( );
160         model.put( MARK_DATA_TABLE_MANAGER, _dataTableManager );
161 
162         AdminUser user = AdminUserService.getAdminUser( request );
163 
164         Map<String, Boolean> mapPermissions = new HashMap<String, Boolean>( );
165         mapPermissions.put( ActionbarResourceIdService.PERMISSION_MODIFY_ACTION_BUTTON, RBACService.isAuthorized(
166                 ActionButton.RESOURCE_TYPE, null, ActionbarResourceIdService.PERMISSION_MODIFY_ACTION_BUTTON, user ) );
167         mapPermissions.put( ActionbarResourceIdService.PERMISSION_ADD_ACTION_BUTTON, RBACService.isAuthorized(
168                 ActionButton.RESOURCE_TYPE, null, ActionbarResourceIdService.PERMISSION_ADD_ACTION_BUTTON, user ) );
169         mapPermissions.put( ActionbarResourceIdService.PERMISSION_REMOVE_ACTION_BUTTON, RBACService.isAuthorized(
170                 ActionButton.RESOURCE_TYPE, null, ActionbarResourceIdService.PERMISSION_REMOVE_ACTION_BUTTON, user ) );
171 
172         model.put( MARK_PERMISSIONS, mapPermissions );
173         model.put( MARK_LAST_ORDER, _actionbarService.getNewOrder( ) - 1 );
174 
175         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_ACTION_BUTTONS,
176                 AdminUserService.getLocale( request ), model );
177 
178         String strContent = getAdminPage( template.getHtml( ) );
179         _dataTableManager.clearItems( );
180 
181         return strContent;
182     }
183 
184     /**
185      * Get the page to add an action button
186      * @param request The request
187      * @return A IPluginActionResult containing the URL to redirect to or the
188      *         HTML content to display
189      */
190     public IPluginActionResult getAddActionButton( HttpServletRequest request )
191     {
192         if ( !RBACService.isAuthorized( ActionButton.RESOURCE_TYPE, null,
193                 ActionbarResourceIdService.PERMISSION_ADD_ACTION_BUTTON, AdminUserService.getAdminUser( request ) ) )
194         {
195             IPluginActionResult result = new DefaultPluginActionResult( );
196             result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_UNAUTHORIZED_ACTION,
197                     AdminMessage.TYPE_STOP ) );
198 
199             return result;
200         }
201 
202         setPageTitleProperty( PROPERTY_ADD_ACTION_BUTTON_PAGE_TITLE );
203 
204         Locale locale = AdminUserService.getLocale( request );
205         ReferenceList refListResourceTypes = _resourceTypeService.findAllAsRef( locale );
206         ReferenceItem refItem = new ReferenceItem( );
207         refItem.setCode( ActionButton.EVERY_RESOURCE_TYPE );
208         refItem.setName( I18nService.getLocalizedString( MESSAGE_LABEL_EVERY_RESOURCE_TYPE, locale ) );
209         refListResourceTypes.add( 0, refItem );
210 
211         Map<String, Object> model = new HashMap<String, Object>( );
212         model.put( MARK_LOCALE, locale );
213         model.put( MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
214         model.put( MARK_RESOURCE_TYPES, refListResourceTypes );
215 
216         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_ADD_ACTION_BUTTON,
217                 AdminUserService.getLocale( request ), model );
218 
219         IPluginActionResult result = new DefaultPluginActionResult( );
220         result.setHtmlContent( getAdminPage( template.getHtml( ) ) );
221         return result;
222     }
223 
224     /**
225      * Do create an action button
226      * @param request The request
227      * @return The next URL to redirect to
228      */
229     public String doAddActionButton( HttpServletRequest request )
230     {
231         if ( request.getParameter( PARAMETER_CANCEL ) != null )
232         {
233             return AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ACTION_BUTTONS;
234         }
235 
236         if ( !RBACService.isAuthorized( ActionButton.RESOURCE_TYPE, null,
237                 ActionbarResourceIdService.PERMISSION_ADD_ACTION_BUTTON, AdminUserService.getAdminUser( request ) ) )
238         {
239             return AdminMessageService.getMessageUrl( request, MESSAGE_UNAUTHORIZED_ACTION, AdminMessage.TYPE_STOP );
240         }
241 
242         String strName = request.getParameter( PARAM_NAME );
243         if ( StringUtils.isBlank( strName ) )
244         {
245             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
246         }
247 
248         String strHtmlContent = request.getParameter( PARAM_HTML_CONTENT );
249         if ( StringUtils.isBlank( strHtmlContent ) )
250         {
251             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
252         }
253         String strResourceType = request.getParameter( PARAM_RESOURCE_TYPE );
254         if ( StringUtils.isBlank( strResourceType ) )
255         {
256             strResourceType = ActionButton.EVERY_RESOURCE_TYPE;
257         }
258 
259         ActionButtonnd/modules/actionbar/business/ActionButton.html#ActionButton">ActionButton actionButton = new ActionButton( );
260         actionButton.setName( strName );
261         actionButton.setHtmlContent( strHtmlContent );
262         actionButton.setResourceType( strResourceType );
263 
264         _actionbarService.createActionButton( actionButton );
265 
266         return AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ACTION_BUTTONS;
267     }
268 
269     /**
270      * Get the page to modify an action button
271      * @param request The request
272      * @return A IPluginActionResult containing the URL to redirect to or the
273      *         HTML content to display
274      */
275     public IPluginActionResult getModifyActionButton( HttpServletRequest request )
276     {
277         if ( !RBACService.isAuthorized( ActionButton.RESOURCE_TYPE, null,
278                 ActionbarResourceIdService.PERMISSION_MODIFY_ACTION_BUTTON, AdminUserService.getAdminUser( request ) ) )
279         {
280             IPluginActionResult result = new DefaultPluginActionResult( );
281             result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_UNAUTHORIZED_ACTION,
282                     AdminMessage.TYPE_STOP ) );
283 
284             return result;
285         }
286 
287         setPageTitleProperty( PROPERTY_MODIFY_ACTION_BUTTON_PAGE_TITLE );
288 
289         int nActionButtonId = 0;
290         try
291         {
292             nActionButtonId = Integer.parseInt( request.getParameter( PARAMETER_ID_ACTION_BUTTON ) );
293         }
294         catch ( NumberFormatException e )
295         {
296             IPluginActionResult result = new DefaultPluginActionResult( );
297             result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_ACTION_BUTTON_NOT_FOUND,
298                     AdminMessage.TYPE_STOP ) );
299             return result;
300         }
301 
302         ActionButton actionButton = _actionbarService.findActionButton( nActionButtonId );
303         if ( actionButton == null )
304         {
305             IPluginActionResult result = new DefaultPluginActionResult( );
306             result.setRedirect( AdminMessageService.getMessageUrl( request, MESSAGE_ACTION_BUTTON_NOT_FOUND,
307                     AdminMessage.TYPE_STOP ) );
308             return result;
309         }
310         Locale locale = AdminUserService.getLocale( request );
311         ReferenceList refListResourceTypes = _resourceTypeService.findAllAsRef( locale );
312         ReferenceItem refItem = new ReferenceItem( );
313         refItem.setCode( ActionButton.EVERY_RESOURCE_TYPE );
314         refItem.setName( I18nService.getLocalizedString( MESSAGE_LABEL_EVERY_RESOURCE_TYPE, locale ) );
315         refListResourceTypes.add( 0, refItem );
316 
317         Map<String, Object> model = new HashMap<String, Object>( );
318         model.put( MARK_LOCALE, locale );
319         model.put( MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
320         model.put( MARK_ACTION_BUTTON, actionButton );
321         model.put( MARK_RESOURCE_TYPES, refListResourceTypes );
322 
323         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_ACTION_BUTTON,
324                 AdminUserService.getLocale( request ), model );
325 
326         IPluginActionResult result = new DefaultPluginActionResult( );
327         result.setHtmlContent( getAdminPage( template.getHtml( ) ) );
328         return result;
329     }
330 
331     /**
332      * Do modify an action button
333      * @param request The request
334      * @return The next URL to redirect to
335      */
336     public String doModifyActionButton( HttpServletRequest request )
337     {
338         if ( request.getParameter( PARAMETER_CANCEL ) != null )
339         {
340             return AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ACTION_BUTTONS;
341         }
342 
343         if ( !RBACService.isAuthorized( ActionButton.RESOURCE_TYPE, null,
344                 ActionbarResourceIdService.PERMISSION_MODIFY_ACTION_BUTTON, AdminUserService.getAdminUser( request ) ) )
345         {
346             return AdminMessageService.getMessageUrl( request, MESSAGE_UNAUTHORIZED_ACTION, AdminMessage.TYPE_STOP );
347         }
348 
349         String strName = request.getParameter( PARAM_NAME );
350         String strHtmlContent = request.getParameter( PARAM_HTML_CONTENT );
351 
352         if ( StringUtils.isBlank( strHtmlContent ) || StringUtils.isBlank( strName ) )
353         {
354             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
355         }
356 
357         int nIdActionButton = 0;
358         try
359         {
360             nIdActionButton = Integer.parseInt( request.getParameter( PARAMETER_ID_ACTION_BUTTON ) );
361         }
362         catch ( NumberFormatException e )
363         {
364             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
365         }
366 
367         String strResourceType = request.getParameter( PARAM_RESOURCE_TYPE );
368         if ( StringUtils.isBlank( strResourceType ) )
369         {
370             strResourceType = ActionButton.EVERY_RESOURCE_TYPE;
371         }
372 
373         ActionButtonnd/modules/actionbar/business/ActionButton.html#ActionButton">ActionButton actionButton = new ActionButton( );
374         actionButton.setName( strName );
375         actionButton.setHtmlContent( strHtmlContent );
376         actionButton.setIdAction( nIdActionButton );
377         actionButton.setResourceType( strResourceType );
378 
379         _actionbarService.updateActionButton( actionButton );
380 
381         return AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ACTION_BUTTONS;
382     }
383 
384     /**
385      * Get the confirmation page before removing an action button
386      * @param request The request
387      * @return The next URL to redirect to
388      */
389     public String confirmRemoveActionButton( HttpServletRequest request )
390     {
391         String strId = request.getParameter( PARAMETER_ID_ACTION_BUTTON );
392         if ( StringUtils.isBlank( strId ) )
393         {
394             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
395         }
396 
397         UrlItem url = new UrlItem( JSP_URL_REMOVE_ACTION_BUTTON );
398         url.addParameter( PARAMETER_ID_ACTION_BUTTON, strId );
399 
400         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_SOCIALHUB, url.getUrl( ),
401                 AdminMessage.TYPE_CONFIRMATION );
402     }
403 
404     /**
405      * Do remove an action button
406      * @param request The request
407      * @return The next URL to redirect to
408      */
409     public String doRemoveActionButton( HttpServletRequest request )
410     {
411         String strId = request.getParameter( PARAMETER_ID_ACTION_BUTTON );
412         if ( StringUtils.isBlank( strId ) )
413         {
414             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
415         }
416         int nId = 0;
417         try
418         {
419             nId = Integer.parseInt( strId );
420         }
421         catch ( NumberFormatException e )
422         {
423             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
424         }
425 
426         _actionbarService.removeActionButton( nId );
427         return AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_ACTION_BUTTONS;
428     }
429 
430     /**
431      * Move an action button
432      * @param request The request
433      * @return The html content to display
434      */
435     public String doMoveActionButton( HttpServletRequest request )
436     {
437         if ( !RBACService.isAuthorized( ActionButton.RESOURCE_TYPE, null,
438                 ActionbarResourceIdService.PERMISSION_MODIFY_ACTION_BUTTON, AdminUserService.getAdminUser( request ) ) )
439         {
440             getManageActionButtons( request );
441         }
442 
443         boolean bMoveUp = Boolean.parseBoolean( request.getParameter( PARAM_MOVE_UP ) );
444         String strActionId = request.getParameter( PARAMETER_ID_ACTION_BUTTON );
445         if ( StringUtils.isNumeric( strActionId ) )
446         {
447             int nIdAction = Integer.parseInt( strActionId );
448             ActionButton actionButton = _actionbarService.findActionButton( nIdAction );
449             int nOrder = actionButton.getOrder( );
450             if ( bMoveUp )
451             {
452                 nOrder--;
453             }
454             else
455             {
456                 nOrder++;
457             }
458             _actionbarService.updateActionButtonOrder( actionButton, nOrder );
459         }
460 
461         return getManageActionButtons( request );
462     }
463 }