freemarker.cache
Class StringTemplateLoader

java.lang.Object
  extended by freemarker.cache.StringTemplateLoader
All Implemented Interfaces:
TemplateLoader

public class StringTemplateLoader
extends java.lang.Object
implements TemplateLoader

A TemplateLoader that uses a Map with Strings as its source of templates. In most case the regular way of loading templates from files will be fine. However, there can be situations where you don't want to or can't load a template from a file, e.g. if you have to deploy a single jar for JavaWebStart or if they are contained within a database. A single template can be created manually e.g.

   String templateStr="Hello ${user}";
   Template t = new Template("name", new StringReader(templateStr),
               new Configuration());
 
If, however, you want to create templates from strings which import other templates this method doesn't work. In that case you can create a StringTemplateLoader and add each template to it:
   StringTemplateLoader stringLoader = new StringTemplateLoader();
   stringLoader.putTemplate("greetTemplate", "<#macro greet>Hello");
   stringLoader.putTemplate("myTemplate", "<#include \"greetTemplate\"><@greet/> World!");
 
Then you tell your Configuration object to use it:
   cfg.setTemplateLoader(stringLoader);
 
After that you should be able to use the templates as usual. Often you will want to combine a StringTemplateLoader with another loader. You can do so using a MultiTemplateLoader.

Version:
$Id: v 1.0 2005/04/01, $Id: StringTemplateLoader.java,v 1.1 2005/04/08 11:47:53 szegedia Exp $
Author:
Meikel Bisping, Attila Szegedi

Constructor Summary
StringTemplateLoader()
           
 
Method Summary
 void closeTemplateSource(java.lang.Object templateSource)
          Closes the template source.
 java.lang.Object findTemplateSource(java.lang.String name)
          Finds the object that acts as the source of the template with the given name.
 long getLastModified(java.lang.Object templateSource)
          Returns the time of last modification of the specified template source.
 java.io.Reader getReader(java.lang.Object templateSource, java.lang.String encoding)
          Returns the character stream of a template represented by the specified template source.
 void putTemplate(java.lang.String name, java.lang.String templateSource)
          Puts a template into the loader.
 void putTemplate(java.lang.String name, java.lang.String templateSource, long lastModified)
          Puts a template into the loader.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

StringTemplateLoader

public StringTemplateLoader()
Method Detail

putTemplate

public void putTemplate(java.lang.String name,
                        java.lang.String templateSource)
Puts a template into the loader. A call to this method is identical to the call to the three-arg putTemplate(String, String, long) passing System.currentTimeMillis() as the third argument.

Parameters:
name - the name of the template.
templateSource - the source code of the template.

putTemplate

public void putTemplate(java.lang.String name,
                        java.lang.String templateSource,
                        long lastModified)
Puts a template into the loader. The name can contain slashes to denote logical directory structure, but must not start with a slash. If the method is called multiple times for the same name and with different last modified time, the configuration's template cache will reload the template according to its own refresh settings (note that if the refresh is disabled in the template cache, the template will not be reloaded). Also, since the cache uses lastModified to trigger reloads, calling the method with different source and identical timestamp won't trigger reloading.

Parameters:
name - the name of the template.
templateSource - the source code of the template.
lastModified - the time of last modification of the template in terms of System.currentTimeMillis()

closeTemplateSource

public void closeTemplateSource(java.lang.Object templateSource)
Description copied from interface: TemplateLoader
Closes the template source. This is the last method that is called by the TemplateCache for a templateSource. The framework guarantees that this method will be called on every object that is returned from TemplateLoader.findTemplateSource(String).

Specified by:
closeTemplateSource in interface TemplateLoader
Parameters:
templateSource - the template source that should be closed.

findTemplateSource

public java.lang.Object findTemplateSource(java.lang.String name)
Description copied from interface: TemplateLoader
Finds the object that acts as the source of the template with the given name. This method is called by the TemplateCache when a template is requested, before calling either TemplateLoader.getLastModified(Object) or TemplateLoader.getReader(Object, String).

Specified by:
findTemplateSource in interface TemplateLoader
Parameters:
name - the name of the template, already localized and normalized by the cache. It is completely up to the loader implementation to interpret the name, however it should expect to receive hierarchical paths where path components are separated by a slash (not backslash). Backslashes (or any other OS specific separator character) are not considered as separators by FreeMarker, and thus they will not be replaced with slash before passing to this method, so it is up to the template loader to handle them (say, be throwing and exception that tells the user that the path (s)he has entered is invalid, as (s)he must use slash -- typical mistake of Windows users). The passed names are always considered relative to some loader-defined root location (often reffered as the "template root direcotry"), and will never start with a slash, nor will they contain a path component consisting of either a single or a double dot -- these are all resolved by the template cache before passing the name to the loader. As a side effect, paths that trivially reach outside template root directory, such as ../my.ftl, will be rejected by the template cache, so they never reach the template loader. Note again, that if the path uses backslash as path separator instead of slash as (the template loader should not accept that), the normalisation will not properly happen, as FreeMarker (the cache) recognizes only the slashes as separators.
Returns:
an object representing the template source, which can be supplied in subsequent calls to TemplateLoader.getLastModified(Object) and TemplateLoader.getReader(Object, String). Null must be returned if the source for the template can not be found (do not throw FileNotFoundException!). The returned object may will be compared with a cached template source object for equality, using the equals method. Thus, objects returned for the same physical source must be equivalent according to equals method, otherwise template caching can become very ineffective!

getLastModified

public long getLastModified(java.lang.Object templateSource)
Description copied from interface: TemplateLoader
Returns the time of last modification of the specified template source. This method is called after findTemplateSource().

Specified by:
getLastModified in interface TemplateLoader
Parameters:
templateSource - an object representing a template source, obtained through a prior call to TemplateLoader.findTemplateSource(String).
Returns:
the time of last modification of the specified template source, or -1 if the time is not known.

getReader

public java.io.Reader getReader(java.lang.Object templateSource,
                                java.lang.String encoding)
Description copied from interface: TemplateLoader
Returns the character stream of a template represented by the specified template source. This method is called after getLastModified() if it is determined that a cached copy of the template is unavailable or stale.

Specified by:
getReader in interface TemplateLoader
Parameters:
templateSource - an object representing a template source, obtained through a prior call to TemplateLoader.findTemplateSource(String).
encoding - the character encoding used to translate source bytes to characters. Some loaders may not have access to the byte representation of the template stream, and instead directly obtain a character stream. These loaders will - quite naturally - ignore the encoding parameter.
Returns:
a reader representing the template character stream. The framework will call close().