From 36ee14b5b030b619ef753e86c43ad38dbd6302ae Mon Sep 17 00:00:00 2001 From: nmihajlovski Date: Wed, 15 Mar 2017 17:11:09 +0100 Subject: [PATCH] Proper nesting of the thread-local template rendering contexts. --- .../org/rapidoid/render/RapidoidTemplate.java | 19 +++++++++++++------ .../org/rapidoid/render/RenderCtxImpl.java | 10 ++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/rapidoid-render/src/main/java/org/rapidoid/render/RapidoidTemplate.java b/rapidoid-render/src/main/java/org/rapidoid/render/RapidoidTemplate.java index 67b6726e88..a972fb45f8 100644 --- a/rapidoid-render/src/main/java/org/rapidoid/render/RapidoidTemplate.java +++ b/rapidoid-render/src/main/java/org/rapidoid/render/RapidoidTemplate.java @@ -48,26 +48,28 @@ public RapidoidTemplate(String filename, TemplateRenderer template, TemplateFact } void doRenderMulti(RapidoidThreadLocals locals, OutputStream output, List model) { - RenderCtxImpl renderCtx = initRenderCtx(locals); + // start using the render context + RenderCtxImpl renderCtx = getRenderCtx(locals); renderCtx.out(output).factory(factory).filename(filename).multiModel(model); - template.render(renderCtx); + // stop using the render context renderCtx.reset(); } void doRender(RapidoidThreadLocals locals, OutputStream output, Object model) { - RenderCtxImpl renderCtx = initRenderCtx(locals); + // start using the render context + RenderCtxImpl renderCtx = getRenderCtx(locals); renderCtx.out(output).factory(factory).filename(filename).model(model); - template.render(renderCtx); + // stop using the render context renderCtx.reset(); } - private RenderCtxImpl initRenderCtx(RapidoidThreadLocals locals) { + private RenderCtxImpl getRenderCtx(RapidoidThreadLocals locals) { RenderCtxImpl renderCtx = (RenderCtxImpl) locals.renderContext; if (renderCtx == null) { @@ -75,7 +77,12 @@ private RenderCtxImpl initRenderCtx(RapidoidThreadLocals locals) { locals.renderContext = renderCtx; } - return renderCtx; + if (!renderCtx.busy()) { + renderCtx.claim(); + return renderCtx; + } else { + return new RenderCtxImpl(); + } } public void renderMultiModel(OutputStream output, Object... model) { diff --git a/rapidoid-render/src/main/java/org/rapidoid/render/RenderCtxImpl.java b/rapidoid-render/src/main/java/org/rapidoid/render/RenderCtxImpl.java index 14442ae75c..e663873e25 100644 --- a/rapidoid-render/src/main/java/org/rapidoid/render/RenderCtxImpl.java +++ b/rapidoid-render/src/main/java/org/rapidoid/render/RenderCtxImpl.java @@ -47,6 +47,8 @@ public class RenderCtxImpl extends RapidoidThing implements RenderCtx { private volatile String ext; private volatile TemplateFactory factory; + private volatile boolean busy; + @Override public void printAscii(String s) throws IOException { StreamUtils.writeAscii(out, s); @@ -199,6 +201,14 @@ public RenderCtxImpl filename(String filename) { public void reset() { this.model.clear(); + this.busy = false; + } + + public boolean busy() { + return busy; } + public void claim() { + this.busy = true; + } }