Author: ivaynberg
Date: Sat Oct 30 04:18:44 2010
New Revision: 1028987

URL: http://svn.apache.org/viewvc?rev=1028987&view=rev
Log:

Issue: WICKET-3142

Added:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java
   (with props)
Modified:
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/info/ComponentInfo.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/AbstractBookmarkableMapper.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorRequestTest.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorUrlTest.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/MockComponent.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/behavior/ImmutableBehaviorIndexTest.java
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
    
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/info/ComponentInfo.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/info/ComponentInfo.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/info/ComponentInfo.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/info/ComponentInfo.java
 Sat Oct 30 04:18:44 2010
@@ -69,7 +69,7 @@ public class ComponentInfo
 
        private final String listenerInterface;
        private final String componentPath;
-       private final Integer behaviorIndex;
+       private final Integer behaviorId;
        private final Integer renderCount;
 
        /**
@@ -78,17 +78,17 @@ public class ComponentInfo
         * @param renderCount
         * @param listenerInterface
         * @param componentPath
-        * @param behaviorIndex
+        * @param behaviorId
         */
        public ComponentInfo(Integer renderCount, String listenerInterface, 
String componentPath,
-               Integer behaviorIndex)
+               Integer behaviorId)
        {
                Args.notEmpty(listenerInterface, "listenerInterface");
                Args.notNull(componentPath, "componentPath");
 
                this.listenerInterface = listenerInterface;
                this.componentPath = componentPath;
-               this.behaviorIndex = behaviorIndex;
+               this.behaviorId = behaviorId;
                this.renderCount = renderCount;
        }
 
@@ -111,9 +111,9 @@ public class ComponentInfo
        /**
         * @return behavior index
         */
-       public Integer getBehaviorIndex()
+       public Integer getBehaviorId()
        {
-               return behaviorIndex;
+               return behaviorId;
        }
 
        /**
@@ -141,10 +141,10 @@ public class ComponentInfo
 
                result.append(listenerInterface);
 
-               if (behaviorIndex != null)
+               if (behaviorId != null)
                {
                        result.append(BEHAVIOR_INDEX_SEPARATOR);
-                       result.append(behaviorIndex);
+                       result.append(behaviorId);
                }
                result.append(SEPARATOR);
                result.append(encodeComponentPath(componentPath));

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Component.java Sat Oct 
30 04:18:44 2010
@@ -30,6 +30,7 @@ import org.apache.wicket.authorization.A
 import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.authorization.UnauthorizedActionException;
 import org.apache.wicket.behavior.IBehavior;
+import org.apache.wicket.behavior.InvalidBehaviorIdException;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.event.IEventSink;
@@ -235,6 +236,12 @@ public abstract class Component
 
        private static final long serialVersionUID = 1L;
 
+       /** metadata key that stores stable ids for behavior - ids are used 
when generating a url, etc */
+       private static MetaDataKey<ArrayList<IBehavior>> BEHAVIOR_IDS = new 
MetaDataKey<ArrayList<IBehavior>>()
+       {
+               private static final long serialVersionUID = 1L;
+       };
+
        /**
         * Action used with IAuthorizationStrategy to determine whether a 
component is allowed to be
         * enabled.
@@ -596,27 +603,6 @@ public abstract class Component
                }
        }
 
-       private boolean data_can_remove(int index)
-       {
-               int len = data_length();
-               for (int j = index + 1; j < len; j++)
-               {
-                       if (data_get(j) instanceof IRequestListener)
-                       {
-                               return false;
-                       }
-               }
-               return true;
-       }
-
-       /**
-        * WARNING: CALL THIS METHOD ONLY IF {...@link #data_can_remove(int)} 
HAS RETURNED {...@code true},
-        * OTHERWISE USE {...@link #data_set(int, Object)} TO SET THE VALUE TO 
{...@code null} OR SOMETHING
-        * MORE APPROPRIATE FOR THE USECASE
-        * 
-        * @param position
-        * @return {...@code true} if the item can be removed
-        */
        private Object data_remove(int position)
        {
                int currentLength = data_length();
@@ -1072,29 +1058,21 @@ public abstract class Component
                data_add(behavior);
        }
 
