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/11/01 22:48:56 UTC

svn commit: r831766 [1/2] - in /myfaces/extensions/validator/branches/branch_for_jsf_1_1: 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/o...

Author: gpetracek
Date: Sun Nov  1 21:48:55 2009
New Revision: 831766

URL: http://svn.apache.org/viewvc?rev=831766&view=rev
Log:
EXTVAL-69 and small refactorings

Added:
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ValidationModuleKey.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ExtValBeanValidationMetaDataExtractionInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/property-validation/src/test/java/org/apache/myfaces/extensions/validator/test/core/interceptor/RegistrationModuleMetaDataExtractionInterceptorTestCase.java
Modified:
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/ComponentMetaDataExtractorFactory.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleKey.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/BeanValidation.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/ModelValidation.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleKey.java
    myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/annotation/extractor/DefaultPropertyScanningMetaDataExtractor.java

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java Sun Nov  1 21:48:55 2009
@@ -36,8 +36,6 @@
 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
 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.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 
@@ -260,8 +258,9 @@
         this.invocationOrderAwareContextHelper.addPropertyValidationInterceptor(propertyValidationInterceptor);
     }
 
-    @Deprecated
-    @ToDo(value = Priority.HIGH, description = "not used")
+    /**
+     * @return all global validation interceptors
+     */
     public List<PropertyValidationInterceptor> getPropertyValidationInterceptors()
     {
         this.invocationOrderAwareContextHelper.lazyInitPropertyValidationInterceptors();
@@ -283,12 +282,32 @@
         this.invocationOrderAwareContextHelper.addMetaDataExtractionInterceptor(metaDataExtractionInterceptor);
     }
 
+    /**
+     * @return all global meta-data extraction interceptors
+     */
     public List<MetaDataExtractionInterceptor> getMetaDataExtractionInterceptors()
     {
         this.invocationOrderAwareContextHelper.lazyInitMetaDataExtractionInterceptors();
         return this.invocationOrderAwareContextHelper.getMetaDataExtractionInterceptors();
     }
 
+    public List<MetaDataExtractionInterceptor> getMetaDataExtractionInterceptorsFor(Class moduleKey)
+    {
+        Map<String, Object> properties = new HashMap<String, Object>();
+
+        if(moduleKey != null)
+        {
+            properties.put(ValidationModuleKey.class.getName(), moduleKey);
+        }
+        return getMetaDataExtractionInterceptorsWith(properties);
+    }
+
+    public List<MetaDataExtractionInterceptor> getMetaDataExtractionInterceptorsWith(Map<String, Object> properties)
+    {
+        this.invocationOrderAwareContextHelper.lazyInitMetaDataExtractionInterceptors();
+        return this.invocationOrderAwareContextHelper.getMetaDataExtractionInterceptorsWith(properties);
+    }
+
     /*
      * ProcessedInformationRecorders
      */

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java Sun Nov  1 21:48:55 2009
@@ -44,6 +44,7 @@
     private final Log logger = LogFactory.getLog(getClass());
 
     private List<MetaDataExtractionInterceptor> metaDataExtractionInterceptors = null;
+    private Map<Class, List<MetaDataExtractionInterceptor>> moduleSpecificMetaDataExtractionInterceptors = null;
     private List<ValidationExceptionInterceptor> validationExceptionInterceptors = null;
     private List<PropertyValidationInterceptor> propertyValidationInterceptors = null;
     private Map<Class, List<PropertyValidationInterceptor>> moduleSpecificPropertyValidationInterceptors = null;
@@ -92,16 +93,14 @@
     {
         if (propertyValidationInterceptor instanceof ValidationModuleAware)
         {
-            addPropertyValidationInterceptorForModules(propertyValidationInterceptor,
-                    this.propertyValidationInterceptors, this.moduleSpecificPropertyValidationInterceptors);
+            addPropertyValidationInterceptorForModules(propertyValidationInterceptor);
+            sortModuleSpecificPropertyValidationInterceptors();
         }
         else
         {
-            addPropertyValidationInterceptorForModule(null, propertyValidationInterceptor,
-                    this.propertyValidationInterceptors, this.moduleSpecificPropertyValidationInterceptors);
+            addPropertyValidationInterceptorForModule(null, propertyValidationInterceptor);
+            sortPropertyValidationInterceptors();
         }
-
-        sortPropertyValidationInterceptors();
     }
 
     List<PropertyValidationInterceptor> getPropertyValidationInterceptors()
@@ -111,28 +110,18 @@
 
     List<PropertyValidationInterceptor> getPropertyValidationInterceptorsFor(Class moduleKey)
     {
-        List<PropertyValidationInterceptor> generalInterceptors = getPropertyValidationInterceptors();
+        List<PropertyValidationInterceptor> result = new ArrayList<PropertyValidationInterceptor>();
+
+        result.addAll(getPropertyValidationInterceptors());
 
-        if (moduleKey == null || !this.moduleSpecificPropertyValidationInterceptors.containsKey(moduleKey))
+        if (moduleKey != null && this.moduleSpecificPropertyValidationInterceptors.containsKey(moduleKey))
         {
-            return generalInterceptors;
+            result.addAll(this.moduleSpecificPropertyValidationInterceptors.get(moduleKey));
         }
-
-        List<PropertyValidationInterceptor> moduleSpecificInterceptors =
-                this.moduleSpecificPropertyValidationInterceptors.get(moduleKey);
-
-        List<PropertyValidationInterceptor> result = new ArrayList<PropertyValidationInterceptor>();
-        result.addAll(generalInterceptors);
-        result.addAll(moduleSpecificInterceptors);
-
-        sortPropertyValidationInterceptors(result);
-        return result;
+        return sortPropertyValidationInterceptorList(result);
     }
 
-    private void addPropertyValidationInterceptorForModules(PropertyValidationInterceptor propertyValidationInterceptor,
-                                                    List<PropertyValidationInterceptor> propertyValidationInterceptors,
-                                                    Map<Class, List<PropertyValidationInterceptor>>
-                                                            moduleSpecificPropertyValidationInterceptors)
+    private void addPropertyValidationInterceptorForModules(PropertyValidationInterceptor propertyValidationInterceptor)
     {
         Class moduleKey;
         for (String currentModuleKey : ((ValidationModuleAware) propertyValidationInterceptor).getModuleKeys())
@@ -144,44 +133,36 @@
                 continue;
             }
 
-            addPropertyValidationInterceptorForModule(moduleKey,
-                    propertyValidationInterceptor,
-                    propertyValidationInterceptors,
-                    moduleSpecificPropertyValidationInterceptors);
+            addPropertyValidationInterceptorForModule(moduleKey, propertyValidationInterceptor);
         }
     }
 
