package org.trimou.example.ping;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.ocpsoft.logging.Logger.Level;
import org.ocpsoft.rewrite.annotation.RewriteConfiguration;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.config.Direction;
import org.ocpsoft.rewrite.config.Log;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.ocpsoft.rewrite.exception.RewriteException;
import org.ocpsoft.rewrite.param.ParameterStore;
import org.ocpsoft.rewrite.param.Parameterized;
import org.ocpsoft.rewrite.param.RegexParameterizedPatternBuilder;
import org.ocpsoft.rewrite.servlet.config.HttpConfigurationProvider;
import org.ocpsoft.rewrite.servlet.config.HttpOperation;
import org.ocpsoft.rewrite.servlet.config.Path;
import org.ocpsoft.rewrite.servlet.config.Resource;
import org.ocpsoft.rewrite.servlet.http.event.HttpServletRewrite;
import org.trimou.engine.MustacheEngine;
/**
*
* @author Martin Kouba
*/
@RewriteConfiguration
public class MustacheConfigurationProvider extends HttpConfigurationProvider {
@Inject
MustacheEngine engine;
@Override
public Configuration getConfiguration(ServletContext servletContext) {
return ConfigurationBuilder.begin()
// Allows to serve all the templates separately
// The template name is dynamically resolved
.addRule()
.when(Direction.isInbound()
.and(Path.matches("/{name}.html"))
.and(Resource.exists("/templates/{name}.html")))
.perform(
Log.message(Level.INFO,
"Client requested HTML file: {name}")
.and(TemplateOperation.render(engine, "{name}")))
// Static rewrite rule to serve a specific template
.addRule()
.when(Direction.isInbound()
.and(Path.matches("/cdi")))
.perform(
TemplateOperation.render(engine, "pingLogCdi"));
}
@Override
public int priority() {
return 1;
}
private static class TemplateOperation extends HttpOperation implements
Parameterized {
private final MustacheEngine engine;
private final RegexParameterizedPatternBuilder templateNamePatternBuilder;
private final String templateName;
public static TemplateOperation render(MustacheEngine engine,
String templateNamePattern) {
return new TemplateOperation(engine, templateNamePattern);
}
private TemplateOperation(MustacheEngine engine,
String templateNamePattern) {
this.engine = engine;
if (templateNamePattern.contains("{")) {
this.templateNamePatternBuilder = new RegexParameterizedPatternBuilder(
templateNamePattern);
this.templateName = null;
} else {
this.templateNamePatternBuilder = null;
this.templateName = templateNamePattern;
}
}
@Override
public void performHttp(HttpServletRewrite event,
EvaluationContext context) {
HttpServletResponse response = event.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response.setStatus(HttpServletResponse.SC_OK);
try {
engine.getMustache(getTemplateName(event, context)).render(response.getWriter(), null);
response.flushBuffer();
} catch (IOException e) {
throw new RewriteException(
"Could not write value to response stream.", e);
}
event.abort();
}
@Override
public Set<String> getRequiredParameterNames() {
return templateNamePatternBuilder != null ? templateNamePatternBuilder.getRequiredParameterNames() : Collections.<String>emptySet();
}
@Override
public void setParameterStore(ParameterStore store) {
if(templateNamePatternBuilder != null) {
templateNamePatternBuilder.setParameterStore(store);
}
}
private String getTemplateName(HttpServletRewrite event,
EvaluationContext context) {
return templateNamePatternBuilder != null ? templateNamePatternBuilder.build(event, context) : templateName;
}
}
}