Author: alexsmirnov
Date: 2010-10-29 00:32:06 -0400 (Fri, 29 Oct 2010)
New Revision: 19750
Added:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/DummyBeanValidatorService.java
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/BeanValidatorFactory.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/BeanValidatorServiceImpl.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/MessageFactory.java
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/RichFacesBeanValidatorFactory.java
branches/RF-8742/ui/validator/impl/src/test/java/org/richfaces/validator/BeanValidatorServiceConstrainsTest.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
Log:
RESOLVED - issue RF-9510: BeanValidatorService tests and implementation
https://jira.jboss.org/browse/RF-9510
Modified:
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/BeanValidatorFactory.java
===================================================================
---
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/BeanValidatorFactory.java 2010-10-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/api/src/main/java/org/richfaces/validator/BeanValidatorFactory.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -3,8 +3,12 @@
*/
package org.richfaces.validator;
+import java.lang.annotation.Annotation;
+
+import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.validation.Validator;
+import javax.validation.metadata.ConstraintDescriptor;
/**
* @author asmirnov
@@ -14,4 +18,6 @@
Validator getValidator(FacesContext context);
+ FacesMessage interpolateMessage(FacesContext context, final ConstraintDescriptor<?
extends Annotation> constrain);
+
}
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-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/application/ValidatorModule.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -25,13 +25,19 @@
import javax.validation.ValidationException;
+import org.richfaces.el.ValueExpressionAnalayserImpl;
import org.richfaces.validator.BeanValidator;
+import org.richfaces.validator.BeanValidatorFactory;
+import org.richfaces.validator.BeanValidatorService;
+import org.richfaces.validator.BeanValidatorServiceImpl;
import org.richfaces.validator.ConverterServiceImpl;
+import org.richfaces.validator.DummyBeanValidatorService;
import org.richfaces.validator.FacesConverterService;
import org.richfaces.validator.FacesValidatorService;
import org.richfaces.validator.FacesValidatorServiceImpl;
import org.richfaces.validator.NullValidator;
import org.richfaces.validator.ObjectValidator;
+import org.richfaces.validator.RichFacesBeanValidatorFactory;
/**
* <p class="changed_added_4_0">
@@ -49,29 +55,30 @@
* @see
org.richfaces.application.Module#configure(org.richfaces.application.ServicesFactory)
*/
public void configure(ServicesFactory factory) {
- factory.setInstance(ObjectValidator.class, createObjectValidator());
+ configureBeanValidators(factory);
factory.setInstance(FacesConverterService.class, new ConverterServiceImpl());
factory.setInstance(FacesValidatorService.class, new
FacesValidatorServiceImpl());
}
- /**
- * Create BeanValidator instance. For a Junit tests only.
- *
- * @return
- */
- static ObjectValidator createObjectValidator() {
- ObjectValidator validator = null;
+
+ void configureBeanValidators(ServicesFactory factory){
+ BeanValidatorService service ;
+ ObjectValidator validator;
try {
- validator = new BeanValidator();
+ BeanValidatorFactory validatorFactory = new RichFacesBeanValidatorFactory();
+ service = new BeanValidatorServiceImpl(new ValueExpressionAnalayserImpl(),
validatorFactory);
+ validator = new BeanValidator(validatorFactory);
} catch (ValidationException e) {
// JSR-303 is available but not initialised.
+ service = new DummyBeanValidatorService();
validator = new NullValidator();
} catch (NoClassDefFoundError e){
// JSR-303 is not avalable.
// log.warn("Validator implementations not found at classpath, default
NullValidator will be used.");
+ service = new DummyBeanValidatorService();
validator = new NullValidator();
}
- return validator;
+ factory.setInstance(BeanValidatorService.class, service);
+ factory.setInstance(ObjectValidator.class, 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-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidator.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -5,17 +5,13 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Locale;
import java.util.Set;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.validation.ConstraintViolation;
-import javax.validation.MessageInterpolator;
-import javax.validation.Validation;
import javax.validation.Validator;
-import javax.validation.ValidatorContext;
-import javax.validation.ValidatorFactory;
+import javax.validation.groups.Default;
/**
* @author asmirnov
@@ -23,20 +19,12 @@
*/
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[] {Default.class};
+ private final BeanValidatorFactory validatorFactory;
- 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(BeanValidatorFactory validatorFactory) {
+ this.validatorFactory = validatorFactory;
}
/*
@@ -115,37 +103,8 @@
}
protected Validator getValidator(FacesContext facesContext) {
- Validator beanValidator = validatorContext.getValidator();
+ Validator beanValidator = validatorFactory.getValidator(facesContext);
return beanValidator;
}
- private static class JsfMessageInterpolator implements MessageInterpolator {
-
- private MessageInterpolator delegate;
-
- public JsfMessageInterpolator(MessageInterpolator delegate) {
- this.delegate = delegate;
- }
-
- 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);
- }
- }
-
- 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);
- }
- }
-
- }
-
}
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidatorServiceImpl.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidatorServiceImpl.java 2010-10-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/BeanValidatorServiceImpl.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -12,9 +12,11 @@
import javax.el.ELException;
import javax.el.ValueExpression;
+import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.validation.Validator;
import javax.validation.metadata.ConstraintDescriptor;
+import javax.validation.metadata.PropertyDescriptor;
import org.richfaces.el.ValueDescriptor;
import org.richfaces.el.ValueExpressionAnalayser;
@@ -55,25 +57,32 @@
Collection<ValidatorDescriptor> processBeanAttribute(FacesContext context,
ValueDescriptor descriptor,
Class<?>... groups) {
- Set<ConstraintDescriptor<?>> constraints = getValidator(context)
-
.getConstraintsForClass(descriptor.getBeanType()).getConstraintsForProperty(descriptor.getName())
- .findConstraints().unorderedAndMatchingGroups(groups) // or the requested
list of groups)
- .getConstraintDescriptors();
+ PropertyDescriptor constraintsForProperty =
getValidator(context).getConstraintsForClass(
+ descriptor.getBeanType()).getConstraintsForProperty(descriptor.getName());
+ if (null != constraintsForProperty) {
+ Set<ConstraintDescriptor<?>> constraints =
constraintsForProperty.findConstraints()
+ .unorderedAndMatchingGroups(groups) // or the requested list of groups)
+ .getConstraintDescriptors();
- // ContextHolder is an arbitrary object, it will depend on the implementation
- Set<ValidatorDescriptor> descriptors = new
HashSet<ValidatorDescriptor>(constraints.size());
- processConstraints(context, constraints, descriptors);
- return descriptors;
+ // ContextHolder is an arbitrary object, it will depend on the
implementation
+ Set<ValidatorDescriptor> descriptors = new
HashSet<ValidatorDescriptor>(constraints.size());
+ processConstraints(context, constraints, descriptors);
+ return descriptors;
+
+ } else {
+ return Collections.emptySet();
+ }
}
void processConstraints(FacesContext context,
Set<ConstraintDescriptor<?>> constraints,
Collection<ValidatorDescriptor> descriptors) {
- for (ConstraintDescriptor cd : constraints) {
+ for (ConstraintDescriptor<?> cd : constraints) {
Annotation a = cd.getAnnotation();
Map<String, Object> parameters = cd.getAttributes();
// TODO if cd.isReportedAsSingleConstraint() make sure than only the root
constraint raises an error message
// if one or several of the composing constraints are invalid)
- BeanValidatorDescriptor beanValidatorDescriptor = new
BeanValidatorDescriptor(a.getClass(), null);
+ FacesMessage message = validatorFactory.interpolateMessage(context, cd);
+ BeanValidatorDescriptor beanValidatorDescriptor = new
BeanValidatorDescriptor(a.getClass(), message);
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
beanValidatorDescriptor.addParameter(entry.getKey(), entry.getValue());
}
Added:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/DummyBeanValidatorService.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/DummyBeanValidatorService.java
(rev 0)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/DummyBeanValidatorService.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package org.richfaces.validator;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.el.ValueExpression;
+import javax.faces.context.FacesContext;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class DummyBeanValidatorService implements BeanValidatorService {
+
+ /* (non-Javadoc)
+ * @see
org.richfaces.validator.BeanValidatorService#getConstrains(javax.faces.context.FacesContext,
javax.el.ValueExpression, java.lang.Class<?>[])
+ */
+ public Collection<ValidatorDescriptor> getConstrains(FacesContext context,
ValueExpression expression,
+ Class<?>... groups) {
+ return Collections.emptySet();
+ }
+
+}
Property changes on:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/DummyBeanValidatorService.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/MessageFactory.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/MessageFactory.java 2010-10-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/MessageFactory.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -53,7 +53,7 @@
return new FacesMessage(summary, detail);
}
- private static Locale getCurrentLocale(FacesContext context) {
+ public static Locale getCurrentLocale(FacesContext context) {
UIViewRoot viewRoot = context.getViewRoot();
Locale locale;
if (null == viewRoot) {
Modified:
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/RichFacesBeanValidatorFactory.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/RichFacesBeanValidatorFactory.java 2010-10-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/main/java/org/richfaces/validator/RichFacesBeanValidatorFactory.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -3,14 +3,19 @@
*/
package org.richfaces.validator;
+import java.lang.annotation.Annotation;
import java.util.Locale;
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.validation.MessageInterpolator;
+import javax.validation.MessageInterpolator.Context;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorContext;
import javax.validation.ValidatorFactory;
+import javax.validation.metadata.ConstraintDescriptor;
/**
* @author asmirnov
@@ -39,8 +44,28 @@
public Validator getValidator(FacesContext context) {
return validatorContext.getValidator();
}
+
+ public FacesMessage interpolateMessage(FacesContext context,final
ConstraintDescriptor<? extends Annotation> constrain){
+ if(constrain.getAttributes().containsKey("message")){
+ Object object = constrain.getAttributes().get("message");
+ String interpolatedMessage;
+ interpolatedMessage =
validatorFactory.getMessageInterpolator().interpolate(object.toString(), new Context() {
+
+ public Object getValidatedValue() {
+ return "{0}";
+ }
+
+ public ConstraintDescriptor<?> getConstraintDescriptor() {
+ return constrain;
+ }
+ }, MessageFactory.getCurrentLocale(context));
+ return new FacesMessage(interpolatedMessage);
+ } else {
+ return MessageFactory.createMessage(context, UIInput.UPDATE_MESSAGE_ID);
+ }
+ }
- private static class JsfMessageInterpolator implements MessageInterpolator {
+ private static final class JsfMessageInterpolator implements MessageInterpolator {
private MessageInterpolator delegate;
@@ -50,7 +75,7 @@
public String interpolate(String messageTemplate, Context context) {
- Locale locale =
ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
+ Locale locale =
MessageFactory.getCurrentLocale(FacesContext.getCurrentInstance());
if (null != locale) {
return delegate.interpolate(messageTemplate, context, locale);
} else {
@@ -59,7 +84,7 @@
}
public String interpolate(String messageTemplate, Context context, Locale locale)
{
- Locale faceslocale =
ObjectValidator.calculateLocale(FacesContext.getCurrentInstance());
+ Locale faceslocale =
MessageFactory.getCurrentLocale(FacesContext.getCurrentInstance());
if (null != faceslocale) {
return delegate.interpolate(messageTemplate, context, faceslocale);
} else {
Modified:
branches/RF-8742/ui/validator/impl/src/test/java/org/richfaces/validator/BeanValidatorServiceConstrainsTest.java
===================================================================
---
branches/RF-8742/ui/validator/impl/src/test/java/org/richfaces/validator/BeanValidatorServiceConstrainsTest.java 2010-10-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/impl/src/test/java/org/richfaces/validator/BeanValidatorServiceConstrainsTest.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -7,8 +7,10 @@
import java.lang.annotation.Annotation;
import java.util.Collection;
+import java.util.Locale;
import javax.el.ValueExpression;
+import javax.faces.component.UIViewRoot;
import javax.validation.constraints.Size;
import org.jboss.test.faces.mock.Environment;
@@ -41,6 +43,9 @@
@Mock
private ValueExpressionAnalayser analayser;
+ @Mock
+ private UIViewRoot viewRoot;
+
private MockController controller;
private BeanValidatorServiceImpl validatorService;
@@ -48,7 +53,10 @@
@Before
public void setUp() throws Exception {
- validatorService = new BeanValidatorServiceImpl(analayser);
+ RichFacesBeanValidatorFactory validatorFactory = new
RichFacesBeanValidatorFactory();
+ validatorService = new BeanValidatorServiceImpl(analayser,validatorFactory);
+ expect(environment.getFacesContext().getViewRoot()).andStubReturn(viewRoot);
+ expect(viewRoot.getLocale()).andStubReturn(Locale.ENGLISH);
}
@After
@@ -65,6 +73,14 @@
public void testGetNoValidator() throws Exception {
forProperty(Bean.class, "list");expectValidators();
}
+
+ @Test
+ public void testValidatorMessageExtractor() throws Exception {
+ forProperty(Bean.class, "string");
+ Collection<ValidatorDescriptor> validators = expectValidators(Size.class);
+ ValidatorDescriptor validatorDescriptor = Iterables.getOnlyElement(validators);
+ assertEquals("size must be between 0 and
2",validatorDescriptor.getMessage().getSummary());
+ }
private void forProperty(Class<?> beanClass,String property){
expect(analayser.getPropertyDescriptor(environment.getFacesContext(),
expression)).andReturn(new ValueDescriptor(beanClass,property));
@@ -84,7 +100,7 @@
for (final Class<? extends Annotation> class1 : validators) {
Iterables.find(constrains, new Predicate<ValidatorDescriptor>(){
public boolean apply(ValidatorDescriptor input) {
- return class1.equals(input.getImplementationClass());
+ return class1.isAssignableFrom(input.getImplementationClass());
}
});
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-29
01:43:38 UTC (rev 19749)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-29
04:32:06 UTC (rev 19750)
@@ -26,6 +26,7 @@
import org.richfaces.validator.LibraryScriptString;
import org.richfaces.validator.ScriptNotFoundException;
import org.richfaces.validator.FacesObjectDescriptor;
+import org.richfaces.validator.ValidatorDescriptor;
import com.google.common.collect.Lists;
@@ -130,7 +131,7 @@
ComponentValidatorScript createValidatorScript(ClientBehaviorContext
behaviorContext,
ClientValidatorBehavior behavior) {
ValidatorScriptBase validatorScript;
- Collection<FacesObjectDescriptor> validators =
behavior.getValidators(behaviorContext);
+ Collection<ValidatorDescriptor> validators =
behavior.getValidators(behaviorContext);
if (!validators.isEmpty()) {
try {
ConverterDescriptor converter = behavior.getConverter(behaviorContext);
@@ -160,7 +161,7 @@
}
private ValidatorScriptBase createValidatorScript(ClientBehaviorContext
behaviorContext,
- ClientValidatorBehavior behavior, Collection<FacesObjectDescriptor>
validators,
+ ClientValidatorBehavior behavior, Collection<ValidatorDescriptor>
validators,
LibraryScriptString clientSideConverterScript) {
Collection<? extends LibraryScriptString> validatorScripts =
getClientSideValidatorScript(behaviorContext.getFacesContext(), validators);
if (validatorScripts.isEmpty()) {
@@ -216,7 +217,7 @@
* @throws ScriptNotFoundException
*/
Collection<? extends LibraryScriptString>
getClientSideValidatorScript(FacesContext facesContext,
- Collection<FacesObjectDescriptor> validators) {
+ Collection<ValidatorDescriptor> validators) {
ClientScriptService clientScriptService =
ServiceTracker.getService(facesContext, ClientScriptService.class);
List<LibraryScriptString> scripts = Lists.newArrayList();