001: /*
002: * FreemarkerLoader.java January 2006
003: *
004: * Copyright (C) 2006, Niall Gallagher <niallg@users.sf.net>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General
016: * Public License along with this library; if not, write to the
017: * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
018: * Boston, MA 02111-1307 USA
019: */
020:
021: package simple.template.freemarker;
022:
023: import freemarker.template.Template;
024: import freemarker.template.Configuration;
025: import simple.http.serve.Context;
026:
027: /**
028: * The <code>FreemarkerLoader</code> intefaces with the Freemarker
029: * templating system. This is used to load velocity templates which
030: * have a default character encoding of UTF-8 and the type resolved
031: * from the <code>Context</code> object.
032: *
033: * @author Niall Gallagher
034: */
035: final class FreemarkerLoader {
036:
037: /**
038: * This is the interface to the Freemarker templating system.
039: */
040: private Configuration engine;
041:
042: /**
043: * This is used to resolve the MIME type for the template.
044: */
045: private Context context;
046:
047: /**
048: * Constructor for the <code>FreemarkerLoader</code> object. This is
049: * used to wrap the provide Freemarker engine and provide templates,
050: * with a default UTF-8 character encoding and a suitable MIME type.
051: *
052: * @param engine this is the interface to the templating system
053: * @param context this is used to resolve the MIME types
054: */
055: public FreemarkerLoader(Configuration engine, Context context) {
056: this .context = context;
057: this .engine = engine;
058: }
059:
060: /**
061: * This acquires a Freemarker template from the Freemarker templating
062: * system. This uses the URI path provided to load the template
063: * from the configured root for templates. The templates loaded
064: * will use the UTF-8 character encoding.
065: *
066: * @param path this is the path to load the template from
067: */
068: public FreemarkerTemplate getTemplate(String path) throws Exception {
069: return getTemplate(path, getContentType(path));
070: }
071:
072: /**
073: * This acquires a Freemarker template from the Freemarker templating
074: * system. This uses the URI path provided to load the template
075: * from the configured root for templates. The templates loaded
076: * will use the UTF-8 character encoding.
077: *
078: * @param path this is the path to load the template from
079: * @param type this is the MIME type for the loaded template
080: */
081: public FreemarkerTemplate getTemplate(String path, String type)
082: throws Exception {
083: return getTemplate(engine.getTemplate(path), type);
084: }
085:
086: /**
087: * This wraps the loaded template in a container, which exposes
088: * the content type and character encoding used. The template
089: * allows the <code>Viewer</code> to satisfy its interface methods.
090: *
091: * @param template template this is the template to be wrapped
092: * @param type this is the MIME type for the loaded template
093: */
094: public FreemarkerTemplate getTemplate(Template template, String type)
095: throws Exception {
096: return new FreemarkerTemplate(template, type);
097: }
098:
099: /**
100: * This delegates to the <code>Context</code> object, to resolve
101: * the MIME type for the template. By default this makes use if
102: * the template path and file extension to resolve the type.
103: *
104: * @return this returns the MIME type matching the path
105: */
106: private String getContentType(String path) {
107: return context.getContentType(path);
108: }
109: }
|