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.portal.web.mailinglist;
35  
36  import fr.paris.lutece.portal.business.mailinglist.MailingList;
37  import fr.paris.lutece.portal.business.mailinglist.MailingListFilter;
38  import fr.paris.lutece.portal.business.mailinglist.MailingListHome;
39  import fr.paris.lutece.portal.business.mailinglist.MailingListUsersFilter;
40  import fr.paris.lutece.portal.business.mailinglist.Recipient;
41  import fr.paris.lutece.portal.business.rbac.AdminRoleHome;
42  import fr.paris.lutece.portal.service.mailinglist.AdminMailingListService;
43  import fr.paris.lutece.portal.service.mailinglist.MailingListRemovalListenerService;
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.template.AppTemplateService;
47  import fr.paris.lutece.portal.service.util.AppLogService;
48  import fr.paris.lutece.portal.service.util.AppPathService;
49  import fr.paris.lutece.portal.service.util.AppPropertiesService;
50  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
51  import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
52  import fr.paris.lutece.portal.web.constants.Messages;
53  import fr.paris.lutece.portal.web.constants.Parameters;
54  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
55  import fr.paris.lutece.util.ReferenceList;
56  import fr.paris.lutece.util.html.HtmlTemplate;
57  import fr.paris.lutece.util.html.Paginator;
58  import fr.paris.lutece.util.sort.AttributeComparator;
59  import fr.paris.lutece.util.url.UrlItem;
60  
61  import org.apache.commons.lang.StringUtils;
62  
63  import java.util.ArrayList;
64  import java.util.Collection;
65  import java.util.Collections;
66  import java.util.HashMap;
67  import java.util.List;
68  import java.util.Map;
69  
70  import javax.servlet.http.HttpServletRequest;
71  
72  
73  /**
74   * Mailing ListJspBean
75   */
76  public class MailingListJspBean extends AdminFeaturesPageJspBean
77  {
78      //Rights
79      public static final String RIGHT_MANAGE_MAILINGLISTS = "CORE_MAILINGLISTS_MANAGEMENT";
80  
81      // Templates
82      private static final String TEMPLATE_MANAGE_MAILINGLISTS = "admin/mailinglist/manage_mailinglists.html";
83      private static final String TEMPLATE_CREATE_MAILINGLIST = "admin/mailinglist/create_mailinglist.html";
84      private static final String TEMPLATE_MODIFY_MAILINGLIST = "admin/mailinglist/modify_mailinglist.html";
85      private static final String TEMPLATE_ADD_USERS = "admin/mailinglist/add_users.html";
86      private static final String TEMPLATE_VIEW_USERS = "admin/mailinglist/view_users.html";
87  
88      // Bookmarks
89      private static final String MARK_MAILINGLISTS_LIST = "mailinglists_list";
90      private static final String MARK_WORKGROUPS_LIST = "workgroups_list";
91      private static final String MARK_WORKGROUP_SELECTED = "selected_workgroup";
92      private static final String MARK_ROLES_LIST = "roles_list";
93      private static final String MARK_RECIPIENTS_LIST = "recipients_list";
94      private static final String MARK_MAILINGLIST = "mailinglist";
95      private static final String MARK_MAILINGLIST_FILTER = "mailinglistFilter";
96      private static final String MARK_PAGINATOR = "paginator";
97      private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
98  
99      // Properties
100     private static final String PROPERTY_CREATE_MAILINGLIST_PAGETITLE = "portal.mailinglist.create_mailinglist.pageTitle";
101     private static final String PROPERTY_MODIFY_MAILINGLIST_PAGETITLE = "portal.mailinglist.modify_mailinglist.pageTitle";
102     private static final String PROPERTY_VIEW_USERS_PAGETITLE = "portal.mailinglist.view_users.pageTitle";
103     private static final String PROPERTY_ADD_USERS_PAGETITLE = "portal.mailinglist.add_users.pageTitle";
104     private static final String PROPERTY_MAILINGLIST_PER_PAGE = "paginator.mailinglist.itemsPerPage";
105     private static final String MESSAGE_CONFIRM_REMOVE = "portal.mailinglist.message.confirmRemoveMailingList";
106     private static final String MESSAGE_CANNOT_REMOVE = "portal.mailinglist.message.cannotRemoveMailingList";
107     private static final String MESSAGE_FILTER_ALREADY_EXISTS = "portal.mailinglist.message.filterAlreadyExists";
108 
109     // Parameters
110     private static final String PARAMETER_WORKGROUP = "workgroup";
111     private static final String PARAMETER_ROLE = "role";
112     private static final String PARAMETER_MAILINGLIST_ID = "id_mailinglist";
113     private static final String PARAMETER_NAME = "name";
114     private static final String PARAMETER_DESCRIPTION = "description";
115     private static final String PARAMETER_SESSION = "session";
116 
117     // JSP
118     private static final String JSP_MODIFY_MAILINGLIST = "ModifyMailingList.jsp";
119     private static final String JSP_URL_REMOVE_MAILINGLIST = "jsp/admin/mailinglist/DoRemoveMailingList.jsp";
120     private static final String JSP_URL_MANAGE_MAILINGLISTS = "jsp/admin/mailinglist/ManageMailingLists.jsp";
121     private MailingListFilter _mailingListFilter;
122     private int _nItemsPerPage;
123     private int _nDefaultItemsPerPage;
124     private String _strCurrentPageIndex;
125 
126     /**
127      * Get the mailinglists management page.
128      * This page provides the list of all existing mailinglists.
129      * @param request the http request
130      * @return the html code for the mailinglist management page
131      */
132     public String getManageMailinglists( HttpServletRequest request )
133     {
134         Map<String, Object> model = new HashMap<String, Object>(  );
135 
136         // Build filter
137         if ( StringUtils.isBlank( request.getParameter( PARAMETER_SESSION ) ) )
138         {
139             _mailingListFilter = new MailingListFilter(  );
140             populate( _mailingListFilter, request );
141         }
142 
143         List<MailingList> listMailinglists = AdminMailingListService.getUserMailingListsByFilter( getUser(  ),
144                 _mailingListFilter );
145 
146         // SORT
147         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
148         String strAscSort = request.getParameter( Parameters.SORTED_ASC );
149         boolean bIsAscSort = true;
150 
151         if ( StringUtils.isBlank( strSortedAttributeName ) )
152         {
153             strSortedAttributeName = PARAMETER_NAME;
154         }
155 
156         if ( StringUtils.isNotBlank( strAscSort ) )
157         {
158             bIsAscSort = Boolean.parseBoolean( strAscSort );
159         }
160 
161         Collections.sort( listMailinglists, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
162 
163         // Paginator
164         _strCurrentPageIndex = Paginator.getPageIndex( request, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
165         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_MAILINGLIST_PER_PAGE, 50 );
166         _nItemsPerPage = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
167                 _nDefaultItemsPerPage );
168 
169         UrlItem url = new UrlItem( AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_MAILINGLISTS );
170         url.addParameter( Parameters.SORTED_ATTRIBUTE_NAME, strSortedAttributeName );
171         url.addParameter( Parameters.SORTED_ASC, Boolean.toString( bIsAscSort ) );
172         url.addParameter( PARAMETER_SESSION, PARAMETER_SESSION );
173 
174         LocalizedPaginator<MailingList> paginator = new LocalizedPaginator<MailingList>( listMailinglists,
175                 _nItemsPerPage, url.getUrl(  ), Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex,
176                 request.getLocale(  ) );
177 
178         model.put( MARK_MAILINGLISTS_LIST, paginator.getPageItems(  ) );
179         model.put( MARK_PAGINATOR, paginator );
180         model.put( MARK_NB_ITEMS_PER_PAGE, Integer.toString( paginator.getItemsPerPage(  ) ) );
181         model.put( MARK_MAILINGLIST_FILTER, _mailingListFilter );
182 
183         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_MAILINGLISTS, getLocale(  ), model );
184 
185         return getAdminPage( template.getHtml(  ) );
186     }
187 
188     /**
189      * Get the mailinglist create page.
190      * @param request the http request
191      * @return the html code for the mailinglist create page
192      */
193     public String getCreateMailinglist( HttpServletRequest request )
194     {
195         setPageTitleProperty( PROPERTY_CREATE_MAILINGLIST_PAGETITLE );
196 
197         ReferenceList listWorkgroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
198 
199         HashMap<String, Object> model = new HashMap<String, Object>(  );
200         model.put( MARK_WORKGROUPS_LIST, listWorkgroups );
201 
202         //LUTECE-890 : the first workgroup will be selected by default
203         if ( !listWorkgroups.isEmpty(  ) )
204         {
205             model.put( MARK_WORKGROUP_SELECTED, listWorkgroups.get( 0 ).getCode(  ) );
206         }
207 
208         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_MAILINGLIST, getLocale(  ), model );
209 
210         return getAdminPage( template.getHtml(  ) );
211     }
212 
213     /**
214      * Process the data capture form for create a mailing list
215      *
216      * @param request The HTTP Request
217      * @return The Jsp URL of the process result
218      */
219     public String doCreateMailingList( HttpServletRequest request )
220     {
221         MailingList mailinglist = new MailingList(  );
222         String strErrors = processFormData( request, mailinglist );
223 
224         if ( strErrors != null )
225         {
226             return AdminMessageService.getMessageUrl( request, strErrors, AdminMessage.TYPE_STOP );
227         }
228 
229         MailingListHome.create( mailinglist );
230 
231         // Forward to modify page to enter users filters
232         UrlItem urlModify = new UrlItem( JSP_MODIFY_MAILINGLIST );
233         urlModify.addParameter( PARAMETER_MAILINGLIST_ID, mailinglist.getId(  ) );
234 
235         return urlModify.getUrl(  );
236     }
237 
238     /**
239      * Get the mailinglist modify page.
240      * @param request the http request
241      * @return the html code for the mailinglist modify page
242      */
243     public String getModifyMailinglist( HttpServletRequest request )
244     {
245         setPageTitleProperty( PROPERTY_MODIFY_MAILINGLIST_PAGETITLE );
246 
247         ReferenceList listWorkgroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
248 
249         String strMailingListId = request.getParameter( PARAMETER_MAILINGLIST_ID );
250 
251         if ( !StringUtils.isNumeric( strMailingListId ) )
252         {
253             AppLogService.error( strMailingListId + " is not a valid mailing list id." );
254 
255             return getManageMailinglists( request );
256         }
257 
258         int nMailingListId = Integer.parseInt( strMailingListId );
259         MailingList mailinglist = MailingListHome.findByPrimaryKey( nMailingListId );
260 
261         if ( mailinglist == null )
262         {
263             AppLogService.error( strMailingListId + " is not a valid mailing list id." );
264 
265             return getManageMailinglists( request );
266         }
267 
268         Map<String, Object> model = new HashMap<String, Object>(  );
269         model.put( MARK_WORKGROUPS_LIST, listWorkgroups );
270         model.put( MARK_MAILINGLIST, mailinglist );
271 
272         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_MAILINGLIST, getLocale(  ), model );
273 
274         return getAdminPage( template.getHtml(  ) );
275     }
276 
277     /**
278      * Process the data capture form for modify a mailing list
279      *
280      * @param request The HTTP Request
281      * @return The Jsp URL of the process result
282      */
283     public String doModifyMailingList( HttpServletRequest request )
284     {
285         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
286         int nId = Integer.parseInt( strId );
287         MailingList mailinglist = MailingListHome.findByPrimaryKey( nId );
288 
289         String strErrors = processFormData( request, mailinglist );
290 
291         if ( strErrors != null )
292         {
293             return AdminMessageService.getMessageUrl( request, strErrors, AdminMessage.TYPE_STOP );
294         }
295 
296         MailingListHome.update( mailinglist );
297 
298         return getHomeUrl( request );
299     }
300 
301     /**
302      * Returns the page of confirmation for deleting a mailinglist
303      *
304      * @param request The Http Request
305      * @return the confirmation url
306      */
307     public String getConfirmRemoveMailingList( HttpServletRequest request )
308     {
309         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
310         String strUrlRemove = JSP_URL_REMOVE_MAILINGLIST + "?" + PARAMETER_MAILINGLIST_ID + "=" + strId;
311 
312         ArrayList<String> listErrors = new ArrayList<String>(  );
313         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE, strUrlRemove,
314                 AdminMessage.TYPE_CONFIRMATION );
315 
316         if ( !MailingListRemovalListenerService.getService(  ).checkForRemoval( strId, listErrors, getLocale(  ) ) )
317         {
318             String strCause = AdminMessageService.getFormattedList( listErrors, getLocale(  ) );
319             Object[] args = { strCause };
320             strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CANNOT_REMOVE, args, AdminMessage.TYPE_STOP );
321         }
322 
323         return strUrl;
324     }
325 
326     /**
327      * Process the data capture form for modify a mailing list
328      *
329      * @param request The HTTP Request
330      * @return The Jsp URL of the process result
331      */
332     public String doRemoveMailingList( HttpServletRequest request )
333     {
334         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
335         int nId = Integer.parseInt( strId );
336 
337         MailingListHome.remove( nId );
338 
339         return getHomeUrl( request );
340     }
341 
342     /**
343      * Get the view users page.
344      * @param request the http request
345      * @return the html code for the mailinglist modify page
346      */
347     public String getViewUsers( HttpServletRequest request )
348     {
349         setPageTitleProperty( PROPERTY_VIEW_USERS_PAGETITLE );
350 
351         HashMap<String, Object> model = new HashMap<String, Object>(  );
352         Collection<Recipient> listRecipients;
353         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
354 
355         if ( strId != null )
356         {
357             int nIdMailingList = Integer.parseInt( strId );
358             listRecipients = AdminMailingListService.getRecipients( nIdMailingList );
359         }
360         else
361         {
362             String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP );
363             String strRole = request.getParameter( PARAMETER_ROLE );
364             listRecipients = AdminMailingListService.getRecipients( strWorkgroup, strRole );
365         }
366 
367         model.put( MARK_RECIPIENTS_LIST, listRecipients );
368 
369         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_VIEW_USERS, getLocale(  ), model );
370 
371         return getAdminPage( template.getHtml(  ) );
372     }
373 
374     /**
375      * Get the add users page.
376      * @param request the http request
377      * @return the html code for the mailinglist modify page
378      */
379     public String getAddUsers( HttpServletRequest request )
380     {
381         setPageTitleProperty( PROPERTY_ADD_USERS_PAGETITLE );
382 
383         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
384         int nId = Integer.parseInt( strId );
385         MailingList mailinglist = MailingListHome.findByPrimaryKey( nId );
386 
387         if ( mailinglist == null )
388         {
389             return getManageMailinglists( request );
390         }
391 
392         ReferenceList listWorkgroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
393         ReferenceList listRoles = AdminRoleHome.getRolesList(  );
394         listRoles.addItem( AdminMailingListService.ALL_ROLES, AdminMailingListService.ALL_ROLES );
395 
396         Map<String, Object> model = new HashMap<String, Object>(  );
397         model.put( MARK_WORKGROUPS_LIST, listWorkgroups );
398         model.put( MARK_ROLES_LIST, listRoles );
399         model.put( MARK_MAILINGLIST, mailinglist );
400 
401         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_ADD_USERS, getLocale(  ), model );
402 
403         return getAdminPage( template.getHtml(  ) );
404     }
405 
406     /**
407      * Process the data capture form for adding users filters
408      *
409      * @param request The HTTP Request
410      * @return The Jsp URL of the process result
411      */
412     public String doAddUsers( HttpServletRequest request )
413     {
414         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
415         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP );
416         String strRole = request.getParameter( PARAMETER_ROLE );
417 
418         int nId = Integer.parseInt( strId );
419         MailingListUsersFilter filter = new MailingListUsersFilter(  );
420         filter.setWorkgroup( strWorkgroup );
421         filter.setRole( strRole );
422 
423         if ( !AdminMailingListService.checkFilter( filter, nId ) )
424         {
425             MailingListHome.addFilterToMailingList( filter, nId );
426 
427             // Forward to modify page to enter users filters
428             UrlItem urlModify = new UrlItem( JSP_MODIFY_MAILINGLIST );
429             urlModify.addParameter( PARAMETER_MAILINGLIST_ID, nId );
430 
431             return urlModify.getUrl(  );
432         }
433 
434         return AdminMessageService.getMessageUrl( request, MESSAGE_FILTER_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
435     }
436 
437     /**
438      * Process the data capture form to remove users filters
439      *
440      * @param request The HTTP Request
441      * @return The Jsp URL of the process result
442      */
443     public String doDeleteFilter( HttpServletRequest request )
444     {
445         String strId = request.getParameter( PARAMETER_MAILINGLIST_ID );
446         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP );
447         String strRole = request.getParameter( PARAMETER_ROLE );
448 
449         int nId = Integer.parseInt( strId );
450         MailingListUsersFilter filter = new MailingListUsersFilter(  );
451         filter.setWorkgroup( strWorkgroup );
452         filter.setRole( strRole );
453         MailingListHome.deleteFilterToMailingList( filter, nId );
454 
455         // Forward to modify page to enter users filters
456         UrlItem urlModify = new UrlItem( JSP_MODIFY_MAILINGLIST );
457         urlModify.addParameter( PARAMETER_MAILINGLIST_ID, nId );
458 
459         return urlModify.getUrl(  );
460     }
461 
462     /**
463      * Process Form Data
464      * @param request The HTTP request
465      * @param mailinglist The mailing list
466      * @return An Error message or null if no error
467      */
468     private String processFormData( HttpServletRequest request, MailingList mailinglist )
469     {
470         String strErrors = null;
471         String strName = request.getParameter( PARAMETER_NAME );
472         String strDescription = request.getParameter( PARAMETER_DESCRIPTION );
473         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP );
474 
475         if ( ( strName == null ) || ( strName.equals( "" ) ) || ( strDescription == null ) ||
476                 ( strDescription.equals( "" ) ) )
477         {
478             return Messages.MANDATORY_FIELDS;
479         }
480 
481         mailinglist.setName( strName );
482         mailinglist.setDescription( strDescription );
483         mailinglist.setWorkgroup( strWorkgroup );
484 
485         return strErrors;
486     }
487 }