As requested by Johan i created a jira issue
https://issues.apache.org/jira/browse/WICKET-1438 and attached an
application showing the original problem.

Maurice

On Thu, Mar 20, 2008 at 12:22 AM, Maurice Marrink <[EMAIL PROTECTED]> wrote:
> My current patch involved this:
>  for (int i = 0; i < requestTargets.size(); i++)
>                 {
>                         IRequestTarget target = 
> (IRequestTarget)requestTargets.get(i);
>                         if (target != null)
>                         {
>                                 try
>                                 {
>                                         target.detach(this);
>                                 }
>                                 catch (RuntimeException e)
>                                 {
>                                         log.error("there was an error 
> cleaning up target " + target + ".", e);
>                                 }
>                         }
>                 }
>
>  But if you copy the requestTragets before you are going to detach them
>  and then iterate over them that would work too i guess.
>  Only question is, what is more expensive copying a list/stack only a
>  few items big or needlessly detaching 1 or 2 RequestTargets which
>  should still be detached anyway.
>
>  Maurice
>
>
>
>  On Thu, Mar 20, 2008 at 12:13 AM, Johan Compagner <[EMAIL PROTECTED]> wrote:
>  > hmm we already dont do anything with the exceptions there
>  >  so we only have to copy the list of request targets to detach before
>  >  iterating over it
>  >  or use a list that can handle that somehow
>  >
>  >
>  >  On Wed, Mar 19, 2008 at 11:39 PM, Maurice Marrink <[EMAIL PROTECTED]> 
> wrote:
>  >
>  >
>  >
>  > > A couple of days ago Warren came to me with a problem. If he attached
>  >  > a behavior to a component which potentially throws a
>  >  > RestartResponseAtInterceptPageException a
>  >  > ConcurrentModificationException would bubble all the way into tomcat
>  >  > code.
>  >  > Now you probably are going to say: "Then don't do that" ;) but the
>  >  > fact that an exception escapes wicket is imo reason to investigate.
>  >  >
>  >  > So i did some digging. The situation is as follows:
>  >  > In the renderHead method of an IHeaderContributor a check is performed
>  >  > for an authenticated user, if none is found a RRAIPE is thrown.
>  >  > One of the places that executes renderHead is the onDetach of WebPage.
>  >  > Now suppose we have a Page A which has a component decorated with this
>  >  > header contributor, the page also contains a Button to log off users.
>  >  > The onsubmit for this button is as simple as log user off and
>  >  > setResponsePage(class).
>  >  > This page is usually only accessible if an authenticated user is
>  >  > available so everything works fine if that is the case.
>  >  > But then the user decides to log off, the onsubmit is triggered and
>  >  > exits normally. the request continues and reaches the point where the
>  >  > RequestCycle is detaching all RequestTargets (at that point there are
>  >  > 2 targets, 1 for the current page and 1 set during the onsubmit).
>  >  > During the detach the renderHead method is executed along with the
>  >  > check for an authenticated user. Since there isn't one anymore a
>  >  > RRAIPE is thrown, adding a 3rd target to the stack of RequestTargets.
>  >  > The RRAIPE bubbles up to RequestCycle.detach() and is caught and
>  >  > logged there. Then wicket attempts to detach the next RequestTarget
>  >  > but since an iterator is used to loop through all targets, the
>  >  > iterator detects the stack has been changed and throws a
>  >  > ConcurrentModificationException. Ultimately resulting in a tomcat
>  >  > error page.
>  >  >
>  >  > I tried changing the iterator loop to a regular for(int i=0;i < .....)
>  >  > loop and this seems to fix the problem, even if later on more
>  >  > requesttargets are added wicket happily executes them and comes up
>  >  > with the desire page.
>  >  > There is one disadvantage i see with this solution: the requesttarget
>  >  > throwing the RRAIPE is not fully detached. Perhaps the RRAIPE can be
>  >  > swallowed after it has added a RequestTarget and only in the case of a
>  >  > detach phase. That way the rest of the page could be normally
>  >  > detached.
>  >  >
>  >  > If required i can provide a small application (courtesy of Warren)
>  >  > that demonstrates the problem.
>  >  >
>  >  > So what do you guys think, shall i open up a jira issue for this?
>  >  >
>  >  > Maurice
>  >  >
>  >
>  >
>  > > ---------------------------------------------------------------------
>  >  > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  >
>  >  >
>  >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to