Author: alexsmirnov
Date: 2010-10-04 20:23:10 -0400 (Mon, 04 Oct 2010)
New Revision: 19442
Added:
branches/RF-8742/ui/validator/.checkstyle
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidatorState.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ClonedObjectResolver.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ObjectValidator.java
Removed:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ObjectValidator.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/ClonedObjectResolver.java
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorEvent.java
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorListener.java
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ClientScript.java
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidator.java
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/NullValueValidator.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/application/ValidatorModule.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidator.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/FacesBeanValidator.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/NullValidator.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIAjaxValidator.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIBeanValidator.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIGraphValidator.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIRichMessages.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/behavior/ClientValidatorBehavior.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/component/behavior/ClientValidatorBehaviorTest.java
Log:
CODING IN PROGRESS - issue RF-9219: CSV: development tests for server side(junit)
https://jira.jboss.org/browse/RF-9219
Added: branches/RF-8742/ui/validator/.checkstyle
===================================================================
--- branches/RF-8742/ui/validator/.checkstyle (rev 0)
+++ branches/RF-8742/ui/validator/.checkstyle 2010-10-05 00:23:10 UTC (rev 19442)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fileset-config file-format-version="1.2.0" simple-config="false"
sync-formatter="false">
+ <fileset name="all" enabled="true"
check-config-name="RichFaces" local="false">
+ <file-match-pattern match-pattern="."
include-pattern="true"/>
+ </fileset>
+ <filter name="NonSrcDirs" enabled="true"/>
+</fileset-config>
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorEvent.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorEvent.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorEvent.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -27,42 +27,45 @@
import javax.faces.event.FacesEvent;
import javax.faces.event.FacesListener;
-
/**
* @author asmirnov
- *
+ *
*/
public class ValidatorEvent extends FacesEvent {
- /**
+ /**
*
*/
- private static final long serialVersionUID = 5593837134704144777L;
+ private static final long serialVersionUID = 5593837134704144777L;
- public ValidatorEvent(UIComponent component) {
- super(component);
- // TODO Auto-generated constructor stub
- }
+ public ValidatorEvent(UIComponent component) {
+ super(component);
+ // TODO Auto-generated constructor stub
+ }
- /* (non-Javadoc)
- * @see
javax.faces.event.FacesEvent#isAppropriateListener(javax.faces.event.FacesListener)
- */
- @Override
- public boolean isAppropriateListener(FacesListener listener) {
- // TODO Auto-generated method stub
- return listener instanceof ValidatorListener;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see
javax.faces.event.FacesEvent#isAppropriateListener(javax.faces.event.FacesListener)
+ */
+ @Override
+ public boolean isAppropriateListener(FacesListener listener) {
+ // TODO Auto-generated method stub
+ return listener instanceof ValidatorListener;
+ }
- /* (non-Javadoc)
- * @see javax.faces.event.FacesEvent#processListener(javax.faces.event.FacesListener)
- */
- @Override
- public void processListener(FacesListener listener) {
- if (listener instanceof ValidatorListener) {
- ValidatorListener validationListener = (ValidatorListener) listener;
- validationListener.processValidation(this);
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see
javax.faces.event.FacesEvent#processListener(javax.faces.event.FacesListener)
+ */
+ @Override
+ public void processListener(FacesListener listener) {
+ if (listener instanceof ValidatorListener) {
+ ValidatorListener validationListener = (ValidatorListener) listener;
+ validationListener.processValidation(this);
+ }
- }
+ }
}
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorListener.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorListener.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/event/ValidatorListener.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -22,13 +22,12 @@
import javax.faces.event.FacesListener;
-
/**
* @author asmirnov
- *
+ *
*/
public interface ValidatorListener extends FacesListener {
-
- public void processValidation(ValidatorEvent event);
+ public void processValidation(ValidatorEvent event);
+
}
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ClientScript.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ClientScript.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ClientScript.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -24,16 +24,19 @@
package org.richfaces.validator;
/**
- * <p class="changed_added_4_0">This class contains information about
JavaScript associated with JSF object ( converter or validator )</p>
+ * <p class="changed_added_4_0">
+ * This class contains information about JavaScript associated with JSF object (
converter or validator )
+ * </p>
+ *
* @author asmirnov(a)exadel.com
- *
+ *
*/
public interface ClientScript {
String getLibrary();
-
+
String getResourceName();
-
+
String getFunctionName();
-
+
}
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidator.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -8,18 +8,17 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
/**
- * This interface should be implemented by the JSF {@link Validator} which able to
- * validate entire graph.
+ * This interface should be implemented by the JSF {@link Validator} which able to
validate entire graph.
+ *
* @author asmirnov
- *
+ *
*/
public interface GraphValidator {
-
- public Collection<String> validateGraph(FacesContext context, UIComponent
component, Object value,
- Set<String> profiles) throws ValidatorException ;
+ public Collection<String> validateGraph(FacesContext context, UIComponent
component, Object value,
+ Set<String> profiles) throws ValidatorException;
+
}
Added:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidatorState.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidatorState.java
(rev 0)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidatorState.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -0,0 +1,85 @@
+package org.richfaces.validator;
+
+
+public final class GraphValidatorState {
+ public static final String STATE_ATTRIBUTE_PREFIX =
"org.richfaces.GraphValidator:";
+ boolean active = false;
+ Object cloned;
+ Object base;
+ Object property;
+ /**
+ * @return the active
+ */
+ public boolean isActive() {
+ return active;
+ }
+
+ /**
+ * @param active
+ * the active to set
+ */
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ /**
+ * @return the cloned
+ */
+ public Object getCloned() {
+ return cloned;
+ }
+
+ /**
+ * @param cloned
+ * the cloned to set
+ */
+ public void setCloned(Object cloned) {
+ this.cloned = cloned;
+ }
+
+ /**
+ * @return the base
+ */
+ public Object getBase() {
+ return base;
+ }
+
+ /**
+ * @param base
+ * the base to set
+ */
+ public void setBase(Object base) {
+ this.base = base;
+ }
+
+ /**
+ * @return the property
+ */
+ public Object getProperty() {
+ return property;
+ }
+
+ /**
+ * @param property
+ * the property to set
+ */
+ public void setProperty(Object property) {
+ this.property = property;
+ }
+
+ public boolean isSameBase(Object base) {
+ return (null == base && null == this.base) || (base == this.base);
+ }
+
+ public boolean isSameProperty(Object property) {
+ if (null == this.property) {
+ return null == property;
+ } else {
+ return this.property.equals(property);
+ }
+ }
+
+ public boolean isSame(Object base, Object property) {
+ return isSameBase(base) && isSameProperty(property) && active;
+ }
+}
\ No newline at end of file
Property changes on:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/GraphValidatorState.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/NullValueValidator.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/NullValueValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/NullValueValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -7,8 +7,9 @@
/**
* Marker interface for validators that allows null-values to validate.
+ *
* @author asmirnov
- *
+ *
*/
public interface NullValueValidator extends Validator {
Deleted:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ObjectValidator.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ObjectValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ObjectValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -1,443 +0,0 @@
-package org.richfaces.validator;
-
-import java.beans.FeatureDescriptor;
-import java.util.Collection;
-import java.util.EmptyStackException;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.Stack;
-
-import javax.el.ELContext;
-import javax.el.ELException;
-import javax.el.ELResolver;
-import javax.el.ValueExpression;
-import javax.faces.FacesException;
-import javax.faces.application.Application;
-import javax.faces.context.FacesContext;
-
-import org.richfaces.application.ServiceTracker;
-import org.richfaces.component.ClonedObjectResolver;
-import org.richfaces.el.ELContextWrapper;
-
-public abstract class ObjectValidator {
-
- private static final String RESOURCE_BUNDLE_IS_NOT_REGISTERED_FOR_CURRENT_LOCALE =
"Resource bundle is not registered for current locale";
-
- private static final String FACES_CONTEXT_IS_NULL = "Faces context is null";
- protected static final String INPUT_PARAMETERS_IS_NOT_CORRECT = "Input parameters
is not correct.";
- private static final String LOCALE_IS_NOT_SET = "Locale is not set";
- private static final String VIEW_ROOT_IS_NOT_INITIALIZED = "ViewRoot is not
initialized";
-
-
- protected final ObjectValidator parent;
-
-
- ObjectValidator() {
- this.parent = null;
- }
-
- ObjectValidator(ObjectValidator parent){
- this.parent = parent;
- }
- /**
- * Return BeanValidator object from a ServletContext attribute. Create new
- * instance if none is defined.
- *
- * @param context
- * @return
- */
- public static ObjectValidator getInstance(FacesContext context) {
- return ServiceTracker.getService(context, ObjectValidator.class);
- }
-
- public abstract Collection<String> validateGraph(FacesContext context, Object
value,
- Set<String> profiles);
-
- /**
- * Perform Validation for a new value.
- *
- * @param context
- * current faces context.
- * @param target
- * {@link ValueExpression} for a value assignment.
- * @param value
- * new value for validation
- * @param profiles TODO
- * @return null if no validation errors. Array of the validation messages
- * otherwise.
- * @throws FacesException
- * if locale or context not properly initialized
- */
- public Collection<String> validate(FacesContext context, ValueExpression target,
- Object value, Set<String> profiles) {
- if (null == context) {
- throw new FacesException(INPUT_PARAMETERS_IS_NOT_CORRECT);
- }
- Collection<String> validationMessages = null;
- if (null != target) {
- ELContext elContext = context.getELContext();
- ValidationResolver validationResolver = createValidationResolver(
- context, elContext.getELResolver(),profiles);
- ELContextWrapper wrappedElContext = new ELContextWrapper(elContext,
- validationResolver);
- try {
- target.setValue(wrappedElContext, value);
- } catch (ELException e) {
- throw new FacesException(e);
- }
- if (!validationResolver.isValid()) {
- validationMessages = validationResolver.getValidationMessages();
- }
- if(null != parent){
- Collection<String> parentMessages = parent.validate(context, target, value,
profiles);
- if (null != validationMessages) {
- if (null != parentMessages) {
- validationMessages.addAll(parentMessages);
- }
- } else {
- validationMessages = parentMessages;
- }
- }
-
- }
- return validationMessages;
- }
-
- /**
- * Validate bean property for a new value.
- * @param facesContext TODO
- * @param base
- * - bean
- * @param property
- * - bean property name.
- * @param value
- * new value.
- * @param profiles TODO
- *
- * @return null for a valid value, array of the validation messages
- * othervise.
- */
- protected abstract Collection<String> validate(FacesContext facesContext, Object
base,
- String property, Object value, Set<String> profiles);
-
- static Locale calculateLocale(FacesContext context) {
- if (null == context.getViewRoot()) {
- throw new FacesException(VIEW_ROOT_IS_NOT_INITIALIZED);
- } else if (null == context.getViewRoot().getLocale()) {
- throw new FacesException(LOCALE_IS_NOT_SET);
- }
- Locale locale = context.getViewRoot().getLocale();
- return locale;
- }
-
- static ResourceBundle getResourceBundle(FacesContext facesContext, String name) {
- ResourceBundle bundle = null;
- if (null != facesContext) {
- Application application = facesContext.getApplication();
- try {
- bundle = application.getResourceBundle(facesContext,
- name);
-
- } catch (Exception e) {
- // Let one more attempt to load resource
- }
- }
- if (null == bundle) {
- ClassLoader classLoader = Thread.currentThread()
- .getContextClassLoader();
- if (null == classLoader) {
- classLoader = ObjectValidator.class.getClassLoader();
- }
- try {
- bundle = ResourceBundle.getBundle(name, calculateLocale(facesContext),
- classLoader);
-
- } catch (MissingResourceException e) {
- // Do nothing, use default bundle.
- }
- }
- return bundle;
- }
-
- protected ValidationResolver createValidationResolver(FacesContext context,
- ELResolver parent, Set<String> profiles) {
- return new ValidationResolver(parent, context, profiles);
- }
-
- /**
- * @author asmirnov
- *
- */
- protected static class BasePropertyPair {
- private final Object base;
- private final Object property;
-
- /**
- * @param base
- * @param property
- */
- public BasePropertyPair(Object base, Object property) {
- this.base = base;
- this.property = property;
- }
-
- /**
- * @return the base
- */
- public Object getBase() {
- return base;
- }
-
- /**
- * @return the property
- */
- public Object getProperty() {
- return property;
- }
-
- }
-
- /**
- * Class for identify validator instance by locale
- *
- * @author amarkhel
- *
- */
- protected static class ValidatorKey {
- private final Class<? extends Object> validatableClass;
- private final Locale locale;
-
- /**
- * Constructor for ValidatorKey object
- *
- * @param validatableClass
- * - class to validate
- * @param locale
- * - User locale to determine Resource bundle, used during
- * validation process
- */
- public ValidatorKey(Class<? extends Object> validatableClass,
- Locale locale) {
- this.validatableClass = validatableClass;
- this.locale = locale;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result
- + ((locale == null) ? 0 : locale.hashCode());
- result = prime
- * result
- + ((validatableClass == null) ? 0 : validatableClass
- .hashCode());
- return result;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (!(obj instanceof ValidatorKey))
- return false;
- ValidatorKey other = (ValidatorKey) obj;
- if (locale == null) {
- if (other.locale != null)
- return false;
- } else if (!locale.equals(other.locale))
- return false;
- if (validatableClass == null) {
- if (other.validatableClass != null)
- return false;
- } else if (!validatableClass.equals(other.validatableClass))
- return false;
- return true;
- }
-
- }
-
- /**
- * Wrapper class for a {@link ELResolver}. For a setValue method, perform
- * validation instead of real assignment.
- *
- * @author asmirnov
- *
- */
- final class ValidationResolver extends ELResolver {
-
- /**
- * Original resolver.
- */
- private final ELResolver parent;
-
- private boolean valid = true;
-
- private Collection<String> validationMessages = null;
-
- private Stack<BasePropertyPair> valuesStack;
-
- private Set<String> profiles;
-
- private FacesContext facesContext;
-
- private boolean clonedObject = false;
-
- /**
- * @param parent
- * @param context
- */
- public ValidationResolver(ELResolver parent, FacesContext context, Set<String>
profiles) {
- this.parent = parent;
- this.valuesStack = new Stack<BasePropertyPair>();
- this.profiles = profiles;
- this.facesContext = context;
- }
-
- public boolean isValid() {
- return valid;
- }
-
- /**
- * @param context
- * @param base
- * @return
- * @see javax.el.ELResolver#getCommonPropertyType(javax.el.ELContext,
- * java.lang.Object)
- */
- public Class<?> getCommonPropertyType(ELContext context, Object base) {
- return parent.getCommonPropertyType(context, base);
- }
-
- /**
- * @param context
- * @param base
- * @return
- * @see javax.el.ELResolver#getFeatureDescriptors(javax.el.ELContext,
- * java.lang.Object)
- */
- public Iterator<FeatureDescriptor> getFeatureDescriptors(
- ELContext context, Object base) {
- return parent.getFeatureDescriptors(context, base);
- }
-
- /**
- * @param context
- * @param base
- * @param property
- * @return
- * @see javax.el.ELResolver#getType(javax.el.ELContext,
- * java.lang.Object, java.lang.Object)
- */
- public Class<?> getType(ELContext context, Object base, Object property) {
- return parent.getType(context, base, property);
- }
-
- /**
- * @param context
- * @param base
- * @param property
- * @return
- * @see javax.el.ELResolver#getValue(javax.el.ELContext,
- * java.lang.Object, java.lang.Object)
- */
- public Object getValue(ELContext context, Object base, Object property) {
- Object value = ClonedObjectResolver.resolveCloned(context, base, property);
- if(null != value){
- this.clonedObject =true;
- context.setPropertyResolved(true);
- } else {
- value = parent.getValue(context, base, property);
- }
- valuesStack.push(new BasePropertyPair(base, property));
- return value;
- }
-
- /**
- * @param context
- * @param base
- * @param property
- * @return
- * @see javax.el.ELResolver#isReadOnly(javax.el.ELContext,
- * java.lang.Object, java.lang.Object)
- */
- public boolean isReadOnly(ELContext context, Object base,
- Object property) {
- return parent.isReadOnly(context, base, property);
- }
-
- /**
- * @param context
- * @param base
- * @param property
- * @param value
- * @see javax.el.ELResolver#setValue(javax.el.ELContext,
- * java.lang.Object, java.lang.Object, java.lang.Object)
- */
- public void setValue(ELContext context, Object base, Object property,
- Object value) {
- if (null != base && null != property) {
- // TODO - detect value object from inderect references ( e.g. data table variables
).
- if(this.clonedObject){
- parent.setValue(context, base, property, value);
- }
- context.setPropertyResolved(true);
- // For Arrays, Collection or Map use parent base and property.
- BasePropertyPair basePropertyPair = lookupBeanProperty(new BasePropertyPair(
- base, property));
- base = basePropertyPair.getBase();
- property = basePropertyPair.getProperty();
- if (null != base && null != property) {
- //
https://jira.jboss.org/jira/browse/RF-4034
- // apache el looses locale information during value
- // resolution,
- // so we use our own
- validationMessages = validate(facesContext, base,
- property.toString(), value, profiles);
- valid = null == validationMessages
- || 0 == validationMessages.size();
-
- }
- }
- }
-
- private BasePropertyPair lookupBeanProperty(BasePropertyPair pair) {
- Object base = pair.getBase();
- if (null != base
- && (base instanceof Collection || base instanceof Map || base
- .getClass().isArray())) {
- try {
- pair = lookupBeanProperty(valuesStack.pop());
- } catch (EmptyStackException e) {
- // Do nothing, this is a first item.
- }
- }
- return pair;
- }
-
- /**
- * @return the validationMessages
- */
- public Collection<String> getValidationMessages() {
- return validationMessages;
- }
-
- }
-
-}
\ No newline at end of file
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/application/ValidatorModule.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/application/ValidatorModule.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/application/ValidatorModule.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -23,24 +23,32 @@
package org.richfaces.application;
+import javax.validation.ValidationException;
+
import org.richfaces.validator.BeanValidator;
import org.richfaces.validator.NullValidator;
import org.richfaces.validator.ObjectValidator;
/**
- * <p class="changed_added_4_0">This class initializes validator-related
services</p>
+ * <p class="changed_added_4_0">
+ * This class initializes validator-related services
+ * </p>
+ *
* @author asmirnov(a)exadel.com
- *
+ *
*/
public class ValidatorModule implements Module {
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see
org.richfaces.application.Module#configure(org.richfaces.application.ServicesFactory)
*/
public void configure(ServicesFactory factory) {
factory.setInstance(ObjectValidator.class, createInstance());
}
+
/**
* Create BeanValidator instance. For a Junit tests only.
*
@@ -50,9 +58,12 @@
ObjectValidator validator = null;
try {
validator = new BeanValidator();
- } catch (Throwable e){
+ } catch (ValidationException e) {
+ // JSR-303 is available but not initialised.
+ validator = new NullValidator();
+ } catch (NoClassDefFoundError e){
// JSR-303 is not avalable.
-// log.warn("Validator implementations not found at classpath, default
NullValidator will be used.");
+ // log.warn("Validator implementations not found at classpath, default
NullValidator will be used.");
validator = new NullValidator();
}
return validator;
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidator.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -13,11 +13,9 @@
import javax.validation.ConstraintViolation;
import javax.validation.MessageInterpolator;
import javax.validation.Validation;
-import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.ValidatorContext;
import javax.validation.ValidatorFactory;
-import javax.validation.groups.Default;
/**
* @author asmirnov
@@ -25,139 +23,129 @@
*/
public class BeanValidator extends ObjectValidator {
- private static final Class[] DEFAULT_PROFILE = new Class[] {};
- private final ValidatorFactory validatorFactory;
- private ValidatorContext validatorContext;
+ private static final Class[] DEFAULT_PROFILE = new Class[] {};
+ private final ValidatorFactory validatorFactory;
+ private ValidatorContext validatorContext;
- public BeanValidator() {
- // Enforce class to load
- ValidatorFactory.class.getName();
- // Check Factory, to avoid instantiation errors
- //
https://jira.jboss.org/jira/browse/RF-7226
- validatorFactory = Validation
- .buildDefaultValidatorFactory();
- validatorContext = validatorFactory.usingContext();
- MessageInterpolator jsfMessageInterpolator = new JsfMessageInterpolator(
- validatorFactory.getMessageInterpolator());
- validatorContext.messageInterpolator(jsfMessageInterpolator);
- }
+ public BeanValidator() {
+ // Enforce class to load
+ ValidatorFactory.class.getName();
+ // Check Factory, to avoid instantiation errors
+ //
https://jira.jboss.org/jira/browse/RF-7226
+ validatorFactory = Validation.buildDefaultValidatorFactory();
+ validatorContext = validatorFactory.usingContext();
+ MessageInterpolator jsfMessageInterpolator =
+ new JsfMessageInterpolator(validatorFactory.getMessageInterpolator());
+ validatorContext.messageInterpolator(jsfMessageInterpolator);
+ }
- /*
- * (non-Javadoc)
- *
- * @see org.richfaces.validator.ObjectValidator#validate(java.lang.Object,
- * java.lang.String, java.lang.Object, java.util.Locale)
- */
- @Override
- protected Collection<String> validate(FacesContext facesContext, Object base,
String property,
- Object value, Set<String> profiles) {
- Class beanType = base.getClass();
- Set<ConstraintViolation<Object>> constrains = getValidator(facesContext)
- .validateValue(beanType, property, value, getGroups(profiles));
- return extractMessages(constrains);
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.richfaces.validator.ObjectValidator#validate(java.lang.Object,
java.lang.String, java.lang.Object,
+ * java.util.Locale)
+ */
+ @Override
+ protected Collection<String> validate(FacesContext facesContext, Object base,
String property, Object value,
+ Set<String> profiles) {
+ Class beanType = base.getClass();
+ Set<ConstraintViolation<Object>> constrains =
+ getValidator(facesContext).validateValue(beanType, property, value,
getGroups(profiles));
+ return extractMessages(constrains);
+ }
- /*
- * (non-Javadoc)
- *
- * @see
- * org.richfaces.validator.ObjectValidator#validateGraph(javax.faces.context
- * .FacesContext, java.lang.Object, java.util.Set)
- */
- @Override
- public Collection<String> validateGraph(FacesContext context, Object value,
- Set<String> profiles) {
- Class<?>[] groups = getGroups(profiles);
- Set<ConstraintViolation<Object>> violations = getValidator(
- context).validate(value, groups);
- Collection<String> messages = extractMessages(violations);
- if(null != parent){
- Collection<String> parentMessages = parent.validateGraph(context, value,
profiles);
- if (null != messages) {
- if (null != parentMessages) {
- messages.addAll(parentMessages);
- }
- } else {
- messages = parentMessages;
- }
- }
- return messages;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.richfaces.validator.ObjectValidator#validateGraph(javax.faces.context
.FacesContext, java.lang.Object,
+ * java.util.Set)
+ */
+ @Override
+ public Collection<String> validateGraph(FacesContext context, Object value,
Set<String> profiles) {
+ Class<?>[] groups = getGroups(profiles);
+ Set<ConstraintViolation<Object>> violations =
getValidator(context).validate(value, groups);
+ Collection<String> messages = extractMessages(violations);
+ if (null != parent) {
+ Collection<String> parentMessages = parent.validateGraph(context,
value, profiles);
+ if (null != messages) {
+ if (null != parentMessages) {
+ messages.addAll(parentMessages);
+ }
+ } else {
+ messages = parentMessages;
+ }
+ }
+ return messages;
+ }
- private Class<?>[] getGroups(Set<String> profiles) {
- Class<?> groups[] = null;
- if (null != profiles) {
- groups = new Class<?>[profiles.size()];
- int i = 0;
- for (String group : profiles) {
- try {
- groups[i] = Class.forName(group, false, Thread
- .currentThread().getContextClassLoader());
- } catch (ClassNotFoundException e) {
- try {
- groups[i] = Class.forName(group);
- } catch (ClassNotFoundException e1) {
- throw new FacesException(
- "Bean validation group not found " + group, e1);
- }
- }
- i++;
- }
+ private Class<?>[] getGroups(Set<String> profiles) {
+ Class<?>[] groups = null;
+ if (null != profiles) {
+ groups = new Class<?>[profiles.size()];
+ int i = 0;
+ for (String group : profiles) {
+ try {
+ groups[i] = Class.forName(group, false,
Thread.currentThread().getContextClassLoader());
+ } catch (ClassNotFoundException e) {
+ try {
+ groups[i] = Class.forName(group);
+ } catch (ClassNotFoundException e1) {
+ throw new FacesException("Bean validation group not found
" + group, e1);
+ }
+ }
+ i++;
+ }
- } else {
- groups = DEFAULT_PROFILE;
- }
- return groups;
- }
+ } else {
+ groups = DEFAULT_PROFILE;
+ }
+ return groups;
+ }
- private Collection<String>
extractMessages(Set<ConstraintViolation<Object>> violations) {
- Collection<String> messages = null;
- if (null != violations && violations.size() > 0) {
- messages = new ArrayList<String>(violations.size());
- for (ConstraintViolation<? extends Object> constraintViolation : violations) {
- messages.add(constraintViolation.getMessage());
- }
+ private Collection<String>
extractMessages(Set<ConstraintViolation<Object>> violations) {
+ Collection<String> messages = null;
+ if (null != violations && violations.size() > 0) {
+ messages = new ArrayList<String>(violations.size());
+ for (ConstraintViolation<? extends Object> constraintViolation :
violations) {
+ messages.add(constraintViolation.getMessage());
+ }
- }
- return messages;
- }
+ }
+ return messages;
+ }
- protected Validator getValidator(FacesContext facesContext) {
- Validator beanValidator = validatorContext.getValidator();
- return beanValidator;
- }
+ protected Validator getValidator(FacesContext facesContext) {
+ Validator beanValidator = validatorContext.getValidator();
+ return beanValidator;
+ }
- private static class JsfMessageInterpolator implements MessageInterpolator {
+ private static class JsfMessageInterpolator implements MessageInterpolator {
- private MessageInterpolator delegate;
+ private MessageInterpolator delegate;
- public JsfMessageInterpolator(
- MessageInterpolator delegate) {
- this.delegate = delegate;
- }
+ public JsfMessageInterpolator(MessageInterpolator delegate) {
+ this.delegate = delegate;
+ }
- public String interpolate(String messageTemplate, Context context) {
+ public String interpolate(String messageTemplate, Context context) {
- Locale locale = ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
- if (null != locale) {
- return delegate.interpolate(messageTemplate, context,
- locale);
- } else {
- return delegate.interpolate(messageTemplate, context);
- }
- }
+ Locale locale =
ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
+ if (null != locale) {
+ return delegate.interpolate(messageTemplate, context, locale);
+ } else {
+ return delegate.interpolate(messageTemplate, context);
+ }
+ }
- public String interpolate(String messageTemplate, Context context,
- Locale locale) {
- Locale faceslocale =
ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
- if (null != faceslocale) {
- return delegate.interpolate(messageTemplate, context,
- faceslocale);
- } else {
- return delegate.interpolate(messageTemplate, context, locale);
- }
- }
+ public String interpolate(String messageTemplate, Context context, Locale locale)
{
+ Locale faceslocale =
ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
+ if (null != faceslocale) {
+ return delegate.interpolate(messageTemplate, context, faceslocale);
+ } else {
+ return delegate.interpolate(messageTemplate, context, locale);
+ }
+ }
- }
+ }
}
Copied:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ClonedObjectResolver.java
(from rev 19430,
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/ClonedObjectResolver.java)
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ClonedObjectResolver.java
(rev 0)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ClonedObjectResolver.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -0,0 +1,110 @@
+/**
+ *
+ */
+package org.richfaces.validator;
+
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+import javax.faces.context.FacesContext;
+
+
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ClonedObjectResolver extends ELResolver {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#getCommonPropertyType(javax.el.ELContext,
java.lang.Object)
+ */
+ @Override
+ public Class<?> getCommonPropertyType(ELContext context, Object base) {
+ // Do nothing
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#getFeatureDescriptors(javax.el.ELContext,
java.lang.Object)
+ */
+ @Override
+ public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
Object base) {
+ // do nothing
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#getType(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ @Override
+ public Class<?> getType(ELContext context, Object base, Object property) {
+ Object cloned = resolveCloned(context, base, property);
+ if (null != cloned) {
+ context.setPropertyResolved(true);
+ return cloned.getClass();
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#getValue(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ @Override
+ public Object getValue(ELContext context, Object base, Object property) {
+ Object cloned = resolveCloned(context, base, property);
+ if (null != cloned) {
+ context.setPropertyResolved(true);
+ }
+ return cloned;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#isReadOnly(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ @Override
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELResolver#setValue(javax.el.ELContext, java.lang.Object,
java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void setValue(ELContext context, Object base, Object property, Object value)
{
+ // TODO Auto-generated method stub
+
+ }
+
+ public static Object resolveCloned(ELContext context, Object base, Object property)
{
+ if (null != base || null != property) {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ Map<String, Object> requestMap =
facesContext.getExternalContext().getRequestMap();
+ for (String key : requestMap.keySet()) {
+ if (null != key &&
key.startsWith(GraphValidatorState.STATE_ATTRIBUTE_PREFIX)) {
+ GraphValidatorState state = (GraphValidatorState)
requestMap.get(key);
+ if (state.isSame(base, property)) {
+ return state.getCloned();
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
Property changes on:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ClonedObjectResolver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/FacesBeanValidator.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/FacesBeanValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/FacesBeanValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -37,143 +37,142 @@
import javax.faces.validator.ValidatorException;
/**
- * Implementation of the JSF validator to use with Bean Validation / Hibernate
- * validator
+ * Implementation of the JSF validator to use with Bean Validation / Hibernate validator
*
* @author asmirnov
*
*/
public class FacesBeanValidator implements Serializable, Validator, GraphValidator {
- /**
+ public static final String BEAN_VALIDATOR_TYPE =
"org.richfaces.BeanValidator";
+ /**
*
*/
- private static final long serialVersionUID = -264568176252121853L;
- public static final String BEAN_VALIDATOR_TYPE =
"org.richfaces.BeanValidator";
+ private static final long serialVersionUID = -264568176252121853L;
+ private ValueExpression summaryExpression = null;
- private ValueExpression summaryExpression = null;
-
- private String summary = null;
-
- private ValueExpression profilesExpression = null;
+ private String summary = null;
- private Set<String> profiles = null;
- /**
- * @return the summary
- */
- public String getSummary() {
- String summaryString = null;
- if(null != summaryExpression){
- summaryString = (String)
summaryExpression.getValue(FacesContext.getCurrentInstance().getELContext());
- }else {
- summaryString = this.summary;
- }
- return summaryString;
- }
-
- /**
- * @param summary the summary to set
- */
- public void setSummary(ValueExpression summary) {
- this.summaryExpression = summary;
- }
+ private ValueExpression profilesExpression = null;
-
- /**
- * @param summary the summary to set
- */
- public void setSummary(String summary) {
- this.summary = summary;
- }
- /*
- * (non-Javadoc)
- *
- * @see javax.faces.validator.Validator#validate(javax.faces.context.FacesContext,
- * javax.faces.component.UIComponent, java.lang.Object)
- */
- public void validate(FacesContext context, UIComponent component,
- Object convertedValue) throws ValidatorException {
- if (component instanceof EditableValueHolder) {
- // Validate input component
- EditableValueHolder input = (EditableValueHolder) component;
- try {
- ValueExpression valueExpression = component
- .getValueExpression("value");
- if (null != valueExpression) {
- Collection<String> messages = ObjectValidator.getInstance(context)
- .validate(context, valueExpression, convertedValue, getProfiles());
- if (null != messages) {
- input.setValid(false);
- Object label = getLabel(context, component);
- Locale locale = context.getViewRoot().getLocale();
- // send all validation messages.
- for (String msg : messages) {
- //
https://jira.jboss.org/jira/browse/RF-7636 -
- // format values.
- msg = formatMessage(msg, locale, label,convertedValue); // create Summary message
?
- String summaryString = getSummary() != null ? getSummary()
- : msg;
- summaryString = formatMessage(summaryString, locale, label,convertedValue);
- context.addMessage(component.getClientId(context), new FacesMessage(
- FacesMessage.SEVERITY_ERROR, summaryString , msg));
- }
- }
- }
- } catch (ELException e) {
- throw new FacesException(e);
- }
- }
- }
+ private Set<String> profiles = null;
- static String formatMessage(String msg, Locale locale, Object... messageParams) {
- if (msg.contains("{")) {
- try {
- MessageFormat messageFormat = new MessageFormat(
- msg, locale);
- msg = messageFormat.format(messageParams);
- } catch (IllegalArgumentException e) {
- // Do nothing, use original string unchanged.
- }
- }
- return msg;
- }
+ /**
+ * @return the summary
+ */
+ public String getSummary() {
+ String summaryString = null;
+ if (null != summaryExpression) {
+ summaryString = (String)
summaryExpression.getValue(FacesContext.getCurrentInstance().getELContext());
+ } else {
+ summaryString = this.summary;
+ }
+ return summaryString;
+ }
- static Object getLabel(FacesContext context, UIComponent component) {
- Object label = component.getAttributes().get("label");
- if(null == label || 0 == label.toString().length()){
- label = component.getClientId(context);
- }
- return label;
- }
+ /**
+ * @param summary
+ * the summary to set
+ */
+ public void setSummary(ValueExpression summary) {
+ this.summaryExpression = summary;
+ }
- public Collection<String> validateGraph(FacesContext context, UIComponent
component,
- Object value, Set<String> profiles) throws ValidatorException {
- ObjectValidator beanValidator = ObjectValidator.getInstance(context);
- Collection<String> messages = beanValidator.validateGraph(context,
value,profiles);
- return messages;
- }
+ /**
+ * @param summary
+ * the summary to set
+ */
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
- /**
- * @return the profiles
- */
- public Set<String> getProfiles() {
- Set<String> profiles;
- if(null != profilesExpression){
- profiles = (Set<String>)
profilesExpression.getValue(FacesContext.getCurrentInstance().getELContext());
- }else {
- profiles = this.profiles;
- }
- return profiles;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.validator.Validator#validate(javax.faces.context.FacesContext,
+ * javax.faces.component.UIComponent, java.lang.Object)
+ */
+ public void validate(FacesContext context, UIComponent component, Object
convertedValue) throws ValidatorException {
+ if (component instanceof EditableValueHolder) {
+ // Validate input component
+ EditableValueHolder input = (EditableValueHolder) component;
+ try {
+ ValueExpression valueExpression =
component.getValueExpression("value");
+ if (null != valueExpression) {
+ Collection<String> messages =
+ ObjectValidator.getInstance(context).validate(context,
valueExpression, convertedValue,
+ getProfiles());
+ if (null != messages) {
+ input.setValid(false);
+ Object label = getLabel(context, component);
+ Locale locale = context.getViewRoot().getLocale();
+ // send all validation messages.
+ for (String msg : messages) {
+ //
https://jira.jboss.org/jira/browse/RF-7636 -
+ // format values.
+ String formattedMessage = formatMessage(msg, locale, label,
convertedValue); // create Summary message ?
+ String summaryString = getSummary() != null ? getSummary() :
formattedMessage;
+ summaryString = formatMessage(summaryString, locale, label,
convertedValue);
+ context.addMessage(component.getClientId(context), new
FacesMessage(
+ FacesMessage.SEVERITY_ERROR, summaryString,
formattedMessage));
+ }
+ }
+ }
+ } catch (ELException e) {
+ throw new FacesException(e);
+ }
+ }
+ }
- /**
- * @param profiles the profiles to set
- */
- public void setProfiles(Set<String> profiles) {
- this.profiles = profiles;
- }
-
- public void setProfiles(ValueExpression profilesExpression) {
- this.profilesExpression = profilesExpression;
- }
-}
+ static String formatMessage(String msg, Locale locale, Object... messageParams) {
+ if (msg.contains("{")) {
+ try {
+ MessageFormat messageFormat = new MessageFormat(msg, locale);
+ msg = messageFormat.format(messageParams);
+ } catch (IllegalArgumentException e) {
+ // Do nothing, use original string unchanged.
+ }
+ }
+ return msg;
+ }
+
+ static Object getLabel(FacesContext context, UIComponent component) {
+ Object label = component.getAttributes().get("label");
+ if (null == label || 0 == label.toString().length()) {
+ label = component.getClientId(context);
+ }
+ return label;
+ }
+
+ public Collection<String> validateGraph(FacesContext context, UIComponent
component, Object value,
+ Set<String> profiles) throws ValidatorException {
+ ObjectValidator beanValidator = ObjectValidator.getInstance(context);
+ Collection<String> messages = beanValidator.validateGraph(context, value,
profiles);
+ return messages;
+ }
+
+ /**
+ * @return the profiles
+ */
+ public Set<String> getProfiles() {
+ Set<String> profiles;
+ if (null != profilesExpression) {
+ profiles = (Set<String>)
profilesExpression.getValue(FacesContext.getCurrentInstance().getELContext());
+ } else {
+ profiles = this.profiles;
+ }
+ return profiles;
+ }
+
+ /**
+ * @param profiles
+ * the profiles to set
+ */
+ public void setProfiles(Set<String> profiles) {
+ this.profiles = profiles;
+ }
+
+ public void setProfiles(ValueExpression profilesExpression) {
+ this.profilesExpression = profilesExpression;
+ }
+}
\ No newline at end of file
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/NullValidator.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/NullValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/NullValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -10,28 +10,33 @@
/**
* @author asmirnov
- *
+ *
*/
public class NullValidator extends ObjectValidator {
- /* (non-Javadoc)
- * @see org.richfaces.validator.ObjectValidator#validate(java.lang.Object,
java.lang.String, java.lang.Object, java.util.Locale)
- */
- @Override
- protected Collection<String> validate(FacesContext facesContext, Object base,
String property,
- Object value, Set<String> profiles) {
- // do nothing.
- return null;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.richfaces.validator.ObjectValidator#validate(java.lang.Object,
java.lang.String, java.lang.Object,
+ * java.util.Locale)
+ */
+ @Override
+ protected Collection<String> validate(FacesContext facesContext, Object base,
String property, Object value,
+ Set<String> profiles) {
+ // do nothing.
+ return null;
+ }
- /* (non-Javadoc)
- * @see
org.richfaces.validator.ObjectValidator#validateGraph(javax.faces.context.FacesContext,
java.lang.Object, java.util.Set)
- */
- @Override
- public Collection<String> validateGraph(FacesContext context, Object value,
- Set<String> profiles) {
- // do nothing
- return null;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.richfaces.validator.ObjectValidator#validateGraph(javax.faces.context.FacesContext,
java.lang.Object,
+ * java.util.Set)
+ */
+ @Override
+ public Collection<String> validateGraph(FacesContext context, Object value,
Set<String> profiles) {
+ // do nothing
+ return null;
+ }
}
Copied:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ObjectValidator.java
(from rev 19430,
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/ObjectValidator.java)
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ObjectValidator.java
(rev 0)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ObjectValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -0,0 +1,420 @@
+package org.richfaces.validator;
+
+import java.beans.FeatureDescriptor;
+import java.util.Collection;
+import java.util.EmptyStackException;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.Stack;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ELResolver;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.application.Application;
+import javax.faces.context.FacesContext;
+
+import org.richfaces.application.ServiceTracker;
+import org.richfaces.el.ELContextWrapper;
+
+public abstract class ObjectValidator {
+
+ private static final String RESOURCE_BUNDLE_IS_NOT_REGISTERED_FOR_CURRENT_LOCALE =
+ "Resource bundle is not registered for current locale";
+
+ private static final String FACES_CONTEXT_IS_NULL = "Faces context is
null";
+ private static final String INPUT_PARAMETERS_IS_NOT_CORRECT = "Input parameters
is not correct.";
+ private static final String LOCALE_IS_NOT_SET = "Locale is not set";
+ private static final String VIEW_ROOT_IS_NOT_INITIALIZED = "ViewRoot is not
initialized";
+
+ protected final ObjectValidator parent;
+
+ ObjectValidator() {
+ this.parent = null;
+ }
+
+ ObjectValidator(ObjectValidator parent) {
+ this.parent = parent;
+ }
+
+ /**
+ * Return BeanValidator object from a ServletContext attribute. Create new instance
if none is defined.
+ *
+ * @param context
+ * @return
+ */
+ public static ObjectValidator getInstance(FacesContext context) {
+ return ServiceTracker.getService(context, ObjectValidator.class);
+ }
+
+ public abstract Collection<String> validateGraph(FacesContext context, Object
value, Set<String> profiles);
+
+ /**
+ * Perform Validation for a new value.
+ *
+ * @param context
+ * current faces context.
+ * @param target
+ * {@link ValueExpression} for a value assignment.
+ * @param value
+ * new value for validation
+ * @param profiles
+ * TODO
+ * @return null if no validation errors. Array of the validation messages otherwise.
+ * @throws FacesException
+ * if locale or context not properly initialized
+ */
+ public Collection<String> validate(FacesContext context, ValueExpression
target, Object value, Set<String> profiles) {
+ if (null == context) {
+ throw new FacesException(INPUT_PARAMETERS_IS_NOT_CORRECT);
+ }
+ Collection<String> validationMessages = null;
+ if (null != target) {
+ ELContext elContext = context.getELContext();
+ ValidationResolver validationResolver =
+ createValidationResolver(context, elContext.getELResolver(), profiles);
+ ELContextWrapper wrappedElContext = new ELContextWrapper(elContext,
validationResolver);
+ try {
+ target.setValue(wrappedElContext, value);
+ } catch (ELException e) {
+ throw new FacesException(e);
+ }
+ if (!validationResolver.isValid()) {
+ validationMessages = validationResolver.getValidationMessages();
+ }
+ if (null != parent) {
+ Collection<String> parentMessages = parent.validate(context,
target, value, profiles);
+ if (null != validationMessages) {
+ if (null != parentMessages) {
+ validationMessages.addAll(parentMessages);
+ }
+ } else {
+ validationMessages = parentMessages;
+ }
+ }
+
+ }
+ return validationMessages;
+ }
+
+ /**
+ * Validate bean property for a new value.
+ *
+ * @param facesContext
+ * TODO
+ * @param base
+ * - bean
+ * @param property
+ * - bean property name.
+ * @param value
+ * new value.
+ * @param profiles
+ * TODO
+ *
+ * @return null for a valid value, array of the validation messages othervise.
+ */
+ protected abstract Collection<String> validate(FacesContext facesContext,
Object base, String property,
+ Object value, Set<String> profiles);
+
+ static Locale calculateLocale(FacesContext context) {
+ if (null == context.getViewRoot()) {
+ throw new FacesException(VIEW_ROOT_IS_NOT_INITIALIZED);
+ } else if (null == context.getViewRoot().getLocale()) {
+ throw new FacesException(LOCALE_IS_NOT_SET);
+ }
+ Locale locale = context.getViewRoot().getLocale();
+ return locale;
+ }
+
+ static ResourceBundle getResourceBundle(FacesContext facesContext, String name) {
+ ResourceBundle bundle = null;
+ if (null != facesContext) {
+ Application application = facesContext.getApplication();
+ try {
+ bundle = application.getResourceBundle(facesContext, name);
+
+ } catch (Exception e) {
+ // Let one more attempt to load resource
+ }
+ }
+ if (null == bundle) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ if (null == classLoader) {
+ classLoader = ObjectValidator.class.getClassLoader();
+ }
+ try {
+ bundle = ResourceBundle.getBundle(name, calculateLocale(facesContext),
classLoader);
+
+ } catch (MissingResourceException e) {
+ // Do nothing, use default bundle.
+ }
+ }
+ return bundle;
+ }
+
+ protected ValidationResolver createValidationResolver(FacesContext context,
ELResolver parent, Set<String> profiles) {
+ return new ValidationResolver(parent, context, profiles);
+ }
+
+ /**
+ * @author asmirnov
+ *
+ */
+ protected static class BasePropertyPair {
+ private final Object base;
+ private final Object property;
+
+ /**
+ * @param base
+ * @param property
+ */
+ public BasePropertyPair(Object base, Object property) {
+ this.base = base;
+ this.property = property;
+ }
+
+ /**
+ * @return the base
+ */
+ public Object getBase() {
+ return base;
+ }
+
+ /**
+ * @return the property
+ */
+ public Object getProperty() {
+ return property;
+ }
+
+ }
+
+ /**
+ * Class for identify validator instance by locale
+ *
+ * @author amarkhel
+ *
+ */
+ protected static class ValidatorKey {
+ private final Class<? extends Object> validatableClass;
+ private final Locale locale;
+
+ /**
+ * Constructor for ValidatorKey object
+ *
+ * @param validatableClass
+ * - class to validate
+ * @param locale
+ * - User locale to determine Resource bundle, used during validation
process
+ */
+ public ValidatorKey(Class<? extends Object> validatableClass, Locale
locale) {
+ this.validatableClass = validatableClass;
+ this.locale = locale;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((this.locale == null) ? 0 :
this.locale.hashCode());
+ result = prime * result + ((this.validatableClass == null) ? 0 :
this.validatableClass.hashCode());
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ ValidatorKey other = (ValidatorKey) obj;
+ if (this.locale == null) {
+ if (other.locale != null) {
+ return false;
+ }
+ } else if (!this.locale.equals(other.locale)) {
+ return false;
+ }
+ if (this.validatableClass == null) {
+ if (other.validatableClass != null) {
+ return false;
+ }
+ } else if (!this.validatableClass.equals(other.validatableClass)) {
+ return false;
+ }
+ return true;
+ }
+
+
+
+ }
+
+ /**
+ * Wrapper class for a {@link ELResolver}. For a setValue method, perform validation
instead of real assignment.
+ *
+ * @author asmirnov
+ *
+ */
+ final class ValidationResolver extends ELResolver {
+
+ /**
+ * Original resolver.
+ */
+ private final ELResolver parent;
+
+ private boolean valid = true;
+
+ private Collection<String> validationMessages = null;
+
+ private Stack<BasePropertyPair> valuesStack;
+
+ private Set<String> profiles;
+
+ private FacesContext facesContext;
+
+ private boolean clonedObject = false;
+
+ /**
+ * @param parent
+ * @param context
+ */
+ public ValidationResolver(ELResolver parent, FacesContext context,
Set<String> profiles) {
+ this.parent = parent;
+ this.valuesStack = new Stack<BasePropertyPair>();
+ this.profiles = profiles;
+ this.facesContext = context;
+ }
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @return
+ * @see javax.el.ELResolver#getCommonPropertyType(javax.el.ELContext,
java.lang.Object)
+ */
+ public Class<?> getCommonPropertyType(ELContext context, Object base) {
+ return parent.getCommonPropertyType(context, base);
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @return
+ * @see javax.el.ELResolver#getFeatureDescriptors(javax.el.ELContext,
java.lang.Object)
+ */
+ public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
Object base) {
+ return parent.getFeatureDescriptors(context, base);
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @param property
+ * @return
+ * @see javax.el.ELResolver#getType(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ public Class<?> getType(ELContext context, Object base, Object property) {
+ return parent.getType(context, base, property);
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @param property
+ * @return
+ * @see javax.el.ELResolver#getValue(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ public Object getValue(ELContext context, Object base, Object property) {
+ Object value = ClonedObjectResolver.resolveCloned(context, base, property);
+ if (null != value) {
+ this.clonedObject = true;
+ context.setPropertyResolved(true);
+ } else {
+ value = parent.getValue(context, base, property);
+ }
+ valuesStack.push(new BasePropertyPair(base, property));
+ return value;
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @param property
+ * @return
+ * @see javax.el.ELResolver#isReadOnly(javax.el.ELContext, java.lang.Object,
java.lang.Object)
+ */
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ return parent.isReadOnly(context, base, property);
+ }
+
+ /**
+ * @param context
+ * @param base
+ * @param property
+ * @param value
+ * @see javax.el.ELResolver#setValue(javax.el.ELContext, java.lang.Object,
java.lang.Object, java.lang.Object)
+ */
+ public void setValue(ELContext context, Object base, Object property, Object
value) {
+ if (null != base && null != property) {
+ // TODO - detect value object from inderect references ( e.g. data table
variables ).
+ if (this.clonedObject) {
+ parent.setValue(context, base, property, value);
+ }
+ context.setPropertyResolved(true);
+ // For Arrays, Collection or Map use parent base and property.
+ BasePropertyPair basePropertyPair = lookupBeanProperty(new
BasePropertyPair(base, property));
+ base = basePropertyPair.getBase();
+ property = basePropertyPair.getProperty();
+ if (null != base && null != property) {
+ //
https://jira.jboss.org/jira/browse/RF-4034
+ // apache el looses locale information during value
+ // resolution,
+ // so we use our own
+ validationMessages = validate(facesContext, base,
property.toString(), value, profiles);
+ valid = null == validationMessages || 0 ==
validationMessages.size();
+
+ }
+ }
+ }
+
+ private BasePropertyPair lookupBeanProperty(BasePropertyPair pair) {
+ Object base = pair.getBase();
+ if (null != base && (base instanceof Collection || base instanceof
Map || base.getClass().isArray())) {
+ try {
+ pair = lookupBeanProperty(valuesStack.pop());
+ } catch (EmptyStackException e) {
+ // Do nothing, this is a first item.
+ }
+ }
+ return pair;
+ }
+
+ /**
+ * @return the validationMessages
+ */
+ public Collection<String> getValidationMessages() {
+ return validationMessages;
+ }
+
+ }
+
+}
\ No newline at end of file
Property changes on:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/ObjectValidator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/ClonedObjectResolver.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/ClonedObjectResolver.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/ClonedObjectResolver.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -1,103 +0,0 @@
-/**
- *
- */
-package org.richfaces.component;
-
-import java.beans.FeatureDescriptor;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-import javax.faces.context.FacesContext;
-
-import org.richfaces.component.UIGraphValidator.GraphValidatorState;
-
-/**
- * @author asmirnov
- *
- */
-public class ClonedObjectResolver extends ELResolver {
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#getCommonPropertyType(javax.el.ELContext, java.lang.Object)
- */
- @Override
- public Class<?> getCommonPropertyType(ELContext context, Object base) {
- // Do nothing
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#getFeatureDescriptors(javax.el.ELContext, java.lang.Object)
- */
- @Override
- public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
- Object base) {
- // do nothing
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#getType(javax.el.ELContext, java.lang.Object,
java.lang.Object)
- */
- @Override
- public Class<?> getType(ELContext context, Object base, Object property) {
- Object cloned = resolveCloned(context, base, property);
- if(null != cloned){
- context.setPropertyResolved(true);
- return cloned.getClass();
- }
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#getValue(javax.el.ELContext, java.lang.Object,
java.lang.Object)
- */
- @Override
- public Object getValue(ELContext context, Object base, Object property) {
- Object cloned = resolveCloned(context, base, property);
- if(null != cloned){
- context.setPropertyResolved(true);
- }
- return cloned;
- }
-
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#isReadOnly(javax.el.ELContext, java.lang.Object,
java.lang.Object)
- */
- @Override
- public boolean isReadOnly(ELContext context, Object base, Object property) {
- // TODO Auto-generated method stub
- return false;
- }
-
- /* (non-Javadoc)
- * @see javax.el.ELResolver#setValue(javax.el.ELContext, java.lang.Object,
java.lang.Object, java.lang.Object)
- */
- @Override
- public void setValue(ELContext context, Object base, Object property,
- Object value) {
- // TODO Auto-generated method stub
-
- }
-
- public static Object resolveCloned(ELContext context, Object base, Object property){
- if(null != base || null != property){
- FacesContext facesContext = FacesContext.getCurrentInstance();
- Map<String, Object> requestMap =
facesContext.getExternalContext().getRequestMap();
- for (String key : requestMap.keySet()) {
- if(null != key && key.startsWith(UIGraphValidator.STATE_ATTRIBUTE_PREFIX)){
- UIGraphValidator.GraphValidatorState state = (GraphValidatorState)
requestMap.get(key);
- if(state.isSame(base, property)){
- return state.getCloned();
- }
- }
- }
- }
- return null;
- }
-}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIAjaxValidator.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIAjaxValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIAjaxValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -48,161 +48,158 @@
* JSF component class
*
*/
-public abstract class UIAjaxValidator extends UIComponentBase implements
- AjaxComponent, AjaxSupport, AjaxContainer {
+public abstract class UIAjaxValidator extends UIComponentBase implements AjaxComponent,
AjaxSupport, AjaxContainer {
- public static final String COMPONENT_TYPE = "org.richfaces.AjaxValidator";
+ public static final String COMPONENT_TYPE = "org.richfaces.AjaxValidator";
- public static final String COMPONENT_FAMILY = "org.richfaces.AjaxValidator";
+ public static final String COMPONENT_FAMILY =
"org.richfaces.AjaxValidator";
- public static final String BEAN_VALIDATOR_FACET = "org.richfaces.validator.";
+ public static final String BEAN_VALIDATOR_FACET =
"org.richfaces.validator.";
- @Override
- public void setParent(UIComponent parent) {
- super.setParent(parent);
+ @Override
+ public void setParent(UIComponent parent) {
+ super.setParent(parent);
- if (null != parent && parent instanceof EditableValueHolder) {
- setParentProperties(parent);
- }
- }
+ if (null != parent && parent instanceof EditableValueHolder) {
+ setParentProperties(parent);
+ }
+ }
- /**
- * @param parent
- * @throws FacesException
- */
- public void setParentProperties(UIComponent parent) throws FacesException {
- if (!(parent instanceof EditableValueHolder)) {
- throw new FacesException(
- "Parent component must be an EditableValueHolder");
- }
+ /**
+ * @param parent
+ * @throws FacesException
+ */
+ public void setParentProperties(UIComponent parent) throws FacesException {
+ if (!(parent instanceof EditableValueHolder)) {
+ throw new FacesException("Parent component must be an
EditableValueHolder");
+ }
-// if (null != getEvent()) {
-// ValueExpression binding = new EventValueExpression(this);
-// parent.setValueExpression(getEvent(), binding);
-// }
- }
+ // if (null != getEvent()) {
+ // ValueExpression binding = new EventValueExpression(this);
+ // parent.setValueExpression(getEvent(), binding);
+ // }
+ }
- @Override
- public void broadcast(FacesEvent event) throws AbortProcessingException {
- super.broadcast(event);
- if (event.getComponent() == this) {
- FacesContext context = getFacesContext();
- if (event instanceof ValidatorEvent) {
- // ByPass UpdateModelValue
- context.renderResponse();
- }
- }
- }
+ @Override
+ public void broadcast(FacesEvent event) throws AbortProcessingException {
+ super.broadcast(event);
+ if (event.getComponent() == this) {
+ FacesContext context = getFacesContext();
+ if (event instanceof ValidatorEvent) {
+ // ByPass UpdateModelValue
+ context.renderResponse();
+ }
+ }
+ }
- @Override
- public void queueEvent(FacesEvent event) {
- if (event instanceof ValidatorEvent && event.getComponent() == this) {
- UIComponent parent = getParent();
- if (parent instanceof UIInput) {
- UIInput input = (UIInput) parent;
- if (input.isImmediate()) {
- event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
- } else {
- event.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
- }
- }
- }
- super.queueEvent(event);
- }
+ @Override
+ public void queueEvent(FacesEvent event) {
+ if (event instanceof ValidatorEvent && event.getComponent() == this) {
+ UIComponent parent = getParent();
+ if (parent instanceof UIInput) {
+ UIInput input = (UIInput) parent;
+ if (input.isImmediate()) {
+ event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+ } else {
+ event.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
+ }
+ }
+ }
+ super.queueEvent(event);
+ }
- public String getEventString() {
- StringBuffer buildOnEvent = new StringBuffer();
- String onsubmit = getOnsubmit();
- // Insert script to call before submit ajax request.
- if (null != onsubmit) {
- buildOnEvent.append(onsubmit).append(";");
- }
-// buildOnEvent.append(AjaxRendererUtils.buildOnEvent(this,
-// getFacesContext(), getEvent(), true));
- String script = buildOnEvent.toString();
- return script;
- }
+ public String getEventString() {
+ StringBuffer buildOnEvent = new StringBuffer();
+ String onsubmit = getOnsubmit();
+ // Insert script to call before submit ajax request.
+ if (null != onsubmit) {
+ buildOnEvent.append(onsubmit).append(";");
+ }
+ // buildOnEvent.append(AjaxRendererUtils.buildOnEvent(this,
+ // getFacesContext(), getEvent(), true));
+ String script = buildOnEvent.toString();
+ return script;
+ }
- public UIComponent getSingleComponent() {
- return getParent();
- }
+ public UIComponent getSingleComponent() {
+ return getParent();
+ }
- public void encodeAjax(FacesContext context) throws IOException {
- AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
- Set<String> renderedAreas = ajaxContext.getAjaxRenderedAreas();
- for (UIComponent message : getMessages(context)) {
- if (message.isRendered()) {
- message.encodeAll(context);
- renderedAreas.add(message.getClientId(context));
- }
- }
- // Write information about encoded areas after submission.
-// AjaxRendererUtils.encodeAreas(context, this);
- }
+ public void encodeAjax(FacesContext context) throws IOException {
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+ Set<String> renderedAreas = ajaxContext.getAjaxRenderedAreas();
+ for (UIComponent message : getMessages(context)) {
+ if (message.isRendered()) {
+ message.encodeAll(context);
+ renderedAreas.add(message.getClientId(context));
+ }
+ }
+ // Write information about encoded areas after submission.
+ // AjaxRendererUtils.encodeAreas(context, this);
+ }
- public Set<UIComponent> getMessages(FacesContext context) {
- Set<UIComponent> messages = new HashSet<UIComponent>();
- findMessages(this.getParent(), this, messages,false);
- findRichMessages(context, context.getViewRoot(), messages);
- return messages;
- }
+ public Set<UIComponent> getMessages(FacesContext context) {
+ Set<UIComponent> messages = new HashSet<UIComponent>();
+ findMessages(this.getParent(), this, messages, false);
+ findRichMessages(context, context.getViewRoot(), messages);
+ return messages;
+ }
-
- /**
- * Find all instances of the {@link UIRichMessages} and update list of the rendered
messages.
- * @param context
- * @param component
- * @param messages
- */
- protected void findRichMessages(FacesContext context,UIComponent component,
Set<UIComponent> messages) {
- Iterator<UIComponent> facetsAndChildren = component.getFacetsAndChildren();
- while (facetsAndChildren.hasNext()) {
- UIComponent child = (UIComponent) facetsAndChildren.next();
- if (child instanceof UIRichMessages) {
- UIRichMessages richMessage = (UIRichMessages) child;
- if(null == richMessage.getFor()){
- richMessage.updateMessages(context, this.getParent().getClientId(context));
- messages.add(richMessage);
- }
- } else {
- findRichMessages(context, child, messages);
- }
- }
- }
+ /**
+ * Find all instances of the {@link UIRichMessages} and update list of the rendered
messages.
+ *
+ * @param context
+ * @param component
+ * @param messages
+ */
+ protected void findRichMessages(FacesContext context, UIComponent component,
Set<UIComponent> messages) {
+ Iterator<UIComponent> facetsAndChildren =
component.getFacetsAndChildren();
+ while (facetsAndChildren.hasNext()) {
+ UIComponent child = (UIComponent) facetsAndChildren.next();
+ if (child instanceof UIRichMessages) {
+ UIRichMessages richMessage = (UIRichMessages) child;
+ if (null == richMessage.getFor()) {
+ richMessage.updateMessages(context,
this.getParent().getClientId(context));
+ messages.add(richMessage);
+ }
+ } else {
+ findRichMessages(context, child, messages);
+ }
+ }
+ }
- /**
- * Recursive search messages for the parent component.
- * @param parent
- * @param component
- * @param messages
- * @return
- */
- protected boolean findMessages(UIComponent parent, UIComponent component,
- Set<UIComponent> messages,boolean found) {
- Iterator<UIComponent> facetsAndChildren = parent.getFacetsAndChildren();
- while (facetsAndChildren.hasNext()) {
- UIComponent child = (UIComponent) facetsAndChildren.next();
- if (child != component) {
- if (child instanceof UIMessage || child instanceof UIMessages) {
- UIComponent message = (UIComponent) child;
- Object targetId = message.getAttributes().get("for");
- if (null != targetId
- && targetId.equals(getParent().getId())) {
- messages.add(message);
- found = true;
- }
- } else {
- found |= findMessages(child, null, messages,found);
- }
- }
- }
- if(!(found && parent instanceof NamingContainer) && component !=
null){
- UIComponent newParent = parent.getParent();
- if(null != newParent){
- found = findMessages(newParent, parent, messages,found);
- }
- }
- return found;
- }
+ /**
+ * Recursive search messages for the parent component.
+ *
+ * @param parent
+ * @param component
+ * @param messages
+ * @return
+ */
+ protected boolean findMessages(UIComponent parent, UIComponent component,
Set<UIComponent> messages, boolean found) {
+ Iterator<UIComponent> facetsAndChildren = parent.getFacetsAndChildren();
+ while (facetsAndChildren.hasNext()) {
+ UIComponent child = (UIComponent) facetsAndChildren.next();
+ if (child != component) {
+ if (child instanceof UIMessage || child instanceof UIMessages) {
+ UIComponent message = (UIComponent) child;
+ Object targetId = message.getAttributes().get("for");
+ if (null != targetId && targetId.equals(getParent().getId()))
{
+ messages.add(message);
+ found = true;
+ }
+ } else {
+ found |= findMessages(child, null, messages, found);
+ }
+ }
+ }
+ if (!(found && parent instanceof NamingContainer) && component !=
null) {
+ UIComponent newParent = parent.getParent();
+ if (null != newParent) {
+ found = findMessages(newParent, parent, messages, found);
+ }
+ }
+ return found;
+ }
}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIBeanValidator.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIBeanValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIBeanValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -5,19 +5,21 @@
/**
* Stage class to keep backward compatibility.
+ *
* @author asmirnov
* @deprecated That class has been renamed, Use {@link UIAjaxValidator} instead
- *
+ *
*/
public abstract class UIBeanValidator extends UIAjaxValidator {
- /* (non-Javadoc)
- * @see javax.faces.component.UIComponent#getFamily()
- */
- @Override
- public String getFamily() {
- return COMPONENT_FAMILY;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.component.UIComponent#getFamily()
+ */
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
-
}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIGraphValidator.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIGraphValidator.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIGraphValidator.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -33,7 +33,6 @@
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.component.EditableValueHolder;
-import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
@@ -43,316 +42,240 @@
import org.richfaces.el.util.CapturingELResolver;
import org.richfaces.validator.FacesBeanValidator;
import org.richfaces.validator.GraphValidator;
+import org.richfaces.validator.GraphValidatorState;
-
/**
* JSF component class
*
*/
public abstract class UIGraphValidator extends UIComponentBase {
- public static final String COMPONENT_TYPE = "org.richfaces.GraphValidator";
+ public static final String COMPONENT_TYPE =
"org.richfaces.GraphValidator";
- public static final String COMPONENT_FAMILY = "org.richfaces.GraphValidator";
+ public static final String COMPONENT_FAMILY =
"org.richfaces.GraphValidator";
- public static final String STATE_ATTRIBUTE_PREFIX =
COMPONENT_TYPE+NamingContainer.SEPARATOR_CHAR;
-
-
-
+ /**
+ * Get object for validation
+ *
+ * @return
+ */
+ public abstract Object getValue();
- /**
- * Get object for validation
- *
- * @return
- */
- public abstract Object getValue();
+ /**
+ * Set object for validation
+ *
+ * @param newvalue
+ */
+ public abstract void setValue(Object newvalue);
- /**
- * Set object for validation
- *
- * @param newvalue
- */
- public abstract void setValue(Object newvalue);
-
- /**
- * Get object for validation
- *
- * @return
- */
- public abstract String getSummary();
+ /**
+ * Get object for validation
+ *
+ * @return
+ */
+ public abstract String getSummary();
- /**
- * Set object for validation
- *
- * @param newvalue
- */
- public abstract void setSummary(String newvalue);
+ /**
+ * Set object for validation
+ *
+ * @param newvalue
+ */
+ public abstract void setSummary(String newvalue);
- /**
- * Get set of profiles for validation
- *
- * @return
- */
- public abstract Set<String> getProfiles();
+ /**
+ * Get set of profiles for validation
+ *
+ * @return
+ */
+ public abstract Set<String> getProfiles();
- /**
- * Set set of profiles for validation
- *
- * @param newvalue
- */
- public abstract void setProfiles(Object newvalue);
-
- /**
- * Get graph validator Id.
- * @return
- */
- public abstract String getType();
+ /**
+ * Set set of profiles for validation
+ *
+ * @param newvalue
+ */
+ public abstract void setProfiles(Object newvalue);
- /**
- * Set graph validator Id.
- * @param newvalue
- */
- public abstract void setType(String newvalue);
+ /**
+ * Get graph validator Id.
+ *
+ * @return
+ */
+ public abstract String getType();
+ /**
+ * Set graph validator Id.
+ *
+ * @param newvalue
+ */
+ public abstract void setType(String newvalue);
- @Override
- public void processDecodes(FacesContext context) {
- GraphValidatorState validatorState = null;
- // Detect value EL-expression.
- ValueExpression valueExpression = getValueExpression("value");
- if (null != valueExpression) {
+ @Override
+ public void processDecodes(FacesContext context) {
+ GraphValidatorState validatorState = null;
+ // Detect value EL-expression.
+ ValueExpression valueExpression = getValueExpression("value");
+ if (null != valueExpression) {
-
- Object value = getValue();
- if (null !=value && value instanceof Cloneable) {
- try {
- ELContext initialELContext = context.getELContext();
+ Object value = getValue();
+ if (null != value && value instanceof Cloneable) {
+ try {
+ ELContext initialELContext = context.getELContext();
- CapturingELResolver capturingELResolver = new
CapturingELResolver(initialELContext.getELResolver());
- Class<?> type = valueExpression.getType(new ELContextWrapper(initialELContext,
capturingELResolver));
- if(null != type) {
- validatorState = new GraphValidatorState();
- Method method = getCloneMethod(value.getClass());
- if(!Modifier.isPublic(method.getModifiers())){
- // Method Object#clone() is protected by default. Make it public
- // unless developer did it.
- method.setAccessible(true);
- }
- validatorState.cloned = method.invoke(value);
- validatorState.base = capturingELResolver.getBase();
- validatorState.property = capturingELResolver.getProperty();
- validatorState.active = true;
- context.getExternalContext().getRequestMap().put(getStateId(context),
validatorState);
- }
- } catch (NoSuchMethodException e) {
- // do nothing, that is really not possible.
- } catch (InvocationTargetException e) {
- throw new FacesException(e);
- } catch (IllegalArgumentException e) {
- // do nothing, that is really not possible.
- } catch (IllegalAccessException e) {
- throw new FacesException(e);
- }
- }
- }
- super.processDecodes(context);
- if(null != validatorState){
- validatorState.active = false;
- }
- }
+ CapturingELResolver capturingELResolver = new
CapturingELResolver(initialELContext.getELResolver());
+ Class<?> type =
+ valueExpression.getType(new ELContextWrapper(initialELContext,
capturingELResolver));
+ if (null != type) {
+ validatorState = new GraphValidatorState();
+ Method method = getCloneMethod(value.getClass());
+ if (!Modifier.isPublic(method.getModifiers())) {
+ // Method Object#clone() is protected by default. Make it
public
+ // unless developer did it.
+ method.setAccessible(true);
+ }
+ validatorState.setCloned(method.invoke(value));
+ validatorState.setBase(capturingELResolver.getBase());
+ validatorState.setProperty(capturingELResolver.getProperty());
+ validatorState.setActive(true);
+
context.getExternalContext().getRequestMap().put(getStateId(context), validatorState);
+ }
+ } catch (NoSuchMethodException e) {
+ // do nothing, that is really not possible.
+ } catch (InvocationTargetException e) {
+ throw new FacesException(e);
+ } catch (IllegalArgumentException e) {
+ // do nothing, that is really not possible.
+ } catch (IllegalAccessException e) {
+ throw new FacesException(e);
+ }
+ }
+ }
+ super.processDecodes(context);
+ if (null != validatorState) {
+ validatorState.setActive(false);
+ }
+ }
- private Method getCloneMethod(Class<?> clazz) throws NoSuchMethodException {
- try {
- return clazz.getDeclaredMethod("clone");
- } catch( NoSuchMethodException e){
- if(null != clazz.getSuperclass()){
- return getCloneMethod(clazz.getSuperclass());
- } else {
- throw e;
- }
- }
- }
+ private Method getCloneMethod(Class<?> clazz) throws NoSuchMethodException {
+ try {
+ return clazz.getDeclaredMethod("clone");
+ } catch (NoSuchMethodException e) {
+ if (null != clazz.getSuperclass()) {
+ return getCloneMethod(clazz.getSuperclass());
+ } else {
+ throw e;
+ }
+ }
+ }
- protected String getStateId(FacesContext context) {
- String stateId = STATE_ATTRIBUTE_PREFIX+getClientId(context);
- return stateId;
- }
-
- protected GraphValidatorState getValidatorState(FacesContext context){
- return (GraphValidatorState)
context.getExternalContext().getRequestMap().get(getStateId(context));
- }
+ protected String getStateId(FacesContext context) {
+ String stateId = GraphValidatorState.STATE_ATTRIBUTE_PREFIX +
getClientId(context);
+ return stateId;
+ }
- @Override
- public void processValidators(FacesContext context) {
- GraphValidatorState validatorState = getValidatorState(context);
- if(null != validatorState){
- validatorState.active = true;
- }
- super.processValidators(context);
- if(null != validatorState){
- validatorState.active = false;
- validateObject(context, validatorState.cloned);
- context.getExternalContext().getRequestMap().remove(getStateId(context));
- }
- }
-
- @Override
- public void processUpdates(FacesContext context) {
- super.processUpdates(context);
- Object value = getValue();
- validateObject(context, value);
- }
+ protected GraphValidatorState getValidatorState(FacesContext context) {
+ return (GraphValidatorState)
context.getExternalContext().getRequestMap().get(getStateId(context));
+ }
- private void validateObject(FacesContext context, Object value) {
- if (null != value) {
- Validator validator = context.getApplication().createValidator(getType());
- if (validator instanceof GraphValidator) {
- GraphValidator graphValidator = (GraphValidator) validator;
- Collection<String> messages = graphValidator.validateGraph(context,this,
value,getProfiles());
- if (null != messages) {
- context.renderResponse();
- // send all validation messages.
- String clientId = getClientId(context);
- for (String msg : messages) {
- // TODO - create Summary message ?
- String summary = null != getSummary() ? getSummary() + msg : msg;
- context.addMessage(clientId, new FacesMessage(
- FacesMessage.SEVERITY_ERROR, summary, msg));
- }
- }
-
- } else {
- throw new FacesException("Validator
"+FacesBeanValidator.BEAN_VALIDATOR_TYPE+" does not implement
GraphValidator");
- }
+ @Override
+ public void processValidators(FacesContext context) {
+ GraphValidatorState validatorState = getValidatorState(context);
+ if (null != validatorState) {
+ validatorState.setActive(true);
+ }
+ super.processValidators(context);
+ if (null != validatorState) {
+ validatorState.setActive(false);
+ validateObject(context, validatorState.getCloned());
+ context.getExternalContext().getRequestMap().remove(getStateId(context));
+ }
+ }
- }
- }
-
- @Override
- public void encodeBegin(FacesContext context) throws IOException {
- super.encodeBegin(context);
- FacesBeanValidator validator =
(FacesBeanValidator)context.getApplication().createValidator(getType());
- validator.setSummary(getSummary());
- ValueExpression expression = getValueExpression("profiles");
- if(null != expression){
- validator.setProfiles(expression);
- } else {
- validator.setProfiles(getProfiles());
- }
- setupValidators(this,validator);
- }
-
- @Override
- public void encodeChildren(FacesContext context) throws IOException {
- if(isRendered()){
- for (UIComponent child : getChildren()) {
- if(child.isRendered()){
- child.encodeAll(context);
- }
- }
- }
- }
-
- private void setupValidators(UIComponent component,
- Validator validator) {
- Iterator<UIComponent> facetsAndChildren = component.getFacetsAndChildren();
- while (facetsAndChildren.hasNext()) {
- UIComponent child = facetsAndChildren.next();
- if (child instanceof EditableValueHolder) {
- EditableValueHolder input = (EditableValueHolder) child;
- setupValidator(input,validator);
- }
- setupValidators(child, validator);
- }
- }
+ @Override
+ public void processUpdates(FacesContext context) {
+ super.processUpdates(context);
+ Object value = getValue();
+ validateObject(context, value);
+ }
- /**
- * @param input
- */
- private void setupValidator(EditableValueHolder input,Validator validator) {
- Validator[] validators = input.getValidators();
- for (int i = 0; i < validators.length; i++) {
- if(validators[i] instanceof FacesBeanValidator){
- return;
- }
- }
- input.addValidator(validator);
- }
+ private void validateObject(FacesContext context, Object value) {
+ if (null != value) {
+ Validator validator = context.getApplication().createValidator(getType());
+ if (validator instanceof GraphValidator) {
+ GraphValidator graphValidator = (GraphValidator) validator;
+ Collection<String> messages = graphValidator.validateGraph(context,
this, value, getProfiles());
+ if (null != messages) {
+ context.renderResponse();
+ // send all validation messages.
+ String clientId = getClientId(context);
+ for (String msg : messages) {
+ // TODO - create Summary message ?
+ String summary = null != getSummary() ? getSummary() + msg :
msg;
+ context.addMessage(clientId, new
FacesMessage(FacesMessage.SEVERITY_ERROR, summary, msg));
+ }
+ }
- @Override
- public boolean getRendersChildren() {
- return true;
- }
-
- public static final class GraphValidatorState {
- private boolean active = false;
- private Object cloned;
- private Object base;
- private Object property;
- /**
- * @return the active
- */
- public boolean isActive() {
- return active;
- }
- /**
- * @param active the active to set
- */
- public void setActive(boolean active) {
- this.active = active;
- }
- /**
- * @return the cloned
- */
- public Object getCloned() {
- return cloned;
- }
- /**
- * @param cloned the cloned to set
- */
- public void setCloned(Object cloned) {
- this.cloned = cloned;
- }
- /**
- * @return the base
- */
- public Object getBase() {
- return base;
- }
- /**
- * @param base the base to set
- */
- public void setBase(Object base) {
- this.base = base;
- }
- /**
- * @return the property
- */
- public Object getProperty() {
- return property;
- }
- /**
- * @param property the property to set
- */
- public void setProperty(Object property) {
- this.property = property;
- }
-
- public boolean isSameBase(Object base){
- return (null == base && null == this.base)||(base == this.base);
- }
-
- public boolean isSameProperty(Object property){
- if(null == this.property){
- return null == property;
- } else {
- return this.property.equals(property);
- }
- }
-
- public boolean isSame(Object base, Object property){
- return isSameBase(base)&& isSameProperty(property)&& active;
- }
- }
+ } else {
+ throw new FacesException("Validator " +
FacesBeanValidator.BEAN_VALIDATOR_TYPE
+ + " does not implement GraphValidator");
+ }
+ }
+ }
+
+ @Override
+ public void encodeBegin(FacesContext context) throws IOException {
+ super.encodeBegin(context);
+ FacesBeanValidator validator = (FacesBeanValidator)
context.getApplication().createValidator(getType());
+ validator.setSummary(getSummary());
+ ValueExpression expression = getValueExpression("profiles");
+ if (null != expression) {
+ validator.setProfiles(expression);
+ } else {
+ validator.setProfiles(getProfiles());
+ }
+ setupValidators(this, validator);
+ }
+
+ @Override
+ public void encodeChildren(FacesContext context) throws IOException {
+ if (isRendered()) {
+ for (UIComponent child : getChildren()) {
+ if (child.isRendered()) {
+ child.encodeAll(context);
+ }
+ }
+ }
+ }
+
+ private void setupValidators(UIComponent component, Validator validator) {
+ Iterator<UIComponent> facetsAndChildren =
component.getFacetsAndChildren();
+ while (facetsAndChildren.hasNext()) {
+ UIComponent child = facetsAndChildren.next();
+ if (child instanceof EditableValueHolder) {
+ EditableValueHolder input = (EditableValueHolder) child;
+ setupValidator(input, validator);
+ }
+ setupValidators(child, validator);
+ }
+ }
+
+ /**
+ * @param input
+ */
+ private void setupValidator(EditableValueHolder input, Validator validator) {
+ Validator[] validators = input.getValidators();
+ for (int i = 0; i < validators.length; i++) {
+ if (validators[i] instanceof FacesBeanValidator) {
+ return;
+ }
+ }
+ input.addValidator(validator);
+ }
+
+ @Override
+ public boolean getRendersChildren() {
+ return true;
+ }
+
}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIRichMessages.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIRichMessages.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIRichMessages.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -27,15 +27,17 @@
import javax.faces.context.FacesContext;
/**
- * <p class="changed_added_4_0"></p>
+ * <p class="changed_added_4_0">
+ * </p>
+ *
* @author asmirnov(a)exadel.com
- *
+ *
*/
public class UIRichMessages extends UIMessages {
public void updateMessages(FacesContext context, String clientId) {
// TODO Auto-generated method stub
-
+
}
}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/behavior/ClientValidatorBehavior.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/behavior/ClientValidatorBehavior.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/behavior/ClientValidatorBehavior.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -22,11 +22,8 @@
*/
package org.richfaces.component.behavior;
-import java.util.Collection;
-
import javax.faces.FacesException;
import javax.faces.component.EditableValueHolder;
-import javax.faces.component.UIMessage;
import javax.faces.component.behavior.ClientBehaviorBase;
import javax.faces.component.behavior.ClientBehaviorContext;
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -1,26 +1,19 @@
-
package org.richfaces.renderkit.html;
-
//
// Imports
//
import javax.faces.render.ClientBehaviorRenderer;
-
-
/**
* Renderer for component class org.richfaces.renderkit.html.AjaxValidatorRenderer
*/
public class ClientValidatorRenderer extends ClientBehaviorRenderer {
-
- public static final String RENDERER_TYPE =
"org.richfaces.ClientValidatorRenderer";
-
- public ClientValidatorRenderer () {
- super();
- }
+ public static final String RENDERER_TYPE =
"org.richfaces.ClientValidatorRenderer";
-
+ public ClientValidatorRenderer() {
+ super();
+ }
}
Modified:
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/component/behavior/ClientValidatorBehaviorTest.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/component/behavior/ClientValidatorBehaviorTest.java 2010-10-05
00:00:43 UTC (rev 19441)
+++
branches/RF-8742/ui/validator/ui/src/test/java/org/richfaces/component/behavior/ClientValidatorBehaviorTest.java 2010-10-05
00:23:10 UTC (rev 19442)
@@ -7,7 +7,6 @@
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
-import javax.faces.component.UIForm;
import javax.faces.component.UIInput;
import javax.faces.component.UIOutput;
import javax.faces.component.UIViewRoot;
@@ -16,16 +15,15 @@
import javax.faces.convert.Converter;
import org.jboss.test.faces.mock.Environment;
+import org.jboss.test.faces.mock.Environment.Feature;
import org.jboss.test.faces.mock.Mock;
import org.jboss.test.faces.mock.MockController;
import org.jboss.test.faces.mock.MockFacesEnvironment;
import org.jboss.test.faces.mock.MockTestRunner;
import org.jboss.test.faces.mock.Stub;
-import org.jboss.test.faces.mock.Environment.Feature;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.richfaces.component.behavior.ClientValidatorBehavior;
import org.richfaces.component.mock.MockUIForm;
import org.richfaces.component.mock.MockUIMessage;