package org.koshinuke.jersey; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import com.sampullara.mustache.Mustache; import com.sampullara.mustache.MustacheBuilder; import com.sampullara.mustache.MustacheContext; import com.sampullara.mustache.MustacheException; import com.sampullara.mustache.Scope; import com.sun.jersey.api.view.Viewable; import com.sun.jersey.core.util.ReaderWriter; import com.sun.jersey.spi.template.ViewProcessor; /** * @author taichi */ public class MustacheViewProcessor implements ViewProcessor<String> { @Context ThreadLocal<HttpServletResponse> responseInvoker; Map<String, Mustache> templates = new HashMap<>(); public MustacheViewProcessor(final @Context ServletContext sc) throws MustacheException { MustacheBuilder builder = new MustacheBuilder(new MustacheContext() { @Override public BufferedReader getReader(String name) throws MustacheException { String path = "/WEB-INF/mustache" + name + ".html"; return new BufferedReader(new InputStreamReader( sc.getResourceAsStream(path), ReaderWriter.UTF8)); } }); String[] ary = { "/login", "/repos" }; for (String s : ary) { this.templates.put(s, builder.parseFile(s)); } } @Override public String resolve(String name) { if (this.templates.containsKey(name)) { return name; } return null; } @Override public void writeTo(String name, Viewable viewable, OutputStream out) throws IOException { HttpServletResponse response = responseInvoker.get(); response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache"); response.setDateHeader(HttpHeaders.EXPIRES, 1); try { Mustache t = this.templates.get(name); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, ReaderWriter.UTF8)); t.execute(bw, new Scope(viewable.getModel())); bw.flush(); } catch (MustacheException e) { throw new IOException(e); } } }