You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2010/05/14 16:33:30 UTC

svn commit: r944289 - in /myfaces/extensions/validator/trunk: test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/ test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validato...

Author: gpetracek
Date: Fri May 14 14:33:30 2010
New Revision: 944289

URL: http://svn.apache.org/viewvc?rev=944289&view=rev
Log:
EXTVAL-96

Added:
    myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/CascadedValidationTestCase.java
    myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CascadedValidationTestCase1Bean.java
    myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CustomTypeForCascadedValidationTestCase1Bean.java
Modified:
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptor.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptorInternals.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptor.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptorInternals.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/ExtValBeanValidationMetaDataInternals.java

Added: myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/CascadedValidationTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/CascadedValidationTestCase.java?rev=944289&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/CascadedValidationTestCase.java (added)
+++ myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/CascadedValidationTestCase.java Fri May 14 14:33:30 2010
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.test.beanval;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.myfaces.extensions.validator.test.beanval.model.CascadedValidationTestCase1Bean;
+import org.apache.myfaces.extensions.validator.test.beanval.model.CustomTypeForCascadedValidationTestCase1Bean;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+import javax.faces.component.UIComponent;
+
+public class CascadedValidationTestCase extends BaseBeanValPropertyValidationTestCase<CascadedValidationTestCase1Bean>
+{
+    public CascadedValidationTestCase(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new TestSuite(CascadedValidationTestCase.class);
+    }
+
+    protected CascadedValidationTestCase1Bean getBeanToTest()
+    {
+        return new CascadedValidationTestCase1Bean();
+    }
+
+    public void testCascadedValidationCorrectValue()
+    {
+        createValueBindingForComponent(this.inputComponent1, "#{testBean.property}");
+        setValueToValidate(this.inputComponent1, "123:456");
+        this.inputComponent1.setConverter(createCustomTypeConverter());
+
+        validateComponents();
+
+        assertComponentValid(this.inputComponent1);
+        assertNavigationBlocked(false);
+
+        checkMessageCount(0);
+    }
+
+    public void testCascadedValidationValueTooShort()
+    {
+        createValueBindingForComponent(this.inputComponent1, "#{testBean.property}");
+        setValueToValidate(this.inputComponent1, "1:4");
+        this.inputComponent1.setConverter(createCustomTypeConverter());
+
+        validateComponents();
+
+        assertComponentInvalid(this.inputComponent1);
+        assertNavigationBlocked(true);
+
+        checkMessageCount(1);
+        checkMessageSeverities(FacesMessage.SEVERITY_ERROR);
+    }
+
+    public void testCascadedValidationInvalidValue()
+    {
+        createValueBindingForComponent(this.inputComponent1, "#{testBean.property}");
+        setValueToValidate(this.inputComponent1, "");
+        this.inputComponent1.setConverter(createCustomTypeConverter());
+
+        validateComponents();
+
+        assertComponentInvalid(this.inputComponent1);
+        assertNavigationBlocked(true);
+
+        checkMessageCount(1);
+        checkMessageSeverities(FacesMessage.SEVERITY_ERROR);
+    }
+
+    private Converter createCustomTypeConverter()
+    {
+        return new Converter()
+        {
+            public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) throws ConverterException
+            {
+                if(s != null && !s.equals(""))
+                {
+                    return new CustomTypeForCascadedValidationTestCase1Bean(s.split(":")[0], s.split(":")[1]);
+                }
+                return null;
+            }
+
+            public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) throws ConverterException
+            {
+                return ((CustomTypeForCascadedValidationTestCase1Bean)o).getProperty1() + "" + ((CustomTypeForCascadedValidationTestCase1Bean)o).getProperty2();
+            }
+        };
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CascadedValidationTestCase1Bean.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CascadedValidationTestCase1Bean.java?rev=944289&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CascadedValidationTestCase1Bean.java (added)
+++ myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CascadedValidationTestCase1Bean.java Fri May 14 14:33:30 2010
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.test.beanval.model;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+public class CascadedValidationTestCase1Bean
+{
+    @NotNull
+    @Valid
+    private CustomTypeForCascadedValidationTestCase1Bean property;
+
+    public CustomTypeForCascadedValidationTestCase1Bean getProperty()
+    {
+        return property;
+    }
+
+    public void setProperty(CustomTypeForCascadedValidationTestCase1Bean property)
+    {
+        this.property = property;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CustomTypeForCascadedValidationTestCase1Bean.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CustomTypeForCascadedValidationTestCase1Bean.java?rev=944289&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CustomTypeForCascadedValidationTestCase1Bean.java (added)
+++ myfaces/extensions/validator/trunk/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/model/CustomTypeForCascadedValidationTestCase1Bean.java Fri May 14 14:33:30 2010
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.test.beanval.model;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class CustomTypeForCascadedValidationTestCase1Bean
+{
+    @NotNull
+    private String property1;
+
+    @Size(min = 3)
+    private String property2;
+
+    public CustomTypeForCascadedValidationTestCase1Bean(String property1, String property2)
+    {
+        this.property1 = property1;
+        this.property2 = property2;
+    }
+
+    public String getProperty1()
+    {
+        return property1;
+    }
+
+    public String getProperty2()
+    {
+        return property2;
+    }
+}
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptor.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptor.java Fri May 14 14:33:30 2010
@@ -109,8 +109,8 @@ public class BeanValidationModuleValidat
                                           PropertyInformation propertyInformation)
     {
         /*not used yet supportMultipleViolationsPerField()*/
-        Set<ConstraintViolation> violations = this.bviUtils
-                .validate(facesContext, uiComponent, convertedObject, propertyInformation);
+        Set<ConstraintViolation<Object>> violations = this.bviUtils
+                .validate(facesContext, uiComponent, convertedObject, propertyInformation, true);
 
         processConstraintViolations(facesContext, uiComponent, convertedObject, violations);
     }
@@ -118,7 +118,7 @@ public class BeanValidationModuleValidat
     protected void processConstraintViolations(FacesContext facesContext,
                                              UIComponent uiComponent,
                                              Object convertedObject,
-                                             Set<ConstraintViolation> violations)
+                                             Set<ConstraintViolation<Object>> violations)
     {
         if(violations != null && !violations.isEmpty())
         {

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptorInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptorInternals.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptorInternals.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleValidationInterceptorInternals.java Fri May 14 14:33:30 2010
@@ -19,6 +19,7 @@
 package org.apache.myfaces.extensions.validator.beanval;
 
 import org.apache.myfaces.extensions.validator.beanval.validation.strategy.BeanValidationVirtualValidationStrategy;
+import org.apache.myfaces.extensions.validator.beanval.util.BeanValidationUtils;
 import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
 import org.apache.myfaces.extensions.validator.core.metadata.extractor.MetaDataExtractor;
 import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
@@ -35,9 +36,7 @@ import org.apache.myfaces.extensions.val
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.validation.ConstraintViolation;
-import javax.validation.ValidatorFactory;
 import javax.validation.groups.Default;
-import javax.validation.metadata.BeanDescriptor;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.ElementDescriptor;
 import java.util.HashMap;
@@ -102,7 +101,8 @@ class BeanValidationModuleValidationInte
 
         targetClass = ProxyUtils.getUnproxiedClass(targetClass);
 
-        ElementDescriptor elementDescriptor = getDescriptorFor(targetClass, propertyDetails.getProperty());
+        ElementDescriptor elementDescriptor = BeanValidationUtils.getElementDescriptor(
+                targetClass, propertyDetails.getProperty());
 
         if (elementDescriptor == null)
         {
@@ -193,14 +193,15 @@ class BeanValidationModuleValidationInte
 
         Class targetClass = ProxyUtils.getUnproxiedClass(propertyDetails.getBaseObject().getClass());
 
-        return getDescriptorFor(targetClass, propertyDetails.getProperty()) != null;
+        return BeanValidationUtils.getElementDescriptor(targetClass, propertyDetails.getProperty()) != null;
     }
 
     @SuppressWarnings({"unchecked"})
-    Set<ConstraintViolation> validate(FacesContext facesContext,
-                                      UIComponent uiComponent,
-                                      Object convertedObject,
-                                      PropertyInformation propertyInformation)
+    Set<ConstraintViolation<Object>> validate(FacesContext facesContext,
+                                              UIComponent uiComponent,
+                                              Object convertedObject,
+                                              PropertyInformation propertyInformation,
+                                              boolean cascadedValidation)
     {
         Class baseBeanClass = getBaseClassType(propertyInformation);
         String propertyName = getPropertyToValidate(propertyInformation);
@@ -212,14 +213,7 @@ class BeanValidationModuleValidationInte
             return null;
         }
 
-        ValidatorFactory validatorFactory = ExtValBeanValidationContext.getCurrentInstance().getValidatorFactory();
-        return validatorFactory
-                .usingContext()
-                .messageInterpolator(ExtValBeanValidationContext.getCurrentInstance().getMessageInterpolator())
-                .constraintValidatorFactory(validatorFactory.getConstraintValidatorFactory())
-                .traversableResolver(validatorFactory.getTraversableResolver())
-                .getValidator()
-                .validateValue(baseBeanClass, propertyName, convertedObject, groups);
+        return BeanValidationUtils.validate(baseBeanClass, propertyName, convertedObject, groups, cascadedValidation);
     }
 
     Class getBaseClassType(PropertyInformation propertyInformation)
@@ -240,12 +234,4 @@ class BeanValidationModuleValidationInte
                 facesContext.getViewRoot().getViewId(),
                 uiComponent.getClientId(facesContext));
     }
