FormsPDFTaskTemplateJspBean.java

/*
 * Copyright (c) 2002-2023, City of Paris
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice
 *     and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice
 *     and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *
 *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * License 1.0
 */
package fr.paris.lutece.plugins.workflow.modules.formspdf.web.task;

import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.math.NumberUtils;

import fr.paris.lutece.plugins.forms.business.Form;
import fr.paris.lutece.plugins.forms.business.FormHome;
import fr.paris.lutece.plugins.forms.service.provider.GenericFormsProvider;
import fr.paris.lutece.plugins.workflow.modules.formspdf.business.FormsPDFTaskTemplate;
import fr.paris.lutece.plugins.workflow.modules.formspdf.business.FormsPDFTaskTemplateHome;
import fr.paris.lutece.portal.util.mvc.admin.MVCAdminJspBean;
import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
import fr.paris.lutece.portal.util.mvc.commons.annotations.View;

@Controller( controllerJsp = "ManageTemplates.jsp", controllerPath = "jsp/admin/plugins/workflow/modules/formspdf/", right = "WORKFLOW_MANAGEMENT" )
public class FormsPDFTaskTemplateJspBean extends MVCAdminJspBean{

	private static final long serialVersionUID = 1L;
	
	public static final int DEFAULT_ID_VALUE = NumberUtils.BYTE_MINUS_ONE;
	
	// Templates
	private static final String TEMPLATE_MANAGE_FORMS_PDF_TEMPLATES = "/admin/plugins/workflow/modules/formspdf/manage_forms_pdf_templates.html";
	private static final String TEMPLATE_MODIFY_FORMS_PDF_TEMPLATE = "/admin/plugins/workflow/modules/formspdf/modify_forms_pdf_template.html";
	
	// Views
    private static final String VIEW_MANAGE_TEMPLATES = "manageTemplates";
    private static final String VIEW_MODIFY_TEMPLATE = "modifyTemplate";
    
    // Actions
    private static final String ACTION_MODIFY_TEMPLATE = "modifyTemplate";
    private static final String ACTION_REMOVE_TEMPLATE = "removeTemplate";
    
    // Parameters
    private static final String PARAMETER_TASK_ID = "task_id";
    private static final String PARAMETER_TEMPLATE_ID = "template_id";
    private static final String PARAMETER_TEMPLATE_NAME = "template_name";
    private static final String PARAMETER_TEMPLATE_ID_FORM = "template_id_form";
    private static final String PARAMETER_TEMPLATE_ASSOCIATE_FORM = "template_associate_form";
    private static final String PARAMETER_TEMPLATE_CONTENT = "template_content";
	private static final String PARAMETER_RICH_TEXT_EDITOR = "rte";

	// Markers
	private static final String MARK_RICH_TEXT_EDITOR = "rte";
    private static final String MARK_TEMPLATE_PDF_LIST = "template_pdf_list";
    private static final String MARK_FORMS_PDF_TASK_TEMPLATE = "forms_pdf_task_template";
    private static final String MARK_TASK_ID = "task_id";
    private static final String MARK_LIST_MARKERS = "list_markers";
    private static final String MARK_FORMS_LIST = "forms_list";
    
    // session fields
    private int _nIdTask;

	//Properties

	private static final String PROPERTY_PAGE_TITLE_MANAGE_FORMS_PDF_TEMPLATES = "module.workflow.formspdf.manage.template.title";
	private static final String PROPERTY_PAGE_TITLE_MODIFY_FORMS_PDF_TEMPLATES = "module.workflow.formspdf.modify.template.title";
    @View( value = VIEW_MANAGE_TEMPLATES, defaultView = true )
    public String getManageTemplates( HttpServletRequest request )
    {
    	Locale locale = getLocale( );
    	Map<String, Object> model = getModel( );
    	
        if (_nIdTask == 0)
        {
        	_nIdTask = NumberUtils.toInt( request.getParameter(PARAMETER_TASK_ID), DEFAULT_ID_VALUE);
        }
        model.put(MARK_TASK_ID, _nIdTask);
        
        model.put(MARK_TEMPLATE_PDF_LIST, FormsPDFTaskTemplateHome.findAllWithFormTitles());

		return getPage(PROPERTY_PAGE_TITLE_MANAGE_FORMS_PDF_TEMPLATES, TEMPLATE_MANAGE_FORMS_PDF_TEMPLATES, model);
    }
    
