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> </td>
<td valign="top" align="left"><span wicket:id="path">label1</span> </td>
- <td valign="top" align="left" nowrap><span wicket:id="size">390 bytes</span> </td>
+ <td valign="top" align="left" nowrap><span wicket:id="size">414 bytes</span> </td>
<td valign="top" align="left"><span wicket:id="type">org.apache.wicket.markup.html.basic.Label</span> </td>
<td valign="top" align="left"><span wicket:id="model">test1</span> </td>
</tr><tr wicket:id="components">
<td valign="top" align="left"><span wicket:id="row">2</span> </td>
<td valign="top" align="left"><span wicket:id="path">label2</span> </td>
- <td valign="top" align="left" nowrap><span wicket:id="size">391 bytes</span> </td>
+ <td valign="top" align="left" nowrap><span wicket:id="size">415 bytes</span> </td>
<td valign="top" align="left"><span wicket:id="type">org.apache.wicket.markup.html.basic.Label</span> </td>
<td valign="top" align="left"><span wicket:id="model">test22</span> </td>
</tr>