-
-    ElementDescriptor getDescriptorFor(Class targetClass, String property)
-    {
-        BeanDescriptor beanDescriptor = ExtValBeanValidationContext.getCurrentInstance().getValidatorFactory()
-                .getValidator().getConstraintsForClass(targetClass);
-
-        return beanDescriptor.getConstraintsForProperty(property);
-    }
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptor.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptor.java Fri May 14 14:33:30 2010
@@ -66,8 +66,8 @@ public class MappedConstraintSourceBeanV
                                           Object convertedObject,
                                           PropertyInformation propertyInformation)
     {
-        Set<ConstraintViolation> violations = this.csaBviUtils
-                .validateMappedConstraintSource(facesContext, uiComponent, convertedObject, propertyInformation);
+        Set<ConstraintViolation<Object>> violations = this.csaBviUtils
+                .validateMappedConstraintSource(facesContext, uiComponent, convertedObject, propertyInformation, true);
 
         processConstraintViolations(facesContext, uiComponent, convertedObject, violations);
     }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptorInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptorInternals.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptorInternals.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/MappedConstraintSourceBeanValidationModuleValidationInterceptorInternals.java Fri May 14 14:33:30 2010
@@ -24,11 +24,11 @@ import org.apache.myfaces.extensions.val
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 import org.apache.myfaces.extensions.validator.util.ConstraintSourceUtils;
+import org.apache.myfaces.extensions.validator.beanval.util.BeanValidationUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.validation.ConstraintViolation;
-import javax.validation.ValidatorFactory;
 import javax.validation.groups.Default;
 import javax.validation.metadata.ElementDescriptor;
 import java.util.Collections;
