package cn.bran.play; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.HashMap; import java.util.Map; import play.mvc.Content; import play.mvc.Results; import scala.collection.Seq; import cn.bran.japid.template.RenderResult; /** * * The return type of the renderJapid(...) method in JapidController. * * An object of this class is a valid value for a controller action to return. Doing this allows * headers set in the Japid content to be carried over to the response. * * If the headers are not a concern, the JapidResult is also a valid argument type for ok() and other * helper methods in a controller. * * <pre> * public static Result foo() { * return renderJapid(); // which return an instance of this class. * } * * public static Result bar() { * return ok(renderJapid()); // which allows more response manipulations. * } * * </pre> * * @author bran * */ public class JapidResult extends Results.Status implements Externalizable, Content { public static final String CONTENT_TYPE = "Content-Type"; public static final String CACHE_CONTROL = "Cache-Control"; private RenderResult renderResult; private Map<String, String> headers = new HashMap<String, String>(); // private boolean eager = false; // String resultContent = ""; // public JapidResult(String contentType) { // super(); // this.contentType = contentType; // } // // public JapidResult(String contentType2, String string) { // this.contentType = contentType2; // this.content = string; // } public JapidResult(RenderResult r) { super(play.core.j.JavaResults.Status(200), r.getContent().toString(), play.api.mvc.Codec.javaSupported("utf-8") ); this.renderResult = r; this.setHeaders(r.getHeaders()); Seq<scala.Tuple2<String, String>> seq = scala.collection.JavaConversions.mapAsScalaMap(renderResult.getHeaders()).toSeq(); super.getWrappedSimpleResult().withHeaders(seq); } public JapidResult() { super(play.core.j.JavaResults.Status(200)); } // /** // * extract content now and once. Eager evaluation of RenderResult // */ // public JapidResult eval() { // this.eager = true; // this.resultContent = extractContent(); // return this; // } /** * @param r */ public String extractContent() { String content = ""; StringBuilder sb = renderResult.getContent(); if (sb != null) content = sb.toString(); return content; } public RenderResult getRenderResult() { return renderResult; } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(renderResult); out.writeObject(getHeaders()); // out.writeBoolean(eager); // out.writeUTF(resultContent); } @SuppressWarnings("unchecked") @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { renderResult = (RenderResult) in.readObject(); setHeaders((Map<String, String>) in.readObject()); } /** * @return the headers */ public Map<String, String> getHeaders() { return headers; } /** * @param headers the headers to set */ private void setHeaders(Map<String, String> headers) { this.headers = headers; } @Override public String toString() { return extractContent(); } /* (non-Javadoc) * @see play.api.mvc.Content#body() */ @Override public String body() { return renderResult == null? null : renderResult.getText(); } /* (non-Javadoc) * @see play.api.mvc.Content#contentType() */ @Override public String contentType() { return renderResult == null? null : renderResult.getContentType(); } // /* (non-Javadoc) // * @see play.mvc.SimpleResult#getWrappedSimpleResult() // */ // @Override // public SimpleResult getWrappedSimpleResult() { // String content = extractContent(); // Results.Status st = Results.ok(content); //// //// play.api.mvc.Results.Status sta = play.core.j.JavaResults.Status(200); //// Seq<Tuple2<String, String>> seq = JavaConversions.mapAsScalaMap(renderResult.getHeaders()).toSeq(); //// st.withHeaders(seq); //// status = new play.mvc.Results.Status(sta, content, play.api.mvc.Codec.javaSupported("utf-8")); //// } // return st; // } // /* (non-Javadoc) // * @see play.mvc.Result#getWrappedResult() // */ // @Override // public Future<SimpleResult> getWrappedResult() { // // TODO Auto-generated method stub // return null; // } }