From fb97cbb0d6c94b264752cb645a044974363e642c Mon Sep 17 00:00:00 2001 From: Guoqiang Chen Date: Mon, 1 Dec 2014 02:22:08 +0000 Subject: [PATCH] fixes NPE occured while invoking getTemplate().render(...) in functions/methods/tags (#6) --- .../jetbrick/template/JetTemplateImpl.java | 32 ++++++++++++------- .../runtime/InterpretContextImpl.java | 6 +++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/jetbrick-template/src/main/java/jetbrick/template/JetTemplateImpl.java b/jetbrick-template/src/main/java/jetbrick/template/JetTemplateImpl.java index 9a3a79c..d11385e 100644 --- a/jetbrick-template/src/main/java/jetbrick/template/JetTemplateImpl.java +++ b/jetbrick-template/src/main/java/jetbrick/template/JetTemplateImpl.java @@ -148,19 +148,29 @@ public void render(Map context, OutputStream out) { } private void doInterpret(Map context, JetWriter writer) { - InterpretContextImpl ctx = new InterpretContextImpl(engine, writer, context, securityManager); + // 如果在扩展函数,方法,tag 等里面,再次调用 getTemplate().render(),需要保持当前环境,在运行完之后,进行现场恢复 + // see: https://github.com/subchen/jetbrick-template-2x/issues/6 + InterpretContextImpl last = (InterpretContextImpl) InterpretContext.current(); try { - ctx.getTemplateStack().push(this); - ctx.getValueStack().push(option.getSymbols(), null, true); - - astNode.execute(ctx); - - ctx.getValueStack().pop(); - ctx.getTemplateStack().pop(); - } catch (InterpretException e) { - throw e.set(ctx.getSource()); + InterpretContextImpl ctx = new InterpretContextImpl(engine, writer, context, securityManager); + try { + ctx.getTemplateStack().push(this); + ctx.getValueStack().push(option.getSymbols(), null, true); + + astNode.execute(ctx); + + ctx.getValueStack().pop(); + ctx.getTemplateStack().pop(); + } catch (InterpretException e) { + throw e.set(ctx.getSource()); + } finally { + ctx.freeThreadLocal(); + } } finally { - ctx.remove(); + // 进行现场恢复 + if (last != null) { + last.setThreadLocal(); + } } } diff --git a/jetbrick-template/src/main/java/jetbrick/template/runtime/InterpretContextImpl.java b/jetbrick-template/src/main/java/jetbrick/template/runtime/InterpretContextImpl.java index 19cbfa4..9338b6b 100644 --- a/jetbrick-template/src/main/java/jetbrick/template/runtime/InterpretContextImpl.java +++ b/jetbrick-template/src/main/java/jetbrick/template/runtime/InterpretContextImpl.java @@ -45,10 +45,14 @@ public InterpretContextImpl(JetEngine engine, JetWriter writer, Map