Author: ivaynberg
Date: Sun Feb 1 00:09:27 2009
New Revision: 739664
URL: http://svn.apache.org/viewvc?rev=739664&view=rev
Log:
WICKET-1483
Modified:
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
Modified:
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java?rev=739664&r1=739663&r2=739664&view=diff
==============================================================================
---
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
(original)
+++
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
Sun Feb 1 00:09:27 2009
@@ -30,6 +30,7 @@
import org.apache.wicket.authorization.IAuthorizationStrategy;
import org.apache.wicket.authorization.UnauthorizedActionException;
import org.apache.wicket.behavior.IBehavior;
+import org.apache.wicket.behavior.IBehaviorListener;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.IFeedback;
import org.apache.wicket.markup.ComponentTag;
@@ -938,7 +939,12 @@
data_add(behavior);
}
- private List getBehaviorsImpl()
+ /**
+ * FOR INTERNAL USE ONLY
+ *
+ * @return unmodified list of behaviors which may contain null entries
+ */
+ public final List getBehaviorsRawList()
{
if (data != null)
{
@@ -952,7 +958,7 @@
for (int i = startIndex; i < length; ++i)
{
Object o = data_get(i);
- if (o instanceof IBehavior)
+ if (o == null || o instanceof IBehavior)
{
result.add(o);
}
@@ -1120,7 +1126,7 @@
*/
public final void detachBehaviors()
{
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if (behaviors != null)
{
for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -2242,12 +2248,49 @@
private boolean removeBehavior(final IBehavior behavior)
{
final int start = getFlag(FLAG_MODEL_SET) ? 1 : 0;
- for (int i = start; i < data_length(); ++i)
+ final int len = data_length();
+ for (int i = start; i < len; ++i)
{
Object o = data_get(i);
- if (o.equals(behavior))
+ if (o != null && o.equals(behavior))
{
- data_remove(i);
+ // behaviors that produce urls depend on their
index in the behaviors list,
+ // therefore we cannot blindly shrink the array
by removing this behavior's slot.
+ // Instead we check if there are any behaviors
downstream that will be affected by
+ // this, and if there are we set this
behavior's slot to null instead of removing it
+ // to preserve indexes of behaviors downstream.
+ boolean listenersAfter = false;
+ for (int j = i + 1; j < len; j++)
+ {
+ if (data_get(j) instanceof
IBehaviorListener)
+ {
+ listenersAfter = true;
+ break;
+ }
+ }
+
+ if (listenersAfter)
+ {
+ data_set(i, null);
+ }
+ else
+ {
+ data_remove(i);
+
+ if (o instanceof IBehaviorListener)
+ {
+ // this was a listener which
mightve caused holes in the array, see if we
+ // can clean them up. notice:
at this point we already know there are no
+ // listeners that can be
affected by index change downstream.
+ for (int j = i - 1; j >= start;
j--)
+ {
+ if (data_get(j) == null)
+ {
+ data_remove(j);
+ }
+ }
+ }
+ }
return true;
}
}
@@ -2328,7 +2371,7 @@
{
// Call each behaviors onException() to allow
the
// behavior to clean up
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if (behaviors != null)
{
for (Iterator i = behaviors.iterator();
i.hasNext();)
@@ -2558,7 +2601,7 @@
// Ask all behaviors if they have something to
contribute to the
// header or body onLoad tag.
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if (behaviors != null)
{
final Iterator iter = behaviors.iterator();
@@ -3244,7 +3287,7 @@
*/
private void notifyBehaviorsComponentBeforeRender()
{
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if (behaviors != null)
{
for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -3265,7 +3308,7 @@
private void notifyBehaviorsComponentRendered()
{
// notify the behaviors that component has been rendered
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if (behaviors != null)
{
for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -3431,7 +3474,7 @@
*/
protected List/* <IBehavior> */getBehaviors(Class type)
{
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviorsRawList();
if (behaviors == null)
{
return Collections.EMPTY_LIST;
@@ -3441,7 +3484,7 @@
for (Iterator i = behaviors.iterator(); i.hasNext();)
{
Object behavior = i.next();
- if (type == null ||
type.isAssignableFrom(behavior.getClass()))
+ if (behavior != null && (type == null ||
type.isAssignableFrom(behavior.getClass())))
{
subset.add(behavior);
}
@@ -3811,7 +3854,7 @@
if (!(tag instanceof WicketTag) || !stripWicketTags)
{
// Apply behavior modifiers
- List behaviors = getBehaviorsImpl();
+ List behaviors = getBehaviors();
if ((behaviors != null) && !behaviors.isEmpty() &&
!tag.isClose() &&
(isIgnoreAttributeModifier() == false))
{
Modified:
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java?rev=739664&r1=739663&r2=739664&view=diff
==============================================================================
---
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
(original)
+++
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/RequestCycle.java
Sun Feb 1 00:09:27 2009
@@ -783,7 +783,7 @@
public final CharSequence urlFor(final Component component, final
IBehavior behaviour,
final RequestListenerInterface listener)
{
- int index = component.getBehaviors().indexOf(behaviour);
+ int index = component.getBehaviorsRawList().indexOf(behaviour);
if (index == -1)
{
throw new IllegalArgumentException("Behavior " + this +
Modified:
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java?rev=739664&r1=739663&r2=739664&view=diff
==============================================================================
---
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
(original)
+++
wicket/branches/wicket-1.3.x/jdk-1.4/wicket/src/main/java/org/apache/wicket/request/target/component/listener/BehaviorRequestTarget.java
Sun Feb 1 00:09:27 2009
@@ -16,6 +16,8 @@
*/
package org.apache.wicket.request.target.component.listener;
+import java.util.List;
+
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.RequestCycle;
@@ -42,7 +44,7 @@
* the listener method
*/
public BehaviorRequestTarget(final Page page, final Component component,
- final RequestListenerInterface listener)
+ final RequestListenerInterface listener)
{
this(page, component, listener, null);
}
@@ -60,7 +62,7 @@
* the request parameters
*/
public BehaviorRequestTarget(final Page page, final Component component,
- final RequestListenerInterface listener, final
RequestParameters requestParameters)
+ final RequestListenerInterface listener, final
RequestParameters requestParameters)
{
super(page, component, listener, requestParameters);
}
@@ -80,20 +82,22 @@
if (id == null)
{
throw new IllegalStateException(
- "Parameter behaviorId was not provided:
unable to locate listener. Component: " +
- component.toString());
+ "Parameter behaviorId was not provided: unable
to locate listener. Component: " +
+ component.toString());
}
final int idAsInt = Integer.parseInt(id);
+ final List behaviors = component.getBehaviorsRawList();
IBehaviorListener behaviorListener = null;
- if (component.getBehaviors().size() > idAsInt)
+
+ if (behaviors.size() > idAsInt)
{
- behaviorListener =
(IBehaviorListener)component.getBehaviors().get(idAsInt);
+ behaviorListener =
(IBehaviorListener)behaviors.get(idAsInt);
}
if (behaviorListener == null)
{
throw new IllegalStateException("No behavior listener
found with behaviorId " + id +
- "; Component: " + component.toString());
+ "; Component: " + component.toString());
}
// Invoke the interface method