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 2008/06/16 17:51:17 UTC

svn commit: r668206 - /myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java

Author: lu4242
Date: Mon Jun 16 08:51:16 2008
New Revision: 668206

URL: http://svn.apache.org/viewvc?rev=668206&view=rev
Log:
TOMAHAWK-1219 validateEquals compares the wrong values

Modified:
    myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java

Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java?rev=668206&r1=668205&r2=668206&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java Mon Jun 16 08:51:16 2008
@@ -19,10 +19,17 @@
 package org.apache.myfaces.custom.equalvalidator;
 
 import javax.faces.FacesException;
+import javax.faces.FactoryFinder;
 import javax.faces.application.FacesMessage;
 import javax.faces.component.EditableValueHolder;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+import javax.faces.el.ValueBinding;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
+import javax.faces.render.Renderer;
 import javax.faces.validator.ValidatorException;
 
 import org.apache.myfaces.validator.ValidatorBase;
@@ -86,10 +93,42 @@
         if (foreignEditableValueHolder.isRequired() && foreignEditableValueHolder.getValue()== null ) {
             return;
         }
+        
+        Object foreignValue;
+        if (foreignEditableValueHolder.isValid())
+        {
+            foreignValue = foreignEditableValueHolder.getValue();
+        }
+        else
+        {
+            try 
+            {
+                foreignValue = getConvertedValueNonValid(facesContext, foreignComp);
+            }
+            catch(ConverterException e)
+            {
+                /*
+                 * If the value cannot be converted this should return,
+                 * because does not have sense compare one
+                 * foreign invalid value with other value.
+                 * this force end the validation but do not continue
+                 * with the next phases, because the converter
+                 * of the foreign component fails and show a validation error.
+                 */
+                return;
+            }
+        }
+
+        // Don't perform validation if the foreign value is null
+        if (null == foreignValue)
+        {
+            return;
+        }
+        
 
-		Object[] args = {value.toString(),(foreignEditableValueHolder.getValue()==null) ? foreignComp.getId():foreignEditableValueHolder.getValue().toString()};
+		Object[] args = {value.toString(),(foreignValue==null) ? foreignComp.getId():foreignValue.toString()};
 
-		if(foreignEditableValueHolder.getValue()==null || !foreignEditableValueHolder.getValue().toString().equals(value.toString())  )
+		if(foreignEditableValueHolder.getValue()==null || !foreignValue.toString().equals(value.toString())  )
         {
             throw new ValidatorException(getFacesMessage(EQUAL_MESSAGE_ID, args));
         }
@@ -109,6 +148,88 @@
         super.restoreState(context, values[0]);
         _for = (String)values[1];
     }
+    
+    // ---------------- Borrowed to convert foreign submitted values
+
+    protected Renderer getRenderer(FacesContext context, UIComponent foreignComponent)
+    {
+        if (context == null) throw new NullPointerException("context");
+        String rendererType = foreignComponent.getRendererType();
+        if (rendererType == null) return null;
+        String renderKitId = context.getViewRoot().getRenderKitId();
+        RenderKitFactory rkf = (RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+        RenderKit renderKit = rkf.getRenderKit(context, renderKitId);
+        Renderer renderer = renderKit.getRenderer(foreignComponent.getFamily(), rendererType);
+        if (renderer == null)
+        {
+            getFacesContext().getExternalContext().log("No Renderer found for component " + foreignComponent + " (component-family=" + foreignComponent.getFamily() + ", renderer-type=" + rendererType + ")");
+        }
+        return renderer;
+    }
+
+    protected Converter findUIOutputConverter(FacesContext facesContext, UIComponent component)
+    {
+        Converter converter = ((EditableValueHolder)component).getConverter();
+        if (converter != null) return converter;
+
+        //Try to find out by value binding
+        ValueBinding vb = component.getValueBinding("value");
+        if (vb == null) return null;
+
+        Class valueType = vb.getType(facesContext);
+        if (valueType == null) return null;
+
+        if (String.class.equals(valueType)) return null;    //No converter needed for String type
+        if (Object.class.equals(valueType)) return null;    //There is no converter for Object class
+
+        try
+        {
+            return facesContext.getApplication().createConverter(valueType);
+        }
+        catch (FacesException e)
+        {
+            getFacesContext().getExternalContext().log("No Converter for type " + valueType.getName() + " found", e);
+            return null;
+        }
+    }
+
+
+    // --------------------- borrowed and modified from UIInput ------------
+
+    protected Object getConvertedValueNonValid(FacesContext facesContext, UIComponent component)
+        throws ConverterException
+    {
+        Object componentValueObject;
+        Object submittedValue = ((EditableValueHolder) component).getSubmittedValue();
+        if (submittedValue == null)
+        {
+            componentValueObject = null;
+        }
+        else
+        {
+            Renderer renderer = getRenderer(facesContext, component);
+            if (renderer != null)
+            {
+                componentValueObject = renderer.getConvertedValue(facesContext, component, submittedValue);
+            }
+            else if (submittedValue instanceof String)
+            {
+                Converter converter = findUIOutputConverter(facesContext, component);
+                if (converter != null)
+                {
+                    componentValueObject = converter.getAsObject(facesContext, component, (String)submittedValue);
+                }
+                else
+                {
+                    componentValueObject = submittedValue;
+                }
+            }else{
+                componentValueObject = submittedValue;
+            }
+        }
+        return componentValueObject;
+    }
+        
 	// -------------------------------------------------------- GETTER & SETTER
 
 	/**