KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > freemarker > cache > WebappTemplateLoader


1 /*
2  * Copyright (c) 2003 The Visigoth Software Society. All rights
3  * reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in
14  * the documentation and/or other materials provided with the
15  * distribution.
16  *
17  * 3. The end-user documentation included with the redistribution, if
18  * any, must include the following acknowledgement:
19  * "This product includes software developed by the
20  * Visigoth Software Society (http://www.visigoths.org/)."
21  * Alternately, this acknowledgement may appear in the software itself,
22  * if and wherever such third-party acknowledgements normally appear.
23  *
24  * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
25  * project contributors may be used to endorse or promote products derived
26  * from this software without prior written permission. For written
27  * permission, please contact visigoths@visigoths.org.
28  *
29  * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
30  * nor may "FreeMarker" or "Visigoth" appear in their names
31  * without prior written permission of the Visigoth Software Society.
32  *
33  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36  * DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
37  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44  * SUCH DAMAGE.
45  * ====================================================================
46  *
47  * This software consists of voluntary contributions made by many
48  * individuals on behalf of the Visigoth Software Society. For more
49  * information on the Visigoth Software Society, please see
50  * http://www.visigoths.org/
51  */

52
53 package freemarker.cache;
54
55 import java.io.File JavaDoc;
56 import java.io.FileInputStream JavaDoc;
57 import java.io.IOException JavaDoc;
58 import java.io.InputStreamReader JavaDoc;
59 import java.io.Reader JavaDoc;
60 import java.net.MalformedURLException JavaDoc;
61 import java.net.URL JavaDoc;
62
63 import javax.servlet.ServletContext JavaDoc;
64
65 import freemarker.log.Logger;
66
67 /**
68  * A {@link TemplateLoader} that uses streams reachable through
69  * {@link ServletContext#getResource(String)} as its source of templates.
70  * @version $Id: WebappTemplateLoader.java,v 1.10 2003/01/29 08:01:18 szegedia Exp $
71  * @author Attila Szegedi
72  */

73 public class WebappTemplateLoader implements TemplateLoader
74 {
75     private static final Logger logger = Logger.getLogger("freemarker.cache");
76     
77     private final ServletContext JavaDoc servletContext;
78     private final String JavaDoc path;
79     
80     /**
81      * Creates a resource template cache that will use the specified servlet
82      * context to load the resources. It will use the base path of
83      * <code>"/"</code> meaning templates will be resolved relative to the
84      * servlet context root location.
85      * @param servletContext the servlet context whose
86      * {@link ServletContext#getResource(String)} will be used to load the
87      * templates.
88      */

89     public WebappTemplateLoader(ServletContext JavaDoc servletContext) {
90         this(servletContext, "/");
91     }
92
93     /**
94      * Creates a template loader that will use the specified servlet
95      * context to load the resources. It will use the specified base path.
96      * The is interpreted as relative to the current context root (does not mater
97      * if you start it with "/" or not). Path components
98      * should be separated by forward slashes independently of the separator
99      * character used by the underlying operating system.
100      * @param servletContext the servlet context whose
101      * {@link ServletContext#getResource(String)} will be used to load the
102      * templates.
103      * @param path the base path to template resources.
104      */

105     public WebappTemplateLoader(ServletContext JavaDoc servletContext, String JavaDoc path) {
106         if(servletContext == null) {
107             throw new IllegalArgumentException JavaDoc("servletContext == null");
108         }
109         if(path == null) {
110             throw new IllegalArgumentException JavaDoc("path == null");
111         }
112         
113         path = path.replace('\\', '/');
114         if(!path.endsWith("/")) {
115             path += "/";
116         }
117         if (!path.startsWith("/")) {
118             path = "/" + path;
119         }
120         this.path = path;
121         this.servletContext = servletContext;
122     }
123
124     public Object JavaDoc findTemplateSource(String JavaDoc name) throws IOException JavaDoc {
125         String JavaDoc fullPath = path + name;
126         // First try to open as plain file (to bypass servlet container resource caches).
127
try {
128             String JavaDoc realPath = servletContext.getRealPath(fullPath);
129             if (realPath != null) {
130                 File JavaDoc file = new File JavaDoc(realPath);
131                 if(!file.isFile()) {
132                     return null;
133                 }
134                 if(file.canRead()) {
135                     return file;
136                 }
137             }
138         } catch (SecurityException JavaDoc e) {
139             ;// ignore
140
}
141             
142         // If it fails, try to open it with servletContext.getResource.
143
URL JavaDoc url = null;
144         try {
145             url = servletContext.getResource(fullPath);
146         } catch(MalformedURLException JavaDoc e) {
147             logger.warn("Could not retrieve resource " + fullPath, e);
148             return null;
149         }
150         return url == null ? null : new URLTemplateSource(url);
151     }
152     
153     public long getLastModified(Object JavaDoc templateSource) {
154         if (templateSource instanceof File JavaDoc) {
155             return ((File JavaDoc) templateSource).lastModified();
156         } else {
157             return ((URLTemplateSource) templateSource).lastModified();
158         }
159     }
160     
161     public Reader JavaDoc getReader(Object JavaDoc templateSource, String JavaDoc encoding)
162     throws IOException JavaDoc {
163         if (templateSource instanceof File JavaDoc) {
164             return new InputStreamReader JavaDoc(
165                     new FileInputStream JavaDoc((File JavaDoc) templateSource),
166                     encoding);
167         } else {
168             return new InputStreamReader JavaDoc(
169                     ((URLTemplateSource) templateSource).getInputStream(),
170                     encoding);
171         }
172     }
173     
174     public void closeTemplateSource(Object JavaDoc templateSource) throws IOException JavaDoc {
175         if (templateSource instanceof File JavaDoc) {
176             // Do nothing.
177
} else {
178             ((URLTemplateSource) templateSource).close();
179         }
180     }
181 }
Popular Tags