You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2012/05/02 13:06:57 UTC

[1/2] git commit: WICKET-4528 make recorder component of wicket-extensions palette more efficient for large number of items

Updated Branches:
  refs/heads/master 15734a0da -> 6029e6d02


WICKET-4528 make recorder component of wicket-extensions palette more efficient for large number of items


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6029e6d0
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6029e6d0
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6029e6d0

Branch: refs/heads/master
Commit: 6029e6d0243073a39c517fc6075d6b167e0482d6
Parents: 6da066e
Author: Peter Ertl <pe...@apache.org>
Authored: Wed May 2 12:46:46 2012 +0200
Committer: Peter Ertl <pe...@apache.org>
Committed: Wed May 2 12:46:46 2012 +0200

----------------------------------------------------------------------
 .../html/form/palette/component/Recorder.java      |  112 ++++++++-------
 1 files changed, 61 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/6029e6d0/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/component/Recorder.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/component/Recorder.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/component/Recorder.java
index beab03c..56bd425 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/component/Recorder.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/component/Recorder.java
@@ -18,10 +18,14 @@ package org.apache.wicket.extensions.markup.html.form.palette.component;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.extensions.markup.html.form.palette.Palette;
@@ -44,10 +48,8 @@ public class Recorder<T> extends HiddenField<Object>
 {
 	private static final long serialVersionUID = 1L;
 
-	private static final String[] EMPTY_IDS = new String[0];
-
-	/** conveniently maintained array of selected ids */
-	private String[] ids;
+	/**  set of selected ids */
+	private final Set<String> ids;
 
 	/** parent palette object */
 	private final Palette<T> palette;
@@ -63,6 +65,16 @@ public class Recorder<T> extends HiddenField<Object>
 	}
 
 	/**
+	 * internal access to ids for subclasses
+	 * 
+	 * @return set of ids
+	 */
+	protected Set<String> getIds()
+	{
+		return ids;
+	}
+
+	/**
 	 * @param id
 	 *            component id
 	 * @param palette
@@ -72,6 +84,7 @@ public class Recorder<T> extends HiddenField<Object>
 	{
 		super(id);
 		this.palette = palette;
+		this.ids = new LinkedHashSet<String>(); // hash set with insertion order 
 		setDefaultModel(new Model<Serializable>());
 		setOutputMarkupId(true);
 	}
@@ -89,10 +102,6 @@ public class Recorder<T> extends HiddenField<Object>
 		{
 			initIds();
 		}
-		else if (ids == null)
-		{
-			ids = EMPTY_IDS;
-		}
 		attached = true;
 	}
 
@@ -141,67 +150,71 @@ public class Recorder<T> extends HiddenField<Object>
 	}
 
 	/**
-	 * @return iterator over selected choices
+	 * @return list over selected choices
 	 */
-	@SuppressWarnings("unchecked")
-	public Iterator<T> getSelectedChoices()
+	protected List<T> getSelectedList()
 	{
-		IChoiceRenderer<T> renderer = getPalette().getChoiceRenderer();
-		if (ids.length == 0)
+		if (getIds().isEmpty())
 		{
-			return Collections.EMPTY_LIST.iterator();
+			return Collections.EMPTY_LIST;
 		}
 
-		List<T> selected = new ArrayList<T>(ids.length);
-		Collection<? extends T> choices = getPalette().getChoices();
-		for (String id : ids)
+		final IChoiceRenderer<T> renderer = getPalette().getChoiceRenderer();
+		final List<T> selected = new ArrayList<T>(getIds().size());
+		final Collection<? extends T> choices = getPalette().getChoices();
+
+		for (T choice : choices)
 		{
-			for (T choice : choices)
+			final String idValue = renderer.getIdValue(choice, 0);
+			if (getIds().contains(idValue))
 			{
-				if (renderer.getIdValue(choice, 0).equals(id))
-				{
-					selected.add(choice);
-					break;
-				}
+				selected.add(choice);
 			}
 		}
-		return selected.iterator();
+		return selected;
 	}
 
 	/**
-	 * @return iterator over unselected choices
+	 * @return iterator over selected choices
 	 */
-	public Iterator<T> getUnselectedChoices()
+	public Iterator<T> getSelectedChoices()
 	{
-		IChoiceRenderer<T> renderer = getPalette().getChoiceRenderer();
-		Collection<? extends T> choices = getPalette().getChoices();
+		return getSelectedList().iterator();
+	}
+
+	/**
+	 * @return list over unselected choices
+	 */
+	protected List<T> getUnselectedList()
+	{
+		final Collection<? extends T> choices = getPalette().getChoices();
 
-		if (choices.size() - ids.length == 0)
+		if (choices.size() - getIds().size() == 0)
 		{
-			return Collections.<T> emptyList().iterator();
+			return Collections.<T>emptyList();
 		}
 
-		List<T> unselected = new ArrayList<T>(Math.max(1, choices.size() - ids.length));
+		final IChoiceRenderer<T> renderer = getPalette().getChoiceRenderer();
+		final List<T> unselected = new ArrayList<T>(Math.max(1, choices.size() - getIds().size()));
+
 		for (T choice : choices)
 		{
-			final String choiceId = renderer.getIdValue(choice, 0);
-			boolean selected = false;
-			for (String id : ids)
-			{
-				if (id.equals(choiceId))
-				{
-					selected = true;
-					break;
-				}
-			}
-			if (!selected)
+			final String idValue = renderer.getIdValue(choice, 0);
+			if (!getIds().contains(idValue))
 			{
 				unselected.add(choice);
 			}
 		}
-		return unselected.iterator();
+		return unselected;
 	}
 
+	/**
+	 * @return iterator over unselected choices
+	 */
+	public Iterator<T> getUnselectedChoices()
+	{
+		return getUnselectedList().iterator();
+	}
 
 	@Override
 	protected void onInvalid()
@@ -218,16 +231,13 @@ public class Recorder<T> extends HiddenField<Object>
 		updateIds(getValue());
 	}
 
-	private void updateIds(final String value)
+	protected void updateIds(final String value)
 	{
-		if (Strings.isEmpty(value))
-		{
-			ids = EMPTY_IDS;
-		}
-		else
+		getIds().clear();
+
+		for (String id : Strings.split(value, ','))
 		{
-			ids = Strings.split(value, ',');
+			getIds().add(id);
 		}
 	}
-
 }