freemarker.template.TemplateModelException when using Stripes LayoutRenderTag 
with Freemarker 2.3.18
----------------------------------------------------------------------------------------------------

                 Key: STS-861
                 URL: http://www.stripesframework.org/jira/browse/STS-861
             Project: Stripes
          Issue Type: Bug
          Components: Tag Library
    Affects Versions: Release 1.5.6, Release 1.5.5, Release 1.5.4
         Environment: Freemarker 2.3.18
Stripes 1.5.6
            Reporter: Haggi


We managed Stripes LayoutRenderTag to work with the latest version of 
Freemarker 2.3.x. without the need of a dynamic attribute to be set. Freemarker 
throws some curious exception when using the LayoutRenderTag without a dynamic 
attribute.

It's because Stripes overrides the Tagwriter instance of Freemarker in the 
getContext() method of the LayoutRenderTag class within the doStartTag() 
method. That's a problem because Freemarks checks if the Writer (Tagwriter) 
before the Tag is called is the same like after Tag processing.

If you set a dynamic attribute on the layout-render tag the getContext() method 
in LayoutRenderTag is called within the setDynamicAttribute() method and before 
the doStartTag() method is invoked. If the LayoutContext is initialized before 
the doStartTag() method is invoked all goes fine.

So i override the setPageContext() method within the LayoutRenderTag class and 
call the getContext() method before anything else is invoked.

{code:title=LayoutRenderTag.java|borderStyle=solid}
@Override
public void setPageContext(PageContext pageContext) {
   super.setPageContext(pageContext);
   this.getContext();
}
{code}

Here is the layout used in my tests:

{code:title=layout.ftl with the layout-definition|borderStyle=solid}
<#ftl>
<#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>

<@s["layout-definition"]>
         HEAD: <@s["layout-component"] name="html_head" /><br/>
         BODY: <@s["layout-component"] name="body" />
</@>
{code}

{code:title=test.ftl with the layout-render|borderStyle=solid}
<#ftl>
<#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>

<@s["layout-render"] name="/web/manager/layout/default.ftl">
        <@s["layout-component"] name="html_head">
                Here is the head
        </@>
    <@s["layout-component"] name="body">
                Here is the body
    </@>
</@>
{code}

There some other really annoying problems when using Stripes and Freemarker we 
have managed to go away.

{code}
12:58:42 WARN: freemarker.jsp - Tag.SKIP_PAGE was ignored from a 
net.sourceforge.stripes.tag.layout.LayoutDefinitionTag tag.
{code}

This execption is raised because of the SKIP_PAGE return value in 
LayoutDefinitionTag class in the doEndTag() method.
I change the return value in EVAL_PAGE to prevent the output of the WARN 
message.

and 

in the LayoutWriter class the flush() method throw an unhandled exception 
NullPointerException because the expected Writer is null. The root cause is 
unknown, but i added a null-check to prevent this WARN message too.

After that all pages renders fine, i can use Freemarker templates with layout 
tags of Stripes.

{code}
12:58:42 WARN: net.sourceforge.stripes.exception.DefaultExceptionHandler - 
Unhandled exception caught by the Stripes default exception handler.
java.lang.NullPointerException
        at 
net.sourceforge.stripes.tag.layout.LayoutWriter.flush(LayoutWriter.java:125)
        at freemarker.ext.jsp.JspWriterAdapter.flush(JspWriterAdapter.java:40)
        at 
net.sourceforge.stripes.tag.layout.LayoutWriter.tryFlush(LayoutWriter.java:108)
        at 
net.sourceforge.stripes.tag.layout.LayoutWriter.setSilent(LayoutWriter.java:70)
        at 
net.sourceforge.stripes.tag.layout.LayoutRenderTag.doEndTag(LayoutRenderTag.java:189)
        at 
freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:430)
        at 
freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:406)
        at freemarker.core.Environment.visit(Environment.java:312)
        at freemarker.core.UnifiedCall.accept(UnifiedCall.java:130)
        at freemarker.core.Environment.visit(Environment.java:221)
        at freemarker.core.MixedContent.accept(MixedContent.java:92)
        at freemarker.core.Environment.visit(Environment.java:221)
        at freemarker.core.Environment.process(Environment.java:199)
        at freemarker.template.Template.process(Template.java:237)
        at 
freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:452)
        at 
freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:391)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at 
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at 
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
        at 
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
        at 
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
        at 
net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
        at 
net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
        at 
org.stripesstuff.plugin.security.SecurityInterceptor.intercept(SecurityInterceptor.java:140)
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
        at 
net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
        at 
net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
        at 
net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
        at 
net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
        at 
net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
        at 
net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
        at 
net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at 
net.sourceforge.stripes.controller.DynamicMappingFilter$2.doFilter(DynamicMappingFilter.java:431)
        at 
net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
        at 
net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:418)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
        at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
        at 
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
        at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
        at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
{code}



-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure 
contains a definitive record of customers, application performance, 
security threats, fraudulent activity, and more. Splunk takes this 
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to