Re: How to stop (w/o exception)
"Newman, John W" <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <EE3D0D387D01C8498EC1CED489DEAB2537F988CCCA@msxmbxnsprd01.acct.upmchs.net> |
catch (StopException stop) {
if !("graceful".equals(stop.getMessage()) throw stop;
}
That's where I am going, but FreemarkerServlet doesn't really give me a clear point to hook in. This class could probably use a few simple refactorings like extract method and such at some point. Some of the methods look like they are doing 6 different things.
Pre template process can do it, but the exception handling doesn't really work out...
@Override
public boolean preTemplateProcess(HttpServletRequest request,
HttpServletResponse response, Template template, TemplateModel model) {
addMyStuffToModel();
try {
process(request, response, template, model);
} catch (TemplateException e) {
handleException(e);
} catch (IOException e) {
handleException(e);
} catch (ServletException e) {
handleException(e);
}
return false;
}
// servlet should have this as a protected method,
// I could then just call super.process(..) in a try catch block.
protected void process(HttpServletRequest request,
HttpServletResponse response, Template template, TemplateModel model)
throws TemplateException, IOException, ServletException {
try {
template.process(model, response.getWriter());
} catch (StopException e) {
if (!"graceful".equals(e.getMessage())) {
throw e;
}
} finally {
postTemplateProcess(request, response, template, model);
}
}
protected void handleException(Exception e) {
LOG.error(e.getMessage(), e);
// uh...
}
Also it looks like that won't work anyway, the exception doesn't come back and I can't catch it... Am I doing something wrong?
13:32:22,530 ERROR runtime:96 -
Encountered stop instruction
Cause given: graceful
graceful
The problematic instruction:
----------
==> stop [on line 4, column 9 in WEB-INF/inquiry/view.ftl] [on line 4, column 9 in WEB-INF/inquiry/view.ftl]
in include "view.ftl" [on line 11, column 9 in WEB-INF/inquiry/index.ftl]
----------
Java backtrace for programmers:
----------
freemarker.core.StopException: graceful
at freemarker.core.StopInstruction.accept(StopInstruction.java:73)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.Environment.include(Environment.java:1378)
at freemarker.core.Include.accept(Include.java:155)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:196)
at freemarker.core.Environment.process(Environment.java:176)
at freemarker.template.Template.process(Template.java:232)
at edu.upmc.ccweb.core.support.freemarker.FreemarkerServlet.process(FreemarkerServlet.java:168)
at edu.upmc.ccweb.core.support.freemarker.FreemarkerServlet.preTemplateProcess(FreemarkerServlet.java:152)
at freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:424)
at freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:366)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Jonathan Revusky
Sent: Tuesday, February 26, 2008 1:03 PM
To: FreeMarker-user
Subject: Re: [FreeMarker-user] How to stop (w/o exception)
On Tue, Feb 26, 2008 at 6:48 PM, Newman, John W <[email protected]> wrote:
> Instead of the macro I'd just put it in an if statement. Maybe I can try/catch stop exception in my servlet, but I may not always want to catch that. There should be a [#abort /] directive or something to do that.
Well, one possibility is that you use [#stop "graceful"] when you
intend for the exception to be ignored. And then in the java code, you
could:
try {
....
template.process(dataModel,out);
...
} catch (StopException stop) {
if !("graceful".equals(stop.getMessage()) throw stop;
}
so you rethrow the exception unless the detail string associated with
it is "graceful".
In any case, Attila's suggestion of using a macro in conjunction with
#return also works internally by throwing an exception except that it
gets caught , so it unwinds to the point where the macro was called.
You know, again, AFAICS, the only way to jump out of an arbitrarilly
nested structure is by throwing an exception.
>
>
>
>
> -----Original Message-----
> From: [email protected] [mailto:[email protected]] On Behalf Of Attila Szegedi
> Sent: Tuesday, February 26, 2008 12:44 PM
> To: FreeMarker-user
> Subject: Re: [FreeMarker-user] How to stop (w/o exception)
>
> You could enclose your template body in a:
>
> [#macro actuallyRenderThePage]
> ...
> [/#macro]
> [@actuallyRenderThePage/]
>
> and then use [#return] from within the macro body. Of course, that
> doesn't address more complex situations, as stopping gracefully from
> several levels of macros or includes. In these cases [#stop/] is the
> only reliable mechanism -- you'll just have to catch and ignore it at
> your point of Template.process() invocation...
>
> Attila.
>
> On 2008.02.26., at 17:44, Newman, John W wrote:
>
> > Hi,
> >
> > I tried searching but sourceforge is down... I'm sure this has been
> > discussed before.
> >
> >
> > We have the [#stop /] directive which throws an exception. Is there
> > a way to stop processing gracefully?
> >
> >
> > [#if somethingBad]
> > [#stopGracefully /]
> > [/#if]
> >
> > Sure I could do
> >
> > [#if ! somethingBad]
> > Everything here
> > [/#if]
> >
> > But I'm pretty sure there is a break or stop thing that should work
> > here. Just wondering, thanks.
>
>
>
>
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> FreeMarker-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freemarker-user
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> FreeMarker-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freemarker-user
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
FreeMarker-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freemarker-user
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/