KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > blojsom > dispatcher > freemarker > FreeMarkerDispatcher


1 /**
2  * Copyright (c) 2003-2006, David A. Czarnecki
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * Redistributions of source code must retain the above copyright notice, this list of conditions and the
9  * following disclaimer.
10  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
11  * following disclaimer in the documentation and/or other materials provided with the distribution.
12  * Neither the name of "David A. Czarnecki" and "blojsom" nor the names of its contributors may be used to
13  * endorse or promote products derived from this software without specific prior written permission.
14  * Products derived from this software may not be called "blojsom", nor may "blojsom" appear in their name,
15  * without prior written permission of David A. Czarnecki.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
18  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
19  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
21  * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */

31 package org.blojsom.dispatcher.freemarker;
32
33 import freemarker.cache.ClassTemplateLoader;
34 import freemarker.cache.FileTemplateLoader;
35 import freemarker.cache.MultiTemplateLoader;
36 import freemarker.cache.TemplateLoader;
37 import freemarker.ext.beans.BeansWrapper;
38 import freemarker.template.Configuration;
39 import freemarker.template.Template;
40 import freemarker.template.TemplateException;
41 import org.apache.commons.logging.Log;
42 import org.apache.commons.logging.LogFactory;
43 import org.blojsom.BlojsomException;
44 import org.blojsom.blog.Blog;
45 import org.blojsom.dispatcher.Dispatcher;
46 import org.blojsom.util.BlojsomConstants;
47 import org.blojsom.util.BlojsomUtils;
48
49 import javax.servlet.ServletException JavaDoc;
50 import javax.servlet.ServletConfig JavaDoc;
51 import javax.servlet.ServletContext JavaDoc;
52 import javax.servlet.http.HttpServletRequest JavaDoc;
53 import javax.servlet.http.HttpServletResponse JavaDoc;
54 import java.io.File JavaDoc;
55 import java.io.IOException JavaDoc;
56 import java.io.Writer JavaDoc;
57 import java.util.Map JavaDoc;
58 import java.util.Properties JavaDoc;
59
60 /**
61  * FreeMarkerDispatcher
62  *
63  * @author Dsvid Czarnecki
64  * @version $Id: FreeMarkerDispatcher.java,v 1.1 2006/03/23 14:27:54 czarneckid Exp $
65  * @since blojsom 3.0
66  */

