1 31 package org.blojsom.dispatcher.groovy; 32 33 import groovy.lang.Binding; 34 import groovy.text.SimpleTemplateEngine; 35 import groovy.text.Template; 36 import org.apache.commons.logging.Log; 37 import org.apache.commons.logging.LogFactory; 38 import org.blojsom.BlojsomException; 39 import org.blojsom.blog.Blog; 40 import org.blojsom.dispatcher.Dispatcher; 41 import org.blojsom.util.BlojsomConstants; 42 import org.blojsom.util.BlojsomUtils; 43 import org.codehaus.groovy.syntax.SyntaxException; 44 45 import javax.servlet.ServletConfig ; 46 import javax.servlet.ServletException ; 47 import javax.servlet.ServletContext ; 48 import javax.servlet.http.HttpServletRequest ; 49 import javax.servlet.http.HttpServletResponse ; 50 import java.io.IOException ; 51 import java.io.InputStreamReader ; 52 import java.io.Writer ; 53 import java.util.Iterator ; 54 import java.util.Map ; 55 import java.util.Properties ; 56 57 64 public class GroovyDispatcher implements Dispatcher { 65 66 private Log _logger = LogFactory.getLog(GroovyDispatcher.class); 67 68 private ServletConfig _servletConfig; 69 private Properties _blojsomProperties; 70 71 private String _templatesDirectory; 72 private String _blogsDirectory; 73 74 77 public GroovyDispatcher() { 78 } 79 80 85 public void setBlojsomProperties(Properties blojsomProperties) { 86 _blojsomProperties = blojsomProperties; 87 } 88 89 94 public void setServletConfig(ServletConfig servletConfig) { 95 _servletConfig = servletConfig; 96 } 97 98 103 public void init() throws BlojsomException { 104 _templatesDirectory = _blojsomProperties.getProperty(BlojsomConstants.TEMPLATES_DIRECTORY_IP, BlojsomConstants.DEFAULT_TEMPLATES_DIRECTORY); 105 _blogsDirectory = _blojsomProperties.getProperty(BlojsomConstants.BLOGS_DIRECTORY_IP, BlojsomConstants.DEFAULT_BLOGS_DIRECTORY); 106 } 107 108 123 public void dispatch(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Blog blog, Map context, String flavorTemplate, String flavorContentType) throws IOException , ServletException { 124 httpServletResponse.setContentType(flavorContentType); 125 126 ServletContext servletContext = _servletConfig.getServletContext(); 127 128 if (!flavorTemplate.startsWith("/")) { 129 flavorTemplate = '/' + flavorTemplate; 130 } 131 132 String flavorTemplateForPage = null; 133 String pageParameter = BlojsomUtils.getRequestValue(BlojsomConstants.PAGE_PARAM, httpServletRequest, true); 134 135 if (pageParameter != null) { 136 flavorTemplateForPage = BlojsomUtils.getTemplateForPage(flavorTemplate, pageParameter); 137 if (_logger.isDebugEnabled()) { 138 _logger.debug("Retrieved template for page: " + flavorTemplateForPage); 139 } 140 } 141 142 Binding binding = new Binding(); 143 144 Iterator contextIterator = context.keySet().iterator(); 146 String contextKey; 147 while (contextIterator.hasNext()) { 148 contextKey = (String ) contextIterator.next(); 149 binding.setVariable(contextKey, context.get(contextKey)); 150 } 151 152 Writer responseWriter = httpServletResponse.getWriter(); 153 154 SimpleTemplateEngine simpleTemplateEngine = new SimpleTemplateEngine(); 155 156 if (flavorTemplateForPage != null) { 158 String templateToLoad = BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + _blogsDirectory + blog.getBlogId() + _templatesDirectory + BlojsomUtils.removeInitialSlash(flavorTemplateForPage); 159 160 if (servletContext.getResource(templateToLoad) != null) { 161 InputStreamReader isr = new InputStreamReader (servletContext.getResourceAsStream(templateToLoad), BlojsomConstants.UTF8); 162 163 try { 164 Template groovyTemplate = simpleTemplateEngine.createTemplate(isr); 165 groovyTemplate.setBinding(context); 166 groovyTemplate.writeTo(responseWriter); 167 } catch (SyntaxException e) { 168 if (_logger.isErrorEnabled()) { 169 _logger.error(e); 170 } 171 } catch (ClassNotFoundException e) { 172 if (_logger.isErrorEnabled()) { 173 _logger.error(e); 174 } 175 } 176 177 if (_logger.isDebugEnabled()) { 178 _logger.debug("Dispatched to flavor page template for user: " + templateToLoad); 179 } 180 181 return; 182 } else { 183 templateToLoad = BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + BlojsomUtils.removeInitialSlash(_templatesDirectory) + BlojsomUtils.removeInitialSlash(flavorTemplateForPage); 184 185 if (servletContext.getResource(templateToLoad) != null) { 186 InputStreamReader isr = new InputStreamReader (servletContext.getResourceAsStream(templateToLoad), BlojsomConstants.UTF8); 188 189 try { 190 Template groovyTemplate = simpleTemplateEngine.createTemplate(isr); 191 groovyTemplate.setBinding(context); 192 groovyTemplate.writeTo(responseWriter); 193 } catch (SyntaxException e) { 194 if (_logger.isErrorEnabled()) { 195 _logger.error(e); 196 } 197 } catch (ClassNotFoundException e) { 198 if (_logger.isErrorEnabled()) { 199 _logger.error(e); 200 } 201 } 202 203 if (_logger.isDebugEnabled()) { 204 _logger.debug("Dispatched to flavor page template for user: " + templateToLoad); 205 } 206 207 return; 208 } else { 209 if (_logger.isErrorEnabled()) { 210 _logger.error("Unable to dispatch to flavor page template: " + templateToLoad); 211 } 212 } 213 } 214 } else { 215 String templateToLoad = BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + _blogsDirectory + blog.getBlogId() + _templatesDirectory + BlojsomUtils.removeInitialSlash(flavorTemplate); 217 218 if (servletContext.getResource(templateToLoad) != null) { 219 InputStreamReader isr = new InputStreamReader (servletContext.getResourceAsStream(templateToLoad), BlojsomConstants.UTF8); 220 221 try { 222 Template groovyTemplate = simpleTemplateEngine.createTemplate(isr); 223 groovyTemplate.setBinding(context); 224 groovyTemplate.writeTo(responseWriter); 225 } catch (SyntaxException e) { 226 if (_logger.isErrorEnabled()) { 227 _logger.error(e); 228 } 229 } catch (ClassNotFoundException e) { 230 if (_logger.isErrorEnabled()) { 231 _logger.error(e); 232 } 233 } 234 235 if (_logger.isDebugEnabled()) { 236 _logger.debug("Dispatched to flavor template for user: " + templateToLoad); 237 } 238 239 return; 240 } else { 241 templateToLoad = BlojsomConstants.DEFAULT_CONFIGURATION_BASE_DIRECTORY + BlojsomUtils.removeInitialSlash(_templatesDirectory) + BlojsomUtils.removeInitialSlash(flavorTemplate); 242 243 if (servletContext.getResource(templateToLoad) != null) { 244 InputStreamReader isr = new InputStreamReader (servletContext.getResourceAsStream(templateToLoad), BlojsomConstants.UTF8); 246 247 try { 248 Template groovyTemplate = simpleTemplateEngine.createTemplate(isr); 249 groovyTemplate.setBinding(context); 250 groovyTemplate.writeTo(responseWriter); 251 } catch (SyntaxException e) { 252 if (_logger.isErrorEnabled()) { 253 _logger.error(e); 254 } 255 } catch (ClassNotFoundException e) { 256 if (_logger.isErrorEnabled()) { 257 _logger.error(e); 258 } 259 } 260 261 if (_logger.isDebugEnabled()) { 262 _logger.debug("Dispatched to flavor template: " + templateToLoad); 263 } 264 265 return; 266 } else { 267 if (_logger.isErrorEnabled()) { 268 _logger.error("Unable to dispatch to flavor template: " + templateToLoad); 269 } 270 } 271 } 272 } 273 274 responseWriter.flush(); 275 } 276 } 277 | Popular Tags |