-       /**
-        * FOR INTERNAL USE ONLY
-        * 
-        * @return unmodified list of behaviors which may contain null entries
-        */
-       public final List<? extends IBehavior> getBehaviorsRawList()
+       private final List<? extends IBehavior> getBehaviorsRawList()
        {
                if (data != null)
                {
                        // if the model is set, we must skip it
+                       final int startIndex = getFlag(FLAG_MODEL_SET) ? 1 : 0;
                        int length = data_length();
 
-                       if (length > 0)
+                       if (length > startIndex)
                        {
                                final ArrayList<IBehavior> result = new 
ArrayList<IBehavior>();
-                               for (int i = 0; i < length; ++i)
+                               for (int i = startIndex; i < length; ++i)
                                {
                                        Object o = data_get(i);
-                                       if (o == null || !(o instanceof 
IBehavior))
-                                       {
-                                               result.add((IBehavior)null);
-                                       }
-                                       else
+                                       if (o == null || o instanceof IBehavior)
                                        {
                                                result.add((IBehavior)o);
                                        }
@@ -1755,20 +1733,6 @@ public abstract class Component
                return key.get(getMetaData());
        }
 
-       private int getMetaDataIndex()
-       {
-               int start = getFlag(FLAG_MODEL_SET) ? 1 : 0;
-               for (int i = start; i < data_length(); i++)
-               {
-                       Object object = data_get(i);
-                       if (object instanceof MetaDataEntry<?>[] || object 
instanceof MetaDataEntry)
-                       {
-                               return i;
-                       }
-               }
-               return -1;
-       }
-
        /**
         * 
         * @return meta data entry
@@ -1778,9 +1742,11 @@ public abstract class Component
                MetaDataEntry<?>[] metaData = null;
 
                // index where we should expect the entry
-               int index = getMetaDataIndex();
+               int index = getFlag(FLAG_MODEL_SET) ? 1 : 0;
 
-               if (index >= 0)
+               int length = data_length();
+
+               if (index < length)
                {
                        Object object = data_get(index);
                        if (object instanceof MetaDataEntry<?>[])
@@ -2473,44 +2439,31 @@ public abstract class Component
         */
        private boolean removeBehavior(final IBehavior behavior)
        {
-               final int start = getFlag(FLAG_MODEL_SET) ? 1 : 0;
                final int len = data_length();
-               for (int i = start; i < len; ++i)
+               for (int i = 0; i < len; i++)
                {
                        Object o = data_get(i);
                        if (o != null && o.equals(behavior))
                        {
-                               // 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.
+                               data_remove(i);
+                               behavior.unbind(this);
 
-                               if (!data_can_remove(i))
+                               // remove behavior from behavior-ids metadata
+                               ArrayList<IBehavior> ids = 
getMetaData(BEHAVIOR_IDS);
+                               if (ids != null)
                                {
-                                       data_set(i, null);
-                               }
-                               else
-                               {
-                                       data_remove(i);
-
-                                       if (o instanceof IRequestListener)
+                                       int idx = ids.indexOf(behavior);
+                                       if (idx == ids.size() - 1)
                                        {
-                                               // 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 because this is
-                                               // the last one in the array
-                                               for (int j = i - 1; j >= start; 
j--)
-                                               {
-                                                       if (data_get(j) == null)
-                                                       {
-                                                               data_remove(j);
-                                                       }
-                                               }
+                                               ids.remove(idx);
+                                       }
+                                       else if (idx >= 0)
+                                       {
+                                               ids.set(idx, null);
                                        }
+                                       ids.trimToSize();
+                                       return true;
                                }
-                               behavior.unbind(this);
-                               return true;
                        }
                }
                return false;
@@ -3057,7 +3010,6 @@ public abstract class Component
         */
        public final <M> void setMetaData(final MetaDataKey<M> key, final M 
object)
        {
-               int index = getMetaDataIndex();
                MetaDataEntry<?>[] old = getMetaData();
 
                Object metaData = null;
@@ -3067,9 +3019,11 @@ public abstract class Component
                        metaData = (metaDataArray.length > 1) ? 
(Object)metaDataArray : metaDataArray[0];
                }
 
+               int index = getFlag(FLAG_MODEL_SET) ? 1 : 0;
+
                if (old == null && metaData != null)
                {
-                       data_add(metaData);
+                       data_insert(index, metaData);
                }
                else if (old != null && metaData != null)
                {
@@ -3077,15 +3031,7 @@ public abstract class Component
                }
                else if (old != null && metaData == null)
                {
-                       if (data_can_remove(index))
-                       {
-                               data_remove(index);
-                       }
-                       else
-                       {
-                               data_set(index, null);
-                       }
-
+                       data_remove(index);
                }
        }
 
@@ -3156,15 +3102,8 @@ public abstract class Component
                        }
                        else
                        {
-                               if (data_can_remove(0))
-                               {
-                                       data_remove(0);
-                                       setFlag(FLAG_MODEL_SET, false);
-                               }
-                               else
-                               {
-                                       data_set(0, null);
-                               }
+                               data_remove(0);
+                               setFlag(FLAG_MODEL_SET, false);
                        }
                }
                else
@@ -3447,15 +3386,15 @@ public abstract class Component
                final RequestListenerInterface listener)
        {
                PageAndComponentProvider provider = new 
PageAndComponentProvider(getPage(), this);
-               int index = getBehaviorsRawList().indexOf(behaviour);
+               int id = getBehaviorId(behaviour);
                IRequestHandler handler;
                if (getPage().isPageStateless())
                {
-                       handler = new 
BookmarkableListenerInterfaceRequestHandler(provider, listener, index);
+                       handler = new 
BookmarkableListenerInterfaceRequestHandler(provider, listener, id);
                }
                else
                {
-                       handler = new ListenerInterfaceRequestHandler(provider, 
listener, index);
+                       handler = new ListenerInterfaceRequestHandler(provider, 
listener, id);
                }
                return getRequestCycle().urlFor(handler);
        }