-    private void addPropertyValidationInterceptorForModule(Class moduleKey,
-                                                   PropertyValidationInterceptor propertyValidationInterceptor,
-                                                   List<PropertyValidationInterceptor> propertyValidationInterceptors,
-                                                   Map<Class, List<PropertyValidationInterceptor>>
-                                                           moduleSpecificPropertyValidationInterceptors)
+    private void addPropertyValidationInterceptorForModule(
+            Class moduleKey, PropertyValidationInterceptor propertyValidationInterceptor)
     {
         if (moduleKey == null)
         {
-            propertyValidationInterceptors.add(propertyValidationInterceptor);
+            this.propertyValidationInterceptors.add(propertyValidationInterceptor);
 
             if (logger.isTraceEnabled())
             {
-                logger.trace(propertyValidationInterceptor.getClass().getName() + " added");
+                logger.trace(propertyValidationInterceptor.getClass().getName() + " added as global interceptor");
             }
         }
         else
         {
             List<PropertyValidationInterceptor> propertyValidationInterceptorList;
-            if (moduleSpecificPropertyValidationInterceptors.containsKey(moduleKey))
+            if (this.moduleSpecificPropertyValidationInterceptors.containsKey(moduleKey))
             {
-                propertyValidationInterceptorList = moduleSpecificPropertyValidationInterceptors.get(moduleKey);
+                propertyValidationInterceptorList = this.moduleSpecificPropertyValidationInterceptors.get(moduleKey);
             }
             else
             {
                 propertyValidationInterceptorList = new ArrayList<PropertyValidationInterceptor>();
-                moduleSpecificPropertyValidationInterceptors.put(moduleKey, propertyValidationInterceptorList);
+                this.moduleSpecificPropertyValidationInterceptors.put(moduleKey, propertyValidationInterceptorList);
             }
             propertyValidationInterceptorList.add(propertyValidationInterceptor);
 
-            sortModuleSpecificPropertyValidationInterceptors(propertyValidationInterceptorList);
-
             if (logger.isTraceEnabled())
             {
                 logger.trace(propertyValidationInterceptor.getClass().getName() + " added for " + moduleKey.getName());
@@ -194,8 +175,65 @@
      */
     void addMetaDataExtractionInterceptor(MetaDataExtractionInterceptor metaDataExtractionInterceptor)
     {
-        this.metaDataExtractionInterceptors.add(metaDataExtractionInterceptor);
-        sortMetaDataExtractionInterceptors();
+        if(metaDataExtractionInterceptor instanceof ValidationModuleAware)
+        {
+            addMetaDataExtractionInterceptorForModules(metaDataExtractionInterceptor);
+            sortModuleSpecificMetaDataExtractionInterceptors();
+        }
+        else
+        {
+            addMetaDataExtractionInterceptorForModule(null, metaDataExtractionInterceptor);
+            sortMetaDataExtractionInterceptors();
+        }
+    }
+
+    private void addMetaDataExtractionInterceptorForModules(MetaDataExtractionInterceptor metaDataExtractionInterceptor)
+    {
+        Class moduleKey;
+        for (String currentModuleKey : ((ValidationModuleAware) metaDataExtractionInterceptor).getModuleKeys())
+        {
+            moduleKey = ClassUtils.tryToLoadClassForName(currentModuleKey);
+
+            if (moduleKey == null)
+            {
+                continue;
+            }
+
+            addMetaDataExtractionInterceptorForModule(moduleKey, metaDataExtractionInterceptor);
+        }
+    }
+
+    private void addMetaDataExtractionInterceptorForModule(
+            Class moduleKey, MetaDataExtractionInterceptor metaDataExtractionInterceptor)
+    {
+        if (moduleKey == null)
+        {
+            this.metaDataExtractionInterceptors.add(metaDataExtractionInterceptor);
+
+            if (logger.isTraceEnabled())
+            {
+                logger.trace(metaDataExtractionInterceptor.getClass().getName() + " added as global interceptor");
+            }
+        }
+        else
+        {
+            List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorList;
+            if (this.moduleSpecificMetaDataExtractionInterceptors.containsKey(moduleKey))
+            {
+                metaDataExtractionInterceptorList = this.moduleSpecificMetaDataExtractionInterceptors.get(moduleKey);
+            }
+            else
+            {
+                metaDataExtractionInterceptorList = new ArrayList<MetaDataExtractionInterceptor>();
+                this.moduleSpecificMetaDataExtractionInterceptors.put(moduleKey, metaDataExtractionInterceptorList);
+            }
+            metaDataExtractionInterceptorList.add(metaDataExtractionInterceptor);
+
+            if (logger.isTraceEnabled())
+            {
+                logger.trace(metaDataExtractionInterceptor.getClass().getName() + " added for " + moduleKey.getName());
+            }
+        }
     }
 
     List<MetaDataExtractionInterceptor> getMetaDataExtractionInterceptors()
@@ -203,6 +241,35 @@
         return this.metaDataExtractionInterceptors;
     }
 
+    List<MetaDataExtractionInterceptor> getMetaDataExtractionInterceptorsWith(Map<String, Object> properties)
+    {
+        List<MetaDataExtractionInterceptor> result = new ArrayList<MetaDataExtractionInterceptor>();
+
+        result.addAll(getMetaDataExtractionInterceptors());
+
+        Class moduleKey = tryToResolveModuleKey(properties);
+        if(moduleKey != null && this.moduleSpecificMetaDataExtractionInterceptors.containsKey(moduleKey))
+        {
+            result.addAll(this.moduleSpecificMetaDataExtractionInterceptors.get(moduleKey));
+        }
+
+        return sortMetaDataExtractionInterceptorList(result);
+    }
+
+    private Class tryToResolveModuleKey(Map<String, Object> properties)
+    {
+        Class moduleKey = null;
+        if(properties != null && properties.containsKey(ValidationModuleKey.class.getName()))
+        {
+            Object foundValue = properties.get(ValidationModuleKey.class.getName());
+            if(foundValue instanceof Class)
+            {
+                moduleKey = (Class)foundValue;
+            }
+        }
+        return moduleKey;
+    }
+
     /*
      * init
      */
@@ -250,6 +317,7 @@
         }
 
         metaDataExtractionInterceptors = new ArrayList<MetaDataExtractionInterceptor>();
+        moduleSpecificMetaDataExtractionInterceptors = new HashMap<Class, List<MetaDataExtractionInterceptor>>();
 
         List<String> metaDataExtractionInterceptorClassNames = new ArrayList<String>();
 
@@ -268,12 +336,7 @@
 
             if (metaDataExtractionInterceptor != null)
             {
-                metaDataExtractionInterceptors.add(metaDataExtractionInterceptor);
-
-                if (logger.isTraceEnabled())
-                {
-                    logger.trace(metaDataExtractionInterceptor.getClass().getName() + " added");
-                }
+                addMetaDataExtractionInterceptor(metaDataExtractionInterceptor);
             }
         }
     }
@@ -339,15 +402,11 @@
             {
                 if (propertyValidationInterceptor instanceof ValidationModuleAware)
                 {
-                    addPropertyValidationInterceptorForModules(propertyValidationInterceptor,
-                            propertyValidationInterceptors,
-                            moduleSpecificPropertyValidationInterceptors);
+                    addPropertyValidationInterceptorForModules(propertyValidationInterceptor);
                 }
                 else
                 {
-                    addPropertyValidationInterceptorForModule(null, propertyValidationInterceptor,
-                            propertyValidationInterceptors,
-                            moduleSpecificPropertyValidationInterceptors);
+                    addPropertyValidationInterceptorForModule(null, propertyValidationInterceptor);
                 }
             }
         }
