Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   * Copyright (c) 2005 The Visigoth Software Society. 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, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
  * 3. The end-user documentation included with the redistribution, if
  *    any, must include the following acknowledgement:
  *       "This product includes software developed by the
  *        Visigoth Software Society ("
  *    Alternately, this acknowledgement may appear in the software itself,
  *    if and wherever such third-party acknowledgements normally appear.
  * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
  *    project contributors may be used to endorse or promote products derived
  *    from this software without prior written permission. For written
  *    permission, please contact
  * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
  *    nor may "FreeMarker" or "Visigoth" appear in their names
  *    without prior written permission of the Visigoth Software Society.
  * ====================================================================
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Visigoth Software Society. For more
  * information on the Visigoth Software Society, please see
 package freemarker.cache;
 import java.util.Map;

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</#macro>");
   stringLoader.putTemplate("myTemplate", "<#include \"greetTemplate\"><@greet/> World!");
Then you tell your Configuration object to use it:
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.

Meikel Bisping
Attila Szegedi
$Id: v 1.0 2005/04/01
$Id:,v 1.1 2005/04/08 11:47:53 szegedia Exp $
 public class StringTemplateLoader implements TemplateLoader {
     private final Map templates = new HashMap();
Puts a template into the loader. A call to this method is identical to the call to the three-arg putTemplate(java.lang.String,java.lang.String,long) passing System.currentTimeMillis() as the third argument.

name the name of the template.
templateSource the source code of the template.
    public void putTemplate(String nameString templateSource) {
        putTemplate(nametemplateSource, System.currentTimeMillis());
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.

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()
    public void putTemplate(String nameString templateSourcelong lastModified) {
        .put(namenew StringTemplateSource(nametemplateSourcelastModified));
    public void closeTemplateSource(Object templateSource) {
    public Object findTemplateSource(String name) {
        return .get(name);
    public long getLastModified(Object templateSource) {
        return ((StringTemplateSource)templateSource).;
    public Reader getReader(Object templateSourceString encoding) {
        return new StringReader(((StringTemplateSource)templateSource).);
    private static class StringTemplateSource {
        private final String name;
        private final String source;
        private final long lastModified;
        StringTemplateSource(String nameString sourcelong lastModified) {
            if(name == null) {
                throw new IllegalArgumentException("name == null");
            if(source == null) {
                throw new IllegalArgumentException("source == null");
            if(lastModified < -1L) {
                throw new IllegalArgumentException("lastModified < -1L");
            this. = name;
            this. = source;
            this. = lastModified;
        public boolean equals(Object obj) {
            if(obj instanceof StringTemplateSource) {
                return .equals(((StringTemplateSource)obj).);
            return false;
        public int hashCode() {
            return .hashCode();
New to GrepCode? Check out our FAQ X