@@ -4554,4 +4493,69 @@ public abstract class Component
                new ComponentEventSender(this).send(sink, type, payload);
        }
 
+       /** {...@inheritdoc} */
+       public final IBehavior getBehaviorById(int id)
+       {
+               IBehavior behavior = null;
+
+               ArrayList<IBehavior> ids = getMetaData(BEHAVIOR_IDS);
+               if (ids != null)
+               {
+                       if (id >= 0 && id < ids.size())
+                       {
+                               behavior = ids.get(id);
+                       }
+               }
+
+               if (behavior != null)
+               {
+                       return behavior;
+               }
+               throw new InvalidBehaviorIdException(this, id);
+       }
+
+       /** {...@inheritdoc} */
+       public final int getBehaviorId(IBehavior behavior)
+       {
+               if (!getBehaviorsRawList().contains(behavior))
+               {
+                       throw new IllegalStateException(
+                               "Behavior must be added to component before its 
id can be generated. Behavior: " +
+                                       behavior + ", Component: " + this);
+               }
+
+               ArrayList<IBehavior> ids = getMetaData(BEHAVIOR_IDS);
+
+               if (ids == null)
+               {
+                       ids = new ArrayList<IBehavior>(1);
+                       setMetaData(BEHAVIOR_IDS, ids);
+               }
+
+               int id = ids.indexOf(behavior);
+
+               if (id < 0)
+               {
+                       // try to find an unused slot
+                       for (int i = 0; i < ids.size(); i++)
+                       {
+                               if (ids.get(i) == null)
+                               {
+                                       ids.set(i, behavior);
+                                       id = i;
+                               }
+                       }
+               }
+
+               if (id < 0)
+               {
+                       // no unused slots, add to the end
+                       id = ids.size();
+                       ids.add(behavior);
+                       ids.trimToSize();
+               }
+
+               return id;
+       }
+
 }