@@ -361,35 +420,59 @@
         Collections.sort(this.componentInitializers, new InvocationOrderComparator<ComponentInitializer>());
     }
 
-    private void sortPropertyValidationInterceptors(List<PropertyValidationInterceptor> result)
-    {
-        Collections.sort(result, new InvocationOrderComparator<PropertyValidationInterceptor>());
-    }
-
     private void sortPropertyValidationInterceptors()
     {
         Collections.sort(this.propertyValidationInterceptors,
                 new InvocationOrderComparator<PropertyValidationInterceptor>());
     }
 
+    //sort all - it isn't a huge overhead since it's just done during the init-phase
+    private void sortModuleSpecificPropertyValidationInterceptors()
+    {
+        for(List<PropertyValidationInterceptor> propertyValidationInterceptorList :
+                this.moduleSpecificPropertyValidationInterceptors.values())
+        {
+            sortPropertyValidationInterceptorList(propertyValidationInterceptorList);
+        }
+    }
+
+    private List<PropertyValidationInterceptor> sortPropertyValidationInterceptorList(
+            List<PropertyValidationInterceptor> propertyValidationInterceptorList)
+    {
+        Collections.sort(propertyValidationInterceptorList,
+                    new InvocationOrderComparator<PropertyValidationInterceptor>());
+
+        return propertyValidationInterceptorList;
+    }
+
     private void sortValidationExceptionInterceptors()
     {
         Collections.sort(this.validationExceptionInterceptors,
                 new InvocationOrderComparator<ValidationExceptionInterceptor>());
     }
 
-    private void sortModuleSpecificPropertyValidationInterceptors(
-            List<PropertyValidationInterceptor> propertyValidationInterceptorList)
+    private void sortMetaDataExtractionInterceptors()
     {
-        if (propertyValidationInterceptorList != null)
+        Collections.sort(this.metaDataExtractionInterceptors,
+                new InvocationOrderComparator<MetaDataExtractionInterceptor>());
+    }
+
+    //sort all - it isn't a huge overhead since it's just done during the init-phase
+    private void sortModuleSpecificMetaDataExtractionInterceptors()
+    {
+        for(List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorList :
+                this.moduleSpecificMetaDataExtractionInterceptors.values())
         {
-            Collections.sort(propertyValidationInterceptorList, new InvocationOrderComparator<Object>());
+            sortMetaDataExtractionInterceptorList(metaDataExtractionInterceptorList);
         }
     }
 
-    private void sortMetaDataExtractionInterceptors()
+    private List<MetaDataExtractionInterceptor> sortMetaDataExtractionInterceptorList(
+            List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorList)
     {
-        Collections.sort(this.metaDataExtractionInterceptors,
-                new InvocationOrderComparator<MetaDataExtractionInterceptor>());
+        Collections.sort(metaDataExtractionInterceptorList,
+                    new InvocationOrderComparator<MetaDataExtractionInterceptor>());
+
+        return metaDataExtractionInterceptorList;
     }
-}
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ValidationModuleKey.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ValidationModuleKey.java?rev=831766&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ValidationModuleKey.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/ValidationModuleKey.java Sun Nov  1 21:48:55 2009
@@ -0,0 +1,38 @@
+/*
+ * 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.core;
+
+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;
+
+@Target(TYPE)
+@Retention(RUNTIME)
+@Documented
+/**
+ * marker annotation for module keys
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+public @interface ValidationModuleKey
+{
+}

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java Sun Nov  1 21:48:55 2009
@@ -65,7 +65,8 @@
             logger.trace("start to init component " + uiComponent.getClass().getName());
         }
 
-        Map<String, Object> metaDataResult = ExtValUtils.getTransformedMetaData(facesContext, uiComponent);
+        Map<String, Object> metaDataResult = ExtValUtils
+                .getTransformedMetaDataFor(facesContext, uiComponent, getModuleKey());
 
         //get component initializer for the current component and configure it
         //also in case of skipped validation to reset e.g. the required attribute
@@ -82,7 +83,7 @@
 
     protected void processValidation(FacesContext facesContext, UIComponent uiComponent, Object convertedObject)
     {
-        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
+        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractorFor(getModuleKey());
 
         PropertyInformation propertyInformation = metaDataExtractor.extract(facesContext, uiComponent);
 

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/ComponentMetaDataExtractorFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/ComponentMetaDataExtractorFactory.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/ComponentMetaDataExtractorFactory.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/ComponentMetaDataExtractorFactory.java Sun Nov  1 21:48:55 2009
@@ -21,6 +21,8 @@
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 
+import java.util.Map;
+
 /**
  * The interface for all factories which create meta-data extractors
  * 
@@ -31,4 +33,6 @@
 public interface ComponentMetaDataExtractorFactory
 {
     MetaDataExtractor create();
+
+    MetaDataExtractor createWith(Map<String, Object> properties);
 }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java Sun Nov  1 21:48:55 2009
@@ -32,6 +32,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This factory creates a meta-data extractor which extracts the meta-data
@@ -65,6 +66,11 @@
     @ToDo(value = Priority.MEDIUM, description = "logging")
     public MetaDataExtractor create()
     {
+        return createWith(null);
+    }
+
+    public MetaDataExtractor createWith(Map<String, Object> properties)
+    {
         if (metaDataExtractor == null)
         {
             List<String> metaDataExtractorClassNames = new ArrayList<String>();
@@ -91,6 +97,6 @@
             logger.trace(metaDataExtractor.getClass().getName() + " created");
         }
 
-        return ExtValUtils.createInterceptedMetaDataExtractor(metaDataExtractor);
+        return ExtValUtils.createInterceptedMetaDataExtractorWith(metaDataExtractor, properties);
     }
 }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java Sun Nov  1 21:48:55 2009
@@ -31,4 +31,5 @@
     static final String PROPERTY_DETAILS = "property_details";
     static final String SKIP_VALIDATION = "skip_validation";
     static final String LABEL = "label";
+    static final String CUSTOM_PROPERTIES = "custom_properties";
 }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java Sun Nov  1 21:48:55 2009
@@ -19,6 +19,8 @@
 package org.apache.myfaces.extensions.validator.core.storage;
 
 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 static org.apache.myfaces.extensions.validator.internal.UsageCategory.INTERNAL;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
@@ -185,6 +187,7 @@
         return targetClass.getName() + "#" + targetProperty;
     }
 
+    @ToDo(Priority.MEDIUM)
     private void copyMetaData(PropertyInformation source, PropertyInformation target)
     {
         MetaDataEntry newMetaDataEntry;

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java Sun Nov  1 21:48:55 2009
@@ -18,49 +18,50 @@
  */
 package org.apache.myfaces.extensions.validator.util;
 
