You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2017/08/31 09:30:00 UTC
wicket git commit: WICKET-6451 enhance support for unmodifiable or
null sets
Repository: wicket
Updated Branches:
refs/heads/master 76460108c -> 10f5f76e5
WICKET-6451 enhance support for unmodifiable or null sets
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/10f5f76e
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/10f5f76e
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/10f5f76e
Branch: refs/heads/master
Commit: 10f5f76e5d84a85a8aa260b1fd0502bb29a3cc7e
Parents: 7646010
Author: Sven Meier <sv...@apache.org>
Authored: Thu Aug 31 11:28:43 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Thu Aug 31 11:28:43 2017 +0200
----------------------------------------------------------------------
.../wicket/markup/html/form/FormComponent.java | 33 +++++++-
.../html/form/CollectionFormComponentTest.java | 81 +++++++++++++++++---
2 files changed, 102 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/10f5f76e/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
index 9d4460e..37722d8 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@@ -42,12 +43,14 @@ import org.apache.wicket.core.util.lang.WicketObjects;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.form.AutoLabelResolver.AutoLabelMarker;
import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.IObjectClassAwareModel;
import org.apache.wicket.model.IPropertyReflectionAwareModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.lang.Objects;
import org.apache.wicket.util.string.StringList;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.string.Strings;
@@ -1575,7 +1578,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
/**
* Update the model of a {@link FormComponent} containing a {@link Collection}.
*
- * If the model object does not yet exists, a new {@link ArrayList} is filled with the converted
+ * If the model object does not yet exists, a new suitable collection is filled with the converted
* input and used as the new model object. Otherwise the existing collection is modified
* in-place, then {@link Model#setObject(Object)} is called with the same instance: it allows
* the Model to be notified of changes even when {@link Model#getObject()} returns a different
@@ -1599,7 +1602,14 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
Collection<S> collection = formComponent.getModelObject();
if (collection == null)
{
- collection = new ArrayList<>(convertedInput);
+ Class<?> hint = null;
+ if (formComponent.getModel() instanceof IObjectClassAwareModel) {
+ hint = ((IObjectClassAwareModel)formComponent.getModel()).getObjectClass();
+ }
+ if (hint == null) {
+ hint = List.class;
+ }
+ collection = newCollection(hint, convertedInput);
formComponent.setModelObject(collection);
}
else
@@ -1621,7 +1631,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
logger.debug("An error occurred while trying to modify the collection attached to "
+ formComponent, unmodifiable);
}
- collection = new ArrayList<>(convertedInput);
+ collection = newCollection(collection.getClass(), convertedInput);
}
try
@@ -1645,4 +1655,21 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
formComponent.modelChanged();
}
}
+
+ /**
+ * Creates a new collection.
+ *
+ * @param hint type deciding the type of the returned collection
+ * @param elements elements for the new collection
+ * @return collection
+ * @throws IllegalArgumentException if type is not supported
+ */
+ private static <S> Collection<S> newCollection(Class<?> hint, Collection<S> elements)
+ {
+ if (Set.class.isAssignableFrom(hint)) {
+ return new HashSet<>(elements);
+ } else {
+ return new ArrayList<>(elements);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/10f5f76e/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CollectionFormComponentTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CollectionFormComponentTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CollectionFormComponentTest.java
index a208b2d..55ca02b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CollectionFormComponentTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CollectionFormComponentTest.java
@@ -20,6 +20,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.wicket.WicketRuntimeException;
@@ -38,20 +41,50 @@ import org.junit.Test;
public class CollectionFormComponentTest extends WicketTestCase
{
@Test
- public void getSetNullCollection()
+ public void getSetNullList()
{
final AtomicBoolean setCalled = new AtomicBoolean();
Object object = new Object()
{
- private Collection<String> internal = null;
+ private List<String> internal = null;
- public Collection<String> getStrings()
+ public List<String> getStrings()
{
return internal;
}
- public void setStrings(Collection<String> strings)
+ public void setStrings(List<String> strings)
+ {
+ this.internal = strings;
+
+ setCalled.set(true);
+ }
+ };
+
+ Choice choice = new Choice(object);
+ choice.setConvertedInput(Arrays.asList("A", "B"));
+ FormComponent.updateCollectionModel(choice);
+
+ assertEquals(true, setCalled.get());
+ assertEquals("[A, B]", choice.getDefaultModelObjectAsString());
+ }
+
+ @Test
+ public void getSetNullSet()
+ {
+ final AtomicBoolean setCalled = new AtomicBoolean();
+
+ Object object = new Object()
+ {
+ private Set<String> internal = null;
+
+ public Set<String> getStrings()
+ {
+ return internal;
+ }
+
+ public void setStrings(Set<String> strings)
{
this.internal = strings;
@@ -139,20 +172,50 @@ public class CollectionFormComponentTest extends WicketTestCase
* WICKET-5518
*/
@Test
- public void getSetUnmodifiableCollection()
+ public void getSetUnmodifiableList()
{
final AtomicBoolean setCalled = new AtomicBoolean();
Object object = new Object()
{
- private Collection<String> internal = new ArrayList<>();
+ private List<String> internal = new ArrayList<>();
- public Collection<String> getStrings()
+ public List<String> getStrings()
{
- return Collections.unmodifiableCollection(internal);
+ return Collections.unmodifiableList(internal);
}
- public void setStrings(Collection<String> strings)
+ public void setStrings(List<String> strings)
+ {
+ this.internal = strings;
+
+ setCalled.set(true);
+ }
+ };
+
+ Choice choice = new Choice(object);
+ choice.setConvertedInput(Arrays.asList("A", "B"));
+ FormComponent.updateCollectionModel(choice);
+
+ assertEquals(true, setCalled.get());
+ assertEquals("[A, B]", choice.getDefaultModelObjectAsString());
+ }
+
+ @Test
+ public void getSetUnmodifiableSet()
+ {
+ final AtomicBoolean setCalled = new AtomicBoolean();
+
+ Object object = new Object()
+ {
+ private Set<String> internal = new HashSet<>();
+
+ public Set<String> getStrings()
+ {
+ return Collections.unmodifiableSet(internal);
+ }
+
+ public void setStrings(Set<String> strings)
{
this.internal = strings;