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()))