-import org.apache.myfaces.extensions.validator.internal.UsageInformation;
-import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import org.apache.myfaces.extensions.validator.internal.ToDo;
-import org.apache.myfaces.extensions.validator.internal.Priority;
-import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
-import org.apache.myfaces.extensions.validator.core.validation.message.resolver.MessageResolver;
-import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameterExtractor;
-import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameterExtractorFactory;
-import org.apache.myfaces.extensions.validator.core.validation.parameter.ViolationSeverityInterpreter;
-import org.apache.myfaces.extensions.validator.core.factory.ClassMappingFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 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.storage.FacesMessageStorage;
-import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
-import org.apache.myfaces.extensions.validator.core.interceptor.ValidationExceptionInterceptor;
-import org.apache.myfaces.extensions.validator.core.interceptor.MetaDataExtractionInterceptor;
-import org.apache.myfaces.extensions.validator.core.interceptor.PropertyValidationInterceptor;
-import org.apache.myfaces.extensions.validator.core.validation.SkipValidationEvaluator;
-import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
-import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
-import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
-import org.apache.myfaces.extensions.validator.core.el.ELHelper;
+import org.apache.myfaces.extensions.validator.core.ValidationModuleKey;
 import org.apache.myfaces.extensions.validator.core.el.AbstractELHelperFactory;
+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.extractor.MetaDataExtractor;
-import org.apache.myfaces.extensions.validator.core.metadata.extractor.ComponentMetaDataExtractorFactory;
+import org.apache.myfaces.extensions.validator.core.factory.ClassMappingFactory;
+import org.apache.myfaces.extensions.validator.core.factory.FacesMessageFactory;
+import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;
+import org.apache.myfaces.extensions.validator.core.factory.NameMapperAwareFactory;
 import org.apache.myfaces.extensions.validator.core.initializer.component.ComponentInitializer;
-import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationNames;
 import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfiguration;
 import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationEntry;
-import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
+import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationNames;
+import org.apache.myfaces.extensions.validator.core.interceptor.MetaDataExtractionInterceptor;
+import org.apache.myfaces.extensions.validator.core.interceptor.PropertyValidationInterceptor;
+import org.apache.myfaces.extensions.validator.core.interceptor.ValidationExceptionInterceptor;
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
 import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
