From ebe370bd026146a38b5245d0735d305645b577db Mon Sep 17 00:00:00 2001 From: nmihajlovski Date: Sun, 28 Aug 2016 22:24:11 -0700 Subject: [PATCH] Redesigned MasterPage API. --- .../rapidoid/activity/RapidoidThreadLocals.java | 2 ++ .../src/main/java/org/rapidoid/web/Screen.java | 6 ++++++ .../src/main/java/org/rapidoid/web/ScreenBean.java | 6 ++++++ .../src/main/java/org/rapidoid/gui/HtmlPage.java | 14 ++++++++++++++ .../org/rapidoid/http/customize/MasterPage.java | 5 +++-- .../http/customize/defaults/DefaultMasterPage.java | 13 ++++++++++--- .../org/rapidoid/http/impl/ResponseRenderer.java | 12 ++++++++---- 7 files changed, 49 insertions(+), 9 deletions(-) diff --git a/rapidoid-commons/src/main/java/org/rapidoid/activity/RapidoidThreadLocals.java b/rapidoid-commons/src/main/java/org/rapidoid/activity/RapidoidThreadLocals.java index ae3e2dc854..9cd5b9bb10 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/activity/RapidoidThreadLocals.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/activity/RapidoidThreadLocals.java @@ -49,4 +49,6 @@ public static RapidoidThreadLocals get() { public final ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); + public final ByteArrayOutputStream pageRenderingBaos = new ByteArrayOutputStream(); + } diff --git a/rapidoid-commons/src/main/java/org/rapidoid/web/Screen.java b/rapidoid-commons/src/main/java/org/rapidoid/web/Screen.java index 8f0912c802..1275da20f6 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/web/Screen.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/web/Screen.java @@ -23,6 +23,7 @@ import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; +import java.io.OutputStream; import java.util.Map; import java.util.Set; @@ -39,6 +40,11 @@ public interface Screen { */ String render(); + /** + * Renders the screen to the specified OutputStream. + */ + void render(OutputStream out); + /** * Sets the "title" attribute in the MVC model of the response, used for GUI page rendering. */ diff --git a/rapidoid-commons/src/main/java/org/rapidoid/web/ScreenBean.java b/rapidoid-commons/src/main/java/org/rapidoid/web/ScreenBean.java index 5cd984c4e5..eef8f5b198 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/web/ScreenBean.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/web/ScreenBean.java @@ -7,6 +7,7 @@ import org.rapidoid.commons.Env; import org.rapidoid.u.U; +import java.io.OutputStream; import java.util.Map; import java.util.Set; @@ -53,6 +54,11 @@ public String render() { throw U.rte("The Screen cannot render itself!"); } + @Override + public void render(OutputStream out) { + throw U.rte("The Screen cannot render itself!"); + } + @Override public String home() { return home; diff --git a/rapidoid-gui/src/main/java/org/rapidoid/gui/HtmlPage.java b/rapidoid-gui/src/main/java/org/rapidoid/gui/HtmlPage.java index 7e86f66cbf..997fab8a42 100644 --- a/rapidoid-gui/src/main/java/org/rapidoid/gui/HtmlPage.java +++ b/rapidoid-gui/src/main/java/org/rapidoid/gui/HtmlPage.java @@ -14,8 +14,11 @@ import org.rapidoid.render.Template; import org.rapidoid.render.Templates; import org.rapidoid.u.U; +import org.rapidoid.util.StreamUtils; import org.rapidoid.web.ScreenBean; +import java.io.IOException; +import java.io.OutputStream; import java.util.List; import java.util.Map; import java.util.Set; @@ -72,6 +75,17 @@ public String render() { return html; } + @Override + public void render(OutputStream out) { + String html = render(); + + try { + StreamUtils.writeUTF8(out, html); + } catch (IOException e) { + throw U.rte(e); + } + } + @SuppressWarnings("unchecked") private Map pageModel() { IReqInfo req = ReqInfo.get(); diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/MasterPage.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/MasterPage.java index 1622693ad8..e1a726bbba 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/MasterPage.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/MasterPage.java @@ -23,12 +23,13 @@ import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; import org.rapidoid.http.Req; -import org.rapidoid.http.Resp; + +import java.io.OutputStream; @Authors("Nikolche Mihajlovski") @Since("5.2.0") public interface MasterPage { - Object renderPage(Req req, Resp resp, String content) throws Exception; + void renderPage(Req req, String content, OutputStream out) throws Exception; } diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/defaults/DefaultMasterPage.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/defaults/DefaultMasterPage.java index 84ee24aa15..42f74a809e 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/defaults/DefaultMasterPage.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/customize/defaults/DefaultMasterPage.java @@ -8,8 +8,10 @@ import org.rapidoid.http.Resp; import org.rapidoid.http.customize.MasterPage; import org.rapidoid.u.U; +import org.rapidoid.util.StreamUtils; import org.rapidoid.web.Screen; +import java.io.OutputStream; import java.util.regex.Pattern; /* @@ -41,15 +43,20 @@ public class DefaultMasterPage extends RapidoidThing implements MasterPage { private static final Pattern FULL_PAGE_PATTERN = Pattern.compile(FULL_PAGE_REGEX); @Override - public Object renderPage(Req req, Resp resp, String content) throws Exception { + public void renderPage(Req req, String content, OutputStream out) throws Exception { U.notNull(content, "page content"); - if (isFullPage(req, content)) return GUI.hardcoded(content); + Resp resp = req.response(); + + if (isFullPage(req, content)) { + StreamUtils.writeUTF8(out, content); + return; + } Screen screen = resp.screen(); screen.content(GUI.hardcoded(content)); - return screen.render(); + screen.render(out); } private boolean isFullPage(Req req, String content) { diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ResponseRenderer.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ResponseRenderer.java index a770b9d081..137804fd4c 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ResponseRenderer.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ResponseRenderer.java @@ -55,7 +55,7 @@ public static byte[] render(ReqImpl req, Resp resp) { content = new String(HttpUtils.responseToBytes(req, cnt, MediaType.HTML_UTF_8, null)); } - return renderPage(req, resp, content); + return renderPage(req, content); } private static boolean shouldRenderView(Resp resp) { @@ -106,18 +106,22 @@ public static String renderView(ReqImpl req, Resp resp, Object result) { return new String(out.toByteArray()); } - public static byte[] renderPage(ReqImpl req, Resp resp, String content) { + public static byte[] renderPage(ReqImpl req, String content) { MasterPage masterPage = Customization.of(req).masterPage(); U.must(masterPage != null, "A page renderer wasn't configured!"); + ByteArrayOutputStream out = Msc.locals().pageRenderingBaos; + out.reset(); + try { - Object response = U.or(masterPage.renderPage(req, resp, content), ""); - return HttpUtils.responseToBytes(req, response, MediaType.HTML_UTF_8, null); + masterPage.renderPage(req, content, out); } catch (Exception e) { throw U.rte("Error while rendering page!", e); } + + return out.toByteArray(); } private static Object wrapGuiContent(Object content) {