VelocityDispatcher.java [plain text]
package org.blojsom.dispatcher;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.util.EnumerationIterator;
import org.blojsom.BlojsomException;
import org.blojsom.blog.BlogUser;
import org.blojsom.blog.BlojsomConfiguration;
import org.blojsom.util.BlojsomUtils;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
import java.util.Properties;
public class VelocityDispatcher implements BlojsomDispatcher {
private static final String BLOG_VELOCITY_PROPERTIES_IP = "velocity-properties";
private static final String BLOJSOM_RENDER_TOOL = "BLOJSOM_RENDER_TOOL";
private Log _logger = LogFactory.getLog(VelocityDispatcher.class);
private String _installationDirectory;
private String _baseConfigurationDirectory;
private String _templatesDirectory;
private Properties _velocityProperties;
public VelocityDispatcher() {
}
public void init(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws BlojsomException {
_baseConfigurationDirectory = blojsomConfiguration.getBaseConfigurationDirectory();
_installationDirectory = blojsomConfiguration.getInstallationDirectory();
_templatesDirectory = blojsomConfiguration.getTemplatesDirectory();
_logger.debug("Using templates directory: " + _templatesDirectory);
String velocityConfiguration = servletConfig.getInitParameter(BLOG_VELOCITY_PROPERTIES_IP);
_velocityProperties = new Properties();
InputStream is = servletConfig.getServletContext().getResourceAsStream(velocityConfiguration);
try {
_velocityProperties.load(is);
is.close();
} catch (Exception e) {
_logger.error(e);
}
_logger.debug("Initialized Velocity dispatcher");
}
protected String getVelocityFileLoaderPath(String userId) {
StringBuffer fileLoaderPath = new StringBuffer();
fileLoaderPath.append(_installationDirectory);
fileLoaderPath.append(BlojsomUtils.removeInitialSlash(_baseConfigurationDirectory));
fileLoaderPath.append(userId).append("/");
fileLoaderPath.append(BlojsomUtils.removeInitialSlash(_templatesDirectory));
fileLoaderPath.append(", ");
fileLoaderPath.append(_installationDirectory);
fileLoaderPath.append(BlojsomUtils.removeInitialSlash(_baseConfigurationDirectory));
fileLoaderPath.append(BlojsomUtils.removeInitialSlash(_templatesDirectory));
return fileLoaderPath.toString();
}
protected void populateVelocityContext(HttpServletRequest httpServletRequest, Map context) {
EnumerationIterator iterator = new EnumerationIterator(httpServletRequest.getAttributeNames());
while (iterator.hasNext()) {
Object key = iterator.next();
Object value = httpServletRequest.getAttribute(key.toString());
context.put(key, value);
}
HttpSession httpSession = httpServletRequest.getSession();
if (httpSession != null) {
iterator = new EnumerationIterator(httpSession.getAttributeNames());
while (iterator.hasNext()) {
Object key = iterator.next();
Object value = httpSession.getAttribute(key.toString());
context.put(key, value);
}
}
}
public void dispatch(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
BlogUser user,
Map context,
String flavorTemplate,
String flavorContentType)
throws IOException, ServletException {
httpServletResponse.setContentType(flavorContentType);
VelocityEngine velocityEngine = new VelocityEngine();
try {
Properties updatedVelocityProperties = (Properties) _velocityProperties.clone();
updatedVelocityProperties.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, getVelocityFileLoaderPath(user.getId()));
velocityEngine.init(updatedVelocityProperties);
updatedVelocityProperties = null;
} catch (Exception e) {
_logger.error(e);
return;
}
Writer responseWriter = httpServletResponse.getWriter();
String flavorTemplateForPage = null;
String pageParameter = BlojsomUtils.getRequestValue(PAGE_PARAM, httpServletRequest, true);
if (pageParameter != null) {
flavorTemplateForPage = BlojsomUtils.getTemplateForPage(flavorTemplate, pageParameter);
_logger.debug("Retrieved template for page: " + flavorTemplateForPage);
}
populateVelocityContext(httpServletRequest, context);
VelocityContext velocityContext = new VelocityContext(context);
velocityContext.put(BLOJSOM_RENDER_TOOL, new BlojsomRenderTool(velocityEngine, velocityContext));
if (flavorTemplateForPage != null) {
if (!velocityEngine.templateExists(flavorTemplateForPage)) {
_logger.error("Could not find flavor page template for user: " + flavorTemplateForPage);
responseWriter.flush();
velocityEngine = null;
return;
} else {
try {
velocityEngine.mergeTemplate(flavorTemplateForPage, UTF8, velocityContext, responseWriter);
} catch (Exception e) {
_logger.error(e);
responseWriter.flush();
velocityEngine = null;
return;
}
}
_logger.debug("Dispatched to flavor page template: " + flavorTemplateForPage);
} else {
if (!velocityEngine.templateExists(flavorTemplate)) {
_logger.error("Could not find flavor template for user: " + flavorTemplate);
responseWriter.flush();
velocityEngine = null;
return;
} else {
try {
velocityEngine.mergeTemplate(flavorTemplate, UTF8, velocityContext, responseWriter);
} catch (Exception e) {
_logger.error(e);
responseWriter.flush();
velocityEngine = null;
return;
}
}
_logger.debug("Dispatched to flavor template: " + flavorTemplate);
}
responseWriter.flush();
velocityEngine = null;
}
public class BlojsomRenderTool {
private static final String LOG_TAG = "BlojsomRenderTool";
private VelocityEngine _velocityEngine;
private VelocityContext _velocityContext;
public BlojsomRenderTool(VelocityEngine velocityEngine, VelocityContext velocityContext) {
_velocityEngine = velocityEngine;
_velocityContext = velocityContext;
}
public String evaluate(String template) {
if (BlojsomUtils.checkNullOrBlank(template)) {
return null;
}
StringWriter sw = new StringWriter();
boolean success = false;
try {
if (_velocityEngine == null) {
success = Velocity.evaluate(_velocityContext, sw, LOG_TAG, template);
} else {
success = _velocityEngine.evaluate(_velocityContext, sw, LOG_TAG, template);
}
} catch (ParseErrorException e) {
_logger.error(e);
} catch (MethodInvocationException e) {
_logger.error(e);
} catch (ResourceNotFoundException e) {
_logger.error(e);
} catch (IOException e) {
_logger.error(e);
}
if (success) {
return sw.toString();
}
return null;
}
}
}