Some exception handlers stopped working after updating Stripes from CVS

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Some exception handlers stopped working after updating Stripes from CVS

samaxes
After updating Stripes source code from CVS (to try a bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7776) some of my handlers have stopped to work.

This one for example:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        MyActionBeanContext context = (MyActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new RedirectResolution(bean.getClass()).flash(bean).addParameter("id",
                    bean.getContext().getRequest().getParameter("id"));
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It was working fine, but now the error message never appears.
I was using a revision prior to 900, don't know which one exactly...

Regards

--
Samuel Santos
http://www.samaxes.com/
-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

samaxes
Just to confirm, the revision I was using was around the 870 (Freddy's bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7230).


On Thu, May 22, 2008 at 3:23 AM, Samuel Santos <[hidden email]> wrote:
After updating Stripes source code from CVS (to try a bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7776) some of my handlers have stopped to work.

This one for example:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        MyActionBeanContext context = (MyActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new RedirectResolution(bean.getClass()).flash(bean).addParameter("id",
                    bean.getContext().getRequest().getParameter("id"));
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It was working fine, but now the error message never appears.
I was using a revision prior to 900, don't know which one exactly...

Regards

--
Samuel Santos
http://www.samaxes.com/



--
Samuel Santos
http://www.samaxes.com/
-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

Ben Gunter
There were much more severe bugs that we had to fix over the last couple of weeks, and the fix for those bugs is what is causing your error message to disappear.

http://www.stripesframework.org/jira/browse/STS-565
http://www.stripesframework.org/jira/browse/STS-567

The root of those two problems was the following. You have an ActionBean subclass A that handles a request, returning new RedirectResolution(getClass(), "someOtherEvent").flash(this). That means the existing bean of type A will be flashed and reused on the next request. That bean kept its old ActionBeanContext, so the request, response, validation errors, event name, and everything else carried over after the redirect. That messed up a lot of stuff, while some other stuff worked normally, depending on whether the code obtained the ActionBeanContext from the ActionBean or the ExecutionContext. In effect, there were two different ActionBeanContexts for the same request -- bad news.

This is only a problem if the same ActionBean that handled the first request also has to handle the next request. The bean that handles a request has to get a fresh ActionBeanContext so that it has current information to work with. Specifically, you really don't want the validation errors to carry over because they trigger a forward to the source page, which in this case is usually null, resulting in the default validation error page.

Trust me, I've been over and over this in the last few days. I had to deal with it when I was working on the FULEE handler. I discussed it with Tim this morning, and he agreed with my conclusion: there's no good way for Stripes to work around it. You have to have a clean context for each request, and that means if you redirect/flash using the same bean for both requests you must sacrifice the validation errors in the old context.

You can see in my FULEE handler that I switched from a redirect/flash to an internal forward. That way the errors work as expected. You could also switch from using validation errors to messages, as they do carry over when flashing.

Sorry to be the bearer of bad news.

-Ben


Samuel Santos wrote:
Just to confirm, the revision I was using was around the 870 (Freddy's bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7230).


On Thu, May 22, 2008 at 3:23 AM, Samuel Santos <[hidden email]> wrote:
After updating Stripes source code from CVS (to try a bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7776) some of my handlers have stopped to work.

This one for example:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        MyActionBeanContext context = (MyActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new RedirectResolution(bean.getClass()).flash(bean).addParameter("id",
                    bean.getContext().getRequest().getParameter("id"));
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It was working fine, but now the error message never appears.
I was using a revision prior to 900, don't know which one exactly...

Regards

--
Samuel Santos
http://www.samaxes.com/



--
Samuel Santos
http://www.samaxes.com/

------------------------------------------------------------------------- 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/

_______________________________________________ Stripes-users mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/stripes-users

-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

samaxes
If I switch from a redirect to a forward is even worse... It enters in an infinite loop.

My handler:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        PVoucherActionBeanContext context = (PVoucherActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new ForwardResolution(bean.getClass()).addParameter("id",
                    bean.getContext().getRequest().getParameter("id")); // CHANGED TO FORWARD
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

The stack trace:
2008-05-22 23:45:50,815 DEBUG [net.sourceforge.stripes.controller.ExecutionContext] Transitioning to lifecycle stage CustomValidation
2008-05-22 23:45:50,816 DEBUG [net.sourceforge.stripes.controller.ExecutionContext] Transitioning to lifecycle stage EventHandling
2008-05-22 23:45:50,816 DEBUG [net.sourceforge.stripes.controller.ExecutionContext] Transitioning to lifecycle stage ResolutionExecution
2008-05-22 23:45:50,816 DEBUG [net.sourceforge.stripes.controller.HttpCacheInterceptor] Looking for HttpCache on com.criticalsoftware.pvoucher.presentation.action.administration.DealerListingActionBean.main()
2008-05-22 23:45:50,848 DEBUG [net.sourceforge.stripes.validation.SimpleError] Looking up localized field name with messageKey: __stripes_global_error
2008-05-22 23:45:50,959 ERROR [com.criticalsoftware.pvoucher.presentation.exception.DefaultExceptionHandler]
java.lang.NullPointerException
    at net.sourceforge.stripes.validation.LocalizableError.getMessageTemplate(LocalizableError.java:91)
    at net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
    at net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
    at net.sourceforge.stripes.tag.ErrorsTag.doEndTag(ErrorsTag.java:349)
    at org.apache.jsp.decorators.top_jsp._jspService(top_jsp.java:164)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.WEB_002dINF.administration.dealerListing_jsp._jspx_meth_page_005fapplyDecorator_005f0(dealerListing_jsp.java:377)
    at org.apache.jsp.WEB_002dINF.administration.dealerListing_jsp._jspService(dealerListing_jsp.java:159)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
    at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:483)
    at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
    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:111)
    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:477)
    at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:293)
    at net.sourceforge.stripes.controller.DispatcherServlet.doPost(DispatcherServlet.java:177)
    at net.sourceforge.stripes.controller.DispatcherServlet.doGet(DispatcherServlet.java:67)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
    at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
2008-05-22 23:45:51,023 DEBUG [net.sourceforge.stripes.validation.SimpleError] Looking up localized field name with messageKey: __stripes_global_error
2008-05-22 23:45:51,024 ERROR [com.criticalsoftware.pvoucher.presentation.exception.DefaultExceptionHandler]
java.lang.NullPointerException
    at net.sourceforge.stripes.validation.LocalizableError.getMessageTemplate(LocalizableError.java:91)
    at net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
    at net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
    at net.sourceforge.stripes.tag.ErrorsTag.doEndTag(ErrorsTag.java:349)
    at org.apache.jsp.decorators.top_jsp._jspService(top_jsp.java:164)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
[...]


On Thu, May 22, 2008 at 4:37 AM, Ben Gunter <[hidden email]> wrote:
There were much more severe bugs that we had to fix over the last couple of weeks, and the fix for those bugs is what is causing your error message to disappear.

http://www.stripesframework.org/jira/browse/STS-565
http://www.stripesframework.org/jira/browse/STS-567

The root of those two problems was the following. You have an ActionBean subclass A that handles a request, returning new RedirectResolution(getClass(), "someOtherEvent").flash(this). That means the existing bean of type A will be flashed and reused on the next request. That bean kept its old ActionBeanContext, so the request, response, validation errors, event name, and everything else carried over after the redirect. That messed up a lot of stuff, while some other stuff worked normally, depending on whether the code obtained the ActionBeanContext from the ActionBean or the ExecutionContext. In effect, there were two different ActionBeanContexts for the same request -- bad news.

This is only a problem if the same ActionBean that handled the first request also has to handle the next request. The bean that handles a request has to get a fresh ActionBeanContext so that it has current information to work with. Specifically, you really don't want the validation errors to carry over because they trigger a forward to the source page, which in this case is usually null, resulting in the default validation error page.

Trust me, I've been over and over this in the last few days. I had to deal with it when I was working on the FULEE handler. I discussed it with Tim this morning, and he agreed with my conclusion: there's no good way for Stripes to work around it. You have to have a clean context for each request, and that means if you redirect/flash using the same bean for both requests you must sacrifice the validation errors in the old context.

You can see in my FULEE handler that I switched from a redirect/flash to an internal forward. That way the errors work as expected. You could also switch from using validation errors to messages, as they do carry over when flashing.

Sorry to be the bearer of bad news.

-Ben


Samuel Santos wrote:
Just to confirm, the revision I was using was around the 870 (Freddy's bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7230).


On Thu, May 22, 2008 at 3:23 AM, Samuel Santos <[hidden email]> wrote:
After updating Stripes source code from CVS (to try a bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7776) some of my handlers have stopped to work.

This one for example:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        MyActionBeanContext context = (MyActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new RedirectResolution(bean.getClass()).flash(bean).addParameter("id",
                    bean.getContext().getRequest().getParameter("id"));
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It was working fine, but now the error message never appears.
I was using a revision prior to 900, don't know which one exactly...

Regards

--
Samuel Santos
http://www.samaxes.com/



--
Samuel Santos
http://www.samaxes.com/

------------------------------------------------------------------------- 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/

_______________________________________________ Stripes-users mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/stripes-users

-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users




--
Samuel Santos
http://www.samaxes.com/
-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

samaxes
In reply to this post by Ben Gunter
Ben,

I'm a little worried with the new Stripes RC1 release.

All my handlers that return a ForwardResolution have stopped working. For now I will stick with a previous revision of Stripes beta, maybe the way to handle exceptions have changed since I implemented them, but it doesn't seem so.

Here's one of my normal handlers:
    public Resolution handle(IdAlreadyExistException exception, HttpServletRequest request,
            HttpServletResponse response) {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        ActionBean bean = (ActionBean) request.getAttribute(StripesConstants.REQ_ATTR_ACTION_BEAN);
        String sourcePage = bean.getContext().getSourcePage();
        Resolution resolution;

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.IdAlreadyExistException"));
            resolution = new ForwardResolution(sourcePage);
        } else {
            request.setAttribute("error", resources.getString("error.IdAlreadyExistException"));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It crashes on the forward and enters in an infinite loop, is this normal?

2008-05-23 17:42:39,732 INFO  [AddDealerActionBean] User [tadmin] executing method [insert].
2008-05-23 17:42:39,792 WARN  [DefaultExceptionHandler] Already exists a user with the same id
2008-05-23 17:42:39,813 ERROR [DefaultExceptionHandler]
java.lang.NullPointerException
    at net.sourceforge.stripes.validation.LocalizableError.getMessageTemplate(LocalizableError.java:91)
    at net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
    at net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
    at net.sourceforge.stripes.tag.ErrorsTag.doEndTag(ErrorsTag.java:349)
    at org.apache.jsp.decorators.top_jsp._jspService(top_jsp.java:164)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspx_meth_page_005fapplyDecorator_005f0(addDealer_jsp.java:338)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspService(addDealer_jsp.java:169)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
    at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
2008-05-23 17:42:40,099 ERROR [DefaultExceptionHandler]
java.lang.NullPointerException
    at net.sourceforge.stripes.validation.LocalizableError.getMessageTemplate(LocalizableError.java:91)
    at net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
    at net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
    at net.sourceforge.stripes.tag.ErrorsTag.doEndTag(ErrorsTag.java:349)
    at org.apache.jsp.decorators.top_jsp._jspService(top_jsp.java:164)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.includes.errorContent_jsp._jspx_meth_page_005fapplyDecorator_005f0(errorContent_jsp.java:149)
    at org.apache.jsp.includes.errorContent_jsp._jspService(errorContent_jsp.java:87)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:314)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:171)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fimport_005f3(error_jsp.java:406)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fotherwise_005f0(error_jsp.java:355)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fchoose_005f0(error_jsp.java:117)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspService(error_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:106)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspx_meth_page_005fapplyDecorator_005f0(addDealer_jsp.java:338)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspService(addDealer_jsp.java:169)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
    at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
2008-05-23 17:42:40,103 ERROR [DefaultExceptionHandler]
java.lang.NullPointerException
    at net.sourceforge.stripes.validation.LocalizableError.getMessageTemplate(LocalizableError.java:91)
    at net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
    at net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
    at net.sourceforge.stripes.tag.ErrorsTag.doEndTag(ErrorsTag.java:349)
    at org.apache.jsp.decorators.top_jsp._jspService(top_jsp.java:164)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.includes.errorContent_jsp._jspx_meth_page_005fapplyDecorator_005f0(errorContent_jsp.java:149)
    at org.apache.jsp.includes.errorContent_jsp._jspService(errorContent_jsp.java:87)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:314)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:171)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fimport_005f3(error_jsp.java:406)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fotherwise_005f0(error_jsp.java:355)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fchoose_005f0(error_jsp.java:117)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspService(error_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:106)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.includes.errorContent_jsp._jspx_meth_page_005fapplyDecorator_005f0(errorContent_jsp.java:149)
    at org.apache.jsp.includes.errorContent_jsp._jspService(errorContent_jsp.java:87)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:314)
    at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:171)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fimport_005f3(error_jsp.java:406)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fotherwise_005f0(error_jsp.java:355)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspx_meth_c_005fchoose_005f0(error_jsp.java:117)
    at org.apache.jsp.WEB_002dINF.error_jsp._jspService(error_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:246)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:106)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609)
    at com.opensymphony.module.sitemesh.taglib.page.ApplyDecoratorTag.doEndTag(ApplyDecoratorTag.java:254)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspx_meth_page_005fapplyDecorator_005f0(addDealer_jsp.java:338)
    at org.apache.jsp.WEB_002dINF.administration.addDealer_jsp._jspService(addDealer_jsp.java:169)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler$HandlerProxy.handle(DefaultExceptionHandler.java:107)
    at net.sourceforge.stripes.exception.DefaultExceptionHandler.handle(DefaultExceptionHandler.java:140)
    at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:249)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
    at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