Added: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java?rev=1028987&view=auto
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java
 (added)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java
 Sat Oct 30 04:18:44 2010
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.behavior;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.WicketRuntimeException;
+
+/**
+ * Thrown when a behavior with an invalid id is requested
+ * 
+ * @author ivaynberg (Igor Vaynberg)
+ */
+public class InvalidBehaviorIdException extends WicketRuntimeException
+{
+       private static final long serialVersionUID = 1L;
+
+       private final Component component;
+       private final int behaviorId;
+
+       /**
+        * Constructor
+        * 
+        * @param component
+        * @param behaviorId
+        */
+       public InvalidBehaviorIdException(Component component, int behaviorId)
+       {
+               super("Cannot find behavior with id: " + behaviorId + " on 
component: " + component);
+               this.component = component;
+               this.behaviorId = behaviorId;
+       }
+
+       /**
+        * @return component which was thought to contain the behavior
+        */
+       public Component getComponent()
+       {
+               return component;
+       }
+
+       /**
+        * @return behavior id
+        */
+       public int getBehaviorId()
+       {
+               return behaviorId;
+       }
+}

Propchange: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/behavior/InvalidBehaviorIdException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/component/IRequestableComponent.java
 Sat Oct 30 04:18:44 2010
@@ -16,10 +16,9 @@
  */
 package org.apache.wicket.request.component;
 
-import java.util.List;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.IBehavior;
+import org.apache.wicket.behavior.InvalidBehaviorIdException;
 import org.apache.wicket.model.IDetachable;
 
 /**
@@ -69,16 +68,23 @@ public interface IRequestableComponent
        public boolean canCallListenerInterface();
 
        /**
-        * Gets the currently coupled {...@link IBehavior}s as a unmodifiable 
list. Returns an empty list
-        * rather than null if there are no behaviors coupled to this component.
+        * Gets a stable id for the specified behavior. The id remains stable 
from the point this method
+        * is first called for the behavior until the behavior has been removed 
from the component
         * 
-        * NOTE: the list of behaviors is used to keep the index of the 
behavior in the url, which means
-        * the list returned should preserve the index. Eg, removal of items 
from the list should not be
-        * allowed, a removed item should instead be marked by a value such as 
{...@code null}.
+        * @param behavior
+        * @return
+        */
+       public int getBehaviorId(IBehavior behavior);
+
+       /**
+        * Gets the behavior for the specified id
         * 
-        * @return The currently coupled behaviors as a unmodifiable list
+        * @param id
+        * @return behavior or {...@code null} if none
+        * @throws InvalidBehaviorIdException
+        *             when behavior with this id cannot be found
         */
-       public List<? extends IBehavior> getBehaviorsRawList();
+       public IBehavior getBehaviorById(int id);
 
        /**
         * Detaches the component.

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/handler/ListenerInterfaceRequestHandler.java
 Sat Oct 30 04:18:44 2010
@@ -41,7 +41,7 @@ public class ListenerInterfaceRequestHan
 
        private final RequestListenerInterface listenerInterface;
 
-       private final Integer behaviorIndex;
+       private final Integer behaviorId;
 
        /**
         * Construct.
@@ -58,7 +58,7 @@ public class ListenerInterfaceRequestHan
 
                this.pageComponentProvider = pageComponentProvider;
                this.listenerInterface = listenerInterface;
-               this.behaviorIndex = behaviorIndex;
+               this.behaviorId = behaviorIndex;
        }
 
        /**
@@ -130,7 +130,7 @@ public class ListenerInterfaceRequestHan
         */
        public Integer getBehaviorIndex()
        {
-               return behaviorIndex;
+               return behaviorId;
        }
 
        /**
@@ -187,17 +187,16 @@ public class ListenerInterfaceRequestHan
 
        private void invokeListener()
        {
-               IRequestableComponent component = getComponent();
                if (getBehaviorIndex() == null)
                {
-                       listenerInterface.invoke(component);
+                       listenerInterface.invoke(getComponent());
                }
                else
                {
                        try
                        {
-                               IBehavior behavior = 
component.getBehaviorsRawList().get(behaviorIndex);
-                               listenerInterface.invoke(component, behavior);
+                               IBehavior behavior = 
getComponent().getBehaviorById(behaviorId);
+                               listenerInterface.invoke(getComponent(), 
behavior);
                        }
                        catch (IndexOutOfBoundsException e)
                        {

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/AbstractBookmarkableMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/AbstractBookmarkableMapper.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/AbstractBookmarkableMapper.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/AbstractBookmarkableMapper.java
 Sat Oct 30 04:18:44 2010
@@ -182,7 +182,7 @@ public abstract class AbstractBookmarkab
                        provider.setPageSource(getContext());
 
                        return new ListenerInterfaceRequestHandler(provider, 
listenerInterface,
-                               componentInfo.getBehaviorIndex());
+                               componentInfo.getBehaviorId());
                }
                else
                {

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
 Sat Oct 30 04:18:44 2010
@@ -89,7 +89,7 @@ public class PageInstanceMapper extends 
                                        RequestListenerInterface 
listenerInterface = 
requestListenerInterfaceFromString(componentInfo.getListenerInterface());
 
                                        return new 
ListenerInterfaceRequestHandler(provider, listenerInterface,
-                                               
componentInfo.getBehaviorIndex());
+                                               componentInfo.getBehaviorId());
                                }
                        }
                }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorRequestTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorRequestTest.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorRequestTest.java 
(original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorRequestTest.java 
Sat Oct 30 04:18:44 2010
@@ -62,7 +62,7 @@ public class BehaviorRequestTest extends
 
        private String urlForBehavior(IBehavior behaviorUnderTest)
        {
-               int index = 
page.container.getBehaviorsRawList().indexOf(behaviorUnderTest);
+               int index = page.container.getBehaviorId(behaviorUnderTest);
                String enabledBehaviorUrl = tester.urlFor(
                        new ListenerInterfaceRequestHandler(new 
PageAndComponentProvider(page, page.container),
                                IBehaviorListener.INTERFACE, index)).toString();

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorUrlTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorUrlTest.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorUrlTest.java 
(original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/BehaviorUrlTest.java 
Sat Oct 30 04:18:44 2010
@@ -40,12 +40,12 @@ public class BehaviorUrlTest extends Tes
 
                TestPage page = new TestPage();
 
-               int indexBeforeRender = 
page.container.getBehaviorsRawList().indexOf(page.callbackBehavior);
+               int indexBeforeRender = 
page.container.getBehaviorId(page.callbackBehavior);
 
                tester.startPage(page);
 
                page = (TestPage)tester.getLastRenderedPage();
-               int indexAfterRender = 
page.container.getBehaviorsRawList().indexOf(page.callbackBehavior);
+               int indexAfterRender = 
page.container.getBehaviorId(page.callbackBehavior);
 
                assertEquals("index of behavior in the raw list should not have 
changed",
                        indexBeforeRender, indexAfterRender);

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/MockComponent.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/MockComponent.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/MockComponent.java 
(original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/MockComponent.java Sat 
Oct 30 04:18:44 2010
@@ -16,9 +16,6 @@
  */
 package org.apache.wicket;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.request.component.IRequestableComponent;
 import org.apache.wicket.request.component.IRequestablePage;
@@ -139,11 +136,6 @@ public class MockComponent implements IR
                return true;
        }
 
