Re: How to stop (w/o exception)

"Jonathan Revusky" <[email protected]>
Newsgroups gmane.comp.web.freemarker.user
Message-ID <[email protected]>
Oh, it appears that the stop.getMessage() is not returning the string
"graceful", so it's rethrowing. The constructor is putting a bunch of
extra info in the message string as well as the cause you added.

So that would probably work if it was:

if (stop.getMessage().find("graceful") == -1) throw stop;

Then as long as the string "graceful" appears in the message, it
simply ends gracefully, otherwise it rethrows.

JR

On Tue, Feb 26, 2008 at 7:39 PM, Newman, John W <[email protected]> wrote:
> 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/
>  _______________________________________________
>  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.