[...]

--
Samuel


On Thu, May 22, 2008 at 4:37 AM, Ben Gunter <[hidden email]> wrote:
There were much more severe bugs that we had to fix over the last couple of weeks, and the fix for those bugs is what is causing your error message to disappear.

http://www.stripesframework.org/jira/browse/STS-565
http://www.stripesframework.org/jira/browse/STS-567

The root of those two problems was the following. You have an ActionBean subclass A that handles a request, returning new RedirectResolution(getClass(), "someOtherEvent").flash(this). That means the existing bean of type A will be flashed and reused on the next request. That bean kept its old ActionBeanContext, so the request, response, validation errors, event name, and everything else carried over after the redirect. That messed up a lot of stuff, while some other stuff worked normally, depending on whether the code obtained the ActionBeanContext from the ActionBean or the ExecutionContext. In effect, there were two different ActionBeanContexts for the same request -- bad news.

This is only a problem if the same ActionBean that handled the first request also has to handle the next request. The bean that handles a request has to get a fresh ActionBeanContext so that it has current information to work with. Specifically, you really don't want the validation errors to carry over because they trigger a forward to the source page, which in this case is usually null, resulting in the default validation error page.

Trust me, I've been over and over this in the last few days. I had to deal with it when I was working on the FULEE handler. I discussed it with Tim this morning, and he agreed with my conclusion: there's no good way for Stripes to work around it. You have to have a clean context for each request, and that means if you redirect/flash using the same bean for both requests you must sacrifice the validation errors in the old context.

