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
/**