-import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;
-import org.apache.myfaces.extensions.validator.core.factory.NameMapperAwareFactory;
-import org.apache.myfaces.extensions.validator.core.factory.FacesMessageFactory;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.extensions.validator.core.metadata.extractor.ComponentMetaDataExtractorFactory;
+import org.apache.myfaces.extensions.validator.core.metadata.extractor.MetaDataExtractor;
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
+import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
+import org.apache.myfaces.extensions.validator.core.storage.FacesMessageStorage;
+import org.apache.myfaces.extensions.validator.core.storage.StorageManager;
+import org.apache.myfaces.extensions.validator.core.validation.SkipValidationEvaluator;
+import org.apache.myfaces.extensions.validator.core.validation.message.resolver.MessageResolver;
+import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameterExtractor;
+import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameterExtractorFactory;
+import org.apache.myfaces.extensions.validator.core.validation.parameter.ViolationSeverityInterpreter;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+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 javax.faces.application.FacesMessage;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.validator.ValidatorException;
-import javax.faces.application.FacesMessage;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.MissingResourceException;
@@ -122,9 +123,9 @@
     public static MetaDataTransformer getMetaDataTransformerForValidationStrategy(ValidationStrategy validationStrategy)
     {
         return ((ClassMappingFactory<ValidationStrategy, MetaDataTransformer>) ExtValContext
-                    .getContext().getFactoryFinder()
-                    .getFactory(FactoryNames.META_DATA_TRANSFORMER_FACTORY, ClassMappingFactory.class))
-                    .create(validationStrategy);
+                .getContext().getFactoryFinder()
+                .getFactory(FactoryNames.META_DATA_TRANSFORMER_FACTORY, ClassMappingFactory.class))
+                .create(validationStrategy);
     }
 
     public static void registerValidationStrategyToMetaDataTransformerNameMapper(
@@ -156,39 +157,57 @@
 
     public static MetaDataExtractor getComponentMetaDataExtractor()
     {
-            return ExtValContext.getContext().getFactoryFinder()
+        return ExtValContext.getContext().getFactoryFinder()
                 .getFactory(FactoryNames.COMPONENT_META_DATA_EXTRACTOR_FACTORY, ComponentMetaDataExtractorFactory.class)
                 .create();
     }
 
+    public static MetaDataExtractor getComponentMetaDataExtractorFor(Class moduleKey)
+    {
+        Map<String, Object> properties = new HashMap<String, Object>();
+
+        if(moduleKey != null)
+        {
+            properties.put(ValidationModuleKey.class.getName(), moduleKey);
+        }
+        return getComponentMetaDataExtractorWith(properties);
+    }
+
+    public static MetaDataExtractor getComponentMetaDataExtractorWith(Map<String, Object> properties)
+    {
+        return ExtValContext.getContext().getFactoryFinder()
+                .getFactory(FactoryNames.COMPONENT_META_DATA_EXTRACTOR_FACTORY, ComponentMetaDataExtractorFactory.class)
+                .createWith(properties);
+    }
+
     public static void configureComponentWithMetaData(FacesContext facesContext,
                                                       UIComponent uiComponent,
                                                       Map<String, Object> metaData)
     {
-        for(ComponentInitializer componentInitializer : ExtValContext.getContext().getComponentInitializers())
+        for (ComponentInitializer componentInitializer : ExtValContext.getContext().getComponentInitializers())
         {
             componentInitializer.configureComponent(facesContext, uiComponent, metaData);
         }
     }
 
     public static boolean executeAfterThrowingInterceptors(UIComponent uiComponent,
-                                                        MetaDataEntry metaDataEntry,
-                                                        Object convertedObject,
-                                                        ValidatorException validatorException,
-                                                        ValidationStrategy validatorExceptionSource)
+                                                           MetaDataEntry metaDataEntry,
+                                                           Object convertedObject,
+                                                           ValidatorException validatorException,
+                                                           ValidationStrategy validatorExceptionSource)
     {
         boolean result = true;
 
-        if(metaDataEntry == null)
+        if (metaDataEntry == null)
         {
             metaDataEntry = new MetaDataEntry();
         }
-        
-        for(ValidationExceptionInterceptor validationExceptionInterceptor : ExtValContext.getContext()
+
+        for (ValidationExceptionInterceptor validationExceptionInterceptor : ExtValContext.getContext()
                 .getValidationExceptionInterceptors())
         {
-            if(!validationExceptionInterceptor.afterThrowing(
-                            uiComponent, metaDataEntry, convertedObject, validatorException, validatorExceptionSource))
+            if (!validationExceptionInterceptor.afterThrowing(
+                    uiComponent, metaDataEntry, convertedObject, validatorException, validatorExceptionSource))
             {
                 result = false;
             }
@@ -199,27 +218,73 @@
 
     public static MetaDataExtractor createInterceptedMetaDataExtractor(final MetaDataExtractor metaDataExtractor)
     {
+        return createInterceptedMetaDataExtractorWith(metaDataExtractor, null);
+    }
+
+    public static MetaDataExtractor createInterceptedMetaDataExtractorFor(
+            final MetaDataExtractor metaDataExtractor, Class moduleKey)
+    {
+        Map<String, Object> properties = new HashMap<String, Object>();
+
+        if(moduleKey != null)
+        {
+            properties.put(ValidationModuleKey.class.getName(), moduleKey);
+        }
+        return createInterceptedMetaDataExtractorWith(metaDataExtractor, properties);
+    }
+
+    public static MetaDataExtractor createInterceptedMetaDataExtractorWith(
+            final MetaDataExtractor metaDataExtractor, final Map<String, Object> properties)
+    {
         return new MetaDataExtractor()
         {
             public PropertyInformation extract(FacesContext facesContext, Object object)
             {
                 PropertyInformation result = metaDataExtractor.extract(facesContext, object);
-                for(MetaDataExtractionInterceptor metaDataExtractionInterceptor :
-                        ExtValContext.getContext().getMetaDataExtractionInterceptors())
-                {
-                    metaDataExtractionInterceptor.afterExtracting(result);
-                }
+
+                addProperties(result, properties);
+                invokeMetaDataExtractionInterceptors(result, properties);
+
                 return result;
             }
         };
     }
 
+    private static void addProperties(PropertyInformation result, Map<String, Object> properties)
+    {
+        if(properties != null)
+        {
+            Map<String, Object> customProperties = getCustomProperties(result);
+            customProperties.putAll(properties);
+        }
+    }
+
+    private static Map<String, Object> getCustomProperties(PropertyInformation propertyInformation)
+    {
+        if(!propertyInformation.containsInformation(PropertyInformationKeys.CUSTOM_PROPERTIES))
+        {
+            propertyInformation.setInformation(
+                    PropertyInformationKeys.CUSTOM_PROPERTIES, new HashMap<String, Object>());
+        }
+
+        return (Map<String, Object>) propertyInformation.getInformation(PropertyInformationKeys.CUSTOM_PROPERTIES);
+    }
+
+    private static void invokeMetaDataExtractionInterceptors(PropertyInformation result, Map<String, Object> properties)
+    {
+        for (MetaDataExtractionInterceptor metaDataExtractionInterceptor :
+                ExtValContext.getContext().getMetaDataExtractionInterceptorsWith(properties))
+        {
+            metaDataExtractionInterceptor.afterExtracting(result);
+        }
+    }
+
     public static MessageResolver getMessageResolverForValidationStrategy(ValidationStrategy validationStrategy)
     {
-        return ((ClassMappingFactory<ValidationStrategy, MessageResolver>)ExtValContext.getContext()
-            .getFactoryFinder()
-            .getFactory(FactoryNames.MESSAGE_RESOLVER_FACTORY, ClassMappingFactory.class))
-            .create(validationStrategy);
+        return ((ClassMappingFactory<ValidationStrategy, MessageResolver>) ExtValContext.getContext()
+                .getFactoryFinder()
+                .getFactory(FactoryNames.MESSAGE_RESOLVER_FACTORY, ClassMappingFactory.class))
+                .create(validationStrategy);
     }
 
     public static void registerValidationStrategyToMessageResolverNameMapper(
@@ -252,7 +317,7 @@
     public static ELHelper getELHelper()
     {
         return ExtValContext.getContext().getFactoryFinder()
-            .getFactory(FactoryNames.EL_HELPER_FACTORY, AbstractELHelperFactory.class).create();
+                .getFactory(FactoryNames.EL_HELPER_FACTORY, AbstractELHelperFactory.class).create();
     }
 
     public static FacesMessage createFacesMessage(String summary, String detail)
@@ -263,52 +328,52 @@
     public static FacesMessage createFacesMessage(FacesMessage.Severity severity, String summary, String detail)
     {
         return ExtValContext.getContext().getFactoryFinder()
-            .getFactory(FactoryNames.FACES_MESSAGE_FACTORY, FacesMessageFactory.class)
+                .getFactory(FactoryNames.FACES_MESSAGE_FACTORY, FacesMessageFactory.class)
                 .create(severity, summary, detail);
     }
 
     public static FacesMessage convertFacesMessage(FacesMessage facesMessage)
     {
         return ExtValContext.getContext().getFactoryFinder()
-            .getFactory(FactoryNames.FACES_MESSAGE_FACTORY, FacesMessageFactory.class)
+                .getFactory(FactoryNames.FACES_MESSAGE_FACTORY, FacesMessageFactory.class)
                 .convert(facesMessage);
     }
 
     public static PropertyDetails createPropertyDetailsForNewTarget(MetaDataEntry metaDataEntry,
-                                                                                  String targetExpression)
+                                                                    String targetExpression)
     {
         Object baseObject;
-        if(getELHelper().isELTermWellFormed(targetExpression))
+        if (getELHelper().isELTermWellFormed(targetExpression))
         {
             ValueBindingExpression vbe = new ValueBindingExpression(targetExpression);
 
             String expression = vbe.getExpressionString();
             baseObject = getELHelper().getValueOfExpression(FacesContext.getCurrentInstance(), vbe.getBaseExpression());
             return new PropertyDetails(
-                expression.substring(2, expression.length() - 1), baseObject, vbe.getProperty());
+                    expression.substring(2, expression.length() - 1), baseObject, vbe.getProperty());
         }
 
         PropertyDetails original = metaDataEntry.getProperty(
-            PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
+                PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
 
         String newBaseKey = original.getKey().substring(0, original.getKey().lastIndexOf(".") + 1);
         String newKey = newBaseKey + targetExpression;
 
         baseObject = ReflectionUtils.getBaseOfPropertyChain(original.getBaseObject(), targetExpression);
         return new PropertyDetails(
-            newKey, baseObject, targetExpression.substring(targetExpression.lastIndexOf(".") + 1,
-            targetExpression.length()));
+                newKey, baseObject, targetExpression.substring(targetExpression.lastIndexOf(".") + 1,
+                        targetExpression.length()));
     }
 
     @UsageInformation(UsageCategory.INTERNAL)
     public static void tryToPlaceLabel(FacesMessage facesMessage, String label, int index)
     {
-        if(facesMessage.getSummary() != null && facesMessage.getSummary().contains("{" + index + "}"))
+        if (facesMessage.getSummary() != null && facesMessage.getSummary().contains("{" + index + "}"))
         {
             facesMessage.setSummary(facesMessage.getSummary().replace("{" + index + "}", label));
         }
 
-        if(facesMessage.getDetail() != null && facesMessage.getDetail().contains("{" + index + "}"))
+        if (facesMessage.getDetail() != null && facesMessage.getDetail().contains("{" + index + "}"))
         {
             facesMessage.setDetail(facesMessage.getDetail().replace("{" + index + "}", label));
         }
@@ -323,7 +388,7 @@
         //use try/catch for easier sync between trunk/branch
         try
         {
-            if(JsfUtils.getDefaultFacesMessageBundle().getString(JAVAX_FACES_MAXIMUM_DETAIL) != null)
+            if (JsfUtils.getDefaultFacesMessageBundle().getString(JAVAX_FACES_MAXIMUM_DETAIL) != null)
             {
                 facesRequiredMessageDetail = JsfUtils
                         .getDefaultFacesMessageBundle().getString(JAVAX_FACES_MAXIMUM_DETAIL);
@@ -350,7 +415,7 @@
         //use try/catch for easier sync between trunk/branch
         try
         {
-            if(JsfUtils.getDefaultFacesMessageBundle().getString(JAVAX_FACES_REQUIRED_DETAIL) != null)
+            if (JsfUtils.getDefaultFacesMessageBundle().getString(JAVAX_FACES_REQUIRED_DETAIL) != null)
             {
                 facesRequiredMessageDetail = JsfUtils
                         .getDefaultFacesMessageBundle().getString(JAVAX_FACES_REQUIRED_DETAIL);
@@ -367,9 +432,9 @@
 
     public static boolean isSkipableValidationStrategy(Class<? extends ValidationStrategy> targetClass)
     {
-        for(Class currentClass : getSkipValidationSupportClassList())
+        for (Class currentClass : getSkipValidationSupportClassList())
         {
-            if(isSkipValidationSupported(currentClass, targetClass))
+            if (isSkipValidationSupported(currentClass, targetClass))
             {
                 return true;
             }
@@ -393,19 +458,19 @@
         List<Class> markerList = new ArrayList<Class>();
 
         Class currentClass;
-        for(StaticConfiguration<String, String> currentEntry : staticConfigurationList)
+        for (StaticConfiguration<String, String> currentEntry : staticConfigurationList)
         {
-            for(StaticConfigurationEntry<String, String> currentConfigurationEntry : currentEntry.getMapping())
+            for (StaticConfigurationEntry<String, String> currentConfigurationEntry : currentEntry.getMapping())
             {
                 currentClass = ClassUtils.tryToLoadClassForName(currentConfigurationEntry.getTarget());
 
-                if(currentClass != null)
+                if (currentClass != null)
                 {
                     markerList.add(currentClass);
                 }
                 else
                 {
-                    if(LOGGER.isWarnEnabled())
+                    if (LOGGER.isWarnEnabled())
                     {
                         LOGGER.warn("configuration entry provides an invalid entry: "
                                 + currentConfigurationEntry.getTarget());
@@ -420,16 +485,16 @@
     @SuppressWarnings({"unchecked"})
     public static boolean isSkipValidationSupported(Class currentClass, Class targetClass)
     {
-        if(currentClass.isAnnotation())
+        if (currentClass.isAnnotation())
         {
-            if(targetClass.isAnnotationPresent(currentClass))
+            if (targetClass.isAnnotationPresent(currentClass))
             {
                 return true;
             }
         }
         else
         {
-            if(currentClass.isAssignableFrom(targetClass))
+            if (currentClass.isAssignableFrom(targetClass))
             {
                 return true;
             }
@@ -440,9 +505,9 @@
 
     public static ValidationParameterExtractor getValidationParameterExtractor()
     {
-        return ExtValContext.getContext().getFactoryFinder()
-            .getFactory(FactoryNames.VALIDATION_PARAMETER_EXTRACTOR_FACTORY, ValidationParameterExtractorFactory.class)
-            .create();
+        return ExtValContext.getContext().getFactoryFinder().getFactory(
+                FactoryNames.VALIDATION_PARAMETER_EXTRACTOR_FACTORY, ValidationParameterExtractorFactory.class)
+                .create();
     }
 
     public static boolean executeLocalBeforeValidationInterceptors(FacesContext facesContext,
@@ -457,15 +522,16 @@
                 annotation, PropertyValidationInterceptor.class, PropertyValidationInterceptor.class);
         boolean result = true;
 
-        if(properties != null)
+        if (properties != null)
         {
             propertyMap.put(propertyKey, properties);
         }
         propertyMap.put(Annotation.class.getName(), annotation);
 
-        for(PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
+        for (PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
         {
-            if(!propertyValidationInterceptor.beforeValidation(facesContext, uiComponent, convertedObject, propertyMap))
+            if (!propertyValidationInterceptor
+                    .beforeValidation(facesContext, uiComponent, convertedObject, propertyMap))
             {
                 result = false;
             }
@@ -485,13 +551,13 @@
         List<PropertyValidationInterceptor> propertyValidationInterceptors = getValidationParameterExtractor().extract(
                 annotation, PropertyValidationInterceptor.class, PropertyValidationInterceptor.class);
 
-        if(properties != null)
+        if (properties != null)
         {
             propertyMap.put(propertyKey, properties);
             propertyMap.put(Annotation.class.getName(), annotation);
         }
 
-        for(PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
+        for (PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
         {
             propertyValidationInterceptor.afterValidation(facesContext, uiComponent, convertedObject, propertyMap);
         }
@@ -508,7 +574,7 @@
         Map<String, Object> propertyMap = new HashMap<String, Object>();
         boolean result = true;
 
-        if(properties != null)
+        if (properties != null)
         {
             propertyMap.put(propertyKey, properties);
         }
@@ -516,9 +582,10 @@
         List<PropertyValidationInterceptor> propertyValidationInterceptors =
                 ExtValContext.getContext().getPropertyValidationInterceptorsFor(moduleKey);
 
-        for(PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
+        for (PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
         {
-            if(!propertyValidationInterceptor.beforeValidation(facesContext, uiComponent, convertedObject, propertyMap))
+            if (!propertyValidationInterceptor
+                    .beforeValidation(facesContext, uiComponent, convertedObject, propertyMap))
             {
                 result = false;
             }
@@ -537,7 +604,7 @@
     {
         Map<String, Object> propertyMap = new HashMap<String, Object>();
 
-        if(properties != null)
+        if (properties != null)
         {
             propertyMap.put(propertyKey, properties);
         }
@@ -545,7 +612,7 @@
         List<PropertyValidationInterceptor> propertyValidationInterceptors =
                 ExtValContext.getContext().getPropertyValidationInterceptorsFor(moduleKey);
 
-        for(PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
+        for (PropertyValidationInterceptor propertyValidationInterceptor : propertyValidationInterceptors)
         {
             propertyValidationInterceptor.afterValidation(facesContext, uiComponent, convertedObject, propertyMap);
         }
@@ -553,7 +620,7 @@
 
     public static <T> T getStorage(Class<T> storageType, String storageName)
     {
-        return (T)getStorageManagerFactory().create(storageType).create(storageName);
+        return (T) getStorageManagerFactory().create(storageType).create(storageName);
     }
 
     public static void resetStorage(Class storageType, String storageName)
@@ -570,10 +637,29 @@
 
     public static Map<String, Object> getTransformedMetaData(FacesContext facesContext, UIComponent uiComponent)
     {
+        return getTransformedMetaDataFor(facesContext, uiComponent, null);
+    }
+
+    public static Map<String, Object> getTransformedMetaDataFor(
+            FacesContext facesContext, UIComponent uiComponent, Class moduleKey)
+    {
+        Map<String, Object> properties = new HashMap<String, Object>();
+
+        if(moduleKey != null)
+        {
+            properties.put(ValidationModuleKey.class.getName(), moduleKey);
+        }
+
+        return getTransformedMetaDataWith(facesContext, uiComponent, properties);
+    }
+
+    public static Map<String, Object> getTransformedMetaDataWith(
+            FacesContext facesContext, UIComponent uiComponent, Map<String, Object> properties)
+    {
         ValidationStrategy validationStrategy;
 
         SkipValidationEvaluator skipValidationEvaluator = ExtValContext.getContext().getSkipValidationEvaluator();
-        MetaDataExtractor metaDataExtractor = getComponentMetaDataExtractor();
+        MetaDataExtractor metaDataExtractor = getComponentMetaDataExtractorWith(properties);
 
         Map<String, Object> metaData;
         Map<String, Object> metaDataResult = new HashMap<String, Object>();
@@ -588,12 +674,12 @@
                 metaData = transformMetaData(
                         facesContext, uiComponent, validationStrategy, skipValidationEvaluator, metaData, entry);
 
-                if(!isComponentInitializationSkipped(metaData, entry, validationStrategy))
+                if (!isComponentInitializationSkipped(metaData, entry, validationStrategy))
                 {
                     //don't break maybe there are constraints which don't support the skip-mechanism
                     metaDataResult.putAll(metaData);
                 }
-           }
+            }
         }
 
         return metaDataResult;
@@ -605,13 +691,13 @@
                                                          SkipValidationEvaluator skipValidationEvaluator,
                                                          Map<String, Object> metaData, MetaDataEntry entry)
     {
-        if(!skipValidationEvaluator.skipValidation(facesContext, uiComponent, validationStrategy, entry))
+        if (!skipValidationEvaluator.skipValidation(facesContext, uiComponent, validationStrategy, entry))
         {
             MetaDataTransformer metaDataTransformer = getMetaDataTransformerForValidationStrategy(validationStrategy);
 
-            if(metaDataTransformer != null)
+            if (metaDataTransformer != null)
             {
-                if(LOGGER.isDebugEnabled())
+                if (LOGGER.isDebugEnabled())
                 {
                     LOGGER.debug(metaDataTransformer.getClass().getName() + " instantiated");
                 }
@@ -623,7 +709,7 @@
                 metaData = null;
             }
 
-            if(metaData == null)
+            if (metaData == null)
             {
                 return new HashMap<String, Object>();
             }
@@ -635,8 +721,8 @@
                                                             ValidationStrategy validationStrategy)
     {
         return metaData.isEmpty() ||
-              (Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)) &&
-                isSkipableValidationStrategy(validationStrategy.getClass()));
+                (Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)) &&
+                        isSkipableValidationStrategy(validationStrategy.getClass()));
     }
 
     public static boolean interpretEmptyStringValuesAsNull()
@@ -671,9 +757,9 @@
 
         FacesContext facesContext = FacesContext.getCurrentInstance();
 
-        if(interpreter.severityCausesValidatorException(facesContext, uiComponent, facesMessage.getSeverity()))
+        if (interpreter.severityCausesValidatorException(facesContext, uiComponent, facesMessage.getSeverity()))
         {
-            if(throwable == null)
+            if (throwable == null)
             {
                 throw new ValidatorException(facesMessage);
             }
@@ -692,7 +778,7 @@
     {
         UIComponent targetComponent = findComponent(clientId);
 
-        if(targetComponent == null && clientId != null)
+        if (targetComponent == null && clientId != null)
         {
             tryToAddViolationMessageForTestClientId(clientId, facesMessage);
             return;
@@ -708,7 +794,7 @@
 
         FacesContext facesContext = FacesContext.getCurrentInstance();
 
-        if(interpreter.severityCausesViolationMessage(facesContext, null, facesMessage.getSeverity()))
+        if (interpreter.severityCausesViolationMessage(facesContext, null, facesMessage.getSeverity()))
         {
             addFacesMessage(clientId, facesMessage);
         }
@@ -722,9 +808,9 @@
 
         FacesContext facesContext = FacesContext.getCurrentInstance();
 
-        if(interpreter.severityCausesViolationMessage(facesContext, uiComponent, facesMessage.getSeverity()))
+        if (interpreter.severityCausesViolationMessage(facesContext, uiComponent, facesMessage.getSeverity()))
         {
-            if(uiComponent != null)
+            if (uiComponent != null)
             {
                 addFacesMessage(uiComponent.getClientId(facesContext), facesMessage);
             }
@@ -745,7 +831,7 @@
     {
         FacesMessageStorage storage = getStorage(FacesMessageStorage.class, FacesMessageStorage.class.getName());
 
-        if(storage != null)
+        if (storage != null)
         {
             storage.addFacesMessage(clientId, facesMessage);
         }
@@ -769,7 +855,7 @@
 
         FacesContext facesContext = FacesContext.getCurrentInstance();
 
-        if(interpreter.severityBlocksNavigation(facesContext, uiComponent, facesMessage.getSeverity()))
+        if (interpreter.severityBlocksNavigation(facesContext, uiComponent, facesMessage.getSeverity()))
         {
             FacesContext.getCurrentInstance().renderResponse();
         }
@@ -802,7 +888,7 @@
     {
         UIComponent targetComponent = null;
 
-        if(clientId != null)
+        if (clientId != null)
         {
             targetComponent = FacesContext.getCurrentInstance().getViewRoot().findComponent(clientId);
         }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java Sun Nov  1 21:48:55 2009
@@ -67,7 +67,6 @@
 
         if (propertyDetails != null)
         {
-            BeanValidationUtils.addMetaDataToContext(uiComponent, propertyDetails);
             bviUtils.initComponentWithPropertyDetails(facesContext, uiComponent, propertyDetails);
         }
 
@@ -79,7 +78,7 @@
 
     protected void processValidation(FacesContext facesContext, UIComponent uiComponent, Object convertedObject)
     {
-        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
+        MetaDataExtractor metaDataExtractor = bviUtils.getComponentMetaDataExtractor(uiComponent);
 
         PropertyInformation propertyInformation = metaDataExtractor.extract(facesContext, uiComponent);
 
@@ -93,9 +92,6 @@
                     logger.trace("jsr303 start validation");
                 }
 
-                BeanValidationUtils.addMetaDataToContext(
-                        uiComponent, ExtValUtils.getPropertyDetails(propertyInformation));
-
                 if (!executeGlobalBeforeValidationInterceptors(
                         facesContext, uiComponent, convertedObject, propertyInformation))
                 {

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptorInternals.java Sun Nov  1 21:48:55 2009
@@ -22,10 +22,12 @@
 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;
 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
+import org.apache.myfaces.extensions.validator.core.ValidationModuleKey;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.ToDo;
@@ -59,7 +61,8 @@
 
     PropertyDetails extractPropertyDetails(FacesContext facesContext, UIComponent uiComponent)
     {
-        PropertyDetails result = ExtValUtils.getComponentMetaDataExtractor().extract(facesContext, uiComponent)
+        PropertyDetails result = getComponentMetaDataExtractor(uiComponent)
+                .extract(facesContext, uiComponent)
                 .getInformation(PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
 
         if (result.getBaseObject() == null && this.logger.isWarnEnabled())
@@ -71,6 +74,19 @@
         return result.getBaseObject() != null ? result : null;
     }
 
+    /*
+     * also invokes meta-data extraction interceptors
+     * (see e.g. ExtValBeanValidationMetaDataExtractionInterceptor)
+     */
+    MetaDataExtractor getComponentMetaDataExtractor(UIComponent uiComponent)
+    {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(ValidationModuleKey.class.getName(), BeanValidationModuleKey.class);
+        properties.put(UIComponent.class.getName(), uiComponent);
+
+        return ExtValUtils.getComponentMetaDataExtractorWith(properties);
+    }
+
     void initComponentWithPropertyDetails(
             FacesContext facesContext, UIComponent uiComponent, PropertyDetails propertyDetails)
     {

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleKey.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleKey.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleKey.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationModuleKey.java Sun Nov  1 21:48:55 2009
@@ -20,11 +20,13 @@
 
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.core.ValidationModuleKey;
 
 /**
  * @author Gerhard Petracek
  * @since x.x.3
  */
+@ValidationModuleKey
 @UsageInformation(UsageCategory.API)
 public interface BeanValidationModuleKey
 {

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/BeanValidation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/BeanValidation.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/BeanValidation.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/BeanValidation.java Sun Nov  1 21:48:55 2009
@@ -20,8 +20,6 @@
 
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import org.apache.myfaces.extensions.validator.internal.ToDo;
-import org.apache.myfaces.extensions.validator.internal.Priority;
 
 import javax.validation.groups.Default;
 import java.lang.annotation.Target;
@@ -49,7 +47,6 @@
 
     Class[] restrictGroups() default {};
 
-    @ToDo(value = Priority.HIGH, description = "support property chain syntax")
     String[] conditions() default "#{true}";
 
     ModelValidation modelValidation() default @ModelValidation;

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/ModelValidation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/ModelValidation.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/ModelValidation.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/ModelValidation.java Sun Nov  1 21:48:55 2009
@@ -20,6 +20,8 @@
 
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.ToDo;
+import org.apache.myfaces.extensions.validator.internal.Priority;
 
 import java.lang.annotation.Target;
 import java.lang.annotation.Retention;
@@ -47,6 +49,7 @@
 
     boolean displayInline() default false;
 
+    @ToDo(value = Priority.HIGH, description = "support property chain syntax")
     String[] validationTargets() default DEFAULT_TARGET;
 
     String message() default DEFAULT_MESSAGE;

Added: myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ExtValBeanValidationMetaDataExtractionInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ExtValBeanValidationMetaDataExtractionInterceptor.java?rev=831766&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ExtValBeanValidationMetaDataExtractionInterceptor.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ExtValBeanValidationMetaDataExtractionInterceptor.java Sun Nov  1 21:48:55 2009
@@ -0,0 +1,78 @@
+/*
+ * 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.interceptor;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.core.interceptor.MetaDataExtractionInterceptor;
+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.ValidationModuleAware;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.beanval.BeanValidationModuleKey;
+import org.apache.myfaces.extensions.validator.beanval.util.BeanValidationUtils;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+
+import javax.faces.component.UIComponent;
+import java.util.Map;
+
+/**
+ * extracts and adds the extval bv meta-data (e.g. validation groups) to the ExtValBeanValidationContext
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@InvocationOrder(200)
+@UsageInformation(UsageCategory.INTERNAL)
+public class ExtValBeanValidationMetaDataExtractionInterceptor
+        implements MetaDataExtractionInterceptor, ValidationModuleAware
+{
+    public void afterExtracting(PropertyInformation propertyInformation)
+    {
+        if(propertyInformation.containsInformation(PropertyInformationKeys.CUSTOM_PROPERTIES))
+        {
+            Map properties = propertyInformation.getInformation(PropertyInformationKeys.CUSTOM_PROPERTIES, Map.class);
+
+            if(properties != null && properties.containsKey(UIComponent.class.getName()))
+            {
+                UIComponent uiComponent = (UIComponent)properties.get(UIComponent.class.getName());
+                PropertyDetails propertyDetails = ExtValUtils.getPropertyDetails(propertyInformation);
+
+                processExtValBeanValidationMetaData(uiComponent, propertyDetails);
+            }
+        }
+    }
+
+    /**
+     * adds the extval bv meta-data to the ExtValBeanValidationContext
+     *
+     * @param uiComponent current component
+     * @param propertyDetails property details of the value-binding
+     */
+    private void processExtValBeanValidationMetaData(UIComponent uiComponent, PropertyDetails propertyDetails)
+    {
+        BeanValidationUtils.addMetaDataToContext(uiComponent, propertyDetails);
+    }
+
+    public String[] getModuleKeys()
+    {
+        return new String[] {BeanValidationModuleKey.class.getName()};
+    }
+}

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/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/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/NotNullNameMapper.java Sun Nov  1 21:48:55 2009
@@ -32,7 +32,7 @@
  * @since x.x.3
  */
 @Nested
-@InvocationOrder(100)
+@InvocationOrder(200)
 @UsageInformation({UsageCategory.INTERNAL})
 public class NotNullNameMapper extends AbstractBeanValidationVirtualValidationStrategyToMetaDataTransformerNameMapper
 {
@@ -44,4 +44,4 @@
         }
         return null;
     }
-}
\ No newline at end of file
+}

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/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/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/mapper/SizeNameMapper.java Sun Nov  1 21:48:55 2009
@@ -32,7 +32,7 @@
  * @since x.x.3
  */
 @Nested
-@InvocationOrder(101)
+@InvocationOrder(201)
 @UsageInformation({UsageCategory.INTERNAL})
 public class SizeNameMapper extends AbstractBeanValidationVirtualValidationStrategyToMetaDataTransformerNameMapper
 {

Modified: myfaces/extensions/validator/branches/branch_for_jsf_1_1/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/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java?rev=831766&r1=831765&r2=831766&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_1_1/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java Sun Nov  1 21:48:55 2009
@@ -20,6 +20,7 @@
 
 import org.apache.myfaces.extensions.validator.beanval.BeanValidationInterceptor;
 import org.apache.myfaces.extensions.validator.beanval.HtmlCoreComponentsComponentInitializer;
+import org.apache.myfaces.extensions.validator.beanval.interceptor.ExtValBeanValidationMetaDataExtractionInterceptor;
 import org.apache.myfaces.extensions.validator.beanval.validation.ModelValidationPhaseListener;
 import org.apache.myfaces.extensions.validator.beanval.metadata.transformer.mapper.SizeNameMapper;
 import org.apache.myfaces.extensions.validator.beanval.metadata.transformer.mapper.NotNullNameMapper;
@@ -59,6 +60,7 @@
         registerGroupStorageNameMapper();
         registerModelValidationStorageNameMapper();
         registerComponentInitializers();
+        registerMetaDataExtractionInterceptors();
         registerPhaseListeners();
     }
 
@@ -119,6 +121,12 @@
                 .getFactory(FactoryNames.STORAGE_MANAGER_FACTORY, StorageManagerHolder.class));
     }
 
+    protected void registerMetaDataExtractionInterceptors()
+    {
+        ExtValContext.getContext()
+                .addMetaDataExtractionInterceptor(new ExtValBeanValidationMetaDataExtractionInterceptor());
+    }
+
     protected void registerPhaseListeners()
     {
         JsfUtils.registerPhaseListener(new ModelValidationPhaseListener());