You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/10/07 19:20:21 UTC
svn commit: r1180112 - in
/myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit:
RendererUtils.java html/HtmlRadioRendererBase.java
Author: lu4242
Date: Fri Oct 7 17:20:21 2011
New Revision: 1180112
URL: http://svn.apache.org/viewvc?rev=1180112&view=rev
Log:
MYFACES-3304 NullPointerException using h:selectOneRadio with an enum
Modified:
myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
Modified: myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java?rev=1180112&r1=1180111&r2=1180112&view=diff
==============================================================================
--- myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java (original)
+++ myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/RendererUtils.java Fri Oct 7 17:20:21 2011
@@ -339,6 +339,101 @@ public final class RendererUtils
throw ex;
}
}
+
+ public static String getStringFromSubmittedValueOrLocalValueReturnNull(FacesContext facesContext,
+ UIComponent component)
+ {
+ try
+ {
+ if (!(component instanceof ValueHolder))
+ {
+ throw new IllegalArgumentException("Component : "
+ + getPathToComponent(component)
+ + "is not a ValueHolder");
+ }
+
+ if (component instanceof EditableValueHolder)
+ {
+ Object submittedValue = ((EditableValueHolder) component)
+ .getSubmittedValue();
+ if (submittedValue != null)
+ {
+ if (log.isLoggable(Level.FINE))
+ log.fine("returning 1 '" + submittedValue + "'");
+ return submittedValue.toString();
+ }
+ }
+
+ Object value;
+
+ if (component instanceof EditableValueHolder)
+ {
+
+ EditableValueHolder holder = (EditableValueHolder) component;
+
+ if (holder.isLocalValueSet())
+ {
+ value = holder.getLocalValue();
+ }
+ else
+ {
+ value = getValue(component);
+ }
+ }
+ else
+ {
+ value = getValue(component);
+ }
+
+ Converter converter = ((ValueHolder) component).getConverter();
+ if (converter == null && value != null)
+ {
+
+ try
+ {
+ converter = facesContext.getApplication().createConverter(
+ value.getClass());
+ if (log.isLoggable(Level.FINE))
+ log.fine("the created converter is " + converter);
+ }
+ catch (FacesException e)
+ {
+ log.log(Level.SEVERE, "No converter for class "
+ + value.getClass().getName()
+ + " found (component id=" + component.getId()
+ + ").", e);
+ // converter stays null
+ }
+ }
+
+ if (converter == null)
+ {
+ if (value == null)
+ {
+ //if (log.isLoggable(Level.FINE))
+ // log.fine("returning an empty string");
+ return null;
+ }
+
+ if (log.isLoggable(Level.FINE))
+ log.fine("returning an .toString");
+ return value.toString();
+
+ }
+
+ if (log.isLoggable(Level.FINE))
+ log.fine("returning converter get as string " + converter);
+ return converter.getAsString(facesContext, component, value);
+
+ }
+ catch (PropertyNotFoundException ex)
+ {
+ log.log(Level.SEVERE, "Property not found - called by component : "
+ + getPathToComponent(component), ex);
+
+ throw ex;
+ }
+ }
private static Object getValue(UIComponent component) {
Object value;
Modified: myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java?rev=1180112&r1=1180111&r2=1180112&view=diff
==============================================================================
--- myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java (original)
+++ myfaces/core/branches/2.0.x/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlRadioRendererBase.java Fri Oct 7 17:20:21 2011
@@ -115,7 +115,7 @@ public class HtmlRadioRendererBase
List selectItemList = org.apache.myfaces.shared.renderkit.RendererUtils.getSelectItemList(selectOne, facesContext);
converter = HtmlRendererUtils.findUIOutputConverterFailSafe(facesContext, selectOne);
- Object currentValue = org.apache.myfaces.shared.renderkit.RendererUtils.getStringValue(facesContext, selectOne);
+ Object currentValue = org.apache.myfaces.shared.renderkit.RendererUtils.getStringFromSubmittedValueOrLocalValueReturnNull(facesContext, selectOne);
int itemNum = 0;
@@ -218,7 +218,11 @@ public class HtmlRadioRendererBase
else
{
String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectOne, converter, selectItem.getValue());
- boolean itemChecked = itemStrValue.equals(currentValue);
+ boolean itemChecked = (itemStrValue == null) ?
+ itemStrValue == currentValue :
+ "".equals(itemStrValue) ?
+ (currentValue == null || itemStrValue.equals(currentValue)) :
+ itemStrValue.equals(currentValue);
// IF the hideNoSelectionOption attribute of the component is true
// AND this selectItem is the "no selection option"
@@ -312,6 +316,10 @@ public class HtmlRadioRendererBase
{
writer.writeAttribute(HTML.VALUE_ATTR, value, null);
}
+ else
+ {
+ writer.writeAttribute(HTML.VALUE_ATTR, "", null);
+ }
Map<String, List<ClientBehavior>> behaviors = null;
if (uiComponent instanceof ClientBehaviorHolder && JavascriptUtils.isJavascriptAllowed(facesContext.getExternalContext()))