You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2007/10/18 22:28:03 UTC

svn commit: r586123 - in /wicket/trunk/jdk-1.4/wicket/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/markup/html/link/ main/java/org/apache/wicket/util/collections/ main/java/org/apache/wicket/util/tester/ main/java/org/apache/wicket/uti...

Author: knopp
Date: Thu Oct 18 13:28:02 2007
New Revision: 586123

URL: http://svn.apache.org/viewvc?rev=586123&view=rev
Log:
WICKET-1084

Modified:
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ComponentSourceEntry.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/link/BookmarkablePageLink.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/MiniMap.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
    wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/value/ValueMap.java
    wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTestPage_ExpectedResult.html

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Component.java Thu Oct 18 13:28:02 2007
@@ -23,6 +23,8 @@
 import java.util.List;
 import java.util.Locale;
 
+import javax.xml.crypto.Data;
+
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.authorization.Action;
 import org.apache.wicket.authorization.AuthorizationException;
@@ -493,6 +495,12 @@
 		private static final long serialVersionUID = 1L;
 	};
 
+	/* meta data for user specified markup id */
+	private static final MetaDataKey MARKUP_ID_KEY = new MetaDataKey(String.class)
+	{
+		private static final long serialVersionUID = 1L;
+	};
+
 	/** Basic model IModelComparator implementation for normal object models */
 	private static final IModelComparator defaultModelComparator = new IModelComparator()
 	{
@@ -582,6 +590,12 @@
 	/** Reserved subclass-definable flag bit */
 	protected static final int FLAG_RESERVED8 = 0x80000;
 
+	/**
+	 * Flag that determines whether the model is set. This is necessary because of the way we
+	 * represent component state ({@link #data}). We can't distinguish between model and behavior
+	 * using instanceof, because one object can implement both interfaces. Thus we need this flag -
+	 * when the flag is set, first object in {@link Data} is always model.
+	 */
 	private static final int FLAG_MODEL_SET = 0x100000;
 
 	private static final int FLAG_BEFORE_RENDERING_SUPER_CALL_VERIFIED = 0x1000000;
@@ -607,15 +621,6 @@
 	 */
 	private static final String MARKUP_ID_ATTR_NAME = "id";
 
-	/**
-	 * Metadata key used to store/retrieve markup id
-	 */
-	private static MetaDataKey MARKUP_ID_KEY = new MetaDataKey(String.class)
-	{
-
-		private static final long serialVersionUID = 1L;
-
-	};
 	private static final long serialVersionUID = 1L;
 	/**
 	 * Meta data key for line precise error logging for the moment of addition. Made package private
@@ -652,6 +657,13 @@
 	int markupIndex = -1;
 
 	/**
+	 * Instead of remembering the whole markupId, we just remember the number for this component so
+	 * we can "reconstruct" the markupId on demand. While this could be part of {@link #data},
+	 * profiling showed that having it as separate property consumes less memory.
+	 */
+	int generatedMarkupId = -1;
+
+	/**
 	 * MetaDataEntry array.
 	 */
 // private MetaDataEntry[] metaData;
@@ -661,8 +673,184 @@
 //
 // /** The model for this component. */
 // IModel model;
-	/** the object that holds the model/metadata and or behaviors */
-	Object data;
+	/**
+	 * The object that holds the component state.
+	 * <p>
+	 * What's stored here depends on what attributes are set on component. Data can contains
+	 * combination of following attributes:
+	 * <ul>
+	 * <li>Model (indicated by {@link #FLAG_MODEL_SET})
+	 * <li>MetaDataEntry (optionally {@link MetaDataEntry}[] if more metadata entries are present) *
+	 * <li>{@link IBehavior}(s) added to component. The behaviors are not stored in separate
+	 * array, they are part of the {@link #data} array
+	 * </ul>
+	 * If there is only one attribute set (i.e. model or MetaDataEntry([]) or one behavior), the
+	 * #data object points directly to value of that attribute. Otherwise the data is of type
+	 * Object[] where the attributes are ordered as specified above.
+	 * <p>
+	 */
+	Object data = null;
+
+	private final int data_length()
+	{
+		if (data == null)
+		{
+			return 0;
+		}
+		else if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
+		{
+			return ((Object[])data).length;
+		}
+		else
+		{
+			return 1;
+		}
+	}
+
+	private final Object data_get(int index)
+	{
+		if (data == null)
+		{
+			return null;
+		}
+		else if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
+		{
+			Object[] array = (Object[])data;
+			return index < array.length ? array[index] : null;
+		}
+		else if (index == 0)
+		{
+			return data;
+		}
+		else
+		{
+			return null;
+		}
+	}
+
+	private final Object data_set(int index, Object object)
+	{
+		if (index > data_length() - 1)
+		{
+			throw new IndexOutOfBoundsException();
+		}
+		else if (index == 0 && !(data instanceof Object[] && !(data instanceof MetaDataEntry[])))
+		{
+			Object old = data;
+			data = object;
+			return old;
+		}
+		else
+		{
+			Object[] array = (Object[])data;
+			Object old = array[index];
+			array[index] = object;
+			return old;
+		}
+
+	}
+
+	private final void data_add(Object object)
+	{
+		data_insert(-1, object);
+	}
+
+	private final void data_insert(int position, Object object)
+	{
+		int currentLength = data_length();
+		if (position == -1)
+		{
+			position = currentLength;
+		}
+		if (position > currentLength)
+		{
+			throw new IndexOutOfBoundsException();
+		}
+		if (currentLength == 0)
+		{
+			data = object;
+		}
+		else if (currentLength == 1)
+		{
+			Object[] array = new Object[2];
+			if (position == 0)
+			{
+				array[0] = object;
+				array[1] = data;
+			}
+			else
+			{
+				array[0] = data;
+				array[1] = object;
+			}
+			data = array;
+		}
+		else
+		{
+			Object[] array = new Object[currentLength + 1];
+			Object[] current = (Object[])data;
+			int before = position;
+			int after = currentLength - position;
+			if (before > 0)
+			{
+				System.arraycopy(current, 0, array, 0, before);
+			}
+			array[position] = object;
+			if (after > 0)
+			{
+				System.arraycopy(current, position, array, position + 1, after);
+			}
+			data = array;
+		}
+	}
+
+	private Object data_remove(int position)
+	{
+		int currentLength = data_length();
+
+		if (position > currentLength - 1)
+		{
+			throw new IndexOutOfBoundsException();
+		}
+
+		else if (currentLength == 1)
+		{
+			Object old = data;
+			data = null;
+			return old;
+		}
+		else if (currentLength == 2)
+		{
+			Object[] current = (Object[])data;
+			if (position == 0)
+			{
+				data = current[1];
+				return current[0];
+			}
+			else
+			{
+				data = current[0];
+				return current[1];
+			}
+		}
+		else
+		{
+			Object[] current = (Object[])data;
+			data = new Object[currentLength - 1];
+
+			if (position > 0)
+			{
+				System.arraycopy(current, 0, data, 0, position);
+			}
+			if (position != currentLength - 1)
+			{
+				final int left = currentLength - position - 1;
+				System.arraycopy(current, position + 1, data, position, left);
+			}
+
+			return current[position];
+		}
+	}
 
 	/**
 	 * Constructor. All components have names. A component's id cannot be null. This is the minimal
@@ -701,7 +889,7 @@
 	public Component(final String id, final IModel model)
 	{
 		this(id);
-		setModelImp(model);
+		setModelImpl(model);
 	}
 
 	/**
@@ -739,61 +927,29 @@
 
 	private void addBehavior(final IBehavior behavior)
 	{
-		if (data == null)
-		{
-			data = behavior;
-		}
-		else
-		{
-			if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
-			{
-				Object[] tmp = (Object[])data;
-				Object[] array = new Object[tmp.length + 1];
-				System.arraycopy(tmp, 0, array, 0, tmp.length);
-				array[tmp.length] = behavior;
-				data = array;
-			}
-			else
-			{
-				Object[] array = new Object[2];
-				array[0] = data;
-				array[1] = behavior;
-				data = array;
-			}
-		}
+		data_add(behavior);
 	}
 
-	private List getBehaviorsIntern()
+	private List getBehaviorsImpl()
 	{
 		if (data != null)
 		{
-			boolean modelSet = getFlag(FLAG_MODEL_SET);
-			if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
-			{
-				Object[] tmp = (Object[])data;
-				int i = 0;
-				// If the model is set jump one
-				if (modelSet)
-					i++;
-				// if the current one is not a behavior (metadata) jump one.
-				if (!(tmp[i] instanceof IBehavior))
-					i++;
+			// if the model is set, we must skip it
+			final int startIndex = getFlag(FLAG_MODEL_SET) ? 1 : 0;
+			int length = data_length();
 
-				if (i < tmp.length)
+			if (length > startIndex)
+			{
+				final ArrayList result = new ArrayList();
+				for (int i = startIndex; i < length; ++i)
 				{
-					ArrayList al = new ArrayList(tmp.length - i);
-					for (int j = i; j < tmp.length; j++)
+					Object o = data_get(i);
+					if (o instanceof IBehavior)
 					{
-						al.add(tmp[j]);
+						result.add(o);
 					}
-					return al;
 				}
-			}
-			else if (!modelSet && data instanceof IBehavior)
-			{
-				ArrayList al = new ArrayList();
-				al.add(data);
-				return al;
+				return result;
 			}
 		}
 		return null;
@@ -948,7 +1104,7 @@
 		// The model will be created next time.
 		if (getFlag(FLAG_INHERITABLE_MODEL))
 		{
-			setModelImp(null);
+			setModelImpl(null);
 			setFlag(FLAG_INHERITABLE_MODEL, false);
 		}
 	}
@@ -963,7 +1119,7 @@
 	 */
 	public final void detachBehaviors()
 	{
-		List behaviors = getBehaviorsIntern();
+		List behaviors = getBehaviorsImpl();
 		if (behaviors != null)
 		{
 			for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -1214,6 +1370,30 @@
 		return attrs;
 	}
 
+	final Object getMarkupIdImpl()
+	{
+		if (generatedMarkupId != -1)
+		{
+			return new Integer(generatedMarkupId);
+		}
+
+		return getMetaData(MARKUP_ID_KEY);
+	}
+
+	private final int nextAutoIndex()
+	{
+		Page page = findPage();
+		if (page == null)
+		{
+			throw new WicketRuntimeException(
+					"This component is not (yet) coupled to a page. It has to be able "
+							+ "to find the page it is supposed to operate in before you can call "
+							+ "this method (Component#getMarkupId)");
+		}
+
+		return page.getAutoIndex();
+	}
+
 	/**
 	 * Retrieves id by which this component is represented within the markup. This is either the id
 	 * attribute set explicitly via a call to {@link #setMarkupId(String)}, id attribute defined in
@@ -1229,46 +1409,41 @@
 	 */
 	public String getMarkupId()
 	{
-		String markupId = (String)getMetaData(MARKUP_ID_KEY);
-		if (markupId == null)
+		Object storedMarkupId = getMarkupIdImpl();
+
+		if (storedMarkupId instanceof String)
 		{
-			Page page = findPage();
-			if (page == null)
-			{
-				throw new WicketRuntimeException(
-						"This component is not (yet) coupled to a page. It has to be able "
-								+ "to find the page it is supposed to operate in before you can call "
-								+ "this method (Component#getMarkupId)");
-			}
-			// try to read from markup
-			// TODO getting the id from markup doesn't work everywhere yet.
-			// unfortunately, we have to drop this until we have a good solution
-			// for issue http://issues.apache.org/jira/browse/WICKET-694
-			// markupId = getMarkupAttributes().getString("id");
-
-			// if (markupId == null)
-			// {
-			// if not in the markup, generate one
-
-			markupId = RequestContext.get().encodeMarkupId(getId() + page.getAutoIndex());
-			// make sure id is compliant with w3c requirements (starts with a
-			// letter)
-			char c = markupId.charAt(0);
-			if (!Character.isLetter(c))
-			{
-				markupId = "id" + markupId;
-			}
-
-			// escape some noncompliant characters
-			markupId = Strings.replaceAll(markupId, "_", "__").toString();
-			markupId = markupId.replace('.', '_');
-			markupId = markupId.replace('-', '_');
+			return (String)storedMarkupId;
+		}
+
+		final int generatedMarkupId = storedMarkupId instanceof Integer ? ((Integer)storedMarkupId)
+				.intValue() : nextAutoIndex();
 
+		if (storedMarkupId == null)
+		{
+			setMarkupIdImpl(new Integer(generatedMarkupId));
+		}
 
-			// }
-			setMetaData(MARKUP_ID_KEY, markupId);
+		// try to read from markup
+		// TODO getting the id from markup doesn't work everywhere yet.
+		// unfortunately, we have to drop this until we have a good solution
+		// for issue http://issues.apache.org/jira/browse/WICKET-694
+		// markupId = getMarkupAttributes().getString("id");
 
+		String markupId = RequestContext.get().encodeMarkupId(getId() + generatedMarkupId);
+		// make sure id is compliant with w3c requirements (starts with a
+		// letter)
+		char c = markupId.charAt(0);
+		if (!Character.isLetter(c))
+		{
+			markupId = "id" + markupId;
 		}
+
+		// escape some noncompliant characters
+		markupId = Strings.replaceAll(markupId, "_", "__").toString();
+		markupId = markupId.replace('.', '_');
+		markupId = markupId.replace('-', '_');
+
 		return markupId;
 	}
 
@@ -1287,23 +1462,27 @@
 
 	private MetaDataEntry[] getMetaData()
 	{
-		if (data instanceof MetaDataEntry[])
-		{
-			return (MetaDataEntry[])data;
-		}
-		else if (data instanceof Object[])
+		MetaDataEntry[] metaData = null;
+
+		// index where we should expect the entry
+		int index = getFlag(FLAG_MODEL_SET) ? 1 : 0;
+
+		int length = data_length();
+
+		if (index < length)
 		{
-			Object[] tmp = (Object[])data;
-			if (tmp[0] instanceof MetaDataEntry[])
+			Object object = data_get(index);
+			if (object instanceof MetaDataEntry[])
 			{
-				return (MetaDataEntry[])tmp[0];
+				metaData = (MetaDataEntry[])object;
 			}
-			else if (tmp[1] instanceof MetaDataEntry[])
+			else if (object instanceof MetaDataEntry)
 			{
-				return (MetaDataEntry[])tmp[1];
+				metaData = new MetaDataEntry[] { (MetaDataEntry)object };
 			}
 		}
-		return null;
+
+		return metaData;
 	}
 
 	/**
@@ -1319,7 +1498,7 @@
 		{
 			// give subclass a chance to lazy-init model
 			model = initModel();
-			setModelImp(model);
+			setModelImpl(model);
 		}
 
 		return model;
@@ -2008,42 +2187,14 @@
 
 	private boolean removeBehavior(final IBehavior behavior)
 	{
-		if (behavior.equals(data))
+		final int start = getFlag(FLAG_MODEL_SET) ? 1 : 0;
+		for (int i = start; i < data_length(); ++i)
 		{
-			data = null;
-			return true;
-		}
-		else if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
-		{
-			Object[] array = (Object[])data;
-			for (int i = 0; i < array.length; i++)
+			Object o = data_get(i);
+			if (o.equals(behavior))
 			{
-				if (array[i].equals(behavior))
-				{
-					if (array.length == 2)
-					{
-						if (i == 0)
-						{
-							data = array[1];
-						}
-						else
-						{
-							data = array[0];
-						}
-					}
-					else
-					{
-						Object[] tmp = new Object[array.length - 1];
-						System.arraycopy(array, 0, tmp, 0, i);
-						i++;
-						if (i != array.length)
-						{
-							System.arraycopy(array, i, tmp, i - 1, array.length - i);
-						}
-						data = array;
-					}
-					return true;
-				}
+				data_remove(i);
+				return true;
 			}
 		}
 		return false;
@@ -2122,7 +2273,7 @@
 			{
 				// Call each behaviors onException() to allow the
 				// behavior to clean up
-				List behaviors = getBehaviorsIntern();
+				List behaviors = getBehaviorsImpl();
 				if (behaviors != null)
 				{
 					for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -2338,7 +2489,7 @@
 
 			// Ask all behaviors if they have something to contribute to the
 			// header or body onLoad tag.
-			List behaviors = getBehaviorsIntern();
+			List behaviors = getBehaviorsImpl();
 			if (behaviors != null)
 			{
 				final Iterator iter = behaviors.iterator();
@@ -2478,6 +2629,23 @@
 		return this;
 	}
 
+	final void setMarkupIdImpl(Object markupId)
+	{
+		if (markupId != null && !(markupId instanceof String) && !(markupId instanceof Integer))
+		{
+			throw new IllegalArgumentException("markupId must be String or Integer");
+		}
+
+		if (markupId instanceof Integer)
+		{
+			generatedMarkupId = ((Integer)markupId).intValue();
+			setMetaData(MARKUP_ID_KEY, null);
+			return;
+		}
+		generatedMarkupId = -1;
+		setMetaData(MARKUP_ID_KEY, (Serializable)markupId);
+	}
+
 	/**
 	 * Sets this component's markup id to a user defined value. It is up to the user to ensure this
 	 * value is unique.
@@ -2499,8 +2667,8 @@
 		{
 			throw new IllegalArgumentException("Markup id cannot be an empty string");
 		}
-		setMetaData(MARKUP_ID_KEY, markupId);
 
+		setMarkupIdImpl(markupId);
 	}
 
 	/**
@@ -2517,90 +2685,28 @@
 	 */
 	public final void setMetaData(final MetaDataKey key, final Serializable object)
 	{
-		MetaDataEntry[] metaData = key.set(getMetaData(), object);
-		if (data == null || data instanceof MetaDataEntry[])
+		MetaDataEntry[] old = getMetaData();
+
+		Object metaData = null;
+		MetaDataEntry[] metaDataArray = key.set(getMetaData(), object);
+		if (metaDataArray != null && metaDataArray.length > 0)
 		{
-			data = metaData;
+			metaData = (metaDataArray.length > 1) ? (Object)metaDataArray : metaDataArray[0];
 		}
-		else if (data instanceof Object[])
+
+		int index = getFlag(FLAG_MODEL_SET) ? 1 : 0;
+
+		if (old == null && metaData != null)
 		{
-			Object[] tmp = (Object[])data;
-			boolean modelSet = getFlag(FLAG_MODEL_SET);
-			if (modelSet)
-			{
-				if (tmp[1] instanceof MetaDataEntry[])
-				{
-					if (metaData == null)
-					{
-						if (tmp.length == 2)
-						{
-							data = tmp[0];
-						}
-						else
-						{
-							Object[] array = new Object[tmp.length - 1];
-							array[0] = tmp[0]; // model
-							System.arraycopy(tmp, 2, array, 1, tmp.length - 2);
-							data = array;
-						}
-					}
-					else
-					{
-						tmp[1] = metaData;
-					}
-				}
-				else if (metaData != null)
-				{
-					Object[] array = new Object[tmp.length + 1];
-					array[0] = tmp[0]; // the model
-					array[1] = metaData;
-					System.arraycopy(tmp, 1, array, 2, tmp.length - 1); // behaviors
-					data = array;
-				}
-			}
-			else if (tmp[0] instanceof MetaDataEntry[])
-			{
-				if (metaData == null)
-				{
-					if (tmp.length == 2)
-					{
-						data = tmp[1];
-					}
-					else
-					{
-						Object[] array = new Object[tmp.length - 1];
-						System.arraycopy(tmp, 1, array, 0, tmp.length - 1);
-						data = array;
-					}
-				}
-				else
-				{
-					tmp[0] = metaData;
-				}
-			}
-			else if (metaData != null)
-			{
-				Object[] array = new Object[tmp.length + 1];
-				array[0] = metaData;
-				System.arraycopy(tmp, 0, array, 1, tmp.length); // behaviors
-				data = array;
-			}
+			data_insert(index, metaData);
 		}
-		else if (metaData != null)
+		else if (old != null && metaData != null)
 		{
-			Object[] array = new Object[2];
-			boolean modelSet = getFlag(FLAG_MODEL_SET);
-			if (modelSet)
-			{
-				array[0] = data;
-				array[1] = metaData;
-			}
-			else
-			{
-				array[0] = metaData;
-				array[1] = data;
-			}
-			data = array;
+			data_set(index, metaData);
+		}
+		else if (old != null && metaData == null)
+		{
+			data_remove(index);
 		}
 	}
 
@@ -2637,7 +2743,7 @@
 				addStateChange(new ComponentModelChange(prevModel));
 			}
 
-			setModelImp(wrap(model));
+			setModelImpl(wrap(model));
 		}
 
 		modelChanged();
