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 2009/10/12 20:41:13 UTC

svn commit: r824451 - in /myfaces/extensions/validator/trunk: core/src/main/java/org/apache/myfaces/extensions/validator/core/ core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ core/src/main/java/org/apache/myfaces/extensions...

Author: gpetracek
Date: Mon Oct 12 18:41:12 2009
New Revision: 824451

URL: http://svn.apache.org/viewvc?rev=824451&view=rev
Log:
small refactorings

Added:
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/Nested.java
      - copied, changed from r824374, myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubNameMapper.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java
      - copied, changed from r824374, myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/HtmlCoreComponentsComponentInitializer.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/NotNullMetaDataTransformer.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
Removed:
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubNameMapper.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/util/BeanValidationUtils.java
Modified:
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubMapperAwareNameMapper.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/PropertyValidationGroupProvider.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java

Copied: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/Nested.java (from r824374, myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubNameMapper.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/Nested.java?p2=myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/Nested.java&p1=myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubNameMapper.java&r1=824374&r2=824451&rev=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubNameMapper.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/Nested.java Mon Oct 12 18:41:12 2009
@@ -16,18 +16,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.myfaces.extensions.validator.core.mapper;
+package org.apache.myfaces.extensions.validator.core;
 
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Documented;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+
 /**
- * marker interface
+ * marker annotation e.g. to mark sub-name-mappers
  * 
  * @author Gerhard Petracek
  * @since x.x.3
  */
+@Target(TYPE)
+@Retention(RUNTIME)
+@Documented
 @UsageInformation(UsageCategory.API)
-public interface SubNameMapper<T> extends NameMapper<T>
+public @interface Nested
 {
 }
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java Mon Oct 12 18:41:12 2009
@@ -113,7 +113,7 @@
 
     protected Object transformValueForValidation(Object convertedObject)
     {
-        if ("".equals(convertedObject) && interpretEmptyStringAsNull())
+        if ("".equals(convertedObject) && interpretEmptyStringValuesAsNull())
         {
             return null;
         }
@@ -143,10 +143,9 @@
         return !"false".equalsIgnoreCase(WebXmlParameter.VALIDATE_EMPTY_FIELDS);
     }
 
-    protected boolean interpretEmptyStringAsNull()
+    protected boolean interpretEmptyStringValuesAsNull()
     {
-        //to deactivate: the parameter has to be explicitly false
-        return !"false".equalsIgnoreCase(WebXmlParameter.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL);
+        return ExtValUtils.interpretEmptyStringValuesAsNull();
     }
 
     protected abstract void processValidation(

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubMapperAwareNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubMapperAwareNameMapper.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubMapperAwareNameMapper.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/mapper/SubMapperAwareNameMapper.java Mon Oct 12 18:41:12 2009
@@ -30,5 +30,5 @@
 @UsageInformation(UsageCategory.API)
 public interface SubMapperAwareNameMapper<T> extends NameMapper<T>
 {
-    void addNameMapper(SubNameMapper<T> nameMapper);
+    void addNameMapper(NameMapper<T> nameMapper);
 }
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java Mon Oct 12 18:41:12 2009
@@ -25,7 +25,7 @@
 import org.apache.myfaces.extensions.validator.core.validation.strategy.IdentifiableValidationStrategy;
 import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
 import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
-import org.apache.myfaces.extensions.validator.core.mapper.SubNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
 import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfiguration;
 import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationNames;
 import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationEntry;
@@ -62,8 +62,8 @@
 
     private Map<String, String> validationStrategyToMetaDataTransformerMapping;
     private List<NameMapper<ValidationStrategy>> nameMapperList = new ArrayList<NameMapper<ValidationStrategy>>();
-    private List<SubNameMapper<ValidationStrategy>> subNameMapperList =
-            new ArrayList<SubNameMapper<ValidationStrategy>>();
+    private List<NameMapper<ValidationStrategy>> subNameMapperList =
+            new ArrayList<NameMapper<ValidationStrategy>>();
 
     public DefaultMetaDataTransformerFactory()
     {
@@ -227,8 +227,7 @@
 
     protected List<NameMapper<ValidationStrategy>> getNameMapperList()
     {
-        return new SortedNameMapperList<NameMapper<ValidationStrategy>, SubNameMapper<ValidationStrategy>>(
-                this.nameMapperList, this.subNameMapperList);
+        return new SortedNameMapperList<NameMapper<ValidationStrategy>>(this.nameMapperList, this.subNameMapperList);
     }
 
     @Override
@@ -253,9 +252,13 @@
     {
         if(validationStrategyNameMapper instanceof SubMapperAwareNameMapper)
         {
-            for(SubNameMapper<ValidationStrategy> nameMapper : this.subNameMapperList)
+            for(NameMapper<ValidationStrategy> nameMapper : this.subNameMapperList)
             {
-                ((SubMapperAwareNameMapper<ValidationStrategy>)validationStrategyNameMapper).addNameMapper(nameMapper);
+                if(nameMapper.getClass().isAnnotationPresent(Nested.class))
+                {
+                    ((SubMapperAwareNameMapper<ValidationStrategy>)validationStrategyNameMapper)
+                            .addNameMapper(nameMapper);
+                }
             }
         }
     }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java Mon Oct 12 18:41:12 2009
@@ -20,7 +20,7 @@
 
 import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
 import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
-import org.apache.myfaces.extensions.validator.core.mapper.SubNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 
@@ -37,12 +37,12 @@
  * @since x.x.3
  */
 @UsageInformation({UsageCategory.INTERNAL})
-class SortedNameMapperList<T extends NameMapper, S extends SubNameMapper> implements List<T>
+class SortedNameMapperList<T extends NameMapper> implements List<T>
 {
     private List<T> wrapped;
-    private List<S> globalSubNameMapperList;
+    private List<T> globalSubNameMapperList;
 
-    SortedNameMapperList(List<T> wrapped, List<S> subNameMapperList)
+    SortedNameMapperList(List<T> wrapped, List<T> subNameMapperList)
     {
         this.wrapped = wrapped;
         this.globalSubNameMapperList = subNameMapperList;
@@ -50,9 +50,9 @@
 
     public boolean add(T t)
     {
-        if (t instanceof SubNameMapper /*due to a restriction in java*/)
+        if (t != null && t.getClass().isAnnotationPresent(Nested.class))
         {
-            return addSubNameMapper((S) t);
+            return addSubNameMapper(t);
         }
         else
         {
@@ -74,7 +74,7 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private boolean addSubNameMapper(S subNameMapper)
+    private boolean addSubNameMapper(T subNameMapper)
     {
         boolean result = false;
         for (NameMapper nameMapper : this.wrapped)
@@ -90,7 +90,7 @@
         return result;
     }
 
-    private void tryToAddMapperAsGlobalSubNameMapper(S subNameMapper)
+    private void tryToAddMapperAsGlobalSubNameMapper(T subNameMapper)
     {
         if(!this.globalSubNameMapperList.contains(subNameMapper))
         {

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java Mon Oct 12 18:41:12 2009
@@ -20,7 +20,7 @@
 
 import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
 import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
-import org.apache.myfaces.extensions.validator.core.mapper.SubNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
@@ -39,9 +39,9 @@
 {
     private List<NameMapper<ValidationStrategy>> subNameMappers = new ArrayList<NameMapper<ValidationStrategy>>();
 
-    public void addNameMapper(SubNameMapper<ValidationStrategy> nameMapper)
+    public void addNameMapper(NameMapper<ValidationStrategy> nameMapper)
     {
-        if(!this.subNameMappers.contains(nameMapper))
+        if(!this.subNameMappers.contains(nameMapper) && nameMapper.getClass().isAnnotationPresent(Nested.class))
         {
             this.subNameMappers.add(nameMapper);
         }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java Mon Oct 12 18:41:12 2009
@@ -27,6 +27,7 @@
 import org.apache.myfaces.extensions.validator.core.validation.parameter.DisableClientSideValidation;
 import org.apache.myfaces.extensions.validator.core.factory.ClassMappingFactory;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
 import org.apache.myfaces.extensions.validator.core.storage.StorageManager;
 import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
 import org.apache.myfaces.extensions.validator.core.interceptor.ValidationExceptionInterceptor;
@@ -620,4 +621,15 @@
 
         return metaDataResult;
     }
+
+    public static boolean interpretEmptyStringValuesAsNull()
+    {
+        //to deactivate: the parameter has to be explicitly false
+        return !"false".equalsIgnoreCase(WebXmlParameter.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL);
+    }
+
+    public static PropertyDetails getPropertyDetails(PropertyInformation propertyInformation)
+    {
+        return propertyInformation.getInformation(PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
+    }
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java Mon Oct 12 18:41:12 2009
@@ -29,7 +29,7 @@
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
-import util.BeanValidationUtils;
+import org.apache.myfaces.extensions.validator.beanval.util.BeanValidationUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
@@ -61,12 +61,13 @@
             logger.trace("start to init component " + uiComponent.getClass().getName());
         }
 
-        BeanValidationInterceptorUtils bviUtils = new BeanValidationInterceptorUtils(this.logger);
+        BeanValidationInterceptorInternals bviUtils = new BeanValidationInterceptorInternals(this.logger);
 
         PropertyDetails propertyDetails = bviUtils.extractPropertyDetails(facesContext, uiComponent);
 
         if (propertyDetails != null)
         {
+            BeanValidationUtils.addMetaDataToContext(uiComponent, propertyDetails);
             bviUtils.initComponentWithPropertyDetails(facesContext, uiComponent, propertyDetails);
         }
 
@@ -99,6 +100,9 @@
                     logger.trace("jsr303 start validation");
                 }
 
+                BeanValidationUtils.addMetaDataToContext(
+                        uiComponent, ExtValUtils.getPropertyDetails(propertyInformation));
+
                 if (!executeGlobalBeforeValidationInterceptors(
                         facesContext, uiComponent, convertedObject, propertyInformation))
                 {
@@ -125,7 +129,7 @@
 
     protected boolean hasBeanValidationConstraints(PropertyInformation propertyInformation)
     {
-        return new BeanValidationInterceptorUtils(this.logger).hasBeanValidationConstraints(propertyInformation);
+        return new BeanValidationInterceptorInternals(this.logger).hasBeanValidationConstraints(propertyInformation);
     }
 
     protected void processFieldValidation(FacesContext facesContext,
@@ -133,7 +137,7 @@
                                           Object convertedObject,
                                           PropertyInformation propertyInformation)
     {
-        new BeanValidationInterceptorUtils(this.logger).validate(
+        new BeanValidationInterceptorInternals(this.logger).validate(
                 facesContext, uiComponent, convertedObject, propertyInformation, supportMultipleViolationsPerField());
     }
 

Copied: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java (from r824374, myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorUtils.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java?p2=myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java&p1=myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorUtils.java&r1=824374&r2=824451&rev=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorUtils.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java Mon Oct 12 18:41:12 2009
@@ -36,6 +36,7 @@
 import javax.faces.context.FacesContext;
 import javax.faces.validator.ValidatorException;
 import javax.validation.ConstraintViolation;
+import javax.validation.groups.Default;
 import javax.validation.metadata.BeanDescriptor;
 import javax.validation.metadata.ConstraintDescriptor;
 import javax.validation.metadata.ElementDescriptor;
@@ -49,11 +50,11 @@
  * @since x.x.3
  */
 @UsageInformation(UsageCategory.INTERNAL)
-class BeanValidationInterceptorUtils
+class BeanValidationInterceptorInternals
 {
     private Log logger;
 
-    BeanValidationInterceptorUtils(Log logger)
+    BeanValidationInterceptorInternals(Log logger)
     {
         this.logger = logger;
     }
@@ -81,6 +82,10 @@
         {
             return;
         }
+        else if(foundGroups.length == 0)
+        {
+            foundGroups = new Class[]{Default.class};
+        }
 
         ElementDescriptor elementDescriptor = getDescriptorFor(
                 propertyDetails.getBaseObject().getClass(), propertyDetails.getProperty());
@@ -141,7 +146,7 @@
 
     boolean hasBeanValidationConstraints(PropertyInformation propertyInformation)
     {
-        PropertyDetails propertyDetails = getPropertyDetails(propertyInformation);
+        PropertyDetails propertyDetails = ExtValUtils.getPropertyDetails(propertyInformation);
 
         return getDescriptorFor(propertyDetails.getBaseObject().getClass(), propertyDetails.getProperty()) != null;
     }
@@ -244,18 +249,12 @@
 
     private Class getBaseClassType(PropertyInformation propertyInformation)
     {
-        return getPropertyDetails(propertyInformation).getBaseObject().getClass();
+        return ExtValUtils.getPropertyDetails(propertyInformation).getBaseObject().getClass();
     }
 
     private String getPropertyToValidate(PropertyInformation propertyInformation)
     {
-        return getPropertyDetails(propertyInformation).getProperty();
-    }
-
-    private PropertyDetails getPropertyDetails(PropertyInformation propertyInformation)
-    {
-        return propertyInformation.getInformation(
-                PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
+        return ExtValUtils.getPropertyDetails(propertyInformation).getProperty();
     }
 
     //override this method in the jsf 2.0 version

Added: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/HtmlCoreComponentsComponentInitializer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/HtmlCoreComponentsComponentInitializer.java?rev=824451&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/HtmlCoreComponentsComponentInitializer.java (added)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/HtmlCoreComponentsComponentInitializer.java Mon Oct 12 18:41:12 2009
@@ -0,0 +1,131 @@
+/*
+ * 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.beanval;
+
+import org.apache.myfaces.extensions.validator.core.initializer.component.ComponentInitializer;
+import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.util.ReflectionUtils;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+
+import javax.faces.component.EditableValueHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.component.html.HtmlInputText;
+import javax.faces.component.html.HtmlInputSecret;
+import javax.faces.component.html.HtmlSelectBooleanCheckbox;
+import javax.faces.component.html.HtmlSelectOneListbox;
+import javax.faces.component.html.HtmlSelectOneMenu;
+import javax.faces.component.html.HtmlSelectOneRadio;
+import javax.faces.component.html.HtmlSelectManyCheckbox;
+import javax.faces.component.html.HtmlSelectManyListbox;
+import javax.faces.component.html.HtmlSelectManyMenu;
+import javax.faces.component.html.HtmlInputTextarea;
+import javax.faces.context.FacesContext;
+import java.util.Map;
+
+/**
+ * keep in sync with: org.apache.myfaces.extensions.validator.HtmlCoreComponentsComponentInitializer
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class HtmlCoreComponentsComponentInitializer implements ComponentInitializer
+{
+    public void configureComponent(FacesContext facesContext, UIComponent uiComponent, Map<String, Object> metaData)
+    {
+        if(processComponent(uiComponent))
+        {
+            configureRequiredAttribute(facesContext, uiComponent, metaData);
+            configureMaxLengthAttribute(facesContext, uiComponent, metaData);
+        }
+    }
+
+    protected void configureRequiredAttribute(FacesContext facesContext,
+                                              UIComponent uiComponent,
+                                              Map<String, Object> metaData)
+    {
+        if(!ExtValUtils.interpretEmptyStringValuesAsNull())
+        {
+            return;
+        }
+
+        if(Boolean.TRUE.equals(metaData.get(CommonMetaDataKeys.REQUIRED)) ||
+                Boolean.TRUE.equals(isComponentRequired(uiComponent)))
+        {
+            ((EditableValueHolder)uiComponent).setRequired(true);
+        }
+        else
+        {
+            ((EditableValueHolder)uiComponent).setRequired(false);
+        }
+    }
+
+    protected boolean processComponent(UIComponent uiComponent)
+    {
+        return uiComponent instanceof HtmlInputText ||
+                uiComponent instanceof HtmlInputSecret ||
+                uiComponent instanceof HtmlSelectBooleanCheckbox ||
+                uiComponent instanceof HtmlSelectOneListbox ||
+                uiComponent instanceof HtmlSelectOneMenu ||
+                uiComponent instanceof HtmlSelectOneRadio ||
+                uiComponent instanceof HtmlSelectManyCheckbox ||
+                uiComponent instanceof HtmlSelectManyListbox ||
+                uiComponent instanceof HtmlSelectManyMenu ||
+                uiComponent instanceof HtmlInputTextarea;
+    }
+
+    /**
+     * if there is no special attribute at the component which should overrule
+     * the annotated property return true!
+     *
+     * @param uiComponent component which implements the EditableValueHolder interface
+     * @return false to overrule the annotated property e.g. if component is readonly
+     */
+    protected Boolean isComponentRequired(UIComponent uiComponent)
+    {
+        boolean isReadOnly = !Boolean.FALSE.equals(ReflectionUtils.tryToInvokeMethod(
+                uiComponent, ReflectionUtils.tryToGetMethod(uiComponent.getClass(), "isReadonly")));
+        boolean isDisabled = !Boolean.FALSE.equals(ReflectionUtils.tryToInvokeMethod(
+                uiComponent, ReflectionUtils.tryToGetMethod(uiComponent.getClass(), "isDisabled")));
+
+        return !(isReadOnly || isDisabled);
+    }
+
+    protected void configureMaxLengthAttribute(FacesContext facesContext,
+                                             UIComponent uiComponent,
+                                             Map<String, Object> metaData)
+    {
+        if(metaData.containsKey(CommonMetaDataKeys.MAX_LENGTH))
+        {
+            Object maxLength = metaData.get(CommonMetaDataKeys.MAX_LENGTH);
+
+            if(!(maxLength instanceof Integer))
+            {
+                return;
+            }
+            if(uiComponent instanceof HtmlInputText)
+            {
+                HtmlInputText htmlInputText = (HtmlInputText)uiComponent;
+                htmlInputText.setMaxlength((Integer)maxLength);
+            }
+        }
+    }
+}
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/PropertyValidationGroupProvider.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/PropertyValidationGroupProvider.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/PropertyValidationGroupProvider.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/PropertyValidationGroupProvider.java Mon Oct 12 18:41:12 2009
@@ -18,34 +18,15 @@
  */
 package org.apache.myfaces.extensions.validator.beanval.interceptor;
 
-import org.apache.myfaces.extensions.validator.core.interceptor.PropertyValidationInterceptor;
-import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
-import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
-import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
-import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
-import org.apache.myfaces.extensions.validator.core.el.ELHelper;
-import org.apache.myfaces.extensions.validator.core.el.ValueBindingExpression;
-import org.apache.myfaces.extensions.validator.core.ValidationModuleAware;
-import org.apache.myfaces.extensions.validator.util.ExtValUtils;
-import org.apache.myfaces.extensions.validator.util.ReflectionUtils;
-import org.apache.myfaces.extensions.validator.beanval.storage.ModelValidationEntry;
-import org.apache.myfaces.extensions.validator.beanval.ExtValBeanValidationContext;
-import org.apache.myfaces.extensions.validator.beanval.BeanValidationModuleKey;
-import org.apache.myfaces.extensions.validator.beanval.annotation.extractor.DefaultGroupControllerScanningExtractor;
-import org.apache.myfaces.extensions.validator.beanval.annotation.BeanValidation;
-import org.apache.myfaces.extensions.validator.beanval.annotation.ModelValidation;
-import org.apache.myfaces.extensions.validator.internal.ToDo;
-import org.apache.myfaces.extensions.validator.internal.Priority;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.extensions.validator.beanval.BeanValidationModuleKey;
+import org.apache.myfaces.extensions.validator.core.ValidationModuleAware;
+import org.apache.myfaces.extensions.validator.core.interceptor.PropertyValidationInterceptor;
 
-import javax.faces.context.FacesContext;
 import javax.faces.component.UIComponent;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
+import javax.faces.context.FacesContext;
 import java.util.Map;
-import java.lang.reflect.Method;
 
 /**
  * validation interceptor which extracts all groups for the validation process
@@ -53,6 +34,7 @@
  * @author Gerhard Petracek
  * @since x.x.3
  */
+@Deprecated
 public class PropertyValidationGroupProvider implements PropertyValidationInterceptor, ValidationModuleAware
 {
     protected final Log logger = LogFactory.getLog(getClass());
@@ -62,11 +44,6 @@
                                     Object convertedObject,
                                     Map<String, Object> properties)
     {
-        if(properties.containsKey(PropertyInformation.class.getName()))
-        {
-            addMetaDataToContext(
-                    (PropertyInformation)properties.get(PropertyInformation.class.getName()), uiComponent);
-        }
         return true;
     }
 
@@ -78,412 +55,8 @@
         //not used
     }
 
-    protected void addMetaDataToContext(PropertyInformation propertyInformation, UIComponent component)
-    {
-        PropertyDetails propertyDetails = propertyInformation
-                .getInformation(PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
-
-        String[] key = propertyDetails.getKey().split("\\.");
-
-        Object firstBean = ExtValUtils.getELHelper().getBean(key[0]);
-
-        List<Class> foundGroupsForPropertyValidation = new ArrayList<Class>();
-        List<Class> restrictedGroupsForPropertyValidation = new ArrayList<Class>();
-        List<ModelValidationEntry> modelValidationEntryList = new ArrayList<ModelValidationEntry>();
-        List<Class> restrictedGroupsForModelValidation = new ArrayList<Class>();
-
-        //extract bv-controller-annotation of
-
-        //first bean
-        processClass(firstBean,
-                foundGroupsForPropertyValidation,
-                restrictedGroupsForPropertyValidation,
-                modelValidationEntryList,
-                restrictedGroupsForModelValidation);
-
-        //first property
-        processFieldsAndProperties(key[0] + "." + key[1],
-                firstBean,
-                key[1],
-                foundGroupsForPropertyValidation,
-                restrictedGroupsForPropertyValidation,
-                modelValidationEntryList,
-                restrictedGroupsForModelValidation);
-
-        //base object (of target property)
-        processClass(propertyDetails.getBaseObject(),
-                foundGroupsForPropertyValidation,
-                restrictedGroupsForPropertyValidation,
-                modelValidationEntryList,
-                restrictedGroupsForModelValidation);
-
-        //last property
-        processFieldsAndProperties(
-                propertyDetails.getKey(),
-                propertyDetails.getBaseObject(),
-                propertyDetails.getProperty(),
-                foundGroupsForPropertyValidation,
-                restrictedGroupsForPropertyValidation,
-                modelValidationEntryList,
-                restrictedGroupsForModelValidation);
-
-        ExtValBeanValidationContext extValBeanValidationContext = ExtValBeanValidationContext.getCurrentInstance();
-        String currentViewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
-
-        String clientId = component.getClientId(FacesContext.getCurrentInstance());
-
-        processFoundGroups(extValBeanValidationContext, currentViewId, clientId,
-                foundGroupsForPropertyValidation);
-
-        processRestrictedGroups(extValBeanValidationContext, currentViewId, clientId,
-                restrictedGroupsForPropertyValidation);
-
-        initModelValidation(extValBeanValidationContext, currentViewId, component, propertyDetails,
-                modelValidationEntryList, restrictedGroupsForModelValidation);
-    }
-
-    private void processClass(Object objectToInspect,
-                              List<Class> foundGroupsForPropertyValidation,
-                              List<Class> restrictedGroupsForPropertyValidation,
-                              List<ModelValidationEntry> modelValidationEntryList,
-                              List<Class> restrictedGroupsForModelValidation)
-    {
-        Class classToInspect = objectToInspect.getClass();
-        while (!Object.class.getName().equals(classToInspect.getName()))
-        {
-            transferGroupValidationInformationToFoundGroups(objectToInspect,
-                    foundGroupsForPropertyValidation,
-                    restrictedGroupsForPropertyValidation,
-                    modelValidationEntryList,
-                    restrictedGroupsForModelValidation);
-
-            processInterfaces(objectToInspect.getClass(), objectToInspect,
-                    foundGroupsForPropertyValidation,
-                    restrictedGroupsForPropertyValidation,
-                    modelValidationEntryList,
-                    restrictedGroupsForModelValidation);
-
-            classToInspect = classToInspect.getSuperclass();
-        }
-    }
-
-    private void processFieldsAndProperties(String key,
-                                            Object base,
-                                            String property, List<Class> foundGroupsForPropertyValidation,
-                                            List<Class> restrictedGroupsForPropertyValidation,
-                                            List<ModelValidationEntry> modelValidationEntryList,
-                                            List<Class> restrictedGroupsForModelValidation)
-    {
-        PropertyInformation propertyInformation = new DefaultGroupControllerScanningExtractor()
-                .extract(FacesContext.getCurrentInstance(), new PropertyDetails(key, base, property));
-
-        for (MetaDataEntry metaDataEntry : propertyInformation.getMetaDataEntries())
-        {
-            if (metaDataEntry.getValue() instanceof BeanValidation)
-            {
-                processMetaData((BeanValidation) metaDataEntry.getValue(),
-                        base,
-                        foundGroupsForPropertyValidation,
-                        restrictedGroupsForPropertyValidation,
-                        modelValidationEntryList,
-                        restrictedGroupsForModelValidation);
-            }
-            else if(metaDataEntry.getValue() instanceof BeanValidation.List)
-            {
-                for(BeanValidation currentBeanValidation : ((BeanValidation.List)metaDataEntry.getValue()).value())
-                {
-                    processMetaData(currentBeanValidation,
-                            base,
-                            foundGroupsForPropertyValidation,
-                            restrictedGroupsForPropertyValidation,
-                            modelValidationEntryList,
-                            restrictedGroupsForModelValidation);
-                }
-            }
-        }
-    }
-
-    protected void processFoundGroups(ExtValBeanValidationContext extValBeanValidationContext,
-                                      String currentViewId,
-                                      String clientId,
-                                      List<Class> foundGroupsForPropertyValidation)
-    {
-        /*
-         * add found groups to context
-         */
-        for (Class currentGroupClass : foundGroupsForPropertyValidation)
-        {
-            extValBeanValidationContext.addGroup(currentGroupClass, currentViewId, clientId);
-        }
-    }
-
-    protected void processRestrictedGroups(ExtValBeanValidationContext extValBeanValidationContext,
-                                         String currentViewId,
-                                         String clientId,
-                                         List<Class> restrictedGroupsForPropertyValidation)
-    {
-        /*
-         * add restricted groups
-         */
-        for (Class currentGroupClass : restrictedGroupsForPropertyValidation)
-        {
-            extValBeanValidationContext.restrictGroup(currentGroupClass, currentViewId, clientId);
-        }
-    }
-
-    protected void initModelValidation(ExtValBeanValidationContext extValBeanValidationContext,
-                                     String currentViewId,
-                                     UIComponent component,
-                                     PropertyDetails propertyDetails,
-                                     List<ModelValidationEntry> modelValidationEntryList,
-                                     List<Class> restrictedGroupsForModelValidation)
-    {
-        /*
-         * add model validation entry list
-         */
-        for(ModelValidationEntry modelValidationEntry : modelValidationEntryList)
-        {
-            for(Class restrictedGroup : restrictedGroupsForModelValidation)
-            {
-                modelValidationEntry.removeGroup(restrictedGroup);
-            }
-
-            if(modelValidationEntry.getGroups().length > 0)
-            {
-                addTargetsForModelValidation(modelValidationEntry, propertyDetails.getBaseObject());
-                extValBeanValidationContext.addModelValidationEntry(modelValidationEntry, currentViewId, component);
-            }
-        }
-    }
-
-    private void transferGroupValidationInformationToFoundGroups(Object objectToInspect,
-                                                                 List<Class> foundGroupsForPropertyValidation,
-                                                                 List<Class> restrictedGroupsForPropertyValidation,
-                                                                 List<ModelValidationEntry> modelValidationEntryList,
-                                                                 List<Class> restrictedGroupsForModelValidation)
-    {
-        if (objectToInspect.getClass().isAnnotationPresent(BeanValidation.class))
-        {
-            processMetaData(objectToInspect.getClass().getAnnotation(BeanValidation.class),
-                    objectToInspect,
-                    foundGroupsForPropertyValidation,
-                    restrictedGroupsForPropertyValidation,
-                    modelValidationEntryList,
-                    restrictedGroupsForModelValidation);
-        }
-        else if (objectToInspect.getClass().isAnnotationPresent(BeanValidation.List.class))
-        {
-            for(BeanValidation currentBeanValidation :
-                    (objectToInspect.getClass().getAnnotation(BeanValidation.List.class)).value())
-            {
-                processMetaData(currentBeanValidation,
-                        objectToInspect,
-                        foundGroupsForPropertyValidation,
-                        restrictedGroupsForPropertyValidation,
-                        modelValidationEntryList,
-                        restrictedGroupsForModelValidation);
-            }
-        }
-    }
-
-    private void processInterfaces(Class currentClass,
-                                   Object metaDataSourceObject,
-                                   List<Class> foundGroupsForPropertyValidation,
-                                   List<Class> restrictedGroupsForPropertyValidation,
-                                   List<ModelValidationEntry> modelValidationEntryList,
-                                   List<Class> restrictedGroupsForModelValidation)
-    {
-        for (Class currentInterface : currentClass.getInterfaces())
-        {
-            transferGroupValidationInformationToFoundGroups(metaDataSourceObject,
-                    foundGroupsForPropertyValidation,
-                    restrictedGroupsForPropertyValidation,
-                    modelValidationEntryList,
-                    restrictedGroupsForModelValidation);
-
-            processInterfaces(currentInterface, metaDataSourceObject,
-                    foundGroupsForPropertyValidation,
-                    restrictedGroupsForPropertyValidation,
-                    modelValidationEntryList,
-                    restrictedGroupsForModelValidation);
-        }
-    }
-
-    protected void processMetaData(BeanValidation beanValidation,
-                                 Object metaDataSourceObject,
-                                 List<Class> foundGroupsForPropertyValidation,
-                                 List<Class> restrictedGroupsForPropertyValidation,
-                                 List<ModelValidationEntry> modelValidationEntryList,
-                                 List<Class> restrictedGroupsForModelValidation)
-    {
-        for (String currentViewId : beanValidation.viewIds())
-        {
-            if ((currentViewId.equals(FacesContext.getCurrentInstance().getViewRoot().getViewId()) ||
-                    currentViewId.equals("*")) && isValidationPermitted(beanValidation))
-            {
-                if(isModelValidation(beanValidation))
-                {
-                    addModelValidationEntry(
-                            beanValidation, metaDataSourceObject,
-                            modelValidationEntryList, restrictedGroupsForModelValidation);
-                }
-                else
-                {
-                    processGroups(
-                            beanValidation, foundGroupsForPropertyValidation, restrictedGroupsForPropertyValidation);
-                }
-
-                return;
-            }
-        }
-    }
-
-    private void addTargetsForModelValidation(ModelValidationEntry modelValidationEntry, Object defaultTarget)
-    {
-        if(modelValidationEntry.getMetaData().validationTargets().length == 1 &&
-                modelValidationEntry.getMetaData().validationTargets()[0].equals(ModelValidation.DEFAULT_TARGET))
-        {
-            modelValidationEntry.addValidationTarget(defaultTarget);
-        }
-        else
-        {
-            Object target;
-            for(String modelValidationTarget : modelValidationEntry.getMetaData().validationTargets())
-            {
-                target = resolveTarget(modelValidationEntry.getMetaDataSourceObject(), modelValidationTarget);
-
-                if(target == null && this.logger.isErrorEnabled())
-                {
-                    this.logger.error("target unreachable - source class: " +
-                            modelValidationEntry.getMetaDataSourceObject().getClass().getName() +
-                            " target to resolve: " + modelValidationTarget);
-                }
-
-                modelValidationEntry.addValidationTarget(target);
-            }
-        }
-    }
-
-    private boolean isValidationPermitted(BeanValidation beanValidation)
-    {
-        ELHelper elHelper = ExtValUtils.getELHelper();
-
-        for(String condition : beanValidation.conditions())
-        {
-            if(elHelper.isELTermWellFormed(condition) &&
-                    elHelper.isELTermValid(FacesContext.getCurrentInstance(), condition))
-            {
-                if(Boolean.TRUE.equals(
-                        elHelper.getValueOfExpression(
-                                FacesContext.getCurrentInstance(), new ValueBindingExpression(condition))))
-                {
-                    return true;
-                }
-            }
-            else
-            {
-                if(this.logger.isErrorEnabled())
-                {
-                    this.logger.error("an invalid condition is used: " + condition);
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean isModelValidation(BeanValidation beanValidation)
-    {
-        return beanValidation.modelValidation().isActive();
-    }
-
-    private void addModelValidationEntry(BeanValidation beanValidation,
-                                         Object metaDataSourceObject,
-                                         List<ModelValidationEntry> modelValidationEntryList,
-                                         List<Class> restrictedGroupsForModelValidation)
-    {
-        ModelValidationEntry modelValidationEntry = new ModelValidationEntry();
-
-        modelValidationEntry.setGroups(Arrays.asList(beanValidation.useGroups()));
-        modelValidationEntry.setMetaData(beanValidation.modelValidation());
-        modelValidationEntry.setMetaDataSourceObject(metaDataSourceObject);
-
-        if(beanValidation.restrictGroups().length > 0)
-        {
-            restrictedGroupsForModelValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
-        }
-
-        modelValidationEntryList.add(modelValidationEntry);
-    }
-
-    private void processGroups(BeanValidation beanValidation,
-                           List<Class> foundGroupsForPropertyValidation,
-                           List<Class> restrictedGroupsForPropertyValidation)
-    {
-        foundGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.useGroups()));
-
-        if(beanValidation.restrictGroups().length > 0)
-        {
-            restrictedGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
-        }
-    }
-
-    private Object resolveTarget(Object metaDataSourceObject, String modelValidationTarget)
-    {
-        ELHelper elHelper = ExtValUtils.getELHelper();
-
-        if(elHelper.isELTermWellFormed(modelValidationTarget))
-        {
-            if(elHelper.isELTermValid(FacesContext.getCurrentInstance(), modelValidationTarget))
-            {
-                return elHelper.getValueOfExpression(
-                        FacesContext.getCurrentInstance(), new ValueBindingExpression(modelValidationTarget));
-            }
-            else
-            {
-                if(this.logger.isErrorEnabled())
-                {
-                    this.logger.error("an invalid binding is used: " + modelValidationTarget);
-                }
-            }
-        }
-
-        String[] properties = modelValidationTarget.split("\\.");
-
-        Object result = metaDataSourceObject;
-        for(String property : properties)
-        {
-            result = getValueOfProperty(result, property);
-
-            if(result == null)
-            {
-                return null;
-            }
-        }
-
-        return result;
-    }
-
-    @ToDo(value = Priority.HIGH, description = "move to util class - the original method is in LocalCompareStrategy")
-    protected Object getValueOfProperty(Object base, String property)
-    {
-        property = property.substring(0,1).toUpperCase() + property.substring(1, property.length());
-        Method targetMethod = ReflectionUtils.tryToGetMethod(base.getClass(), "get" + property);
-
-        if(targetMethod == null)
-        {
-            targetMethod = ReflectionUtils.tryToGetMethod(base.getClass(), "is" + property);
-        }
-
-        if(targetMethod == null)
-        {
-            throw new IllegalStateException(
-                "class " + base.getClass() + " has no public get/is " + property.toLowerCase());
-        }
-        return ReflectionUtils.tryToInvokeMethod(base, targetMethod);
-    }
-
     public String[] getModuleKeys()
     {
-        return new String[] {BeanValidationModuleKey.class.getName()};
+        return new String[]{BeanValidationModuleKey.class.getName()};
     }
 }

Added: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/NotNullMetaDataTransformer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/NotNullMetaDataTransformer.java?rev=824451&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/NotNullMetaDataTransformer.java (added)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/NotNullMetaDataTransformer.java Mon Oct 12 18:41:12 2009
@@ -0,0 +1,40 @@
+/*
+ * 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.beanval.metadata.transformer;
+
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+public class NotNullMetaDataTransformer implements MetaDataTransformer
+{
+    public Map<String, Object> convertMetaData(MetaDataEntry metaDataEntry)
+    {
+        Map<String, Object> results = new HashMap<String, Object>();
+        results.put(CommonMetaDataKeys.WEAK_REQUIRED, true);
+        return results;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java?rev=824451&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java (added)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java Mon Oct 12 18:41:12 2009
@@ -0,0 +1,57 @@
+/*
+ * 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.beanval.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.Nested;
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
+        .AbstractValidationStrategyToMetaDataTransformerNameMapper;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.beanval.validation.strategy.BeanValidationVirtualValidationStrategy;
+import org.apache.myfaces.extensions.validator.beanval.metadata.transformer.NotNullMetaDataTransformer;
+
+import javax.validation.metadata.ConstraintDescriptor;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@Nested
+@UsageInformation({UsageCategory.INTERNAL})
+public class NotNullNameMapper extends AbstractValidationStrategyToMetaDataTransformerNameMapper
+{
+    public String createName(ValidationStrategy source)
+    {
+        if(source instanceof BeanValidationVirtualValidationStrategy)
+        {
+            BeanValidationVirtualValidationStrategy beanValidationAdapter =
+                    (BeanValidationVirtualValidationStrategy)source;
+
+            ConstraintDescriptor descriptor = beanValidationAdapter.getConstraintDescriptor();
+
+            if(NotNull.class.getName().equals(descriptor.getAnnotation().annotationType().getName()))
+            {
+                return NotNullMetaDataTransformer.class.getName();
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java Mon Oct 12 18:41:12 2009
@@ -19,7 +19,9 @@
 package org.apache.myfaces.extensions.validator.beanval.metadata.transformer.mapper;
 
 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
-import org.apache.myfaces.extensions.validator.core.mapper.SubNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
+        .AbstractValidationStrategyToMetaDataTransformerNameMapper;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.beanval.validation.strategy.BeanValidationVirtualValidationStrategy;
@@ -32,8 +34,9 @@
  * @author Gerhard Petracek
  * @since x.x.3
  */
+@Nested
 @UsageInformation({UsageCategory.INTERNAL})
-public class SizeNameMapper implements SubNameMapper<ValidationStrategy>
+public class SizeNameMapper extends AbstractValidationStrategyToMetaDataTransformerNameMapper
 {
     public String createName(ValidationStrategy source)
     {

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java?rev=824451&r1=824450&r2=824451&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java Mon Oct 12 18:41:12 2009
@@ -19,9 +19,10 @@
 package org.apache.myfaces.extensions.validator.beanval.startup;
 
 import org.apache.myfaces.extensions.validator.beanval.BeanValidationInterceptor;
+import org.apache.myfaces.extensions.validator.beanval.HtmlCoreComponentsComponentInitializer;
 import org.apache.myfaces.extensions.validator.beanval.validation.ModelValidationPhaseListener;
-import org.apache.myfaces.extensions.validator.beanval.interceptor.PropertyValidationGroupProvider;
 import org.apache.myfaces.extensions.validator.beanval.metadata.transformer.mapper.SizeNameMapper;
+import org.apache.myfaces.extensions.validator.beanval.metadata.transformer.mapper.NotNullNameMapper;
 import org.apache.myfaces.extensions.validator.beanval.storage.DefaultModelValidationStorageManager;
 import org.apache.myfaces.extensions.validator.beanval.storage.ModelValidationStorage;
 import org.apache.myfaces.extensions.validator.beanval.storage.mapper.BeanValidationGroupStorageNameMapper;
@@ -35,8 +36,6 @@
 import org.apache.myfaces.extensions.validator.core.storage.StorageManagerHolder;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
-import org.apache.myfaces.extensions.validator.internal.ToDo;
-import org.apache.myfaces.extensions.validator.internal.Priority;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 import org.apache.myfaces.extensions.validator.util.JsfUtils;
 
@@ -61,6 +60,7 @@
         registerGroupStorageNameMapper();
         registerModelValidationStorageNameMapper();
         registerModelValidationPhaseListener();
+        registerComponentInitializers();
     }
 
     protected void registerValidatorFactory()
@@ -74,15 +74,16 @@
         ExtValContext.getContext().registerRendererInterceptor(new BeanValidationInterceptor());
     }
 
+    @Deprecated
     protected void registerValidationGroupProvider()
     {
-        ExtValContext.getContext().addPropertyValidationInterceptor(new PropertyValidationGroupProvider());
+        //ExtValContext.getContext().addPropertyValidationInterceptor(new PropertyValidationGroupProvider());
     }
 
-    @ToDo(Priority.HIGH)
     protected void registerMetaDataTransformerNameMapper()
     {
         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(new SizeNameMapper());
+        ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(new NotNullNameMapper());
     }
 
     @SuppressWarnings({"unchecked"})
@@ -118,6 +119,11 @@
         JsfUtils.registerPhaseListener(new ModelValidationPhaseListener());
     }
 
+    protected void registerComponentInitializers()
+    {
+        ExtValContext.getContext().addComponentInitializer(new HtmlCoreComponentsComponentInitializer());
+    }
+
     private StorageManagerHolder getStorageManagerHolder()
     {
         return (ExtValContext.getContext()

Added: 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=824451&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java (added)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java Mon Oct 12 18:41:12 2009
@@ -0,0 +1,465 @@
+/*
+ * 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.beanval.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.extensions.validator.beanval.ExtValBeanValidationContext;
+import org.apache.myfaces.extensions.validator.beanval.annotation.BeanValidation;
+import org.apache.myfaces.extensions.validator.beanval.annotation.ModelValidation;
+import org.apache.myfaces.extensions.validator.beanval.annotation.extractor.DefaultGroupControllerScanningExtractor;
+import org.apache.myfaces.extensions.validator.beanval.storage.ModelValidationEntry;
+import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
+import org.apache.myfaces.extensions.validator.core.el.ELHelper;
+import org.apache.myfaces.extensions.validator.core.el.ValueBindingExpression;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.internal.Priority;
+import org.apache.myfaces.extensions.validator.internal.ToDo;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.util.ReflectionUtils;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class BeanValidationUtils
+{
+    private static final Log LOG = LogFactory.getLog(BeanValidationUtils.class);
+
+    @ToDo(value = Priority.LOW, description = "use it also in ModelValidationPhaseListener" +
+            "attention: only add one message per client id")
+    public static boolean supportMultipleViolationsPerField()
+    {
+        return "true".equalsIgnoreCase(WebXmlParameter.ACTIVATE_MULTIPLE_VIOLATION_MESSAGES_PER_FIELD);
+    }
+
+    public static void addMetaDataToContext(UIComponent component, PropertyDetails propertyDetails)
+    {
+        String[] key = propertyDetails.getKey().split("\\.");
+
+        Object firstBean = ExtValUtils.getELHelper().getBean(key[0]);
+
+        List<Class> foundGroupsForPropertyValidation = new ArrayList<Class>();
+        List<Class> restrictedGroupsForPropertyValidation = new ArrayList<Class>();
+        List<ModelValidationEntry> modelValidationEntryList = new ArrayList<ModelValidationEntry>();
+        List<Class> restrictedGroupsForModelValidation = new ArrayList<Class>();
+
+        //extract bv-controller-annotation of
+
+        //first bean
+        processClass(firstBean,
+                foundGroupsForPropertyValidation,
+                restrictedGroupsForPropertyValidation,
+                modelValidationEntryList,
+                restrictedGroupsForModelValidation);
+
+        //first property
+        processFieldsAndProperties(key[0] + "." + key[1],
+                firstBean,
+                key[1],
+                foundGroupsForPropertyValidation,
+                restrictedGroupsForPropertyValidation,
+                modelValidationEntryList,
+                restrictedGroupsForModelValidation);
+
+        //base object (of target property)
+        processClass(propertyDetails.getBaseObject(),
+                foundGroupsForPropertyValidation,
+                restrictedGroupsForPropertyValidation,
+                modelValidationEntryList,
+                restrictedGroupsForModelValidation);
+
+        //last property
+        processFieldsAndProperties(
+                propertyDetails.getKey(),
+                propertyDetails.getBaseObject(),
+                propertyDetails.getProperty(),
+                foundGroupsForPropertyValidation,
+                restrictedGroupsForPropertyValidation,
+                modelValidationEntryList,
+                restrictedGroupsForModelValidation);
+
+        ExtValBeanValidationContext extValBeanValidationContext = ExtValBeanValidationContext.getCurrentInstance();
+        String currentViewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
+
+        String clientId = component.getClientId(FacesContext.getCurrentInstance());
+
+        processFoundGroups(extValBeanValidationContext, currentViewId, clientId,
+                foundGroupsForPropertyValidation);
+
+        processRestrictedGroups(extValBeanValidationContext, currentViewId, clientId,
+                restrictedGroupsForPropertyValidation);
+
+        initModelValidation(extValBeanValidationContext, currentViewId, component, propertyDetails,
+                modelValidationEntryList, restrictedGroupsForModelValidation);
+    }
+
+    private static void processClass(Object objectToInspect,
+                                     List<Class> foundGroupsForPropertyValidation,
+                                     List<Class> restrictedGroupsForPropertyValidation,
+                                     List<ModelValidationEntry> modelValidationEntryList,
+                                     List<Class> restrictedGroupsForModelValidation)
+    {
+        Class classToInspect = objectToInspect.getClass();
+        while (!Object.class.getName().equals(classToInspect.getName()))
+        {
+            transferGroupValidationInformationToFoundGroups(objectToInspect,
+                    foundGroupsForPropertyValidation,
+                    restrictedGroupsForPropertyValidation,
+                    modelValidationEntryList,
+                    restrictedGroupsForModelValidation);
+
+            processInterfaces(objectToInspect.getClass(), objectToInspect,
+                    foundGroupsForPropertyValidation,
+                    restrictedGroupsForPropertyValidation,
+                    modelValidationEntryList,
+                    restrictedGroupsForModelValidation);
+
+            classToInspect = classToInspect.getSuperclass();
+        }
+    }
+
+    private static void processFieldsAndProperties(String key,
+                                                   Object base,
+                                                   String property, List<Class> foundGroupsForPropertyValidation,
+                                                   List<Class> restrictedGroupsForPropertyValidation,
+                                                   List<ModelValidationEntry> modelValidationEntryList,
+                                                   List<Class> restrictedGroupsForModelValidation)
+    {
+        PropertyInformation propertyInformation = new DefaultGroupControllerScanningExtractor()
+                .extract(FacesContext.getCurrentInstance(), new PropertyDetails(key, base, property));
+
+        for (MetaDataEntry metaDataEntry : propertyInformation.getMetaDataEntries())
+        {
+            if (metaDataEntry.getValue() instanceof BeanValidation)
+            {
+                processMetaData((BeanValidation) metaDataEntry.getValue(),
+                        base,
+                        foundGroupsForPropertyValidation,
+                        restrictedGroupsForPropertyValidation,
+                        modelValidationEntryList,
+                        restrictedGroupsForModelValidation);
+            }
+            else if (metaDataEntry.getValue() instanceof BeanValidation.List)
+            {
+                for (BeanValidation currentBeanValidation : ((BeanValidation.List) metaDataEntry.getValue()).value())
+                {
+                    processMetaData(currentBeanValidation,
+                            base,
+                            foundGroupsForPropertyValidation,
+                            restrictedGroupsForPropertyValidation,
+                            modelValidationEntryList,
+                            restrictedGroupsForModelValidation);
+                }
+            }
+        }
+    }
+
+    private static void processFoundGroups(ExtValBeanValidationContext extValBeanValidationContext,
+                                           String currentViewId,
+                                           String clientId,
+                                           List<Class> foundGroupsForPropertyValidation)
+    {
+        /*
+         * add found groups to context
+         */
+        for (Class currentGroupClass : foundGroupsForPropertyValidation)
+        {
+            extValBeanValidationContext.addGroup(currentGroupClass, currentViewId, clientId);
+        }
+    }
+
+    private static void processRestrictedGroups(ExtValBeanValidationContext extValBeanValidationContext,
+                                                String currentViewId,
+                                                String clientId,
+                                                List<Class> restrictedGroupsForPropertyValidation)
+    {
+        /*
+         * add restricted groups
+         */
+        for (Class currentGroupClass : restrictedGroupsForPropertyValidation)
+        {
+            extValBeanValidationContext.restrictGroup(currentGroupClass, currentViewId, clientId);
+        }
+    }
+
+    private static void initModelValidation(ExtValBeanValidationContext extValBeanValidationContext,
+                                            String currentViewId,
+                                            UIComponent component,
+                                            PropertyDetails propertyDetails,
+                                            List<ModelValidationEntry> modelValidationEntryList,
+                                            List<Class> restrictedGroupsForModelValidation)
+    {
+        /*
+         * add model validation entry list
+         */
+        for (ModelValidationEntry modelValidationEntry : modelValidationEntryList)
+        {
+            for (Class restrictedGroup : restrictedGroupsForModelValidation)
+            {
+                modelValidationEntry.removeGroup(restrictedGroup);
+            }
+
+            if (modelValidationEntry.getGroups().length > 0)
+            {
+                addTargetsForModelValidation(modelValidationEntry, propertyDetails.getBaseObject());
+                extValBeanValidationContext.addModelValidationEntry(modelValidationEntry, currentViewId, component);
+            }
+        }
+    }
+
+    private static void transferGroupValidationInformationToFoundGroups(
+            Object objectToInspect,
+            List<Class> foundGroupsForPropertyValidation,
+            List<Class> restrictedGroupsForPropertyValidation,
+            List<ModelValidationEntry> modelValidationEntryList,
+            List<Class> restrictedGroupsForModelValidation)
+    {
+        if (objectToInspect.getClass().isAnnotationPresent(BeanValidation.class))
+        {
+            processMetaData(objectToInspect.getClass().getAnnotation(BeanValidation.class),
+                    objectToInspect,
+                    foundGroupsForPropertyValidation,
+                    restrictedGroupsForPropertyValidation,
+                    modelValidationEntryList,
+                    restrictedGroupsForModelValidation);
+        }
+        else if (objectToInspect.getClass().isAnnotationPresent(BeanValidation.List.class))
+        {
+            for (BeanValidation currentBeanValidation :
+                    (objectToInspect.getClass().getAnnotation(BeanValidation.List.class)).value())
+            {
+                processMetaData(currentBeanValidation,
+                        objectToInspect,
+                        foundGroupsForPropertyValidation,
+                        restrictedGroupsForPropertyValidation,
+                        modelValidationEntryList,
+                        restrictedGroupsForModelValidation);
+            }
+        }
+    }
+
+    private static void processInterfaces(Class currentClass,
+                                          Object metaDataSourceObject,
+                                          List<Class> foundGroupsForPropertyValidation,
+                                          List<Class> restrictedGroupsForPropertyValidation,
+                                          List<ModelValidationEntry> modelValidationEntryList,
+                                          List<Class> restrictedGroupsForModelValidation)
+    {
+        for (Class currentInterface : currentClass.getInterfaces())
+        {
+            transferGroupValidationInformationToFoundGroups(metaDataSourceObject,
+                    foundGroupsForPropertyValidation,
+                    restrictedGroupsForPropertyValidation,
+                    modelValidationEntryList,
+                    restrictedGroupsForModelValidation);
+
+            processInterfaces(currentInterface, metaDataSourceObject,
+                    foundGroupsForPropertyValidation,
+                    restrictedGroupsForPropertyValidation,
+                    modelValidationEntryList,
+                    restrictedGroupsForModelValidation);
+        }
+    }
+
+    private static void processMetaData(BeanValidation beanValidation,
+                                        Object metaDataSourceObject,
+                                        List<Class> foundGroupsForPropertyValidation,
+                                        List<Class> restrictedGroupsForPropertyValidation,
+                                        List<ModelValidationEntry> modelValidationEntryList,
+                                        List<Class> restrictedGroupsForModelValidation)
+    {
+        for (String currentViewId : beanValidation.viewIds())
+        {
+            if ((currentViewId.equals(FacesContext.getCurrentInstance().getViewRoot().getViewId()) ||
+                    currentViewId.equals("*")) && isValidationPermitted(beanValidation))
+            {
+                if (isModelValidation(beanValidation))
+                {
+                    addModelValidationEntry(
+                            beanValidation, metaDataSourceObject,
+                            modelValidationEntryList, restrictedGroupsForModelValidation);
+                }
+                else
+                {
+                    processGroups(
+                            beanValidation, foundGroupsForPropertyValidation, restrictedGroupsForPropertyValidation);
+                }
+
+                return;
+            }
+        }
+    }
+
+    private static void addTargetsForModelValidation(ModelValidationEntry modelValidationEntry, Object defaultTarget)
+    {
+        if (modelValidationEntry.getMetaData().validationTargets().length == 1 &&
+                modelValidationEntry.getMetaData().validationTargets()[0].equals(ModelValidation.DEFAULT_TARGET))
+        {
+            modelValidationEntry.addValidationTarget(defaultTarget);
+        }
+        else
+        {
+            Object target;
+            for (String modelValidationTarget : modelValidationEntry.getMetaData().validationTargets())
+            {
+                target = resolveTarget(modelValidationEntry.getMetaDataSourceObject(), modelValidationTarget);
+
+                if (target == null && LOG.isErrorEnabled())
+                {
+                    LOG.error("target unreachable - source class: " +
+                            modelValidationEntry.getMetaDataSourceObject().getClass().getName() +
+                            " target to resolve: " + modelValidationTarget);
+                }
+
+                modelValidationEntry.addValidationTarget(target);
+            }
+        }
+    }
+
+    private static boolean isValidationPermitted(BeanValidation beanValidation)
+    {
+        ELHelper elHelper = ExtValUtils.getELHelper();
+
+        for (String condition : beanValidation.conditions())
+        {
+            if (elHelper.isELTermWellFormed(condition) &&
+                    elHelper.isELTermValid(FacesContext.getCurrentInstance(), condition))
+            {
+                if (Boolean.TRUE.equals(
+                        elHelper.getValueOfExpression(
+                                FacesContext.getCurrentInstance(), new ValueBindingExpression(condition))))
+                {
+                    return true;
+                }
+            }
+            else
+            {
+                if (LOG.isErrorEnabled())
+                {
+                    LOG.error("an invalid condition is used: " + condition);
+                }
+            }
+        }
+        return false;
+    }
+
+    private static boolean isModelValidation(BeanValidation beanValidation)
+    {
+        return beanValidation.modelValidation().isActive();
+    }
+
+    private static void addModelValidationEntry(BeanValidation beanValidation,
+                                                Object metaDataSourceObject,
+                                                List<ModelValidationEntry> modelValidationEntryList,
+                                                List<Class> restrictedGroupsForModelValidation)
+    {
+        ModelValidationEntry modelValidationEntry = new ModelValidationEntry();
+
+        modelValidationEntry.setGroups(Arrays.asList(beanValidation.useGroups()));
+        modelValidationEntry.setMetaData(beanValidation.modelValidation());
+        modelValidationEntry.setMetaDataSourceObject(metaDataSourceObject);
+
+        if (beanValidation.restrictGroups().length > 0)
+        {
+            restrictedGroupsForModelValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
+        }
+
+        modelValidationEntryList.add(modelValidationEntry);
+    }
+
+    private static void processGroups(BeanValidation beanValidation,
+                                      List<Class> foundGroupsForPropertyValidation,
+                                      List<Class> restrictedGroupsForPropertyValidation)
+    {
+        foundGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.useGroups()));
+
+        if (beanValidation.restrictGroups().length > 0)
+        {
+            restrictedGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
+        }
+    }
+
+    private static Object resolveTarget(Object metaDataSourceObject, String modelValidationTarget)
+    {
+        ELHelper elHelper = ExtValUtils.getELHelper();
+
+        if (elHelper.isELTermWellFormed(modelValidationTarget))
+        {
+            if (elHelper.isELTermValid(FacesContext.getCurrentInstance(), modelValidationTarget))
+            {
+                return elHelper.getValueOfExpression(
+                        FacesContext.getCurrentInstance(), new ValueBindingExpression(modelValidationTarget));
+            }
+            else
+            {
+                if (LOG.isErrorEnabled())
+                {
+                    LOG.error("an invalid binding is used: " + modelValidationTarget);
+                }
+            }
+        }
+
+        String[] properties = modelValidationTarget.split("\\.");
+
+        Object result = metaDataSourceObject;
+        for (String property : properties)
+        {
+            result = getValueOfProperty(result, property);
+
+            if (result == null)
+            {
+                return null;
+            }
+        }
+
+        return result;
+    }
+
+    @ToDo(value = Priority.HIGH, description = "move to util class - the original method is in LocalCompareStrategy")
+    private static Object getValueOfProperty(Object base, String property)
+    {
+        property = property.substring(0, 1).toUpperCase() + property.substring(1, property.length());
+        Method targetMethod = ReflectionUtils.tryToGetMethod(base.getClass(), "get" + property);
+
+        if (targetMethod == null)
+        {
+            targetMethod = ReflectionUtils.tryToGetMethod(base.getClass(), "is" + property);
+        }
+
+        if (targetMethod == null)
+        {
+            throw new IllegalStateException(
+                    "class " + base.getClass() + " has no public get/is " + property.toLowerCase());
+        }
+        return ReflectionUtils.tryToInvokeMethod(base, targetMethod);
+    }
+}