@@ -76,7 +76,7 @@ class MappedConstraintSourceBeanValidati
         }
 
         ElementDescriptor elementDescriptor =
-                this.bviUtils.getDescriptorFor((Class) constraintSourcePropertyDetails.getBaseObject(),
+                BeanValidationUtils.getElementDescriptor((Class) constraintSourcePropertyDetails.getBaseObject(),
                         constraintSourcePropertyDetails.getProperty());
 
         if (elementDescriptor == null)
@@ -87,10 +87,11 @@ class MappedConstraintSourceBeanValidati
         this.bviUtils.processElementDescriptor(facesContext, uiComponent, foundGroups, elementDescriptor);
     }
 
-    Set<ConstraintViolation> validateMappedConstraintSource(FacesContext facesContext,
+    Set<ConstraintViolation<Object>> validateMappedConstraintSource(FacesContext facesContext,
                                                             UIComponent uiComponent,
                                                             Object convertedObject,
-                                                            PropertyInformation propertyInformation)
+                                                            PropertyInformation propertyInformation,
+                                                            boolean cascadedValidation)
     {
         Class baseBeanClass = this.bviUtils.getBaseClassType(propertyInformation);
         String propertyName = this.bviUtils.getPropertyToValidate(propertyInformation);
@@ -114,14 +115,7 @@ class MappedConstraintSourceBeanValidati
             return null;
         }
 
-        ValidatorFactory validatorFactory = ExtValBeanValidationContext.getCurrentInstance().getValidatorFactory();
-        return validatorFactory
-                .usingContext()
-                .messageInterpolator(ExtValBeanValidationContext.getCurrentInstance().getMessageInterpolator())
-                .constraintValidatorFactory(validatorFactory.getConstraintValidatorFactory())
-                .traversableResolver(validatorFactory.getTraversableResolver())
-                .getValidator()
-                .validateValue(baseBeanClass, propertyName, convertedObject, groups);
+        return BeanValidationUtils.validate(baseBeanClass, propertyName, convertedObject, groups, cascadedValidation);
     }
 
     private String getKey(PropertyInformation propertyInformation)

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java Fri May 14 14:33:30 2010
@@ -19,6 +19,7 @@
 package org.apache.myfaces.extensions.validator.beanval.util;
 
 import org.apache.myfaces.extensions.validator.beanval.storage.ModelValidationEntry;
+import org.apache.myfaces.extensions.validator.beanval.ExtValBeanValidationContext;
 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
 import org.apache.myfaces.extensions.validator.core.validation.message.FacesMessageHolder;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
@@ -32,10 +33,14 @@ import javax.faces.validator.ValidatorEx
 import javax.validation.ConstraintViolation;
 import javax.validation.ValidatorFactory;
 import javax.validation.Validation;
