PageTemplatesJspBean.java

  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.portal.web.style;

  35. import java.io.File;
  36. import java.io.FileOutputStream;
  37. import java.io.IOException;
  38. import java.util.HashMap;
  39. import java.util.Map;

  40. import javax.servlet.http.HttpServletRequest;

  41. import org.apache.commons.fileupload.FileItem;
  42. import org.apache.commons.lang3.StringUtils;

  43. import fr.paris.lutece.portal.business.style.PageTemplate;
  44. import fr.paris.lutece.portal.business.style.PageTemplateHome;
  45. import fr.paris.lutece.portal.service.admin.AccessDeniedException;
  46. import fr.paris.lutece.portal.service.fileupload.FileUploadService;
  47. import fr.paris.lutece.portal.service.message.AdminMessage;
  48. import fr.paris.lutece.portal.service.message.AdminMessageService;
  49. import fr.paris.lutece.portal.service.security.SecurityTokenService;
  50. import fr.paris.lutece.portal.service.template.AppTemplateService;
  51. import fr.paris.lutece.portal.service.util.AppLogService;
  52. import fr.paris.lutece.portal.service.util.AppPathService;
  53. import fr.paris.lutece.portal.service.util.AppPropertiesService;
  54. import fr.paris.lutece.portal.web.admin.AdminFeaturesPageJspBean;
  55. import fr.paris.lutece.portal.web.constants.Messages;
  56. import fr.paris.lutece.portal.web.constants.Parameters;
  57. import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
  58. import fr.paris.lutece.util.file.FileUtil;
  59. import fr.paris.lutece.util.html.HtmlTemplate;

  60. /**
  61.  * This class provides the user interface to manage page templates features ( manage, create, modify, remove)
  62.  */
  63. public class PageTemplatesJspBean extends AdminFeaturesPageJspBean
  64. {
  65.     // Right
  66.     /**
  67.      * Right to manage page templates
  68.      */
  69.     public static final String RIGHT_MANAGE_PAGE_TEMPLATES = "CORE_PAGE_TEMPLATE_MANAGEMENT";

  70.     /**
  71.      * Serial version UID
  72.      */
  73.     private static final long serialVersionUID = -142214702397662732L;

  74.     // Properties for page titles
  75.     private static final String PROPERTY_PAGE_TITLE_PAGE_TEMPLATE_LIST = "portal.style.manage_page_templates.pageTitle";
  76.     private static final String PROPERTY_PAGE_TITLE_CREATE_PAGE_TEMPLATE = "portal.style.create_page_template.pageTitle";
  77.     private static final String PROPERTY_PAGE_TITLE_MODIFY_PAGE_TEMPLATE = "portal.style.modify_page_template.pageTitle";

  78.     // Markers
  79.     private static final String MARK_PAGE_TEMPLATES_LIST = "page_templates_list";
  80.     private static final String MARK_PAGE_TEMPLATE = "page_template";

  81.     // Templates files path
  82.     private static final String TEMPLATE_PAGE_TEMPLATES = "admin/style/manage_page_templates.html";
  83.     private static final String TEMPLATE_CREATE_PAGE_TEMPLATE = "admin/style/create_page_template.html";
  84.     private static final String TEMPLATE_MODIFY_PAGE_TEMPLATE = "admin/style/modify_page_template.html";

  85.     // Properties
  86.     private static final String PROPERTY_PATH_TEMPLATE = "path.templates";
  87.     private static final String PROPERTY_PATH_FILE_PAGE_TEMPLATE = "path.file.page.template";
  88.     private static final String PROPERTY_PATH_IMAGE_PAGE_TEMPLATE = "path.image.page.template";

  89.     // Messages
  90.     private static final String MESSAGE_CONFIRM_DELETE_PAGE_TEMPLATE = "portal.style.message.pageTemplateConfirmDelete";
  91.     private static final String MESSAGE_PAGE_TEMPLATE_IS_USED = "portal.style.message.pageTemplateIsUsed";
  92.     private static final String MESSAGE_WRONG_IMAGE_EXTENSION = "portal.util.message.wrongImageExtention";
  93.     private static final String MESSAGE_WRONG_HTML_EXTENSION = "portal.util.message.wrongHtmlExtention";

  94.     // Parameters
  95.     private static final String PARAMETER_PAGE_TEMPLATE_FILE = "page_template_file";
  96.     private static final String PARAMETER_PAGE_TEMPLATE_PICTURE = "page_template_picture";
  97.     private static final String PARAMETER_PAGE_TEMPLATE_UPDATE_IMAGE = "update_image";
  98.     private static final String PARAMETER_PAGE_TEMPLATE_UPDATE_FILE = "update_file";
  99.     private static final String PATH_IMAGE_PAGE_TEMPLATE = AppPathService.getPath( PROPERTY_PATH_IMAGE_PAGE_TEMPLATE ) + File.separator;
  100.     private static final String PATH_TEMPLATE = AppPathService.getPath( PROPERTY_PATH_TEMPLATE ) + File.separator
  101.             + AppPropertiesService.getProperty( PROPERTY_PATH_FILE_PAGE_TEMPLATE );

  102.     // JSP
  103.     private static final String JSP_DO_REMOVE_PAGE_TEMPLATE = "jsp/admin/style/DoRemovePageTemplate.jsp";

  104.     /**
  105.      * Returns the list of page templates
  106.      *
  107.      * @param request
  108.      *            The Http request
  109.      * @return the html code for display the page templates list
  110.      */
  111.     public String getManagePageTemplate( HttpServletRequest request )
  112.     {
  113.         setPageTitleProperty( PROPERTY_PAGE_TITLE_PAGE_TEMPLATE_LIST );

  114.         HashMap<String, Object> model = new HashMap<>( );
  115.         model.put( MARK_PAGE_TEMPLATES_LIST, PageTemplateHome.getPageTemplatesList( ) );

  116.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_PAGE_TEMPLATES, getLocale( ), model );

  117.         return getAdminPage( template.getHtml( ) );
  118.     }

  119.     /**
  120.      * Returns the page template form of creation
  121.      *
  122.      * @param request
  123.      *            The Http request
  124.      * @return the html code of the page template
  125.      */
  126.     public String getCreatePageTemplate( HttpServletRequest request )
  127.     {
  128.         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE_PAGE_TEMPLATE );

  129.         HashMap<String, Object> model = new HashMap<>( );
  130.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_CREATE_PAGE_TEMPLATE ) );

  131.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_PAGE_TEMPLATE, getLocale( ), model );

  132.         return getAdminPage( template.getHtml( ) );
  133.     }

  134.     /**
  135.      * Processes the creation form of a new page template by recovering the parameters in the http request
  136.      *
  137.      * @param request
  138.      *            the http request
  139.      * @return The Jsp URL of the process result
  140.      * @throws AccessDeniedException
  141.      *             if the security token is invalid
  142.      */
  143.     public String doCreatePageTemplate( HttpServletRequest request ) throws AccessDeniedException
  144.     {
  145.         PageTemplate pageTemplate = new PageTemplate( );

  146.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

  147.         String strDescription = multipartRequest.getParameter( Parameters.PAGE_TEMPLATE_DESCRIPTION );

  148.         // Mandatory fields
  149.         if ( StringUtils.isEmpty( strDescription ) )
  150.         {
  151.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
  152.         }

  153.         FileItem fileTemplate = multipartRequest.getFile( PARAMETER_PAGE_TEMPLATE_FILE );
  154.         FileItem filePicture = multipartRequest.getFile( PARAMETER_PAGE_TEMPLATE_PICTURE );

  155.         String strFileName = FileUploadService.getFileNameOnly( fileTemplate );
  156.         String strPictureName = FileUploadService.getFileNameOnly( filePicture );

  157.         if ( StringUtils.isEmpty( strFileName ) || StringUtils.isEmpty( strPictureName ) )
  158.         {
  159.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FILE, AdminMessage.TYPE_STOP );
  160.         }

  161.         if ( !( FileUtil.hasHtmlExtension( strFileName ) || FileUtil.hasFreemarkerExtension( strFileName ) ) )
  162.         {
  163.             return AdminMessageService.getMessageUrl( request, MESSAGE_WRONG_HTML_EXTENSION, AdminMessage.TYPE_STOP );
  164.         }

  165.         if ( !FileUtil.hasImageExtension( strPictureName ) )
  166.         {
  167.             return AdminMessageService.getMessageUrl( request, MESSAGE_WRONG_IMAGE_EXTENSION, AdminMessage.TYPE_STOP );
  168.         }

  169.         if ( !SecurityTokenService.getInstance( ).validate( multipartRequest, TEMPLATE_CREATE_PAGE_TEMPLATE ) )
  170.         {
  171.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  172.         }

  173.         pageTemplate.setFile( AppPropertiesService.getProperty( PROPERTY_PATH_FILE_PAGE_TEMPLATE ) + strFileName );
  174.         writeTemplateFile( strFileName, PATH_TEMPLATE, fileTemplate );

  175.         pageTemplate.setPicture( strPictureName );

  176.         writeTemplateFile( strPictureName, PATH_IMAGE_PAGE_TEMPLATE, filePicture );

  177.         pageTemplate.setDescription( strDescription );
  178.         PageTemplateHome.create( pageTemplate );

  179.         // If the process is successful, redirects towards the theme view
  180.         return getHomeUrl( request );
  181.     }

  182.     /**
  183.      * Returns the page template form of update
  184.      *
  185.      * @param request
  186.      *            The Http request
  187.      * @return the html code of the page template form
  188.      */
  189.     public String getModifyPageTemplate( HttpServletRequest request )
  190.     {
  191.         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY_PAGE_TEMPLATE );

  192.         String strId = request.getParameter( Parameters.PAGE_TEMPLATE_ID );

  193.         HashMap<String, Object> model = new HashMap<>( );
  194.         model.put( MARK_PAGE_TEMPLATE, PageTemplateHome.findByPrimaryKey( Integer.parseInt( strId ) ) );
  195.         model.put( SecurityTokenService.MARK_TOKEN, SecurityTokenService.getInstance( ).getToken( request, TEMPLATE_MODIFY_PAGE_TEMPLATE ) );

  196.         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_PAGE_TEMPLATE, getLocale( ), model );

  197.         return getAdminPage( template.getHtml( ) );
  198.     }

  199.     /**
  200.      * Processes the updating form of a page template whose new parameters are stored in the http request
  201.      *
  202.      * @param request
  203.      *            The http request
  204.      * @return The Jsp URL of the process result
  205.      * @throws AccessDeniedException
  206.      *             if the security token is invalid
  207.      */
  208.     public String doModifyPageTemplate( HttpServletRequest request ) throws AccessDeniedException
  209.     {
  210.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

  211.         String strId = multipartRequest.getParameter( Parameters.PAGE_TEMPLATE_ID );
  212.         String strDescription = multipartRequest.getParameter( Parameters.PAGE_TEMPLATE_DESCRIPTION );
  213.         String strUpdatePicture = multipartRequest.getParameter( PARAMETER_PAGE_TEMPLATE_UPDATE_IMAGE );
  214.         String strUpdateFile = multipartRequest.getParameter( PARAMETER_PAGE_TEMPLATE_UPDATE_FILE );

  215.         PageTemplate pageTemplate = PageTemplateHome.findByPrimaryKey( Integer.parseInt( strId ) );

  216.         boolean bUpdateFile = false;
  217.         boolean bUpdatePicture = false;
  218.         FileItem fileTemplate = multipartRequest.getFile( PARAMETER_PAGE_TEMPLATE_FILE );
  219.         String strFileName = FileUploadService.getFileNameOnly( fileTemplate );
  220.         FileItem filePicture = multipartRequest.getFile( PARAMETER_PAGE_TEMPLATE_PICTURE );
  221.         String strPictureName = FileUploadService.getFileNameOnly( filePicture );

  222.         boolean bHasError = false;

  223.         if ( strUpdateFile != null )
  224.         {
  225.             if ( StringUtils.isEmpty( strFileName ) )
  226.             {
  227.                 bHasError = true;
  228.             }
  229.             else
  230.                 if ( !( FileUtil.hasHtmlExtension( strFileName ) || FileUtil.hasFreemarkerExtension( strFileName ) ) )
  231.                 {
  232.                     return AdminMessageService.getMessageUrl( request, MESSAGE_WRONG_HTML_EXTENSION, AdminMessage.TYPE_STOP );
  233.                 }

  234.             bUpdateFile = true;
  235.         }

  236.         if ( strUpdatePicture != null )
  237.         {
  238.             if ( StringUtils.isEmpty( strPictureName ) )
  239.             {
  240.                 bHasError = true;
  241.             }
  242.             else
  243.                 if ( !FileUtil.hasImageExtension( strPictureName ) )
  244.                 {
  245.                     return AdminMessageService.getMessageUrl( request, MESSAGE_WRONG_IMAGE_EXTENSION, AdminMessage.TYPE_STOP );
  246.                 }

  247.             bUpdatePicture = true;
  248.         }

  249.         if ( bHasError || StringUtils.isEmpty( strDescription ) )
  250.         {
  251.             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FILE, AdminMessage.TYPE_STOP );
  252.         }

  253.         if ( !SecurityTokenService.getInstance( ).validate( multipartRequest, TEMPLATE_MODIFY_PAGE_TEMPLATE ) )
  254.         {
  255.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  256.         }

  257.         if ( bUpdateFile )
  258.         {
  259.             FileUtil.deleteFile( new File( AppPathService.getPath( PROPERTY_PATH_TEMPLATE ), pageTemplate.getFile( ) ) );
  260.             pageTemplate.setFile( AppPropertiesService.getProperty( PROPERTY_PATH_FILE_PAGE_TEMPLATE ) + strFileName );

  261.             writeTemplateFile( strFileName, PATH_TEMPLATE, fileTemplate );
  262.         }

  263.         if ( bUpdatePicture )
  264.         {
  265.             FileUtil.deleteFile( new File( PATH_IMAGE_PAGE_TEMPLATE, pageTemplate.getPicture( ) ) );
  266.             pageTemplate.setPicture( strPictureName );

  267.             writeTemplateFile( strPictureName, PATH_IMAGE_PAGE_TEMPLATE, filePicture );
  268.         }

  269.         pageTemplate.setDescription( strDescription );
  270.         PageTemplateHome.update( pageTemplate );

  271.         // If the process is successful, redirects towards the page template management
  272.         // page
  273.         return getHomeUrl( request );
  274.     }

  275.     /**
  276.      * Returns the confirm of removing the page_template whose identifier is in the http request
  277.      *
  278.      * @param request
  279.      *            The Http request
  280.      * @return the html code for the remove confirmation page
  281.      */
  282.     public String getConfirmRemovePageTemplate( HttpServletRequest request )
  283.     {
  284.         String strId = request.getParameter( Parameters.PAGE_TEMPLATE_ID );
  285.         int nId = Integer.parseInt( strId );

  286.         boolean bIsUsed = PageTemplateHome.checkStylePageTemplateIsUsed( nId );

  287.         if ( !bIsUsed )
  288.         {
  289.             return AdminMessageService.getMessageUrl( request, MESSAGE_PAGE_TEMPLATE_IS_USED, AdminMessage.TYPE_STOP );
  290.         }

  291.         PageTemplate pageTemplate = PageTemplateHome.findByPrimaryKey( Integer.parseInt( strId ) );
  292.         String strPathPageTemplateFile = AppPathService.getPath( PROPERTY_PATH_TEMPLATE ) + File.separator + pageTemplate.getFile( );
  293.         String strPathPictureFile = PATH_IMAGE_PAGE_TEMPLATE + pageTemplate.getPicture( );
  294.         Object [ ] args = {
  295.                 strPathPageTemplateFile, strPathPictureFile
  296.         };

  297.         Map<String, Object> parameters = new HashMap<>( );
  298.         parameters.put( Parameters.PAGE_TEMPLATE_ID, strId );
  299.         parameters.put( SecurityTokenService.PARAMETER_TOKEN, SecurityTokenService.getInstance( ).getToken( request, JSP_DO_REMOVE_PAGE_TEMPLATE ) );
  300.         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE_PAGE_TEMPLATE, args, null, JSP_DO_REMOVE_PAGE_TEMPLATE, null,
  301.                 AdminMessage.TYPE_CONFIRMATION, parameters );
  302.     }

  303.     /**
  304.      * Processes the deletion of a page template
  305.      *
  306.      * @param request
  307.      *            the http request
  308.      * @return The Jsp URL of the process result
  309.      * @throws AccessDeniedException
  310.      *             if the security token is invalid
  311.      */
  312.     public String doRemovePageTemplate( HttpServletRequest request ) throws AccessDeniedException
  313.     {
  314.         if ( !SecurityTokenService.getInstance( ).validate( request, JSP_DO_REMOVE_PAGE_TEMPLATE ) )
  315.         {
  316.             throw new AccessDeniedException( ERROR_INVALID_TOKEN );
  317.         }

  318.         String strId = request.getParameter( Parameters.PAGE_TEMPLATE_ID );
  319.         int nId = Integer.parseInt( strId );

  320.         // Delete files associated
  321.         PageTemplate pageTemplate = PageTemplateHome.findByPrimaryKey( Integer.parseInt( strId ) );

  322.         File filePageTemplateToDelete = new File( AppPathService.getPath( PROPERTY_PATH_TEMPLATE ), pageTemplate.getFile( ) );
  323.         FileUtil.deleteFile( filePageTemplateToDelete );

  324.         File filePictureToDelete = new File( PATH_IMAGE_PAGE_TEMPLATE, pageTemplate.getPicture( ) );
  325.         FileUtil.deleteFile( filePictureToDelete );

  326.         PageTemplateHome.remove( nId );

  327.         return getHomeUrl( request );
  328.     }

  329.     // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330.     // private methods

  331.     /**
  332.      * Write the templates files (html and image)
  333.      *
  334.      * @param strFileName
  335.      *            The name of the file
  336.      * @param strPath
  337.      *            The path of the file
  338.      * @param fileItem
  339.      *            The fileItem object which contains the new file
  340.      */
  341.     private void writeTemplateFile( String strFileName, String strPath, FileItem fileItem )
  342.     {
  343.         File file = new File( strPath + strFileName );
  344.         FileUtil.deleteFile( file );

  345.         try ( FileOutputStream fosFile = new FileOutputStream( file ) )
  346.         {
  347.             fosFile.write( fileItem.get( ) );
  348.         }
  349.         catch( IOException e )
  350.         {
  351.             AppLogService.error( e.getMessage( ), e );
  352.         }
  353.     }
  354. }