You can see in my FULEE handler that I switched from a redirect/flash to an internal forward. That way the errors work as expected. You could also switch from using validation errors to messages, as they do carry over when flashing.

Sorry to be the bearer of bad news.

-Ben


Samuel Santos wrote:
Just to confirm, the revision I was using was around the 870 (Freddy's bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7230).


On Thu, May 22, 2008 at 3:23 AM, Samuel Santos <[hidden email]> wrote:
After updating Stripes source code from CVS (to try a bug fix http://article.gmane.org/gmane.comp.java.stripes.user/7776) some of my handlers have stopped to work.

This one for example:
    public Resolution handle(CanNotChangeUserException exception, HttpServletRequest request,
            HttpServletResponse response) throws MalformedURLException, ServletException {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        Resolution resolution;

        // get referer URL and convert it to context-relative path
        URL referer = new URL(request.getHeader("referer"));
        String path = referer.getFile();
        String contextPath = request.getContextPath();
        if (contextPath.length() > 0) {
            if (!path.startsWith(contextPath + "/")) {
                throw new MalformedURLException();
            }
            path = path.replace(contextPath, "");
        }

        // create action bean and context
        Configuration config = StripesFilter.getConfiguration();
        MyActionBeanContext context = (MyActionBeanContext) config.getActionBeanContextFactory()
                .getContextInstance(request, response);
        ActionBean bean = config.getActionResolver().getActionBean(context, path.substring(0, path.indexOf("?")));
        String sourcePage = bean.getContext().getSourcePage();

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.CanNotChangeUserException." + exception.getOperation()));
            resolution = new RedirectResolution(bean.getClass()).flash(bean).addParameter("id",
                    bean.getContext().getRequest().getParameter("id"));
        } else {
            request.setAttribute("error", resources.getString("error.CanNotChangeUserException."
                    + exception.getOperation()));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It was working fine, but now the error message never appears.
I was using a revision prior to 900, don't know which one exactly...

Regards

--
Samuel Santos
http://www.samaxes.com/



--
Samuel Santos
http://www.samaxes.com/

------------------------------------------------------------------------- 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/

_______________________________________________ Stripes-users mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/stripes-users

-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users




--
Samuel Santos
http://www.samaxes.com/
-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

Ben Gunter
Hi, Samuel. I was able to reproduce the NPE you're getting. There's nothing wrong with your exception handler. I've fixed the issue in the trunk, and the fix will be in the final release. If you don't mind, please test this against the latest revision and let me know how it goes.

As for the infinite loop, I have no idea how that could happen. I would have expected a stack overflow before an infinite loop. If it still happens against the latest revision, send along any information you can give me about that and I'll try to track down the cause.

-Ben

Samuel Santos wrote:
Ben,

I'm a little worried with the new Stripes RC1 release.

All my handlers that return a ForwardResolution have stopped working. For now I will stick with a previous revision of Stripes beta, maybe the way to handle exceptions have changed since I implemented them, but it doesn't seem so.

Here's one of my normal handlers:
    public Resolution handle(IdAlreadyExistException exception, HttpServletRequest request,
            HttpServletResponse response) {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        ActionBean bean = (ActionBean) request.getAttribute(StripesConstants.REQ_ATTR_ACTION_BEAN);
        String sourcePage = bean.getContext().getSourcePage();
        Resolution resolution;

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.IdAlreadyExistException"));
            resolution = new ForwardResolution(sourcePage);
        } else {
            request.setAttribute("error", resources.getString("error.IdAlreadyExistException"));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It crashes on the forward and enters in an infinite loop, is this normal?

-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users
Reply | Threaded
Open this post in threaded view
|

Re: Some exception handlers stopped working after updating Stripes from CVS

samaxes
Thanks Ben,

Works fine with revision 933.

--
Samuel

On Fri, May 23, 2008 at 7:39 PM, Ben Gunter <[hidden email]> wrote:
Hi, Samuel. I was able to reproduce the NPE you're getting. There's nothing wrong with your exception handler. I've fixed the issue in the trunk, and the fix will be in the final release. If you don't mind, please test this against the latest revision and let me know how it goes.

As for the infinite loop, I have no idea how that could happen. I would have expected a stack overflow before an infinite loop. If it still happens against the latest revision, send along any information you can give me about that and I'll try to track down the cause.

-Ben


Samuel Santos wrote:
Ben,

I'm a little worried with the new Stripes RC1 release.

All my handlers that return a ForwardResolution have stopped working. For now I will stick with a previous revision of Stripes beta, maybe the way to handle exceptions have changed since I implemented them, but it doesn't seem so.

Here's one of my normal handlers:
    public Resolution handle(IdAlreadyExistException exception, HttpServletRequest request,
            HttpServletResponse response) {
        LOGGER.warn(exception.getMessage());
        resources = ResourceBundle.getBundle("StripesResources", request.getLocale());
        ActionBean bean = (ActionBean) request.getAttribute(StripesConstants.REQ_ATTR_ACTION_BEAN);
        String sourcePage = bean.getContext().getSourcePage();
        Resolution resolution;

        if (bean != null && StringUtils.isNotBlank(sourcePage)) {
            bean.getContext().getValidationErrors().addGlobalError(
                    new LocalizableError("error.IdAlreadyExistException"));
            resolution = new ForwardResolution(sourcePage);
        } else {
            request.setAttribute("error", resources.getString("error.IdAlreadyExistException"));
            resolution = new ForwardResolution("/WEB-INF/error.jsp");
        }

        return resolution;
    }

It crashes on the forward and enters in an infinite loop, is this normal?

-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users




--
Samuel Santos
http://www.samaxes.com/
-------------------------------------------------------------------------
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/
_______________________________________________
Stripes-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/stripes-users