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);
+ }
+}