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