Author: ivaynberg
Date: Sat Sep 17 20:07:48 2011
New Revision: 1172057
URL: http://svn.apache.org/viewvc?rev=1172057&view=rev
Log:
Issue: WICKET-4058
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1172057&r1=1172056&r2=1172057&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
Sat Sep 17 20:07:48 2011
@@ -26,7 +26,6 @@ import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -2267,18 +2266,10 @@ public class BaseWicketTester
final String inputName =
formComponent.getInputName();
if
(!currentParameterNamesSet.contains(inputName))
{
- final Object modelObject =
formComponent.getModelObject();
- if (modelObject instanceof
Collection<?>)
+ String[] values =
FormTester.getInputValue(formComponent);
+ for (String value : values)
{
- final Collection<?>
collectionModelObject = (Collection<?>)modelObject;
- for (Object value :
collectionModelObject)
- {
-
postParameters.addParameterValue(inputName, value.toString());
- }
- }
- else
- {
-
postParameters.addParameterValue(inputName, formComponent.getValue());
+
postParameters.addParameterValue(inputName, value);
}
}
}
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java?rev=1172057&r1=1172056&r2=1172057&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
Sat Sep 17 20:07:48 2011
@@ -47,7 +47,6 @@ import org.apache.wicket.protocol.http.m
import org.apache.wicket.util.file.File;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.StringValue;
-import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;
@@ -389,108 +388,131 @@ public class FormTester
return;
}
- // if component is text field and do not have
exist value, fill
- // blank String if required
- if (formComponent instanceof
AbstractTextComponent)
+ String[] values = getInputValue(formComponent);
+ if (formComponent instanceof
AbstractTextComponent<?>)
{
- if
(Strings.isEmpty(getFormComponentValue(formComponent)))
+ if (values.length == 0 &&
fillBlankString)
{
- if (fillBlankString)
- {
-
setFormComponentValue(formComponent, "");
- }
- }
- else
- {
-
setFormComponentValue(formComponent, getFormComponentValue(formComponent));
+
setFormComponentValue(formComponent, "");
}
}
- else if ((formComponent instanceof
DropDownChoice) ||
- (formComponent instanceof RadioChoice)
|| (formComponent instanceof CheckBox))
+ for (String value : values)
{
- setFormComponentValue(formComponent,
getFormComponentValue(formComponent));
+ addFormComponentValue(formComponent,
value);
}
- else if (formComponent instanceof
ListMultipleChoice)
+ }
+ });
+ workingForm.detach();
+ }
+
+ /**
+ * Gets request parameter values for the form component that represents
its current model value
+ *
+ * @param formComponent
+ * @return array containing parameter values
+ */
+ public static String[] getInputValue(FormComponent<?> formComponent)
+ {
+ // do nothing for invisible or disabled component -- the
browser would not send any
+ // parameter for a disabled component
+ if (!(formComponent.isVisibleInHierarchy() &&
formComponent.isEnabledInHierarchy()))
+ {
+ return new String[] { };
+ }
+
+ // if component is text field and do not have exist value, fill
+ // blank String if required
+ if (formComponent instanceof AbstractTextComponent)
+ {
+ return new String[] {
getFormComponentValue(formComponent) };
+ }
+ else if ((formComponent instanceof DropDownChoice) ||
+ (formComponent instanceof RadioChoice) ||
(formComponent instanceof CheckBox))
+ {
+ return new String[] {
getFormComponentValue(formComponent) };
+ }
+ else if (formComponent instanceof ListMultipleChoice)
+ {
+ return
getFormComponentValue(formComponent).split(FormComponent.VALUE_SEPARATOR);
+ }
+ else if (formComponent instanceof CheckGroup)
+ {
+ final Collection<?> checkGroupValues =
(Collection<?>)formComponent.getDefaultModelObject();
+ final List<String> result = new ArrayList<String>();
+ formComponent.visitChildren(Check.class, new
IVisitor<Component, Void>()
+ {
+ public void component(final Component
component, final IVisit<Void> visit)
{
- final String[] modelValues =
getFormComponentValue(formComponent).split(
- FormComponent.VALUE_SEPARATOR);
- for (String modelValue : modelValues)
+ if
(checkGroupValues.contains(component.getDefaultModelObject()))
{
-
addFormComponentValue(formComponent, modelValue);
+
result.add(getFormComponentValue((Check<?>)component));
}
}
- else if (formComponent instanceof CheckGroup)
+ });
+ return result.toArray(new String[result.size()]);
+ }
+ else if (formComponent instanceof RadioGroup)
+ {
+ // TODO 1.5: see if all these transformations can be
factored out into
+ // checkgroup/radiogroup by them implementing some sort
of interface {
+ // getValue(); } otherwise all these implementation
details leak into the tester
+ final Object value =
formComponent.getDefaultModelObject();
+ String result = null;
+ if (value != null)
+ {
+ result =
formComponent.visitChildren(Radio.class, new IVisitor<Component, String>()
{
- final Collection<?> checkGroupValues =
(Collection<?>)formComponent.getDefaultModelObject();
-
formComponent.visitChildren(Check.class, new IVisitor<Component, Void>()
+ public void component(final Component
component, final IVisit<String> visit)
{
- public void component(final
Component component, final IVisit<Void> visit)
+ if
(value.equals(component.getDefaultModelObject()))
{
- if
(checkGroupValues.contains(component.getDefaultModelObject()))
- {
-
addFormComponentValue(formComponent,
-
getFormComponentValue((Check<?>)component));
- }
+
visit.stop(getFormComponentValue((Radio<?>)component));
}
- });
- }
- else if (formComponent instanceof RadioGroup)
- {
- // TODO 1.5: see if all these
transformations can be factored out into
- // checkgroup/radiogroup by them
implementing some sort of interface {
- // getValue(); } otherwise all these
implementation details leak into the tester
- final Object value =
formComponent.getDefaultModelObject();
- if (value != null)
- {
-
formComponent.visitChildren(Radio.class, new IVisitor<Component, Void>()
+ else
{
- public void
component(final Component component,
- final
IVisit<Void> visit)
- {
- if
(value.equals(component.getDefaultModelObject()))
- {
-
addFormComponentValue(formComponent,
-
getFormComponentValue((Radio<?>)component));
-
visit.stop();
- }
- else
- {
-
visit.dontGoDeeper();
- }
- }
- });
+ visit.dontGoDeeper();
+ }
}
- }
+ });
}
-
- private String getFormComponentValue(final
FormComponent<?> formComponent)
+ if (result == null)
{
- boolean oldEscape =
formComponent.getEscapeModelStrings();
- formComponent.setEscapeModelStrings(false);
- String val = formComponent.getValue();
- formComponent.setEscapeModelStrings(oldEscape);
- return val;
+ return new String[] { };
}
-
- private String getFormComponentValue(final Check<?>
formComponent)
+ else
{
- boolean oldEscape =
formComponent.getEscapeModelStrings();
- formComponent.setEscapeModelStrings(false);
- String val = formComponent.getValue();
- formComponent.setEscapeModelStrings(oldEscape);
- return val;
+ return new String[] { result };
}
+ }
+ return new String[] { };
+ }
- private String getFormComponentValue(final Radio<?>
formComponent)
- {
- boolean oldEscape =
formComponent.getEscapeModelStrings();
- formComponent.setEscapeModelStrings(false);
- String val = formComponent.getValue();
- formComponent.setEscapeModelStrings(oldEscape);
- return val;
- }
- });
- workingForm.detach();
+
+ private static String getFormComponentValue(final FormComponent<?>
formComponent)
+ {
+ boolean oldEscape = formComponent.getEscapeModelStrings();
+ formComponent.setEscapeModelStrings(false);
+ String val = formComponent.getValue();
+ formComponent.setEscapeModelStrings(oldEscape);
+ return val;
+ }
+
+ private static String getFormComponentValue(final Check<?>
formComponent)
+ {
+ boolean oldEscape = formComponent.getEscapeModelStrings();
+ formComponent.setEscapeModelStrings(false);
+ String val = formComponent.getValue();
+ formComponent.setEscapeModelStrings(oldEscape);
+ return val;
+ }
+
+ private static String getFormComponentValue(final Radio<?>
formComponent)
+ {
+ boolean oldEscape = formComponent.getEscapeModelStrings();
+ formComponent.setEscapeModelStrings(false);
+ String val = formComponent.getValue();
+ formComponent.setEscapeModelStrings(oldEscape);
+ return val;
}
/**
Modified:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java?rev=1172057&r1=1172056&r2=1172057&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
Sat Sep 17 20:07:48 2011
@@ -16,12 +16,21 @@
*/
package org.apache.wicket.util.tester;
+import org.apache.wicket.MarkupContainer;
import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.Radio;
+import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
/**
* <a href="https://issues.apache.org/jira/browse/WICKET-3711">WICKET-3711</a>
@@ -58,6 +67,67 @@ public class FormTesterSubmitLinkTest ex
.getDefaultModelObjectAsString());
}
+ public void testRadioComponentValueEncoding()
+ {
+
+ class TestPage extends WebPage implements
IMarkupResourceStreamProvider
+ {
+ private static final long serialVersionUID = 1L;
+
+ private String value;
+ private boolean submitted;
+
+ public TestPage()
+ {
+ Form<Void> form = new Form<Void>("form");
+ add(form);
+
+ RadioGroup<String> group = new
RadioGroup<String>("group",
+ new PropertyModel<String>(this,
"value"));
+ form.add(group);
+
+ value = "a";
+
+ group.add(new Radio<String>("a",
Model.of("a")));
+ group.add(new Radio<String>("b",
Model.of("b")));
+
+ form.add(new AjaxSubmitLink("submit")
+ {
+ @Override
+ protected void
onSubmit(AjaxRequestTarget target, Form<?> form)
+ {
+ submitted = true;
+ }
+
+ @Override
+ protected void
onError(AjaxRequestTarget target, Form<?> form)
+ {
+ }
+ });
+ }
+
+
+ public IResourceStream
getMarkupResourceStream(MarkupContainer container,
+ Class<?> containerClass)
+ {
+ return new StringResourceStream(
+ "<html><body><form
wicket:id='form'><div wicket:id='group'><input type='radio'
wicket:id='a'/><input type='radio' wicket:id='b'/></div><input
wicket:id='submit' type='submit'/></form></body></html>");
+ }
+ }
+
+ TestPage page = new TestPage();
+ WicketTester tester = new WicketTester();
+ tester.startPage(page);
+
+ // clicking an ajax submit link will force the form to be
ajax-serialized, current values of
+ // form components copied into request. this will check that
the value of radio is correctly
+ // serialized.
+
+ tester.clickLink("form:submit");
+ assertTrue(page.submitted);
+ assertEquals("a", page.value);
+ }
+
/**
* A test page for {@link FormTesterSubmitLinkTest}
*/