Change bundle and details at:
https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=53
Background:
- coerce select item value types to the model type of UISelectOne/
UISelectMany.
SECTION: Modified Files
----------------------------
M jsf-api/src/javax/faces/component/UISelectMany.java
M jsf-api/src/javax/faces/component/UISelectOne.java
---- coerce selectitem value types to be the same as
---- UISelectOne/UISelectMany model type before comparison
M jsf-ri/src/com/sun/faces/renderkit/html_basic/MenuRenderer.java
M
jsf-ri/src/com/sun/faces/renderkit/html_basic/SelectManyCheckboxListRenderer.java
---- coerce selectitem value types to be the same as value type before
---- comparison check (to determine selected option(s))
M
jsf-ri/systest/src/com/sun/faces/jsptest/SelectComponentValueTestCase.java
M jsf-ri/systest/src/com/sun/faces/systest/model/TestBean.java
A jsf-ri/systest/web/jsp/selectManyTypeInts.jsp
A jsf-ri/systest/web/jsp/selectOneTypeInt.jsp
---- tests...
SECTION: Diffs
----------------------------
Index: jsf-api/src/javax/faces/component/UISelectMany.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-api/src/javax/faces/component/UISelectMany.java,v
retrieving revision 1.7
diff -u -r1.7 UISelectMany.java
--- jsf-api/src/javax/faces/component/UISelectMany.java 20 Dec 2004
20:33:21 -0000 1.7
+++ jsf-api/src/javax/faces/component/UISelectMany.java 20 Apr 2005
04:28:14 -0000
@@ -468,10 +468,14 @@
return (true);
}
}
- } else if ((value == null) && (item.getValue() == null)) {
- return (true);
- } else if (value.equals(item.getValue())) {
- return (true);
+ } else {
+ //Coerce the item value type before comparing values.
+ Class type = value.getClass();
+ Object newValue = getFacesContext().getApplication().
+
getExpressionFactory().coerceToType(item.getValue(), type);
+ if (value.equals(newValue)) {
+ return (true);
+ }
}
}
return (false);
Index: jsf-api/src/javax/faces/component/UISelectOne.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-api/src/javax/faces/component/UISelectOne.java,v
retrieving revision 1.3
diff -u -r1.3 UISelectOne.java
--- jsf-api/src/javax/faces/component/UISelectOne.java 15 Nov 2004
18:50:42 -0000 1.3
+++ jsf-api/src/javax/faces/component/UISelectOne.java 20 Apr 2005
04:28:14 -0000
@@ -147,10 +147,14 @@
return (true);
}
}
- } else if ((value == null) && (item.getValue() == null)) {
- return (true);
- } else if (value.equals(item.getValue())) {
- return (true);
+ } else {
+ //Coerce the item value type before comparing values.
+ Class type = value.getClass();
+ Object newValue = getFacesContext().getApplication().
+
getExpressionFactory().coerceToType(item.getValue(), type);
+ if (value.equals(newValue)) {
+ return (true);
+ }
}
}
return (false);
Index: jsf-ri/src/com/sun/faces/renderkit/html_basic/MenuRenderer.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-ri/src/com/sun/faces/renderkit/html_basic/MenuRenderer.java,vretrieving
revision 1.5
diff -u -r1.5 MenuRenderer.java
--- jsf-ri/src/com/sun/faces/renderkit/html_basic/MenuRenderer.java
31 Mar 2005 16:39:18 -0000 1.5
+++ jsf-ri/src/com/sun/faces/renderkit/html_basic/MenuRenderer.java
20 Apr 2005 04:28:16 -0000
@@ -537,12 +537,28 @@
Object submittedValues[] = getSubmittedSelectedValues(context,
component);
boolean isSelected;
+
+ Class type = String.class;
+ Object valuesArray = null;
+ Object itemValue = null;
if (submittedValues != null) {
- isSelected = isSelected(valueString, submittedValues);
+ valuesArray = submittedValues;
+ itemValue = valueString;
} else {
- Object selectedValues = getCurrentSelectedValues(context,
- component);
- isSelected = isSelected(curItem.getValue(), selectedValues);
+ valuesArray = getCurrentSelectedValues(context, component);
+ itemValue = curItem.getValue();
+ }
+ if (valuesArray != null) {
+ type = valuesArray.getClass().getComponentType();
+ }
+
+ Object newValue = context.getApplication().getExpressionFactory().
+ coerceToType(itemValue, type);
+
+ if (newValue != null) {
+ isSelected = isSelected(newValue, valuesArray);
+ } else {
+ isSelected = false;
}
if (isSelected) {
Index:
jsf-ri/src/com/sun/faces/renderkit/html_basic/SelectManyCheckboxListRenderer.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-ri/src/com/sun/faces/renderkit/html_basic/SelectManyCheckboxListRenderer.java,v
retrieving revision 1.3
diff -u -r1.3 SelectManyCheckboxListRenderer.java
---
jsf-ri/src/com/sun/faces/renderkit/html_basic/SelectManyCheckboxListRenderer.java
15 Nov 2004 20:01:06 -0000 1.3
+++
jsf-ri/src/com/sun/faces/renderkit/html_basic/SelectManyCheckboxListRenderer.java
20 Apr 2005 04:28:16 -0000
@@ -205,16 +205,29 @@
curItem.getValue());
writer.writeAttribute("value", valueString, "value");
writer.writeAttribute("type", "checkbox", null);
- boolean isSelected;
+
Object submittedValues[] = getSubmittedSelectedValues(context,
component);
+ boolean isSelected;
+
+ Class type = String.class;
+ Object valuesArray = null;
+ Object itemValue = null;
if (submittedValues != null) {
- isSelected = isSelected(valueString, submittedValues);
+ valuesArray = submittedValues;
+ itemValue = valueString;
} else {
- Object selectedValues = getCurrentSelectedValues(context,
- component);
- isSelected = isSelected(curItem.getValue(), selectedValues);
+ valuesArray = getCurrentSelectedValues(context, component);
+ itemValue = curItem.getValue();
}
+ if (valuesArray != null) {
+ type = valuesArray.getClass().getComponentType();
+ }
+
+ Object newValue = context.getApplication().getExpressionFactory().
+ coerceToType(itemValue, type);
+
+ isSelected = isSelected(newValue, valuesArray);
if (isSelected) {
writer.writeAttribute(getSelectedTextString(),
Boolean.TRUE, null);
Index:
jsf-ri/systest/src/com/sun/faces/jsptest/SelectComponentValueTestCase.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-ri/systest/src/com/sun/faces/jsptest/SelectComponentValueTestCase.java,v
retrieving revision 1.3
diff -u -r1.3 SelectComponentValueTestCase.java
---
jsf-ri/systest/src/com/sun/faces/jsptest/SelectComponentValueTestCase.java
15 Nov 2004 20:01:18 -0000 1.3
+++
jsf-ri/systest/src/com/sun/faces/jsptest/SelectComponentValueTestCase.java
20 Apr 2005 04:28:16 -0000
@@ -189,6 +189,41 @@
assertTrue(-1 == page.asText().indexOf(message));
}
+ public void testSelectOneTypeInt() throws Exception {
+ HtmlPage page = getPage("/faces/jsp/selectOneTypeInt.jsp");
+ List list = getAllElementsOfGivenClass(page, null,
+ HtmlSubmitInput.class);
+ HtmlSubmitInput button = (HtmlSubmitInput) list.get(0);
+ list = getAllElementsOfGivenClass(page, null, HtmlSelect.class);
+ HtmlSelect options = (HtmlSelect) list.get(0);
+
+ String chosen = "2";
+ options.fakeSelectedAttribute(chosen);
+ page = (HtmlPage) button.click();
+ ResourceBundle messages = ResourceBundle.getBundle(
+ "javax.faces.Messages");
+ String message =
messages.getString("javax.faces.component.UISelectMany.INVALID");
+ // it does not have a validation message
+ assertTrue(-1 == page.asText().indexOf("Validation Error"));
+ }
+
+ public void testSelectManyTypeInts() throws Exception {
+ HtmlPage page = getPage("/faces/jsp/selectManyTypeInts.jsp");
+ List list = getAllElementsOfGivenClass(page, null,
+ HtmlSubmitInput.class);
+ HtmlSubmitInput button = (HtmlSubmitInput) list.get(0);
+ list = getAllElementsOfGivenClass(page, null, HtmlSelect.class);
+ HtmlSelect options = (HtmlSelect) list.get(0);
+
+ String chosen [] = {"2", "3"};
+ options.fakeSelectedAttribute(chosen);
+ page = (HtmlPage) button.click();
+ ResourceBundle messages = ResourceBundle.getBundle(
+ "javax.faces.Messages");
+ String message =
messages.getString("javax.faces.component.UISelectMany.INVALID");
+ // it does not have a validation message
+ assertTrue(-1 == page.asText().indexOf("Validation Error"));
+ }
Index: jsf-ri/systest/src/com/sun/faces/systest/model/TestBean.java
===================================================================
RCS file:
/cvs/webtier-alignment/prototype/jsf-ri/systest/src/com/sun/faces/systest/model/TestBean.java,v
retrieving revision 1.3
diff -u -r1.3 TestBean.java
--- jsf-ri/systest/src/com/sun/faces/systest/model/TestBean.java
15 Nov 2004 20:01:25 -0000 1.3
+++ jsf-ri/systest/src/com/sun/faces/systest/model/TestBean.java
20 Apr 2005 04:28:16 -0000
@@ -116,6 +116,15 @@
this.intProperty = intProperty;
}
+ private int[] intsProperty = {5, 6, 7};
+
+ public int[] getIntsProperty() {
+ return (this.intsProperty);
+ }
+
+ public void setIntsProperty(int[] intsProperty) {
+ this.intsProperty = intsProperty;
+ }
private long longProperty = 12345;
SECTION: New Files
----------------------------
SEE ATTACHMENTS