+import javax.validation.metadata.ElementDescriptor;
+import javax.validation.metadata.PropertyDescriptor;
+import javax.validation.metadata.BeanDescriptor;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.Map;
+import java.util.Collections;
 import java.util.logging.Logger;
 
 /**
@@ -49,6 +54,58 @@ public class BeanValidationUtils
     private static ExtValBeanValidationMetaDataInternals bvmi = new ExtValBeanValidationMetaDataInternals(LOGGER);
     private static final String VALIDATOR_FACTORY_KEY = "javax.faces.validator.beanValidator.ValidatorFactory";
 
+    @SuppressWarnings({"unchecked"})
+    public static Set<ConstraintViolation<Object>> validate(Class baseClass,
+                                                            String propertyName,
+                                                            Object objectToValidate,
+                                                            Class[] groups,
+                                                            boolean cascadedValidation)
+    {
+        ValidatorFactory validatorFactory = ExtValBeanValidationContext.getCurrentInstance().getValidatorFactory();
+        Set<ConstraintViolation<Object>> result =
+                validatorFactory.usingContext()
+                .messageInterpolator(ExtValBeanValidationContext.getCurrentInstance().getMessageInterpolator())
+                .constraintValidatorFactory(validatorFactory.getConstraintValidatorFactory())
+                .traversableResolver(validatorFactory.getTraversableResolver())
+                .getValidator()
+                .validateValue(baseClass, propertyName, objectToValidate, groups);
+
+        if(result.isEmpty() && cascadedValidation)
+        {
+            result = processCascadedValidation(validatorFactory, baseClass, propertyName, objectToValidate, groups);
+        }
+
+        return result;
+    }
+
+    private static Set<ConstraintViolation<Object>> processCascadedValidation(ValidatorFactory validatorFactory,
+                                                                              Class baseBeanClass,
+                                                                              String propertyName,
+                                                                              Object objectToValidate,
+                                                                              Class[] groups)
+    {
+        ElementDescriptor elementDescriptor = getElementDescriptor(baseBeanClass, propertyName);
+
+        if(elementDescriptor instanceof PropertyDescriptor && ((PropertyDescriptor)elementDescriptor).isCascaded())
+        {
+            return validatorFactory.usingContext()
+                .messageInterpolator(ExtValBeanValidationContext.getCurrentInstance().getMessageInterpolator())
+                .constraintValidatorFactory(validatorFactory.getConstraintValidatorFactory())
+                .traversableResolver(validatorFactory.getTraversableResolver())
+                .getValidator()
+                .validate(objectToValidate, groups);
+        }
+        return Collections.emptySet();
+    }
+
+    public static ElementDescriptor getElementDescriptor(Class targetClass, String property)
+    {
+        BeanDescriptor beanDescriptor = ExtValBeanValidationContext.getCurrentInstance().getValidatorFactory()
+                .getValidator().getConstraintsForClass(targetClass);
+
+        return beanDescriptor.getConstraintsForProperty(property);
+    }
+
     public static void addMetaDataToContext(
             UIComponent component, PropertyDetails propertyDetails, boolean processModelValidation)
     {
@@ -81,12 +138,12 @@ public class BeanValidationUtils
     public static void processConstraintViolations(FacesContext facesContext,
                                                    UIComponent uiComponent,
                                                    Object convertedObject,
-                                                   Set<ConstraintViolation> violations)
+                                                   Set<ConstraintViolation<Object>> violations)
     {
         List<FacesMessageHolder> facesMessageHolderList = new ArrayList<FacesMessageHolder>();
 
         FacesMessage facesMessage;
-        for (ConstraintViolation violation : violations)
+        for (ConstraintViolation<Object> violation : violations)
         {
             facesMessage = createFacesMessageForConstraintViolation(uiComponent, convertedObject, violation);
 
@@ -103,7 +160,7 @@ public class BeanValidationUtils
 
     public static FacesMessage createFacesMessageForConstraintViolation(UIComponent uiComponent,
                                                                         Object convertedObject,
-                                                                        ConstraintViolation violation)
+                                                                        ConstraintViolation<Object> violation)
     {
         String violationMessage = violation.getMessage();
 

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/ExtValBeanValidationMetaDataInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/ExtValBeanValidationMetaDataInternals.java?rev=944289&r1=944288&r2=944289&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/ExtValBeanValidationMetaDataInternals.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/ExtValBeanValidationMetaDataInternals.java Fri May 14 14:33:30 2010
@@ -564,7 +564,7 @@ class ExtValBeanValidationMetaDataIntern
         return this.labeledMessageInternals.createLabeledMessage(violationMessage, isDetailMessage);
     }
 
-    FacesMessage.Severity calcSeverity(ConstraintViolation<?> violation)
+    FacesMessage.Severity calcSeverity(ConstraintViolation<Object> violation)
     {
         for (Class<? extends Payload> payload : violation.getConstraintDescriptor().getPayload())
         {