-       public List<IBehavior> getBehaviorsRawList()
-       {
-               return Collections.emptyList();
-       }
-
        public boolean isEnabledInHierarchy()
        {
                return false;
@@ -153,4 +145,14 @@ public class MockComponent implements IR
        {
                return false;
        }
+
+       public int getBehaviorId(IBehavior behavior)
+       {
+               throw new IllegalArgumentException();
+       }
+
+       public IBehavior getBehaviorById(int id)
+       {
+               return null;
+       }
 }

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
 Sat Oct 30 04:18:44 2010
@@ -5,6 +5,6 @@
 wicketAjaxDebugEnable=true;
 /*-->]^]^>*/</script>
 <script type="text/javascript" 
id="wicket-ajax-base-url"><!--/*--><![CDATA[/*><!--*/
-Wicket.Ajax.baseUrl="wicket/page?0-1.IBehaviorListener.1-comp";
+Wicket.Ajax.baseUrl="wicket/page?0-1.IBehaviorListener.0-comp";
 /*-->]^]^>*/</script>
-</head>]]></header-contribution><component id="comp1" ><![CDATA[<span 
id="comp1" onclick="var 
wcall=wicketAjaxGet('page?0-1.IBehaviorListener.1-comp',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('comp1') != 
null;}.bind(this));">body</span>]]></component></ajax-response>
\ No newline at end of file
+</head>]]></header-contribution><component id="comp1" ><![CDATA[<span 
id="comp1" onclick="var 
wcall=wicketAjaxGet('page?0-1.IBehaviorListener.0-comp',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('comp1') != 
null;}.bind(this));">body</span>]]></component></ajax-response>
\ No newline at end of file

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
 Sat Oct 30 04:18:44 2010
@@ -9,6 +9,6 @@ wicketAjaxDebugEnable=true;
 Wicket.Ajax.baseUrl="wicket/bookmarkable/org.apache.wicket.TestDetachPage?0";
 /*-->]]>*/</script>
 </head><body>
-  <span wicket:id="comp" id="comp1" onclick="var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.1-comp',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('comp1') != 
null;}.bind(this));">body</span>
+  <span wicket:id="comp" id="comp1" onclick="var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.0-comp',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('comp1') != 
null;}.bind(this));">body</span>
 </body>
 </html>

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
 Sat Oct 30 04:18:44 2010
