You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by cm...@apache.org on 2012/05/07 14:40:39 UTC

git commit: [WICKET-4524] use map in convertChoiceIdsToChoices to speed up large choice lists

Updated Branches:
  refs/heads/wicket-1.5.x 0ac4172c7 -> 7735422f7


[WICKET-4524] use map in convertChoiceIdsToChoices to speed up large choice lists


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

Branch: refs/heads/wicket-1.5.x
Commit: 7735422f73cd956f34908513e5486b9f364fbc21
Parents: 0ac4172
Author: Carl-Eric Menzel <cm...@wicketbuch.de>
Authored: Mon May 7 13:38:14 2012 +0200
Committer: Carl-Eric Menzel <cm...@wicketbuch.de>
Committed: Mon May 7 14:22:01 2012 +0200

----------------------------------------------------------------------
 .../markup/html/form/ListMultipleChoice.java       |   40 +++++--
 .../html/form/ListMultipleChoiceTest$TestPage.html |    7 ++
 .../markup/html/form/ListMultipleChoiceTest.java   |   80 +++++++++++++++
 3 files changed, 116 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/7735422f/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
index 2ffffd5..df158ee 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
@@ -18,7 +18,9 @@ package org.apache.wicket.markup.html.form;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 
 import org.apache.wicket.MetaDataKey;
@@ -302,30 +304,46 @@ public class ListMultipleChoice<T> extends AbstractChoice<Collection<T>, T>
 		if (ids != null && ids.length > 0 && !Strings.isEmpty(ids[0]))
 		{
 			// Get values that could be selected
-			final List<? extends T> choices = getChoices();
+			final Map<String, T> choiceIds2choiceValues = createChoicesIdsMap();
 
 			// Loop through selected indices
 			for (String id : ids)
 			{
-				for (int index = 0; index < choices.size(); index++)
+				if (choiceIds2choiceValues.containsKey(id))
 				{
-					// Get next choice
-					final T choice = choices.get(index);
-					if (getChoiceRenderer().getIdValue(choice, index).equals(id))
-					{
-						selectedValues.add(choice);
-						break;
-					}
+					selectedValues.add(choiceIds2choiceValues.get(id));
 				}
 			}
 		}
-
 		addRetainedDisabled(selectedValues);
 
 		return selectedValues;
 
 	}
 
+	/**
+	 * Creates a map of choice IDs to choice values. This map can be used to speed up lookups e.g.
+	 * in {@link #convertChoiceIdsToChoices(String[])}. <strong>Do not store the result of this
+	 * method.</strong> The choices list can change between requests so this map <em>must</em> be
+	 * regenerated.
+	 * 
+	 * @return a map.
+	 */
+	private Map<String, T> createChoicesIdsMap()
+	{
+		final List<? extends T> choices = getChoices();
+
+		final Map<String, T> choiceIds2choiceValues = new HashMap<String, T>(choices.size(), 1);
+
+		for (int index = 0; index < choices.size(); index++)
+		{
+			// Get next choice
+			final T choice = choices.get(index);
+			choiceIds2choiceValues.put(getChoiceRenderer().getIdValue(choice, index), choice);
+		}
+		return choiceIds2choiceValues;
+	}
+
 	private void addRetainedDisabled(ArrayList<T> selectedValues)
 	{
 		if (isRetainDisabledSelected())
@@ -401,4 +419,4 @@ public class ListMultipleChoice<T> extends AbstractChoice<Collection<T>, T>
 		setMetaData(RETAIN_DISABLED_META_KEY, (retain) ? true : null);
 		return this;
 	}
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/7735422f/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest$TestPage.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest$TestPage.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest$TestPage.html
new file mode 100644
index 0000000..f492ca9
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest$TestPage.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<form wicket:id="form">
+<select wicket:id="list"></select>
+</form>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/7735422f/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest.java
new file mode 100644
index 0000000..182c95b
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/ListMultipleChoiceTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.markup.html.form;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.tester.FormTester;
+
+public class ListMultipleChoiceTest extends WicketTestCase
+{
+	public class TestPage extends WebPage
+	{
+		public IModel<List<String>> selectedValues = new Model(new ArrayList<String>());
+		public List<String> choices = Arrays.asList("a", "b", "c", "d", "e", "f");
+
+		public TestPage()
+		{
+			Form<Void> form = new Form<Void>("form");
+			this.add(form);
+			form.add(newListMultipleChoice("list", selectedValues, choices));
+		}
+	}
+
+	public void testSelectionWorks() throws Exception
+	{
+		TestPage page = (TestPage)tester.startPage(new TestPage());
+		FormTester form = tester.newFormTester("form");
+		form.select("list", 1);
+		form.select("list", 3);
+		form.select("list", 5);
+		form.submit();
+		assertEquals(3, page.selectedValues.getObject().size());
+		assertTrue(page.selectedValues.getObject().contains("b"));
+		assertTrue(page.selectedValues.getObject().contains("d"));
+		assertTrue(page.selectedValues.getObject().contains("f"));
+	}
+
+	public void testSelectionAccumulates() throws Exception
+	{
+		final TestPage page = new TestPage();
+		page.selectedValues.getObject().add("a");
+		tester.startPage(page);
+		FormTester form = tester.newFormTester("form");
+		form.select("list", 1);
+		form.select("list", 3);
+		form.select("list", 5);
+		form.submit();
+		assertEquals(4, page.selectedValues.getObject().size());
+		assertTrue(page.selectedValues.getObject().contains("a"));
+		assertTrue(page.selectedValues.getObject().contains("b"));
+		assertTrue(page.selectedValues.getObject().contains("d"));
+		assertTrue(page.selectedValues.getObject().contains("f"));
+	}
+
+	protected ListMultipleChoice<String> newListMultipleChoice(String id,
+		IModel<List<String>> selectedValues, List<String> choices)
+	{
+		return new ListMultipleChoice<String>(id, selectedValues, choices);
+	}
+}