Author: jdonnerstag Date: Tue Jun 21 21:28:45 2011 New Revision: 1138191 URL: http://svn.apache.org/viewvc?rev=1138191&view=rev Log: applied patch: AjaxRequestTarget#addComponent(..) should guard against improper usage Issue: WICKET-3564
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java?rev=1138191&r1=1138190&r2=1138191&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java Tue Jun 21 21:28:45 2011 @@ -320,18 +320,20 @@ public class AjaxRequestTarget implement * Adds a listener to this target * * @param listener + * @throws IllegalStateException + * if {@link IListener}'s events are currently being fired or have both been fired + * already */ - public void addListener(IListener listener) + public void addListener(IListener listener) throws IllegalStateException { Args.notNull(listener, "listener"); + assertListenersNotFrozen(); if (listeners == null) { listeners = new LinkedList<IListener>(); } - assertListenersNotFrozen(); - if (!listeners.contains(listener)) { listeners.add(listener); @@ -378,7 +380,7 @@ public class AjaxRequestTarget implement } /** - * Adds components to the list of components to be rendered + * Adds components to the list of components to be rendered. * * @param components * components to be rendered @@ -423,8 +425,13 @@ public class AjaxRequestTarget implement * id of client-side dom element that will be updated * @param component * component to be rendered + * @throws IllegalArgumentException + * if the component is a {@link Page} or an {@link AbstractRepeater} + * @throws IllegalStateException + * if the components are currently being rendered, or have already been rendered */ public final void add(final Component component, final String markupId) + throws IllegalArgumentException, IllegalStateException { Args.notEmpty(markupId, "markupId"); Args.notNull(component, "component"); @@ -603,7 +610,7 @@ public class AjaxRequestTarget implement return; } - listenersFrozen = true; + respondersFrozen = true; for (ITargetRespondListener listener : respondListeners) { @@ -658,8 +665,6 @@ public class AjaxRequestTarget implement bodyResponse.write("\"?>"); bodyResponse.write("<ajax-response>"); - respondersFrozen = true; - // invoke onbeforerespond event on listeners fireOnBeforeRespondListeners(); @@ -671,8 +676,6 @@ public class AjaxRequestTarget implement respondInvocation(bodyResponse, js); } - componentsFrozen = true; - // process added components respondComponents(bodyResponse); @@ -723,10 +726,13 @@ public class AjaxRequestTarget implement } /** - * + * Freezes the {@link #listeners} before firing the event and un-freezes them afterwards to + * allow components to add more {@link IListener}s for the second event. */ private void fireOnBeforeRespondListeners() { + listenersFrozen = true; + if (listeners != null) { final Map<String, Component> components = Collections.unmodifiableMap(markupIdToComponent); @@ -736,14 +742,20 @@ public class AjaxRequestTarget implement listener.onBeforeRespond(components, this); } } + + listenersFrozen = false; } /** + * Freezes the {@link #listeners}, and does not un-freeze them as the events will have been + * fired by now. * * @param response */ private void fireOnAfterRespondListeners(final Response response) { + listenersFrozen = true; + // invoke onafterresponse event on listeners if (listeners != null) { @@ -774,6 +786,7 @@ public class AjaxRequestTarget implement */ private void respondComponents(Response response) { + componentsFrozen = true; // TODO: We might need to call prepareRender on all components upfront // process component markup