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.newsletter.web;
35  
36  import fr.paris.lutece.plugins.newsletter.business.NewsLetterTemplate;
37  import fr.paris.lutece.plugins.newsletter.business.NewsLetterTemplateHome;
38  import fr.paris.lutece.plugins.newsletter.service.NewsletterPlugin;
39  import fr.paris.lutece.plugins.newsletter.service.NewsletterService;
40  import fr.paris.lutece.plugins.newsletter.service.NewsletterTemplateRemovalService;
41  import fr.paris.lutece.plugins.newsletter.service.NewsletterTemplateResourceIdService;
42  import fr.paris.lutece.plugins.newsletter.service.topic.NewsletterTopicService;
43  import fr.paris.lutece.plugins.newsletter.util.NewsLetterConstants;
44  import fr.paris.lutece.portal.business.rbac.RBAC;
45  import fr.paris.lutece.portal.business.user.AdminUser;
46  import fr.paris.lutece.portal.business.workgroup.AdminWorkgroupHome;
47  import fr.paris.lutece.portal.service.admin.AdminUserService;
48  import fr.paris.lutece.portal.service.i18n.I18nService;
49  import fr.paris.lutece.portal.service.message.AdminMessage;
50  import fr.paris.lutece.portal.service.message.AdminMessageService;
51  import fr.paris.lutece.portal.service.plugin.Plugin;
52  import fr.paris.lutece.portal.service.plugin.PluginService;
53  import fr.paris.lutece.portal.service.rbac.RBACService;
54  import fr.paris.lutece.portal.service.template.AppTemplateService;
55  import fr.paris.lutece.portal.service.util.AppLogService;
56  import fr.paris.lutece.portal.service.util.AppPathService;
57  import fr.paris.lutece.portal.service.util.AppPropertiesService;
58  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
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.upload.MultipartHttpServletRequest;
62  import fr.paris.lutece.util.ReferenceItem;
63  import fr.paris.lutece.util.ReferenceList;
64  import fr.paris.lutece.util.file.FileUtil;
65  import fr.paris.lutece.util.filesystem.UploadUtil;
66  import fr.paris.lutece.util.html.HtmlTemplate;
67  import fr.paris.lutece.util.url.UrlItem;
68  
69  import java.io.BufferedReader;
70  import java.io.File;
71  import java.io.FileNotFoundException;
72  import java.io.FileReader;
73  import java.io.FileWriter;
74  import java.io.IOException;
75  import java.util.ArrayList;
76  import java.util.Collection;
77  import java.util.HashMap;
78  import java.util.List;
79  import java.util.Locale;
80  import java.util.Map;
81  
82  import javax.servlet.http.HttpServletRequest;
83  
84  import org.apache.commons.fileupload.FileItem;
85  import org.apache.commons.io.IOUtils;
86  import org.apache.commons.lang3.StringUtils;
87  
88  /**
89   * JspBean to manage newsletter templates.
90   */
91  public class NewsletterTemplateJspBean extends PluginAdminPageJspBean
92  {
93      /**
94       * The right used for managing newsletter templates
95       */
96      public static final String RIGHT_NEWSLETTER_TEMPLATE_MANAGEMENT = "NEWSLETTER_TEMPLATE_MANAGEMENT";
97  
98      /**
99       * Serial version UID
100      */
101     private static final long serialVersionUID = -2513112227429482685L;
102 
103     // MARKS
104     private static final String MARK_NEWSLETTER_TEMPLATE_ALLOW_CREATION = "newsletter_template_allow_creation";
105     private static final String MARK_NEWSLETTER_TEMPLATE_ALLOW_DELETION = "newsletter_template_allow_deletion";
106     private static final String MARK_NEWSLETTER_TEMPLATE_ALLOW_MODIFICATION = "newsletter_template_allow_modification";
107     private static final String MARK_NEWSLETTER_TEMPLATE_WORKGROUP_DESCRIPTION = "newsletter_template_workgroup_description";
108     private static final String MARK_TEMPLATES_LIST = "template_list";
109     private static final String MARK_ALLOW_CREATION = "creation_allowed";
110     private static final String MARK_WORKGROUP_LIST = "workgroup_list";
111 
112     // MESSAGES
113     private static final String MESSAGE_PAGE_TITLE_MANAGE_TEMPLATES = "newsletter.manage_templates.pageTitle";
114     private static final String MESSAGE_PAGE_TITLE_ADD_TEMPLATE = "newsletter.add_newsletter_template.pageTitle";
115     private static final String MESSAGE_PAGE_TITLE_MODIFY_TEMPLATE = "newsletter.modify_newsletter_template.pageTitle";
116     private static final String MESSAGE_PAGE_TITLE_MODIFY_TEMPLATE_FILE = "newsletter.modify_newsletter_template_file.pageTitle";
117     private static final String MESSAGE_NEWSLETTER_TEMPLATE = "newsletter.template.type.newsletter.label";
118     private static final String MESSAGE_IMAGE_FILE_ALREADY_EXISTS = "newsletter.message.imageFileAlreadyExists";
119     private static final String MESSAGE_FILE_ALREADY_EXISTS = "newsletter.message.fileAlreadyExists";
120     private static final String MESSAGE_USED_TEMPLATE = "newsletter.message.usedTemplate";
121     private static final String MESSAGE_CONFIRM_REMOVE_NEWSLETTER_TEMPLATE = "newsletter.message.confirmRemoveNewsletterTemplate";
122     private static final String MESSAGE_WRONG_IMAGE_EXTENSION = "portal.util.message.wrongImageExtention";
123     private static final String MESSAGE_WRONG_HTML_EXTENSION = "portal.util.message.wrongHtmlExtention";
124 
125     // PARAMETERS
126     private static final String PARAMETER_TEMPLATE_PICTURE = "newsletter_template_picture";
127     private static final String PARAMETER_TEMPLATE_FILE = "newsletter_template_file";
128     private static final String PARAMETER_TEMPLATE_SECTION = "newsletter_template_section";
129     private static final String PARAMETER_NEWSLETTER_TEMPLATE_NEW_PICTURE = "newsletter_template_new_picture";
130     private static final String PARAMETER_NEWSLETTER_TEMPLATE_NEW_FILE = "newsletter_template_new_file";
131 
132     // PROPERTIES
133     private static final String PROPERTY_PATH_IMAGE_NEWSLETTER_TEMPLATE = "newsletter.path.image.newsletter.template";
134     private static final String PROPERTY_PATH_TEMPLATE = "path.templates";
135 
136     private static final String TEMPLATE_MANAGE_NEWSLETTER_TEMPLATE = "admin/plugins/newsletter/manage_templates.html";
137     private static final String TEMPLATE_CREATE_NEWSLETTER_TEMPLATE = "admin/plugins/newsletter/add_newsletter_template.html";
138     private static final String TEMPLATE_MODIFY_NEWSLETTER_TEMPLATE = "admin/plugins/newsletter/modify_newsletter_template.html";
139     private static final String TEMPLATE_MODIFY_NEWSLETTER_TEMPLATE_FILE = "admin/plugins/newsletter/modify_newsletter_template_file.html";
140 
141     // URL
142     private static final String JSP_URL_MANAGE_NEWSLETTER_TEMPLATES = "ManageTemplates.jsp";
143     private static final String JSP_DO_REMOVE_NEWSLETTER_TEMPLATE = "jsp/admin/plugins/newsletter/DoRemoveNewsLetterTemplate.jsp";
144 
145     private static final String CONSTANT_END_OF_LINE = "\n";
146 
147     private NewsletterTopicService _newsletterTopicService = NewsletterTopicService.getService( );
148 
149     /**
150      * Builds the newsletter's templates management page
151      * 
152      * @param request
153      *            The HTTP request
154      * @return the html code for newsletter's templates management page (liste of templates + available actions)
155      */
156     public String getManageTemplates( HttpServletRequest request )
157     {
158         setPageTitleProperty( MESSAGE_PAGE_TITLE_MANAGE_TEMPLATES );
159 
160         Map<String, Object> model = new HashMap<String, Object>( );
161 
162         Collection<NewsLetterTemplate> refListAllTemplates = NewsLetterTemplateHome.getTemplatesList( getPlugin( ) );
163         refListAllTemplates = AdminWorkgroupService.getAuthorizedCollection( refListAllTemplates, getUser( ) );
164 
165         Collection<Map<String, Object>> listNewsletterTemplateDisplay = new ArrayList<Map<String, Object>>( );
166 
167         for ( NewsLetterTemplate newsletterTemplate : refListAllTemplates )
168         {
169             Map<String, Object> newsletterTemplateDisplay = new HashMap<String, Object>( );
170             newsletterTemplateDisplay.put( NewsLetterConstants.MARK_TEMPLATE, newsletterTemplate );
171             newsletterTemplateDisplay.put( MARK_NEWSLETTER_TEMPLATE_ALLOW_CREATION,
172                     RBACService.isAuthorized( newsletterTemplate, NewsletterTemplateResourceIdService.PERMISSION_CREATE, getUser( ) ) );
173 
174             newsletterTemplateDisplay.put( MARK_NEWSLETTER_TEMPLATE_ALLOW_DELETION,
175                     RBACService.isAuthorized( newsletterTemplate, NewsletterTemplateResourceIdService.PERMISSION_DELETE, getUser( ) ) );
176             newsletterTemplateDisplay.put( MARK_NEWSLETTER_TEMPLATE_ALLOW_MODIFICATION,
177                     RBACService.isAuthorized( newsletterTemplate, NewsletterTemplateResourceIdService.PERMISSION_MODIFY, getUser( ) ) );
178 
179             // The workgroup description is needed for coherence and not the key
180             if ( newsletterTemplate.getWorkgroup( ).equals( NewsLetterConstants.ALL_GROUPS ) )
181             {
182                 newsletterTemplateDisplay.put( MARK_NEWSLETTER_TEMPLATE_WORKGROUP_DESCRIPTION,
183                         I18nService.getLocalizedString( NewsLetterConstants.PROPERTY_LABEL_ALL_GROUPS, getLocale( ) ) );
184             }
185             else
186             {
187                 newsletterTemplateDisplay.put( MARK_NEWSLETTER_TEMPLATE_WORKGROUP_DESCRIPTION,
188                         AdminWorkgroupHome.findByPrimaryKey( newsletterTemplate.getWorkgroup( ) ).getDescription( ) );
189             }
190 
191             listNewsletterTemplateDisplay.add( newsletterTemplateDisplay );
192         }
193 
194         model.put( MARK_TEMPLATES_LIST, listNewsletterTemplateDisplay );
195         model.put( MARK_ALLOW_CREATION, isNewsletterTemplateCreationAllowed( request ) );
196 
197         // get the list of all templates
198         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_NEWSLETTER_TEMPLATE, getLocale( ), model );
199 
200         return getAdminPage( template.getHtml( ) );
201     }
202 
203     /**
204      * Builds the newsletter's templates creation page
205      * 
206      * @param request
207      *            The HTTP request
208      * @return the html code for newsletter's templates creation page
209      */
210     public String getCreateNewsLetterTemplate( HttpServletRequest request )
211     {
212         if ( !isNewsletterTemplateCreationAllowed( request ) )
213         {
214             return getManageTemplates( request );
215         }
216 
217         setPageTitleProperty( MESSAGE_PAGE_TITLE_ADD_TEMPLATE );
218 
219         // get the list of template types
220         // nothing should be checked
221         Map<String, Object> model = new HashMap<String, Object>( );
222         model.put( NewsLetterConstants.MARK_TEMPLATE_TYPE, buildTemplateTypeList( AdminUserService.getLocale( request ) ) );
223         model.put( MARK_WORKGROUP_LIST, AdminWorkgroupService.getUserWorkgroups( getUser( ), getLocale( ) ) );
224 
225         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_NEWSLETTER_TEMPLATE, getLocale( ), model );
226 
227         return getAdminPage( template.getHtml( ) );
228     }
229 
230     /**
231      * Processes the creation form of a new newsletter template by recovering the parameters in the http request
232      * 
233      * @param request
234      *            the http request
235      * @return The Jsp URL of the process result
236      */
237     public String doCreateNewsletterTemplate( HttpServletRequest request )
238     {
239         if ( !isNewsletterTemplateCreationAllowed( request ) )
240         {
241             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_ERROR );
242         }
243 
244         NewsLetterTemplatewsLetterTemplate.html#NewsLetterTemplate">NewsLetterTemplate newsletterTemplate = new NewsLetterTemplate( );
245 
246         try
247         {
248             // initialize the paths
249             String strPathImageNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_IMAGE_NEWSLETTER_TEMPLATE );
250             String strPathFileNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_TEMPLATE )
251                     + AppPropertiesService.getProperty( NewsLetterConstants.PROPERTY_PATH_FILE_NEWSLETTER_TEMPLATE );
252 
253             // create the multipart request
254             if ( request instanceof MultipartHttpServletRequest )
255             {
256                 MultipartHttpServletRequest multi = (MultipartHttpServletRequest) request;
257 
258                 // Mandatory fields
259                 String strTopicType = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_TYPE );
260                 String strDescription = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_NAME );
261                 String strWorkgroup = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_WORKGROUP );
262 
263                 FileItem imageItem = multi.getFile( PARAMETER_TEMPLATE_PICTURE );
264 
265                 String strImageFileName = imageItem == null ? null : UploadUtil.cleanFileName( imageItem.getName( ) );
266 
267                 FileItem modelItem = multi.getFile( PARAMETER_TEMPLATE_FILE );
268                 String strTemplateFileName = modelItem == null ? null : UploadUtil.cleanFileName( modelItem.getName( ) );
269                 String strSectionNumber = request.getParameter( PARAMETER_TEMPLATE_SECTION );
270 
271                 if ( StringUtils.isEmpty( strWorkgroup ) || StringUtils.isEmpty( strTopicType ) || StringUtils.isEmpty( strDescription ) || imageItem == null
272                         || StringUtils.isEmpty( strImageFileName ) || !FileUtil.hasImageExtension( strImageFileName ) || modelItem == null
273                         || StringUtils.isEmpty( strTemplateFileName ) || !FileUtil.hasHtmlExtension( strTemplateFileName )
274                         || !StringUtils.isNumeric( strSectionNumber ) )
275                 {
276                     return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
277                 }
278 
279                 // create the directory if it doesn't exist
280                 if ( !new File( strPathImageNewsletterTemplate ).exists( ) )
281                 {
282                     File fDirectory = new File( strPathImageNewsletterTemplate );
283                     if ( !fDirectory.exists( ) )
284                     {
285                         fDirectory.mkdir( );
286                     }
287                 }
288 
289                 File fileImage = new File( strPathImageNewsletterTemplate + File.separator + strImageFileName );
290 
291                 if ( fileImage.exists( ) )
292                 {
293                     return AdminMessageService.getMessageUrl( request, MESSAGE_IMAGE_FILE_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
294                 }
295 
296                 int nSections = Integer.parseInt( strSectionNumber );
297 
298                 File fileTemplate = new File( strPathFileNewsletterTemplate + File.separator + strTemplateFileName );
299                 if ( fileTemplate.exists( ) )
300                 {
301                     return AdminMessageService.getMessageUrl( request, MESSAGE_FILE_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
302                 }
303 
304                 // if files are ok, save them
305                 imageItem.write( fileImage );
306                 newsletterTemplate.setPicture( strImageFileName );
307 
308                 modelItem.write( fileTemplate );
309                 newsletterTemplate.setFileName( strTemplateFileName );
310 
311                 // Complete the newsLetterTemplate
312                 newsletterTemplate.setDescription( strDescription );
313                 newsletterTemplate.setTopicType( strTopicType );
314                 newsletterTemplate.setWorkgroup( strWorkgroup );
315                 if ( nSections <= 0 )
316                 {
317                     nSections = 1;
318                 }
319                 newsletterTemplate.setSectionNumber( nSections );
320                 NewsLetterTemplateHome.create( newsletterTemplate, getPlugin( ) );
321             }
322         }
323         catch( Exception e )
324         {
325             AppLogService.error( e.getMessage( ), e );
326         }
327 
328         return getHomeUrl( request );
329     }
330 
331     /**
332      * Builds the newsletter's templates modification page
333      * 
334      * @param request
335      *            The HTTP request
336      * @return the html code for newsletter's templates creation page
337      */
338     public String getModifyNewsLetterTemplate( HttpServletRequest request )
339     {
340         String strIdTemplate = request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID );
341         int nIdTemplate = Integer.parseInt( strIdTemplate );
342         NewsLetterTemplate newsletterTemplate = NewsLetterTemplateHome.findByPrimaryKey( nIdTemplate, getPlugin( ) );
343 
344         // Workgroup & RBAC permissions
345         if ( !AdminWorkgroupService.isAuthorized( newsletterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
346                 Integer.toString( newsletterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_MODIFY, getUser( ) ) )
347         {
348             return getManageTemplates( request );
349         }
350 
351         setPageTitleProperty( MESSAGE_PAGE_TITLE_MODIFY_TEMPLATE );
352 
353         // get the list of template types
354         Map<String, Object> model = new HashMap<String, Object>( );
355         model.put( NewsLetterConstants.MARK_TEMPLATE_TYPE, buildTemplateTypeList( AdminUserService.getLocale( request ) ) );
356         model.put( MARK_WORKGROUP_LIST, AdminWorkgroupService.getUserWorkgroups( getUser( ), getLocale( ) ) );
357         model.put( NewsLetterConstants.MARK_TEMPLATE, newsletterTemplate );
358 
359         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_NEWSLETTER_TEMPLATE, getLocale( ), model );
360 
361         return getAdminPage( template.getHtml( ) );
362     }
363 
364     /**
365      * Processes the modification form of a newsletter template by recovering the parameters in the http request
366      * 
367      * @param request
368      *            the http request
369      * @return The Jsp URL of the process result
370      */
371     public String doModifyNewsletterTemplate( HttpServletRequest request )
372     {
373         try
374         {
375             // initialize the paths
376             String strPathImageNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_IMAGE_NEWSLETTER_TEMPLATE );
377             String strPathFileNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_TEMPLATE )
378                     + AppPropertiesService.getProperty( NewsLetterConstants.PROPERTY_PATH_FILE_NEWSLETTER_TEMPLATE );
379 
380             // create the multipart request
381             if ( request instanceof MultipartHttpServletRequest )
382             {
383                 MultipartHttpServletRequest multi = (MultipartHttpServletRequest) request;
384 
385                 // creation of the NewsLetterTemplate
386                 NewsLetterTemplate newsletterTemplate = NewsLetterTemplateHome
387                         .findByPrimaryKey( Integer.parseInt( multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID ) ), getPlugin( ) );
388 
389                 // Workgroup & RBAC permissions
390                 if ( !AdminWorkgroupService.isAuthorized( newsletterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
391                         Integer.toString( newsletterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_MODIFY, getUser( ) ) )
392                 {
393                     return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_ERROR );
394                 }
395 
396                 // Mandatory fields
397                 String strType = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_TYPE );
398                 String strDescription = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_NAME );
399                 String strWorkgroup = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_WORKGROUP );
400                 String strSectionNumber = request.getParameter( PARAMETER_TEMPLATE_SECTION );
401 
402                 if ( StringUtils.isEmpty( strDescription ) || StringUtils.isEmpty( strWorkgroup ) || !StringUtils.isNumeric( strSectionNumber ) )
403                 {
404                     return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
405                 }
406                 int nSections = Integer.parseInt( strSectionNumber );
407 
408                 // Names of the old files
409                 String strOldFileName = newsletterTemplate.getFileName( );
410                 String strOldImageName = newsletterTemplate.getPicture( );
411 
412                 FileItem imageItem = multi.getFile( PARAMETER_NEWSLETTER_TEMPLATE_NEW_PICTURE );
413                 String strImageFileName = null;
414                 File fileImage = null;
415 
416                 if ( ( imageItem != null ) && ( imageItem.getSize( ) != 0 ) )
417                 {
418                     strImageFileName = UploadUtil.cleanFileName( imageItem.getName( ) );
419                     String strError = null;
420                     if ( !FileUtil.hasImageExtension( strImageFileName ) )
421                     {
422                         strError = MESSAGE_WRONG_IMAGE_EXTENSION;
423                     }
424 
425                     String strFullPathNewImageFileName = strPathImageNewsletterTemplate + File.separator + strImageFileName;
426                     String strFullPathOldImageFileName = strPathImageNewsletterTemplate + File.separator + strOldImageName;
427                     fileImage = new File( strFullPathNewImageFileName );
428 
429                     if ( fileImage.exists( ) && !( strFullPathNewImageFileName ).equals( strFullPathOldImageFileName ) )
430                     {
431                         strError = MESSAGE_IMAGE_FILE_ALREADY_EXISTS;
432                     }
433                     if ( strError != null )
434                     {
435                         return AdminMessageService.getMessageUrl( request, strError, AdminMessage.TYPE_STOP );
436                     }
437 
438                     // we delete the old picture
439                     File oldImageFile = new File( strFullPathOldImageFileName );
440                     oldImageFile.delete( );
441                 }
442 
443                 FileItem modelItem = multi.getFile( PARAMETER_NEWSLETTER_TEMPLATE_NEW_FILE );
444 
445                 if ( ( modelItem != null ) && ( modelItem.getSize( ) != 0 ) )
446                 {
447                     String strFileName = UploadUtil.cleanFileName( modelItem.getName( ) );
448                     String strFullPathNewFileName = strPathFileNewsletterTemplate + File.separator + strFileName;
449                     String strFullPathOldFileName = strPathFileNewsletterTemplate + File.separator + strOldFileName;
450                     File fileTemplate = new File( strFullPathNewFileName );
451                     String strError = null;
452                     if ( fileTemplate.exists( ) && !( strFullPathNewFileName ).equals( strFullPathOldFileName ) )
453                     {
454                         strError = MESSAGE_FILE_ALREADY_EXISTS;
455                     }
456                     if ( !FileUtil.hasHtmlExtension( strFileName ) )
457                     {
458                         strError = MESSAGE_WRONG_HTML_EXTENSION;
459                     }
460                     if ( strError != null )
461                     {
462                         return AdminMessageService.getMessageUrl( request, strError, AdminMessage.TYPE_STOP );
463                     }
464 
465                     // we delete the old file
466                     File oldFile = new File( strFullPathOldFileName );
467                     oldFile.delete( );
468 
469                     modelItem.write( fileTemplate );
470                     newsletterTemplate.setFileName( strFileName );
471                 }
472 
473                 // if the two files are ok, write them
474                 if ( imageItem != null && fileImage != null && strImageFileName != null )
475                 {
476                     imageItem.write( fileImage );
477                     newsletterTemplate.setPicture( strImageFileName );
478                 }
479 
480                 // Complete the newsLetterTemplate
481                 newsletterTemplate.setDescription( strDescription );
482                 newsletterTemplate.setTopicType( strType );
483                 newsletterTemplate.setWorkgroup( strWorkgroup );
484 
485                 int nOldSectionNumber = newsletterTemplate.getSectionNumber( );
486                 NewsletterService.getService( ).modifySectionNumber( nOldSectionNumber, nSections, newsletterTemplate.getId( ) );
487                 if ( nSections > 0 )
488                 {
489                     newsletterTemplate.setSectionNumber( nSections );
490                 }
491                 NewsLetterTemplateHome.update( newsletterTemplate, getPlugin( ) );
492             }
493         }
494         catch( Exception e )
495         {
496             AppLogService.error( e.getMessage( ), e );
497         }
498 
499         return getHomeUrl( request );
500     }
501 
502     /**
503      * Builds the newsletter's templates modification page (with the modification of the file content)
504      * 
505      * @param request
506      *            The HTTP request
507      * @return the html code for newsletter's templates creation page
508      */
509     public String getModifyNewsLetterTemplateFile( HttpServletRequest request )
510     {
511         setPageTitleProperty( MESSAGE_PAGE_TITLE_MODIFY_TEMPLATE_FILE );
512 
513         Map<String, Object> model = new HashMap<String, Object>( );
514 
515         BufferedReader fileReader = null;
516         try
517         {
518             int nIdTemplate = Integer.parseInt( request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID ) );
519             NewsLetterTemplate newsletterTemplate = NewsLetterTemplateHome.findByPrimaryKey( nIdTemplate, getPlugin( ) );
520 
521             // Workgroup & RBAC permissions
522             if ( !AdminWorkgroupService.isAuthorized( newsletterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
523                     Integer.toString( newsletterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_MODIFY, getUser( ) ) )
524             {
525                 return getManageTemplates( request );
526             }
527 
528             // get the file content
529             String strPathFileNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_TEMPLATE )
530                     + AppPropertiesService.getProperty( NewsLetterConstants.PROPERTY_PATH_FILE_NEWSLETTER_TEMPLATE );
531 
532             String strFileName = newsletterTemplate.getFileName( );
533             fileReader = new BufferedReader( new FileReader( strPathFileNewsletterTemplate + File.separator + strFileName ) );
534 
535             StringBuilder sbSource = new StringBuilder( );
536             String line = fileReader.readLine( );
537 
538             while ( line != null )
539             {
540                 sbSource.append( line + CONSTANT_END_OF_LINE );
541                 line = fileReader.readLine( );
542             }
543 
544             fileReader.close( );
545 
546             model.put( NewsLetterConstants.MARK_TEMPLATE_TYPE, buildTemplateTypeList( AdminUserService.getLocale( request ) ) );
547 
548             model.put( NewsLetterConstants.MARK_TEMPLATE_SOURCE, sbSource.toString( ) );
549             model.put( NewsLetterConstants.MARK_TEMPLATE_FILE_NAME, strFileName );
550             model.put( NewsLetterConstants.MARK_TEMPLATE, newsletterTemplate );
551         }
552         catch( FileNotFoundException f )
553         {
554             AppLogService.debug( f );
555         }
556         catch( IOException i )
557         {
558             AppLogService.debug( i );
559         }
560         finally
561         {
562             IOUtils.closeQuietly( fileReader );
563         }
564         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_NEWSLETTER_TEMPLATE_FILE, getLocale( ), model );
565 
566         return getAdminPage( template.getHtml( ) );
567     }
568 
569     /**
570      * Processes the modification form of a newsletter template modified by hand by recovering the parameters in the http request
571      * 
572      * @param request
573      *            the http request
574      * @return The Jsp URL of the process result
575      */
576     public String doModifyNewsletterTemplateFile( HttpServletRequest request )
577     {
578         FileWriter fileWriter = null;
579         try
580         {
581             // initialize the paths
582             String strPathImageNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_IMAGE_NEWSLETTER_TEMPLATE );
583             String strPathFileNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_TEMPLATE )
584                     + AppPropertiesService.getProperty( NewsLetterConstants.PROPERTY_PATH_FILE_NEWSLETTER_TEMPLATE );
585 
586             // create the multipart request
587             if ( request instanceof MultipartHttpServletRequest )
588             {
589                 MultipartHttpServletRequest multi = (MultipartHttpServletRequest) request;
590 
591                 // creation of the NewsLetterTemplate
592                 NewsLetterTemplate newsletterTemplate = NewsLetterTemplateHome
593                         .findByPrimaryKey( Integer.parseInt( multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID ) ), getPlugin( ) );
594 
595                 // Workgroup & RBAC permissions
596                 if ( !AdminWorkgroupService.isAuthorized( newsletterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
597                         Integer.toString( newsletterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_MODIFY, getUser( ) ) )
598                 {
599                     return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_ERROR );
600                 }
601 
602                 // Mandatory fields
603                 String strType = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_TYPE );
604                 String strDescription = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_NAME );
605                 String strSectionNumber = request.getParameter( PARAMETER_TEMPLATE_SECTION );
606 
607                 if ( StringUtils.isEmpty( strDescription ) || !StringUtils.isNumeric( strSectionNumber ) )
608                 {
609                     return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
610                 }
611                 int nSections = Integer.parseInt( strSectionNumber );
612 
613                 // Names of the old files
614                 String strOldFileName = newsletterTemplate.getFileName( );
615                 String strOldImageName = newsletterTemplate.getPicture( );
616 
617                 FileItem imageItem = multi.getFile( PARAMETER_NEWSLETTER_TEMPLATE_NEW_PICTURE );
618 
619                 if ( ( imageItem != null ) && ( imageItem.getSize( ) != 0 ) )
620                 {
621                     String strFileName = UploadUtil.cleanFileName( imageItem.getName( ) );
622                     imageItem.write( new File( strPathImageNewsletterTemplate + File.separator + strFileName ) );
623                     newsletterTemplate.setPicture( strFileName );
624 
625                     // we delete the old picture
626                     File oldImageFile = new File( strPathImageNewsletterTemplate + File.separator + strOldImageName );
627                     oldImageFile.delete( );
628                 }
629 
630                 // Writes the new content of the file.
631                 String fileContent = multi.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_SOURCE );
632 
633                 fileWriter = new FileWriter( strPathFileNewsletterTemplate + File.separator + strOldFileName );
634                 fileWriter.write( fileContent );
635                 fileWriter.close( );
636 
637                 int nOldSectionNumber = newsletterTemplate.getSectionNumber( );
638                 NewsletterService.getService( ).modifySectionNumber( nOldSectionNumber, nSections, newsletterTemplate.getId( ) );
639 
640                 // Complete the newsLetterTemplate
641                 newsletterTemplate.setDescription( strDescription );
642                 newsletterTemplate.setTopicType( strType );
643                 if ( nSections > 0 )
644                 {
645                     newsletterTemplate.setSectionNumber( nSections );
646                 }
647                 NewsLetterTemplateHome.update( newsletterTemplate, getPlugin( ) );
648             }
649         }
650         catch( IOException io )
651         {
652             AppLogService.error( io.getMessage( ), io );
653         }
654         catch( Exception e )
655         {
656             AppLogService.error( e.getMessage( ), e );
657         }
658         finally
659         {
660             IOUtils.closeQuietly( fileWriter );
661         }
662 
663         return getHomeUrl( request );
664     }
665 
666     /**
667      * Manages the removal form of a newsletter template whose identifier is in the http request
668      * 
669      * @param request
670      *            The Http request
671      * @return the html code to confirm
672      */
673     public String getRemoveNewsLetterTemplate( HttpServletRequest request )
674     {
675         String strNewsletterTemplateId = request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID );
676         int nNewsletterTemplateId = Integer.parseInt( strNewsletterTemplateId );
677         NewsLetterTemplate newsletterTemplate = NewsLetterTemplateHome.findByPrimaryKey( nNewsletterTemplateId, getPlugin( ) );
678 
679         // Workgroup & RBAC permissions
680         if ( !AdminWorkgroupService.isAuthorized( newsletterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
681                 Integer.toString( newsletterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_DELETE, getUser( ) ) )
682         {
683             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_ERROR );
684         }
685         List<String> listMessages = new ArrayList<String>( );
686         if ( !NewsletterTemplateRemovalService.getService( ).checkForRemoval( strNewsletterTemplateId, listMessages, AdminUserService.getLocale( request ) ) )
687         {
688             Object [ ] args = {
689                     listMessages.get( 0 )
690             };
691             return AdminMessageService.getMessageUrl( request, MESSAGE_USED_TEMPLATE, args, AdminMessage.TYPE_STOP );
692         }
693 
694         UrlItem url = new UrlItem( JSP_DO_REMOVE_NEWSLETTER_TEMPLATE );
695         url.addParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID,
696                 Integer.parseInt( request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID ) ) );
697 
698         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_NEWSLETTER_TEMPLATE, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
699     }
700 
701     /**
702      * Processes the removal form of a newsletter template
703      * 
704      * @param request
705      *            The Http request
706      * @return the jsp URL to display the form to manage newsletter templates
707      */
708     public String doRemoveNewsLetterTemplate( HttpServletRequest request )
709     {
710         int nNewsletterTemplateId = Integer.parseInt( request.getParameter( NewsLetterConstants.PARAMETER_NEWSLETTER_TEMPLATE_ID ) );
711 
712         NewsLetterTemplate newsLetterTemplate = NewsLetterTemplateHome.findByPrimaryKey( nNewsletterTemplateId, getPlugin( ) );
713 
714         // Workgroup & RBAC permissions
715         if ( !AdminWorkgroupService.isAuthorized( newsLetterTemplate, getUser( ) ) || !RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE,
716                 Integer.toString( newsLetterTemplate.getId( ) ), NewsletterTemplateResourceIdService.PERMISSION_DELETE, getUser( ) ) )
717         {
718             return AdminMessageService.getMessageUrl( request, Messages.USER_ACCESS_DENIED, AdminMessage.TYPE_ERROR );
719         }
720 
721         String strFileName = newsLetterTemplate.getFileName( );
722         String strPictureName = newsLetterTemplate.getPicture( );
723 
724         // removes the file
725         String strPathFileNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_TEMPLATE )
726                 + AppPropertiesService.getProperty( NewsLetterConstants.PROPERTY_PATH_FILE_NEWSLETTER_TEMPLATE );
727         File file = new File( strPathFileNewsletterTemplate + NewsLetterConstants.CONSTANT_SLASH + strFileName );
728 
729         if ( file.exists( ) )
730         {
731             file.delete( );
732         }
733 
734         // removes the picture
735         String strPathImageNewsletterTemplate = AppPathService.getPath( PROPERTY_PATH_IMAGE_NEWSLETTER_TEMPLATE );
736         File picture = new File( strPathImageNewsletterTemplate + NewsLetterConstants.CONSTANT_SLASH + strPictureName );
737 
738         if ( picture.exists( ) )
739         {
740             picture.delete( );
741         }
742 
743         // removes the newsletter template from the database
744         NewsLetterTemplateHome.remove( nNewsletterTemplateId, getPlugin( ) );
745 
746         // loads the newsletter templates management page
747         // If the operation occurred well returns on the info of the newsletter
748         UrlItem url = new UrlItem( JSP_URL_MANAGE_NEWSLETTER_TEMPLATES );
749 
750         return url.getUrl( );
751     }
752 
753     /**
754      * {@inheritDoc}
755      */
756     @Override
757     public Plugin getPlugin( )
758     {
759         return PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME );
760     }
761 
762     /**
763      * Build a radio buttons list of template types from properties
764      * 
765      * @param locale
766      *            The locale
767      * @return the html code for the radio buttons list
768      */
769     private ReferenceList buildTemplateTypeList( Locale locale )
770     {
771         ReferenceList refTemplateTypeList = _newsletterTopicService.getNewsletterTopicTypeRefList( locale );
772         ReferenceItem refItemTemplate = new ReferenceItem( );
773         refItemTemplate.setCode( NewsLetterTemplate.RESOURCE_TYPE );
774         refItemTemplate.setName( I18nService.getLocalizedString( MESSAGE_NEWSLETTER_TEMPLATE, locale ) );
775         refTemplateTypeList.add( 0, refItemTemplate );
776 
777         return refTemplateTypeList;
778     }
779 
780     /**
781      * Check if user is authorized to create a newsletter template
782      * 
783      * @param request
784      *            The {@link HttpServletRequest}
785      * @return true if creation is authorized, false otherwise
786      */
787     private boolean isNewsletterTemplateCreationAllowed( HttpServletRequest request )
788     {
789         // RBAC permission
790         AdminUser user = AdminUserService.getAdminUser( request );
791         if ( RBACService.isAuthorized( NewsLetterTemplate.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID, NewsletterTemplateResourceIdService.PERMISSION_CREATE,
792                 user ) )
793         {
794             return true;
795         }
796 
797         Collection<NewsLetterTemplate> listNewsletterTemplates = NewsLetterTemplateHome.getTemplatesList( getPlugin( ) );
798         listNewsletterTemplates = AdminWorkgroupService.getAuthorizedCollection( listNewsletterTemplates, user );
799 
800         for ( NewsLetterTemplate newsletterTemplate : listNewsletterTemplates )
801         {
802             if ( RBACService.isAuthorized( newsletterTemplate, NewsletterTemplateResourceIdService.PERMISSION_CREATE, user ) )
803             {
804                 return true;
805             }
806         }
807 
808         return false;
809     }
810 
811 }