1 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 ; 50 import javax.servlet.ServletConfig ; 51 import javax.servlet.ServletContext ; 52 import javax.servlet.http.HttpServletRequest ; 53 import javax.servlet.http.HttpServletResponse ; 54 import java.io.File ; 55 import java.io.IOException ; 56 import java.io.Writer ; 57 import java.util.Map ; 58 import java.util.Properties ; 59 60 67 public class FreeMarkerDispatcher implements Dispatcher { 68 69 private Log _logger = LogFactory.getLog(FreeMarkerDispatcher.class); 70 71 private Properties _freemarkerProperties; 72 private Properties _blojsomProperties; 73 private ServletConfig _servletConfig; 74 75 private String _templatesDirectory; 76 private String _blogsDirectory; 77 78 81 public FreeMarkerDispatcher() { 82 } 83 84 89 public void setFreemarkerProperties(Properties freemarkerProperties) { 90 _freemarkerProperties = freemarkerProperties; 91 } 92 93 98 public void setBlojsomProperties(Properties blojsomProperties) { 99 _blojsomProperties = blojsomProperties; 100 } 101 102 107 public void setServletConfig(ServletConfig servletConfig) { 108 _servletConfig = servletConfig; 109 } 110 111 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 129 private void setTemplatePath(String blogID, Configuration freemarkerConfiguration) { 130 ServletContext servletContext = _servletConfig.getServletContext(); 131 132 try { 133 StringBuffer templatePath = new StringBuffer (servletContext.getRealPath(BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY)); 134 templatePath.append(_blogsDirectory).append(blogID).append(_templatesDirectory); 135 FileTemplateLoader fileTemplateLoaderUser = new FileTemplateLoader(new File (templatePath.toString())); 136 137 ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(getClass(), ""); 138 139 templatePath = new StringBuffer (); 140 templatePath.append(servletContext.getRealPath(BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY)); 141 templatePath.append(BlojsomUtils.removeInitialSlash(_templatesDirectory)); 142 File globalTemplateDirectory = new File (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 e) { 156 if (_logger.isErrorEnabled()) { 157 _logger.error(e); 158 } 159 } 160 } 161 162 177 public void dispatch(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Blog blog, Map context, String flavorTemplate, String flavorContentType) throws IOException , ServletException { 178 httpServletResponse.setContentType(flavorContentType); 179 180 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 responseWriter = httpServletResponse.getWriter(); 200 String flavorTemplateForPage = null; 201 String 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 { 213 Template template = freemarkerConfiguration.getTemplate(flavorTemplateForPage); 214 template.setEncoding(BlojsomConstants.UTF8); 215 template.process(context, responseWriter); 216 } catch (Exception 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 try { 230 Template template = freemarkerConfiguration.getTemplate(flavorTemplate); 231 template.setEncoding(BlojsomConstants.UTF8); 232 template.process(context, responseWriter); 233 } catch (Exception 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
|