@@ -2648,74 +2754,37 @@
 	{
 		if (getFlag(FLAG_MODEL_SET))
 		{
-			if (data instanceof IModel)
-			{
-				return (IModel)data;
-			}
-			else if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
-			{
-				return (IModel)((Object[])data)[0];
-			}
+			return (IModel)data_get(0);
+		}
+		else
+		{
+			return null;
 		}
-		return null;
 	}
 
-	void setModelImp(IModel model)
+	void setModelImpl(IModel model)
 	{
 		if (getFlag(FLAG_MODEL_SET))
 		{
-			if (data instanceof IModel)
+			if (model != null)
 			{
-				data = model;
+				data_set(0, model);
 			}
-			else if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
+			else
 			{
-				if (model == null)
-				{
-					Object[] tmp = (Object[])data;
-					if (tmp.length > 2)
-					{
-						Object[] array = new Object[tmp.length - 1];
-						System.arraycopy(tmp, 1, array, 0, array.length);
-						data = array;
-					}
-					else
-					{
-						data = tmp[1];
-					}
-				}
-				else
-				{
-					((Object[])data)[0] = model;
-				}
+				data_remove(0);
+				setFlag(FLAG_MODEL_SET, false);
 			}
 		}
-		else if (model != null)
+		else
 		{
-			if (data == null)
-			{
-				data = model;
-			}
-			else
+			if (model != null)
 			{
-				if (data instanceof Object[] && !(data instanceof MetaDataEntry[]))
-				{
-					Object[] tmp = (Object[])data;
-					Object[] array = new Object[tmp.length + 1];
-					System.arraycopy(tmp, 0, array, 1, tmp.length);
-					array[0] = model;
-					data = array;
-				}
-				else
-				{
-					Object[] array = new Object[2];
-					array[0] = model;
-					array[1] = data;
-					data = array;
-				}
+				data_insert(0, model);
+				setFlag(FLAG_MODEL_SET, true);
 			}
 		}
-		setFlag(FLAG_MODEL_SET, model != null);
+
 
 	}
 