@@ -5,6 +5,6 @@
 wicketAjaxDebugEnable=true;
 /*-->]^]^>*/</script>
 <script type="text/javascript" 
id="wicket-ajax-base-url"><!--/*--><![CDATA[/*><!--*/
-Wicket.Ajax.baseUrl="wicket/page?0-1.IBehaviorListener.1-testPanel-baseSpan-linja1";
+Wicket.Ajax.baseUrl="wicket/page?0-1.IBehaviorListener.0-testPanel-baseSpan-linja1";
 /*-->]^]^>*/</script>
-</head>]]></header-contribution><component id="linja11" ><![CDATA[<span 
id="linja11">1</span>]]></component><evaluate><![CDATA[setTimeout("var 
wcall=wicketAjaxGet('page?0-1.IBehaviorListener.1-testPanel-baseSpan-linja1',function()
 { }.bind(this),function() { }.bind(this), function() {var c = 
Wicket.$('linja11'); return typeof(c) != 'undefined' && c != 
null}.bind(this));", 2000);]]></evaluate></ajax-response>
\ No newline at end of file
+</head>]]></header-contribution><component id="linja11" ><![CDATA[<span 
id="linja11">1</span>]]></component><evaluate><![CDATA[setTimeout("var 
wcall=wicketAjaxGet('page?0-1.IBehaviorListener.0-testPanel-baseSpan-linja1',function()
 { }.bind(this),function() { }.bind(this), function() {var c = 
Wicket.$('linja11'); return typeof(c) != 'undefined' && c != 
null}.bind(this));", 2000);]]></evaluate></ajax-response>
\ No newline at end of file

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
 Sat Oct 30 04:18:44 2010
@@ -11,7 +11,7 @@ wicketAjaxDebugEnable=true;
 
Wicket.Ajax.baseUrl="wicket/bookmarkable/org.apache.wicket.ajax.markup.html.componentMap.SimpleTestPage?0";
 /*-->]]>*/</script>
 <script type="text/javascript" ><!--/*--><![CDATA[/*><!--*/
-Wicket.Event.add(window, "load", function(event) { setTimeout("var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.1-testPanel-baseSpan-linja1',function()
 { }.bind(this),function() { }.bind(this), function() {var c = 
Wicket.$('linja11'); return typeof(c) != 'undefined' && c != 
null}.bind(this));", 2000);;});
+Wicket.Event.add(window, "load", function(event) { setTimeout("var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.0-testPanel-baseSpan-linja1',function()
 { }.bind(this),function() { }.bind(this), function() {var c = 
Wicket.$('linja11'); return typeof(c) != 'undefined' && c != 
null}.bind(this));", 2000);;});
 /*-->]]>*/</script>
 </head>
 <body>

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/behavior/ImmutableBehaviorIndexTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/behavior/ImmutableBehaviorIndexTest.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/behavior/ImmutableBehaviorIndexTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/behavior/ImmutableBehaviorIndexTest.java
 Sat Oct 30 04:18:44 2010
@@ -63,8 +63,8 @@ public class ImmutableBehaviorIndexTest 
                assertTrue(output.contains("autocomplete=\"off\""));
                assertTrue(output.contains("class2=\"border\""));
                assertTrue(output.contains("autocomplete2=\"off\""));
-               assertTrue(output.contains("IBehaviorListener.2"));
-               assertTrue(output.contains("IBehaviorListener.4"));
+               assertTrue(output.contains("IBehaviorListener.0"));
+               assertTrue(output.contains("IBehaviorListener.1"));
 
                // if we remove a behavior that is before the ibehaviorlistener 
its url index should not
                // change
@@ -75,9 +75,8 @@ public class ImmutableBehaviorIndexTest 
                page.getContainer().remove(auto2);
                tester.startPage(page);
                output = tester.getLastResponseAsString();
-               System.out.println(output);
-               assertTrue(output.contains("IBehaviorListener.2"));
-               assertTrue(output.contains("IBehaviorListener.4"));
+               assertTrue(output.contains("IBehaviorListener.0"));
+               assertTrue(output.contains("IBehaviorListener.1"));
        }
 
        /**
@@ -95,7 +94,14 @@ public class ImmutableBehaviorIndexTest 
                MyPage page = new MyPage();
                page.getContainer().add(border, auto, link, border2, link2, 
auto2);
 
-               List<? extends IBehavior> behaviors = 
page.getContainer().getBehaviorsRawList();
+               int borderId = page.container.getBehaviorId(border);
+               int border2Id = page.container.getBehaviorId(border2);
+               int autoId = page.container.getBehaviorId(auto);
+               int auto2Id = page.container.getBehaviorId(auto2);
+               int linkId = page.container.getBehaviorId(link);
+               int link2Id = page.container.getBehaviorId(link2);
+
+               List<? extends IBehavior> behaviors = 
page.getContainer().getBehaviors();
                assertEquals(6, behaviors.size());
 
                // test removal of various behaviors and make sure they 
preserve indexes as long as there is
@@ -103,30 +109,31 @@ public class ImmutableBehaviorIndexTest 
 
                // border,auto,link,border2,link2,auto2
                page.getContainer().remove(border);
-               behaviors = page.getContainer().getBehaviorsRawList();
-               assertEquals(6, behaviors.size());
-               assertNull(behaviors.get(0));
+               behaviors = page.getContainer().getBehaviors();
+               assertEquals(5, behaviors.size());
+               assertEquals(autoId, page.container.getBehaviorId(auto));
+               assertEquals(link2Id, page.container.getBehaviorId(link2));
 
-               // null,auto,link,border2,link2,auto2
+               // auto,link,border2,link2,auto2
                page.getContainer().remove(link);
-               behaviors = page.getContainer().getBehaviorsRawList();
-               assertEquals(6, behaviors.size());
-               assertNull(behaviors.get(0));
-               assertNull(behaviors.get(2));
+               behaviors = page.getContainer().getBehaviors();
+               assertEquals(4, behaviors.size());
+               assertEquals(autoId, page.container.getBehaviorId(auto));
+               assertEquals(link2Id, page.container.getBehaviorId(link2));
 
-               // null,auto,null,border2,link2,auto2
+               // auto,border2,link2,auto2
                page.getContainer().remove(auto2);
-               behaviors = page.getContainer().getBehaviorsRawList();
-               assertEquals(5, behaviors.size());
-               assertNull(behaviors.get(0));
-               assertNull(behaviors.get(2));
+               behaviors = page.getContainer().getBehaviors();
+               assertEquals(3, behaviors.size());
+               assertEquals(autoId, page.container.getBehaviorId(auto));
+               assertEquals(link2Id, page.container.getBehaviorId(link2));
 
-               // null,auto,null,border2,link2
+               // auto,border2,link2
                page.getContainer().remove(link2); // last IBehaviorListener
-               behaviors = page.getContainer().getBehaviorsRawList();
+               behaviors = page.getContainer().getBehaviors();
                assertEquals(2, behaviors.size());
-               assertSame(auto, behaviors.get(0));
-               assertSame(border2, behaviors.get(1));
+               assertEquals(autoId, page.container.getBehaviorId(auto));
+               assertEquals(border2Id, page.container.getBehaviorId(border2));
 
        }
 

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
 Sat Oct 30 04:18:44 2010
@@ -1,7 +1,7 @@
 <? xml version= "1.0" encoding ="UTF-8" ?>
 <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
 
-<html wicket:id="html" xmlns:wicket="" xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:lang="[current language]" lang="de" id="html1" onclick="var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.1-html',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('html1') != 
null;}.bind(this));return !wcall;">
+<html wicket:id="html" xmlns:wicket="" xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:lang="[current language]" lang="de" id="html1" onclick="var 
wcall=wicketAjaxGet('../page?0-1.IBehaviorListener.0-html',function() { 
}.bind(this),function() { }.bind(this), function() {return Wicket.$('html1') != 
null;}.bind(this));return !wcall;">
   <head><link rel="stylesheet" type="text/css" href="../../BasePage.css" />
 <script type="text/javascript" 
src="../resource/org.apache.wicket.markup.html.WicketEventReference/wicket-event.js"></script>
 <script type="text/javascript" 
src="../resource/org.apache.wicket.ajax.WicketAjaxReference/wicket-ajax.js"></script>

Modified: 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java?rev=1028987&r1=1028986&r2=1028987&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java
 (original)
+++ 
wicket/trunk/wicket/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java
 Sat Oct 30 04:18:44 2010
@@ -44,7 +44,7 @@ public class ComponentInfoTest extends T
                ComponentInfo info = ComponentInfo.parse(s);
                assertEquals("listener", info.getListenerInterface());
                assertEquals("component:path", info.getComponentPath());
-               assertNull(info.getBehaviorIndex());
+               assertNull(info.getBehaviorId());
 
                assertEquals(s, info.toString());
        }
@@ -99,7 +99,7 @@ public class ComponentInfoTest extends T
                ComponentInfo info = ComponentInfo.parse(s);
                assertEquals("listener", info.getListenerInterface());
                assertEquals("compo-nent:path", info.getComponentPath());
-               assertNull(info.getBehaviorIndex());
+               assertNull(info.getBehaviorId());
 
                assertEquals(s, info.toString());
        }
@@ -113,7 +113,7 @@ public class ComponentInfoTest extends T
                ComponentInfo info = ComponentInfo.parse(s);
                assertEquals("listener", info.getListenerInterface());
                assertEquals("co-mpo--nent:path", info.getComponentPath());
-               assertNull(info.getBehaviorIndex());
+               assertNull(info.getBehaviorId());
 
                assertEquals(s, info.toString());
        }
@@ -127,7 +127,7 @@ public class ComponentInfoTest extends T
                ComponentInfo info = ComponentInfo.parse(s);
                assertEquals("listener", info.getListenerInterface());
                assertEquals("component:path", info.getComponentPath());
-               assertEquals((Object)12, info.getBehaviorIndex());
+               assertEquals((Object)12, info.getBehaviorId());
 
                assertEquals(s, info.toString());
        }
@@ -154,7 +154,7 @@ public class ComponentInfoTest extends T
                ComponentInfo info = ComponentInfo.parse(s);
                assertEquals("listener", info.getListenerInterface());
                assertEquals((Integer)4, info.getRenderCount());
-               assertEquals((Integer)5, info.getBehaviorIndex());
+               assertEquals((Integer)5, info.getBehaviorId());
 
                assertEquals(s, info.toString());
        }


Reply via email to