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/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.