AppTemplateService.java
/*
* Copyright (c) 2002-2022, 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.portal.service.template;
import fr.paris.lutece.portal.service.datastore.DatastoreService;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.i18n.I18nTemplateMethod;
import fr.paris.lutece.portal.service.plugin.Plugin;
import fr.paris.lutece.portal.service.plugin.PluginService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.util.html.HtmlTemplate;
import java.util.Locale;
/**
* This Service is used to retreive HTML templates, stored as files in the WEB-INF/templates directory of the webapp, to build the user interface. It provides a
* cache feature to prevent from loading file each time it is asked.
*/
public final class AppTemplateService
{
// Variables
private static String _strTemplateDefaultPath;
private static IFreeMarkerTemplateService _freeMarkerTemplateService;
/**
* Protected constructor
*/
private AppTemplateService( )
{
}
/**
* Initializes the service with the templates's path
*
* @param strTemplatePath
* The template path
*/
public static void init( String strTemplatePath )
{
_strTemplateDefaultPath = strTemplatePath;
getFreeMarkerTemplateService( ).setSharedVariable( "i18n", new I18nTemplateMethod( ) );
}
/**
* Initializes autoincludes for plugins.
*/
public static void initAutoIncludes( )
{
// register core (commons declared in core.xml)
Plugin corePlugin = PluginService.getCore( );
addPluginMacros( corePlugin );
// register plugins
for ( Plugin plugin : PluginService.getPluginList( ) )
{
addPluginMacros( plugin );
}
// activate current commons stored in the datastore
CommonsService.activateCommons( CommonsService.getCurrentCommonsKey( ) );
}
/**
* Adds the plugin macros.
*
* @param plugin
* the plugin
*/
private static void addPluginMacros( Plugin plugin )
{
for ( String strFileName : plugin.getFreeMarkerMacrosFiles( ) )
{
AppLogService.info( "New freemarker autoinclude : {} from {}", strFileName, plugin.getName( ) );
getFreeMarkerTemplateService( ).addPluginMacros( strFileName );
}
}
/**
* Reset the cache
*/
public static void resetCache( )
{
getFreeMarkerTemplateService( ).resetCache( );
}
/**
* Resets the configuration cache
*/
public static void resetConfiguration( )
{
getFreeMarkerTemplateService( ).resetConfiguration( );
}
/**
* Returns a reference on a template object (load the template or get it from the cache if present.)
*
* @param strTemplate
* The name of the template
* @return The template object.
*/
public static HtmlTemplate getTemplate( String strTemplate )
{
return getTemplate( strTemplate, _strTemplateDefaultPath );
}
/**
* Returns a reference on a template object (load the template or get it from the cache if present.)
*
* @param strTemplate
* The name of the template
* @param strPath
* The specific path to load the template
* @return The template object.
* @since 1.3.1
*/
public static HtmlTemplate getTemplate( String strTemplate, String strPath )
{
return getTemplate( strTemplate, strPath, null, null );
}
// //////////////////////////////////////////////////////////////////////////
// v1.5
/**
* Returns a reference on a template object (load the template or get it from the cache if present.)
*
* @param strTemplate
* The name of the template
* @param locale
* The current locale to localize the template
* @return The template object.
* @since 1.5
*/
public static HtmlTemplate getTemplate( String strTemplate, Locale locale )
{
return getTemplate( strTemplate, _strTemplateDefaultPath, locale, null );
}
/**
* Returns a reference on a template object (load the template or get it from the cache if present.)
*
* @param strTemplate
* The name of the template
* @param locale
* The current locale to localize the template
* @param model
* the model to use for loading
* @return The template object.
* @since 1.5
*/
public static HtmlTemplate getTemplate( String strTemplate, Locale locale, Object model )
{
HtmlTemplate template;
// Load the template from the file
template = getTemplate( strTemplate, _strTemplateDefaultPath, locale, model );
return template;
}
/**
* Returns a reference on a template object (load the template or get it from the cache if present.)
*
* @param strTemplate
* The name of the template
* @param strPath
* The specific path to load the template
* @param locale
* The current locale to localize the template
* @param model
* the model to use for loading
* @return The template object.
* @since 1.5
*/
public static HtmlTemplate getTemplate( String strTemplate, String strPath, Locale locale, Object model )
{
HtmlTemplate template;
// Load the template from the file
template = loadTemplate( strPath, strTemplate, locale, model );
return template;
}
/**
* Returns a reference on a template object using the template data passed in parameter or getting from cache if present
*
*
* @param strFreemarkerTemplateData
* The content of the template
* @param locale
* The current {@link Locale} to localize the template
* @param model
* The model
* @return The template object
* @since 1.5
*/
public static HtmlTemplate getTemplateFromStringFtl( String strFreemarkerTemplateData, Locale locale, Object model )
{
HtmlTemplate template = getFreeMarkerTemplateService( ).loadTemplateFromStringFtl( strFreemarkerTemplateData, locale, model );
if ( locale != null )
{
String strLocalized = I18nService.localize( template.getHtml( ), locale );
template = new HtmlTemplate( strLocalized );
}
return template;
}
/**
* Returns a reference on a template object using the template data passed in parameter or getting from cache if present
*
* @param strFreemarkerTemplateName The name of the template ( Must be a Fully qualified name for example skin.plugins.myplugin.manage_my_objects )
* @param strFreemarkerTemplateData
* The content of the template
* @param locale
* The current {@link Locale} to localize the template
* @param model
* The model
* @param bResetCache true if the template stored in cache must be updated by the content of the strFreemarkerTemplateDa
* @return The template object
* @since 7.0.5
*/
public static HtmlTemplate getTemplateFromStringFtl( String strFreemarkerTemplateName,String strFreemarkerTemplateData, Locale locale, Object model,boolean bResetCache )
{
HtmlTemplate template = getFreeMarkerTemplateService( ).loadTemplateFromStringFtl( strFreemarkerTemplateName,strFreemarkerTemplateData, locale, model,bResetCache );
if ( locale != null )
{
String strLocalized = I18nService.localize( template.getHtml( ), locale );
template = new HtmlTemplate( strLocalized );
}
return template;
}
/**
* Load the template from the file
*
* @param strTemplate
* The name of the template
* @param strPath
* The specific path to load the template
* @param locale
* The current locale to localize the template
* @param model
* the model to use for loading
* @return The loaded template
*/
private static HtmlTemplate loadTemplate( String strPath, String strTemplate, Locale locale, Object model )
{
HtmlTemplate template;
template = getFreeMarkerTemplateService( ).loadTemplate( strPath, strTemplate, locale, model );
if ( locale != null )
{
String strLocalized = I18nService.localize( template.getHtml( ), locale );
template = new HtmlTemplate( strLocalized );
}
template = new HtmlTemplate( DatastoreService.replaceKeys( template.getHtml( ) ) );
return template;
}
/**
* Get the instance of free marker template service
*
* @return the instance of free marker template service
*/
private static IFreeMarkerTemplateService getFreeMarkerTemplateService( )
{
if ( _freeMarkerTemplateService == null )
{
_freeMarkerTemplateService = FreeMarkerTemplateService.getInstance( );
_freeMarkerTemplateService.init( _strTemplateDefaultPath );
}
return _freeMarkerTemplateService;
}
}