Tab (\t) character in a DropDownChoice value causes the returned selected value
to be null
------------------------------------------------------------------------------------------
Key: WICKET-2043
URL: https://issues.apache.org/jira/browse/WICKET-2043
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4-RC1
Environment: Window Vista 64-bit, javac 1.6.0_10, BEA weblogic 10.3
Reporter: Marcin Palka
Priority: Minor
I use a DropDownChoice with a model of SelectOption objects and a
ChoiceRenderer (see code below).
This is how I create a DropDownChoice instance:
DropDownChoice separatorDropDown = new DropDownChoice(
"separatorDropDown",
new PropertyModel(this, "separator"), //separator is a field in
my class
new Model(new ArrayList(Arrays.asList(separators))),
//separators is an array of SelectOption objects
choiceRenderer);
This is how the SelectOption looks like:
class SelectOption implements Serializable {
private String key;
private String value;
public SelectOption(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return getKey();
}
}
And this is how choiceRenderer looks like
ChoiceRenderer choiceRenderer = new ChoiceRenderer("key", "value");
These are the values that my model consist of:
private SelectOption[] separators = new SelectOption[]{
new SelectOption("comma", ","),
new SelectOption("semicolon ", ";"),
new SelectOption("dot", "."),
new SelectOption("tab", "\t"), //causes null
new SelectOption("tabandtex", "\ttext"), //causes null
new SelectOption("space", " ")};
Whenever any item containing a \t (tab character) in its value field is
selected, the separator field that PropertyModel points to becomes null.
Otherwise correct SelectOption instance is being set into separator.
I noticed that tab characters are missing from the output markup generated by
wicket.
<select wicket:id="separatorDropDown" ...>
<option selected="selected" value=",">comma</option>
<option value=";">semicolon </option>
<option value=".">dot</option>
<option value=" ">tab</option>
<option value=" text">tabandtex</option>
<option value=" ">space</option>
</select>
This is complete code:
Markup part:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:wicket>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>BuggyPage</title>
</head>
<body>
<div>
Separator <select
wicket:id="separatorDropDown">Separator</select>
</div>
<div wicket:id="separatorLabel">separatorLabel</div>
</body>
</html>
and Java code:
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
/**
*
* @author Marcin Pałka ([email protected])
*/
public final class BuggyPage extends WebPage {
//default separator
private SelectOption defaultSeparator = new SelectOption("comma", ",");
//current separator
private SelectOption separator = defaultSeparator;
//separators
private SelectOption[] separators = new SelectOption[]{
new SelectOption("comma", ","),
new SelectOption("semicolon ", ";"),
new SelectOption("dot", "."),
new SelectOption("tab", "\t"), //causes null
new SelectOption("tabandtex", "\ttext"), //causes null
new SelectOption("space", " ")};
Label separatorLabel = new Label("separatorLabel", "Separator is " +
separator);
public BuggyPage(PageParameters params) {
separatorLabel.setOutputMarkupId(true);
ChoiceRenderer choiceRenderer = new ChoiceRenderer("key", "value");
DropDownChoice separatorDropDown = new DropDownChoice(
"separatorDropDown",
new PropertyModel(this, "separator"),
new Model(new ArrayList(Arrays.asList(separators))),
choiceRenderer);
// Enable Ajax-based choice
separatorDropDown.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
@Override
protected void onUpdate(AjaxRequestTarget target) {
//whenever the \t or \tsomething is selected,
//the separator instance is null here.
//This applies to any value that contains a backslash
String separatorLabelText = "New separator is " + separator;
Label newLabel = new Label("separatorLabel",
separatorLabelText);
newLabel.setOutputMarkupId(true);
separatorLabel.replaceWith(newLabel);
separatorLabel = newLabel;
target.addComponent(newLabel);
}
});
add(separatorDropDown);
add(separatorLabel);
}
class SelectOption implements Serializable {
private String key;
private String value;
public SelectOption(String key, String value) {
this.key = key;
this.value = value;
}
/**
* @return the key
*/
public String getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return getKey();
}
}
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.