001: /*
002: * Copyright (c) 2003 The Visigoth Software Society. All rights
003: * reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions
007: * are met:
008: *
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: *
012: * 2. Redistributions in binary form must reproduce the above copyright
013: * notice, this list of conditions and the following disclaimer in
014: * the documentation and/or other materials provided with the
015: * distribution.
016: *
017: * 3. The end-user documentation included with the redistribution, if
018: * any, must include the following acknowledgement:
019: * "This product includes software developed by the
020: * Visigoth Software Society (http://www.visigoths.org/)."
021: * Alternately, this acknowledgement may appear in the software itself,
022: * if and wherever such third-party acknowledgements normally appear.
023: *
024: * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
025: * project contributors may be used to endorse or promote products derived
026: * from this software without prior written permission. For written
027: * permission, please contact visigoths@visigoths.org.
028: *
029: * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
030: * nor may "FreeMarker" or "Visigoth" appear in their names
031: * without prior written permission of the Visigoth Software Society.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of the Visigoth Software Society. For more
049: * information on the Visigoth Software Society, please see
050: * http://www.visigoths.org/
051: */
052:
053: package freemarker.cache;
054:
055: import java.net.URL;
056:
057: /**
058: * A {@link TemplateLoader} that uses streams reachable through
059: * {@link Class#getResourceAsStream(String)} as its source of templates.
060: * @author Attila Szegedi, szegedia at freemail dot hu
061: * @version $Id: ClassTemplateLoader.java,v 1.9.2.3 2005/10/10 21:28:46 ddekany Exp $
062: */
063: public class ClassTemplateLoader extends URLTemplateLoader {
064: private Class loaderClass;
065: private String path;
066:
067: /**
068: * Creates a template loader that will use the {@link Class#getResource(String)}
069: * method of its own class to load the resources, and <code>"/"</code> as base path.
070: * This means that that template paths will be resolved relatvively the root package
071: * of the class hierarchy, so you hardly ever should use this constructor, rather do
072: * something like this:<br>
073: * {@link #ClassTemplateLoader(Class, String)
074: * new ClassTemplateLoader(com.example.myapplication.SomeClass.class, "templates")}
075: *
076: * <p>If you extend this class, then the extending class will be used to load
077: * the resources.
078: *
079: * <p>Warning: this constructor was malfunctioned prior FreeMarker 2.3.4
080: * -- please update FreeMarker if needed.
081: *
082: * @deprecated confusing constructor, and seldom useful;
083: * use {@link #ClassTemplateLoader(Class, String)} instead.
084: */
085: public ClassTemplateLoader() {
086: setFields(this .getClass(), "/");
087: }
088:
089: /**
090: * Creates a template loader that will use the {@link Class#getResource(String)}
091: * method of the specified class to load the resources, and <code>""</code> as base
092: * path. This means that template paths will be resolved relatively to the class
093: * location, that is, relatively to the directory (package) of the class.
094: *
095: * @param loaderClass the class whose
096: * {@link Class#getResource(String)} will be used to load the templates.
097: *
098: * @deprecated it is confusing that the base path is <code>""</code>;
099: * use {@link #ClassTemplateLoader(Class, String)} instead.
100: */
101: public ClassTemplateLoader(Class loaderClass) {
102: setFields(loaderClass, "");
103: }
104:
105: /**
106: * Creates a template loader that will use the {@link Class#getResource(String)} method
107: * of the specified class to load the resources, and the specified base path (absolute or relative).
108: *
109: * <p>Examples:
110: * <ul>
111: * <li>Relative base path (will load from the
112: * <code>com.example.myapplication.templates</code> package):<br>
113: * <code>new ClassTemplateLoader(<br>
114: * com.example.myapplication.SomeClass.class,<br>
115: * "templates")</code>
116: * <li>Absolute base path:<br>
117: * <code>new ClassTemplateLoader(<br>
118: * somepackage.SomeClass.class,<br>
119: * "/com/example/myapplication/templates")</code>
120: * </ul>
121: *
122: * @param loaderClass the class whose {@link Class#getResource(String)} method will be used
123: * to load the templates. Be sure that you chose a class whose defining class-loader
124: * sees the templates. This parameter can't be <code>null</code>.
125: * @param path the base path to template resources.
126: * A path that doesn't start with a slash (/) is relative to the
127: * path (package) of the specified class. A path that starts with a slash
128: * is an absolute path starting from the root of the package hierarchy. Path
129: * components should be separated by forward slashes independently of the
130: * separator character used by the underlying operating system.
131: * This parameter can't be <code>null</code>.
132: */
133: public ClassTemplateLoader(Class loaderClass, String path) {
134: setFields(loaderClass, path);
135: }
136:
137: protected URL getURL(String name) {
138: return loaderClass.getResource(path + name);
139: }
140:
141: private void setFields(Class loaderClass, String path) {
142: if (loaderClass == null) {
143: throw new IllegalArgumentException("loaderClass == null");
144: }
145: if (path == null) {
146: throw new IllegalArgumentException("path == null");
147: }
148: this.loaderClass = loaderClass;
149: this.path = canonicalizePrefix(path);
150: }
151:
152: }
|