@@ -3095,7 +3164,7 @@
 	 */
 	private void notifyBehaviorsComponentBeforeRender()
 	{
-		List behaviors = getBehaviorsIntern();
+		List behaviors = getBehaviorsImpl();
 		if (behaviors != null)
 		{
 			for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -3116,7 +3185,7 @@
 	private void notifyBehaviorsComponentRendered()
 	{
 		// notify the behaviors that component has been rendered
-		List behaviors = getBehaviorsIntern();
+		List behaviors = getBehaviorsImpl();
 		if (behaviors != null)
 		{
 			for (Iterator i = behaviors.iterator(); i.hasNext();)
@@ -3283,7 +3352,7 @@
 	 */
 	protected List/* <IBehavior> */getBehaviors(Class type)
 	{
-		List behaviors = getBehaviorsIntern();
+		List behaviors = getBehaviorsImpl();
 		if (behaviors == null)
 		{
 			return Collections.EMPTY_LIST;
@@ -3641,7 +3710,7 @@
 		if (!(tag instanceof WicketTag) || !stripWicketTags)
 		{
 			// Apply behavior modifiers
-			List behaviors = getBehaviorsIntern();
+			List behaviors = getBehaviorsImpl();
 			if ((behaviors != null) && !behaviors.isEmpty() && !tag.isClose() &&
 					(isIgnoreAttributeModifier() == false))
 			{
@@ -3854,7 +3923,7 @@
 	 */
 	final boolean hasMarkupIdMetaData()
 	{
-		return getMetaData(MARKUP_ID_KEY) != null;
+		return getMarkupId() != null;
 	}
 
 	void internalMarkRendering()

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ComponentSourceEntry.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ComponentSourceEntry.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ComponentSourceEntry.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ComponentSourceEntry.java Thu Oct 18 13:28:02 2007
@@ -69,20 +69,21 @@
 		checkId("Component id", component.getId());
 		buffer.append(component.getId());
 		buffer.append(' ');
-		if (component.hasMarkupIdMetaData())
+		Object markupId = component.getMarkupIdImpl();
+		if (markupId != null)
 		{
-
-			checkId("Component markup id", component.getMarkupId());
-			// if the markup id starts with component id, append only the difference prefixed by '*'
-			if (component.getMarkupId().startsWith(component.getId()))
+			if (markupId instanceof String)
 			{
-				buffer.append('*');
-				buffer.append(component.getMarkupId().substring(component.getId().length()));
+				checkId("Component markup id", (String)markupId);
 			}
-			else
+
+			// if the markup id is an integer, prefixed it with '*'
+			if (markupId instanceof Integer)
 			{
-				buffer.append(component.getMarkupId());
+				buffer.append('*');
 			}
+			buffer.append(markupId);
+
 			buffer.append(' ');
 		}
 		buffer.append(component.markupIndex);
@@ -214,7 +215,7 @@
 		String parts[] = info.split(" ");
 
 		final String id = parts[0];
-		final String markupId;
+		final Object markupId;
 		final int markupIndex;
 
 		if (parts.length == 2)
@@ -224,9 +225,10 @@
 		}
 		else if (parts.length == 3)
 		{
+
 			if (parts[1] != null && parts[1].startsWith("*"))
 			{
-				markupId = id + parts[1].substring(1);
+				markupId = Integer.valueOf(parts[1].substring(1));
 			}
 			else
 			{
@@ -254,9 +256,9 @@
 		{
 			if (markupId != null)
 			{
-				component.setMarkupId(markupId);
+				component.setMarkupIdImpl(markupId);
 			}
-			component.markupIndex = markupIndex;
+			component.markupIndex = (short)markupIndex;
 		}
 		return component instanceof MarkupContainer ? (MarkupContainer)component : null;
 	}

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/MarkupContainer.java Thu Oct 18 13:28:02 2007
@@ -685,8 +685,7 @@
 			child.markupIndex = replaced.markupIndex;
 
 			// The generated markup id remains the same
-			String replacedId = (replaced.hasMarkupIdMetaData()) ? replaced.getMarkupId() : null;
-			child.setMarkupId(replacedId);
+			child.setMarkupIdImpl(replaced.getMarkupIdImpl());
 		}
 
 		return this;

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/link/BookmarkablePageLink.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/link/BookmarkablePageLink.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/link/BookmarkablePageLink.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/markup/html/link/BookmarkablePageLink.java Thu Oct 18 13:28:02 2007
@@ -16,12 +16,16 @@
  */
 package org.apache.wicket.markup.html.link;
 
+import java.util.Iterator;
+import java.util.Map.Entry;
+
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.IPageMap;
 import org.apache.wicket.Page;
 import org.apache.wicket.PageMap;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.util.collections.MiniMap;
 import org.apache.wicket.util.lang.Classes;
 
 /**
@@ -40,7 +44,7 @@
 	private String pageMapName = null;
 
 	/** The parameters to pass to the class constructor when instantiated. */
-	protected final PageParameters parameters;
+	protected final MiniMap parameters;
 
 	/**
 	 * Constructor.
@@ -52,7 +56,40 @@
 	 */
 	public BookmarkablePageLink(final String id, final Class pageClass)
 	{
-		this(id, pageClass, new PageParameters());
+		this(id, pageClass, null);
+	}
+
+	private MiniMap pageParametersToMiniMap(PageParameters parameters)
+	{
+		if (parameters != null)
+		{
+			MiniMap map = new MiniMap(parameters.keySet().size());
+			for (Iterator i = parameters.entrySet().iterator(); i.hasNext();)
+			{
+				Entry entry = (Entry)i.next();
+				map.put(entry.getKey(), entry.getValue());
+			}
+			return map;
+		}
+		else
+		{
+			return null;
+		}
+
+	}
+
+	private PageParameters getPageParameters()
+	{
+		PageParameters result = new PageParameters();
+		if (parameters != null)
+		{
+			for (Iterator i = parameters.entrySet().iterator(); i.hasNext();)
+			{
+				Entry entry = (Entry)i.next();
+				result.put(entry.getKey(), entry.getValue());
+			}
+		}
+		return result;
 	}
 
 	/**
@@ -69,6 +106,9 @@
 			final PageParameters parameters)
 	{
 		super(id);
+
+		this.parameters = pageParametersToMiniMap(parameters);
+
 		if (pageClass == null)
 		{
 			throw new IllegalArgumentException("Page class for bookmarkable link cannot be null");
@@ -78,8 +118,7 @@
 			throw new IllegalArgumentException("Page class must be derived from " +
 					Page.class.getName());
 		}
-		this.pageClassName = pageClass.getName();
-		this.parameters = parameters;
+		pageClassName = pageClass.getName();
 	}
 
 	/**
@@ -89,7 +128,7 @@
 	 */
 	public final Class getPageClass()
 	{
-		return Classes.resolveClass(this.pageClassName);
+		return Classes.resolveClass(pageClassName);
 	}
 
 	/**
@@ -145,7 +184,7 @@
 	{
 		if (pageMap != null)
 		{
-			this.pageMapName = pageMap.getName();
+			pageMapName = pageMap.getName();
 			add(new AttributeModifier("target", true, new Model(pageMapName)));
 		}
 		return this;
@@ -208,6 +247,8 @@
 		{
 			throw new IllegalStateException("You cannot specify popup settings and a page map");
 		}
+
+		PageParameters parameters = getPageParameters();
 
 		if (getPopupSettings() != null)
 		{

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/MiniMap.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/MiniMap.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/MiniMap.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/collections/MiniMap.java Thu Oct 18 13:28:02 2007
@@ -31,7 +31,7 @@
  * 
  * @author Jonathan Locke
  */
-public final class MiniMap implements Map, Serializable
+public class MiniMap implements Map, Serializable
 {
 	private static final long serialVersionUID = 1L;
 
@@ -55,8 +55,8 @@
 	 */
 	public MiniMap(final int maxEntries)
 	{
-		this.keys = new Object[maxEntries];
-		this.values = new Object[maxEntries];
+		keys = new Object[maxEntries];
+		values = new Object[maxEntries];
 	}
 
 	/**
@@ -143,7 +143,7 @@
 		{
 			// Replace existing value
 			final Object oldValue = values[index];
-			this.values[index] = value;
+			values[index] = value;
 			return oldValue;
 		}
 

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java Thu Oct 18 13:28:02 2007
@@ -19,6 +19,7 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -725,9 +726,12 @@
 				{
 					Field parametersField = BookmarkablePageLink.class
 							.getDeclaredField("parameters");
-					parametersField.setAccessible(true);
-					PageParameters parameters = (PageParameters)parametersField
-							.get(bookmarkablePageLink);
+					Method getParametersMethod = BookmarkablePageLink.class.getDeclaredMethod(
+							"getPageParameters", null);
+					getParametersMethod.setAccessible(true);
+
+					PageParameters parameters = (PageParameters)getParametersMethod.invoke(
+							bookmarkablePageLink, null);
 					setParametersForNextRequest(parameters);
 				}
 				catch (Exception e)

Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/value/ValueMap.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/value/ValueMap.java?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/value/ValueMap.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/value/ValueMap.java Thu Oct 18 13:28:02 2007
@@ -411,7 +411,7 @@
 	 */
 	public final IValueMap makeImmutable()
 	{
-		this.immutable = true;
+		immutable = true;
 		return this;
 	}
 
@@ -489,7 +489,7 @@
 	 */
 	public String getKey(final String key)
 	{
-		Iterator iter = this.keySet().iterator();
+		Iterator iter = keySet().iterator();
 		while (iter.hasNext())
 		{
 			Object keyValue = iter.next();

Modified: wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTestPage_ExpectedResult.html
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTestPage_ExpectedResult.html?rev=586123&r1=586122&r2=586123&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTestPage_ExpectedResult.html (original)
+++ wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/markup/html/debug/WicketComponentTreeTestPage_ExpectedResult.html Thu Oct 18 13:28:02 2007
@@ -34,13 +34,13 @@
 		<tr wicket:id="components">
 		  <td valign="top" align="left"><span wicket:id="row">1</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="path">label1</span>&nbsp;&nbsp;&nbsp;</td>
-		  <td valign="top" align="left" nowrap><span wicket:id="size">390 bytes</span>&nbsp;&nbsp;&nbsp;</td>
+		  <td valign="top" align="left" nowrap><span wicket:id="size">414 bytes</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="type">org.apache.wicket.markup.html.basic.Label</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="model">test1</span>&nbsp;&nbsp;&nbsp;</td>
 		</tr><tr wicket:id="components">
 		  <td valign="top" align="left"><span wicket:id="row">2</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="path">label2</span>&nbsp;&nbsp;&nbsp;</td>
-		  <td valign="top" align="left" nowrap><span wicket:id="size">391 bytes</span>&nbsp;&nbsp;&nbsp;</td>
+		  <td valign="top" align="left" nowrap><span wicket:id="size">415 bytes</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="type">org.apache.wicket.markup.html.basic.Label</span>&nbsp;&nbsp;&nbsp;</td>
 		  <td valign="top" align="left"><span wicket:id="model">test22</span>&nbsp;&nbsp;&nbsp;</td>
 		</tr>