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 2011/07/05 18:27:02 UTC
svn commit: r1143128 - in
/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form:
CheckGroup.java FormComponent.java ListMultipleChoice.java
upload/MultiFileUploadField.java
Author: svenmeier
Date: Tue Jul 5 16:27:02 2011
New Revision: 1143128
URL: http://svn.apache.org/viewvc?rev=1143128&view=rev
Log:
WICKET-3784 Moved update logic for all Collections based FormComponents into single helper method FormComponent#updateCollectionModel(FormComponent).
I'm not sure a static method is the best place for this, but at least we have this logic unified in one place only, supporting all former use cases in ListMultipleChoice, CheckGroup and MultiFileUploadField.
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java?rev=1143128&r1=1143127&r2=1143128&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java Tue Jul 5 16:27:02 2011
@@ -23,7 +23,6 @@ import org.apache.wicket.WicketRuntimeEx
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.model.util.CollectionModel;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.lang.Generics;
@@ -152,43 +151,13 @@ public class CheckGroup<T> extends FormC
}
/**
- * If the model object exists, it is assumed to be a Collection, and it 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
- * {@link Collection} at every invocation.
- *
- * @see FormComponent#updateModel()
- * @throws UnsupportedOperationException
- * if the model object Collection cannot be modified
+ * See {@link FormComponent#updateCollectionModel(FormComponent)} for details on how the model
+ * is updated.
*/
@Override
public void updateModel()
{
- Collection<T> collection = getModelObject();
- if (collection == null)
- {
- collection = getConvertedInput();
- setDefaultModelObject(collection);
- }
- else
- {
- modelChanging();
- collection.clear();
- collection.addAll(getConvertedInput());
- modelChanged();
-
- // call model.setObject()
- try
- {
- getModel().setObject(collection);
- }
- catch (Exception e)
- {
- // ignore this exception because it could be that there
- // is not setter for this collection.
- log.info("no setter for the property attached to " + this);
- }
- }
+ FormComponent.updateCollectionModel(this);
}
@Override
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java?rev=1143128&r1=1143127&r2=1143128&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java Tue Jul 5 16:27:02 2011
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.html.fo
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
@@ -37,6 +38,7 @@ import org.apache.wicket.behavior.Behavi
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.model.IModel;
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;
@@ -466,7 +468,7 @@ public abstract class FormComponent<T> e
* @see IValidatorAddListener
*
*/
- @SuppressWarnings({ "rawtypes", "unchecked" })
+ @SuppressWarnings( { "rawtypes", "unchecked" })
public final FormComponent<T> add(final IValidator<? super T> validator)
{
if (validator == null)
@@ -1494,4 +1496,54 @@ public abstract class FormComponent<T> e
{
setDefaultModelObject(object);
}
+
+ /**
+ * 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
+ * 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
+ * {@link Collection} at every invocation.
+ *
+ * @param <S>
+ * collection type
+ * @param formComponent
+ * the form component to update
+ * @see FormComponent#updateModel()
+ * @throws UnsupportedOperationException
+ * if the existing model object Collection cannot be modified
+ */
+ protected static <S> void updateCollectionModel(FormComponent<Collection<S>> formComponent)
+ {
+ Collection<S> convertedInput = formComponent.getConvertedInput();
+
+ Collection<S> collection = formComponent.getModelObject();
+ if (collection == null)
+ {
+ collection = new ArrayList<S>(convertedInput);
+ formComponent.setDefaultModelObject(collection);
+ }
+ else
+ {
+ formComponent.modelChanging();
+ collection.clear();
+ if (convertedInput != null)
+ {
+ collection.addAll(convertedInput);
+ }
+ formComponent.modelChanged();
+
+ try
+ {
+ formComponent.getModel().setObject(collection);
+ }
+ catch (Exception e)
+ {
+ // ignore this exception because it could be that there
+ // is not setter for this collection.
+ logger.info("no setter for the property attached to " + formComponent);
+ }
+ }
+ }
}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java?rev=1143128&r1=1143127&r2=1143128&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ListMultipleChoice.java Tue Jul 5 16:27:02 2011
@@ -22,15 +22,11 @@ import java.util.List;
import java.util.StringTokenizer;
import org.apache.wicket.MetaDataKey;
-import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.string.AppendingStringBuffer;
import org.apache.wicket.util.string.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
@@ -53,9 +49,6 @@ public class ListMultipleChoice<T> exten
private static final long serialVersionUID = 1L;
};
- /** Log. */
- private static final Logger log = LoggerFactory.getLogger(ListMultipleChoice.class);
-
/** The default maximum number of rows to display. */
private static int defaultMaxRows = 8;
@@ -367,52 +360,13 @@ public class ListMultipleChoice<T> exten
}
/**
- * If the model object exists, it is assumed to be a Collection, and it 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
- * {@link Collection} at every invocation.
- *
- * @see FormComponent#updateModel()
- * @throws UnsupportedOperationException
- * if the model object Collection cannot be modified
+ * See {@link FormComponent#updateCollectionModel(FormComponent)} for details on how the model
+ * is updated.
*/
@Override
public void updateModel()
{
- Collection<T> selectedValues = getModelObject();
- if (selectedValues != null)
- {
- if (getDefaultModelObject() != selectedValues)
- {
- throw new WicketRuntimeException(
- "Updating a ListMultipleChoice works by modifying the underlying model object in-place, so please make sure that getObject() always returns the same Collection instance!");
- }
-
- modelChanging();
- selectedValues.clear();
- final Collection<T> converted = getConvertedInput();
- if (converted != null)
- {
- selectedValues.addAll(converted);
- }
- modelChanged();
- // call model.setObject()
- try
- {
- getModel().setObject(selectedValues);
- }
- catch (Exception e)
- {
- // ignore this exception because it could be that there
- // is not setter for this collection.
- log.info("no setter for the property attached to " + this);
- }
- }
- else
- {
- selectedValues = new ArrayList<T>(getConvertedInput());
- setDefaultModelObject(selectedValues);
- }
+ FormComponent.updateCollectionModel(this);
}
/**
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java?rev=1143128&r1=1143127&r2=1143128&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java Tue Jul 5 16:27:02 2011
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.Web
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
@@ -291,33 +292,13 @@ public class MultiFileUploadField extend
}
/**
- * @see org.apache.wicket.markup.html.form.FormComponent#updateModel()
+ * See {@link FormComponent#updateCollectionModel(FormComponent)} for details on how the model
+ * is updated.
*/
@Override
public void updateModel()
{
- final Collection<FileUpload> collection = getModelObject();
-
- // figure out if there is an existing model object collection for us to
- // reuse
- if (collection == null)
- {
- // no existing collection, push the one we created
- setDefaultModelObject(getConvertedInput());
- }
- else
- {
- // refresh the existing collection
- collection.clear();
- if (getConvertedInput() != null)
- {
- collection.addAll(getConvertedInput());
- }
-
- // push the collection in case the model is listening to
- // setobject calls
- setDefaultModelObject(collection);
- }
+ FormComponent.updateCollectionModel(this);
}
/**