    @View( value = VIEW_MODIFY_TEMPLATE )
    public String getModifyTemplate( HttpServletRequest request )
    {
    	Locale locale = getLocale( );
    	Map<String, Object> model = getModel( );
		FormsPDFTaskTemplate formsPDFTaskTemplate = null;
    	int nIdTemplate = NumberUtils.toInt( request.getParameter( PARAMETER_TEMPLATE_ID ), DEFAULT_ID_VALUE );
    	if (nIdTemplate > 0)
    	{
    		formsPDFTaskTemplate = FormsPDFTaskTemplateHome.findByPrimaryKey(nIdTemplate);
    	} else {
    		formsPDFTaskTemplate = new FormsPDFTaskTemplate();
    		formsPDFTaskTemplate.setGeneric(true);
			formsPDFTaskTemplate.setRte(true);
    	}
		Boolean isRichTextEditor = Boolean.parseBoolean( request.getParameter( PARAMETER_RICH_TEXT_EDITOR ) );
		if(request.getParameter( PARAMETER_RICH_TEXT_EDITOR ) == null)
		{
			isRichTextEditor = formsPDFTaskTemplate.isRte();
		} 
			model.put(MARK_RICH_TEXT_EDITOR, isRichTextEditor );
		// format the content
		if (isRichTextEditor) {
			if(!formsPDFTaskTemplate.isRte()) {
				formsPDFTaskTemplate.setContent(convertMacroToSquareBrackets(formsPDFTaskTemplate.getContent()));
			}
		} else {
			if(formsPDFTaskTemplate.isRte()) {
				formsPDFTaskTemplate.setContent(convertMacroToSuppMinor(formsPDFTaskTemplate.getContent()));
			}
		}
    	model.put(MARK_FORMS_PDF_TASK_TEMPLATE, formsPDFTaskTemplate);
    	
    	model.put( MARK_FORMS_LIST, FormHome.getFormsReferenceList( ) );
    	
    	// markers
    	Form form = FormHome.findByPrimaryKey( formsPDFTaskTemplate.getIdForm());
    	model.put(MARK_LIST_MARKERS, GenericFormsProvider.getProviderMarkerDescriptions(form != null ? form : new Form()));

		return getPage(PROPERTY_PAGE_TITLE_MODIFY_FORMS_PDF_TEMPLATES, TEMPLATE_MODIFY_FORMS_PDF_TEMPLATE, model);
	}
    
    @Action( value = ACTION_MODIFY_TEMPLATE )
    public String doModifyTemplate( HttpServletRequest request )
    {
    	int nIdTemplate = NumberUtils.toInt( request.getParameter( PARAMETER_TEMPLATE_ID ), DEFAULT_ID_VALUE );
    	FormsPDFTaskTemplate formsPDFTaskTemplateToEdit = FormsPDFTaskTemplateHome.findByPrimaryKey(nIdTemplate);
    	
    	if (formsPDFTaskTemplateToEdit == null)
    	{
    		formsPDFTaskTemplateToEdit = new FormsPDFTaskTemplate();
    		populateFormsPDFTaskTemplate(request, formsPDFTaskTemplateToEdit);
    		FormsPDFTaskTemplateHome.create(formsPDFTaskTemplateToEdit);
    	} else {
    		populateFormsPDFTaskTemplate(request, formsPDFTaskTemplateToEdit);
    		FormsPDFTaskTemplateHome.update(formsPDFTaskTemplateToEdit);
    	}
    	
    	return redirectView( request, VIEW_MANAGE_TEMPLATES );
    }
    
    @Action( value = ACTION_REMOVE_TEMPLATE )
    public String doRemoveTemplate( HttpServletRequest request )
    {
    	int nIdTemplate = NumberUtils.toInt( request.getParameter( PARAMETER_TEMPLATE_ID ), DEFAULT_ID_VALUE );
    	
    	if (nIdTemplate > DEFAULT_ID_VALUE)
    	{
    		FormsPDFTaskTemplateHome.remove(nIdTemplate);
    	}
    	return redirectView( request, VIEW_MANAGE_TEMPLATES );
    }
    
    private FormsPDFTaskTemplate populateFormsPDFTaskTemplate(HttpServletRequest request, FormsPDFTaskTemplate formsPDFTaskTemplateToEdit)
    {
    	formsPDFTaskTemplateToEdit.setName(request.getParameter( PARAMETER_TEMPLATE_NAME ));
    	
    	boolean isAssociateForm = Boolean.parseBoolean(request.getParameter(PARAMETER_TEMPLATE_ASSOCIATE_FORM));
    	formsPDFTaskTemplateToEdit.setGeneric(!isAssociateForm);
    	if (isAssociateForm)
    	{
    		formsPDFTaskTemplateToEdit.setIdForm(NumberUtils.toInt( request.getParameter( PARAMETER_TEMPLATE_ID_FORM ), DEFAULT_ID_VALUE));
    	}
    	else
    	{
    		formsPDFTaskTemplateToEdit.setIdForm(DEFAULT_ID_VALUE);
    	}
    	
		formsPDFTaskTemplateToEdit.setContent(request.getParameter( PARAMETER_TEMPLATE_CONTENT ));
		formsPDFTaskTemplateToEdit.setRte(Boolean.parseBoolean( request.getParameter( PARAMETER_RICH_TEXT_EDITOR ) ));
		
		return formsPDFTaskTemplateToEdit;
    }

	/**
	 * Convert the macro to display responses to the usual supp and minor
	 * @param strtemplate
	 * @return the string with the macro converted
	 */
	private String convertMacroToSuppMinor(String strtemplate)
	{
		if( strtemplate != null )
		{
			strtemplate = strtemplate.replaceAll("\\[@displayEntry q=position_(\\d+)/]", "<@displayEntry q=position_$1/>");
		}
		return strtemplate;
	}

	/**
	 * Convert the macro to display responses to the square brackets
	 * @param strtemplate
	 * @return the string with the macro converted
	 */
	private String convertMacroToSquareBrackets(String strtemplate)
	{
		if( strtemplate != null )
		{
			strtemplate = strtemplate.replaceAll("<@displayEntry q=position_(\\d+)/>", "[@displayEntry q=position_$1/]");
		}
		return strtemplate;
	}

}