67 public class FreeMarkerDispatcher implements Dispatcher {
68
69     private Log _logger = LogFactory.getLog(FreeMarkerDispatcher.class);
70
71     private Properties JavaDoc _freemarkerProperties;
72     private Properties JavaDoc _blojsomProperties;
73     private ServletConfig JavaDoc _servletConfig;
74
75     private String JavaDoc _templatesDirectory;
76     private String JavaDoc _blogsDirectory;
77
78     /**
79      * Default constructor.
80      */

81     public FreeMarkerDispatcher() {
82     }
83
84     /**
85      * Set the Freemarker properties for use by the dispatcher
86      *
87      * @param freemarkerProperties Properties for Freemarker configuration
88      */

89     public void setFreemarkerProperties(Properties JavaDoc freemarkerProperties) {
90         _freemarkerProperties = freemarkerProperties;
91     }
92
93     /**
94      * Set the properties in use by blojsom
95      *
96      * @param blojsomProperties Properties in use by blojsom
97      */

98     public void setBlojsomProperties(Properties JavaDoc blojsomProperties) {
99         _blojsomProperties = blojsomProperties;
100     }
101
102     /**
103      * Set the {@link javax.servlet.ServletConfig}
104      *
105      * @param servletConfig {@link javax.servlet.ServletConfig}
106      */

107     public void setServletConfig(ServletConfig JavaDoc servletConfig) {
108         _servletConfig = servletConfig;
109     }
110
111     /**
112      * Initialization method for blojsom dispatchers
113      *
114      * @param servletConfig ServletConfig for obtaining any initialization parameters
115      * @param blojsomConfiguration BlojsomConfiguration for blojsom-specific configuration information
116      * @throws org.blojsom.BlojsomException If there is an error initializing the dispatcher
117      */

118     public void init() throws BlojsomException {
119         _templatesDirectory = _blojsomProperties.getProperty(BlojsomConstants.TEMPLATES_DIRECTORY_IP, BlojsomConstants.DEFAULT_TEMPLATES_DIRECTORY);
120         _blogsDirectory = _blojsomProperties.getProperty(BlojsomConstants.BLOGS_DIRECTORY_IP, BlojsomConstants.DEFAULT_BLOGS_DIRECTORY);
121     }
122
123     /**
124      * Set paths appropriate for loading FreeMarker templates
125      *
126      * @param blogID Blog ID
127      * @param freemarkerConfiguration
128      */

129     private void setTemplatePath(String JavaDoc blogID, Configuration freemarkerConfiguration) {
130         ServletContext JavaDoc servletContext = _servletConfig.getServletContext();
131
132         try {
133             StringBuffer JavaDoc templatePath = new StringBuffer JavaDoc(servletContext.getRealPath(BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY));
134             templatePath.append(_blogsDirectory).append(blogID).append(_templatesDirectory);
135             FileTemplateLoader fileTemplateLoaderUser = new FileTemplateLoader(new File JavaDoc(templatePath.toString()));
136
137             ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(getClass(), "");
138
139             templatePath = new StringBuffer JavaDoc();
140             templatePath.append(servletContext.getRealPath(BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY));
141             templatePath.append(BlojsomUtils.removeInitialSlash(_templatesDirectory));
142             File JavaDoc globalTemplateDirectory = new File JavaDoc(templatePath.toString());
143
144             TemplateLoader[] loaders;
145             if (globalTemplateDirectory.exists()) {
146                 FileTemplateLoader fileTemplateLoaderGlobal = new FileTemplateLoader(globalTemplateDirectory);
147                 loaders = new TemplateLoader[] {fileTemplateLoaderUser, fileTemplateLoaderGlobal,
148                                                 classTemplateLoader};
149             } else {
150                 loaders = new TemplateLoader[] {fileTemplateLoaderUser, classTemplateLoader};
151             }
152
153             MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(loaders);
154             freemarkerConfiguration.setTemplateLoader(multiTemplateLoader);
155         } catch (IOException JavaDoc e) {
156             if (_logger.isErrorEnabled()) {
157                 _logger.error(e);
158             }
159         }
160     }
161
162     /**
163      * Dispatch a request and response. A context map is provided for the BlojsomServlet to pass
164      * any required information for use by the dispatcher. The dispatcher is also
165      * provided with the template for the requested flavor along with the content type for the
166      * specific flavor.
167      *
168      * @param httpServletRequest Request
169      * @param httpServletResponse Response
170      * @param blog {@link Blog}
171      * @param context Context map
172      * @param flavorTemplate Template to dispatch to for the requested flavor
173      * @param flavorContentType Content type for the requested flavor
174      * @throws java.io.IOException If there is an exception during IO
175      * @throws javax.servlet.ServletException If there is an exception in dispatching the request
176      */

177     public void dispatch(HttpServletRequest JavaDoc httpServletRequest, HttpServletResponse JavaDoc httpServletResponse, Blog blog, Map JavaDoc context, String JavaDoc flavorTemplate, String JavaDoc flavorContentType) throws IOException JavaDoc, ServletException JavaDoc {
178         httpServletResponse.setContentType(flavorContentType);
179
180         // Configure FreeMarker with the loaded properties
181
Configuration freemarkerConfiguration = Configuration.getDefaultConfiguration();
182         if (_freemarkerProperties != null) {
183             try {
184                 freemarkerConfiguration.setSettings(_freemarkerProperties);
185             } catch (TemplateException e) {
186                 if (_logger.isErrorEnabled()) {
187                     _logger.error(e);
188                 }
189             }
190         }
191
192         setTemplatePath(blog.getBlogId(), freemarkerConfiguration);
193
194         BeansWrapper wrapper = new BeansWrapper();
195         wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY);
196         wrapper.setSimpleMapWrapper(true);
197         freemarkerConfiguration.setObjectWrapper(wrapper);
198
199         Writer JavaDoc responseWriter = httpServletResponse.getWriter();
200         String JavaDoc flavorTemplateForPage = null;
201         String JavaDoc pageParameter = BlojsomUtils.getRequestValue(BlojsomConstants.PAGE_PARAM, httpServletRequest, true);
202
203         if (pageParameter != null) {
204             flavorTemplateForPage = BlojsomUtils.getTemplateForPage(flavorTemplate, pageParameter);
205             if (_logger.isDebugEnabled()) {
206                 _logger.debug("Retrieved template for page: " + flavorTemplateForPage);
207             }
208         }
209
210         if (flavorTemplateForPage != null) {
211             // Try and look for the flavor page template for the individual user
212
try {
213                 Template template = freemarkerConfiguration.getTemplate(flavorTemplateForPage);
214                 template.setEncoding(BlojsomConstants.UTF8);
215                 template.process(context, responseWriter);
216             } catch (Exception JavaDoc e) {
217                 if (_logger.isErrorEnabled()) {
218                     _logger.error(e);
219                 }
220
221                 return;
222             }
223
224             if (_logger.isDebugEnabled()) {
225                 _logger.debug("Dispatched to flavor page template: " + flavorTemplateForPage);
226             }
227         } else {
228             // Otherwise, fallback and look for the flavor template for the individual user
229
try {
230                 Template template = freemarkerConfiguration.getTemplate(flavorTemplate);
231                 template.setEncoding(BlojsomConstants.UTF8);
232                 template.process(context, responseWriter);
233             } catch (Exception JavaDoc e) {
234                 if (_logger.isErrorEnabled()) {
235                     _logger.error(e);
236                 }
237
238                 return;
239             }
240
241             if (_logger.isDebugEnabled()) {
242                 _logger.debug("Dispatched to flavor template: " + flavorTemplate);
243             }
244         }
245
246         responseWriter.flush();
247     }
248 }
249
Popular Tags