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/05/24 23:12:15 UTC

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

Author: gpetracek
Date: Sun May 24 21:12:14 2009
New Revision: 778236

URL: http://svn.apache.org/viewvc?rev=778236&view=rev
Log:
sync issue 42 and additions for jsf 2.0

Added:
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationRendererInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidationTagAwareValidationInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidatorWrapper.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ResetBeanValidationRendererInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ValidationGroupProvider.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/JSF2AwareBeanValidationStartupListener.java
Modified:
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/CustomInformation.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/INTERNAL_README
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/faces-config.xml
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/factory/ExtValApplicationFactory.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/ValidationInterceptorWithSkipValidationSupport.java
    myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/CrossValidationPhaseListener.java

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/CustomInformation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/CustomInformation.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/CustomInformation.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/CustomInformation.java Sun May 24 21:12:14 2009
@@ -42,6 +42,7 @@
     STARTUP_LISTENER,
     COMPONENT_INITIALIZER,
     VALIDATION_EXCEPTION_INTERCEPTOR,
+    VALIDATION_INTERCEPTOR,
     META_DATA_EXTRACTION_INTERCEPTOR,
 
     MESSAGE_RESOLVER_FACTORY,

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/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_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java Sun May 24 21:12:14 2009
@@ -23,6 +23,7 @@
 import org.apache.myfaces.extensions.validator.core.interceptor.RendererInterceptor;
 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.ValidationInterceptor;
 import org.apache.myfaces.extensions.validator.core.recorder.ProcessedInformationRecorder;
 import org.apache.myfaces.extensions.validator.core.factory.FactoryFinder;
 import org.apache.myfaces.extensions.validator.core.factory.DefaultFactoryFinder;
@@ -59,6 +60,7 @@
 
     private List<ComponentInitializer> componentInitializers;
     private List<ValidationExceptionInterceptor> validationExceptionInterceptors;
+    private List<ValidationInterceptor> validationInterceptors;
     private List<MetaDataExtractionInterceptor> metaDataExtractionInterceptors;
 
     private Map<String, Object> globalProperties = new HashMap<String, Object>();
@@ -134,6 +136,41 @@
         }
     }
 
+    private void lazyInitValidationInterceptors()
+    {
+        if(this.validationInterceptors != null)
+        {
+            return;
+        }
+
+        this.validationInterceptors = new ArrayList<ValidationInterceptor>();
+        List<String> validationInterceptorClassNames = new ArrayList<String>();
+
+        validationInterceptorClassNames
+            .add(WebXmlParameter.CUSTOM_VALIDATION_INTERCEPTOR);
+        validationInterceptorClassNames
+            .add(ExtValContext.getContext().getInformationProviderBean().get(
+                    CustomInformation.VALIDATION_INTERCEPTOR));
+
+        ValidationInterceptor validationInterceptor;
+        for (String validationInterceptorName : validationInterceptorClassNames)
+        {
+            validationInterceptor =
+                (ValidationInterceptor)
+                        ClassUtils.tryToInstantiateClassForName(validationInterceptorName);
+
+            if (validationInterceptor != null)
+            {
+                validationInterceptors.add(validationInterceptor);
+
+                if(logger.isTraceEnabled())
+                {
+                    logger.trace(validationInterceptor.getClass().getName() + " added");
+                }
+            }
+        }
+    }
+
     private void lazyInitMetaDataExtractionInterceptors()
     {
         if(this.metaDataExtractionInterceptors != null)
@@ -252,7 +289,19 @@
     public List<ValidationExceptionInterceptor> getValidationExceptionInterceptors()
     {
         lazyInitValidationExceptionInterceptors();
-        return validationExceptionInterceptors;
+        return this.validationExceptionInterceptors;
+    }
+
+    public void addValidationInterceptor(ValidationInterceptor validationInterceptor)
+    {
+        lazyInitValidationInterceptors();
+        this.validationInterceptors.add(validationInterceptor);
+    }
+
+    public List<ValidationInterceptor> getValidationValidationInterceptors()
+    {
+        lazyInitValidationInterceptors();
+        return this.validationInterceptors;
     }
 
     public void addMetaDataExtractionInterceptor(MetaDataExtractionInterceptor metaDataExtractionInterceptor)

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java Sun May 24 21:12:14 2009
@@ -90,6 +90,8 @@
                 "ComponentInitializer");
         customizableInfos.put(CustomInformation.VALIDATION_EXCEPTION_INTERCEPTOR,
                 "ValidationExceptionInterceptor");
+        customizableInfos.put(CustomInformation.VALIDATION_INTERCEPTOR,
+                "ValidationInterceptor");
         customizableInfos.put(CustomInformation.META_DATA_EXTRACTION_INTERCEPTOR,
                 "MetaDataExtractionInterceptor");
 

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java Sun May 24 21:12:14 2009
@@ -55,6 +55,9 @@
     static final String CUSTOM_VALIDATION_EXCEPTION_INTERCEPTOR = WebXmlUtils
         .getInitParameter("CUSTOM_VALIDATION_EXCEPTION_INTERCEPTOR");
 
+    static final String CUSTOM_VALIDATION_INTERCEPTOR = WebXmlUtils
+        .getInitParameter("CUSTOM_VALIDATION_INTERCEPTOR");
+
     static final String CUSTOM_META_DATA_EXTRACTION_INTERCEPTOR = WebXmlUtils
         .getInitParameter("CUSTOM_META_DATA_EXTRACTION_INTERCEPTOR");
 

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/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_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java Sun May 24 21:12:14 2009
@@ -1,217 +1,51 @@
-/*
- * 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.interceptor;
-
-import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import org.apache.myfaces.extensions.validator.internal.UsageInformation;
-import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
-import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
-import org.apache.myfaces.extensions.validator.core.metadata.extractor.MetaDataExtractor;
-import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
-import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
-import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
-import org.apache.myfaces.extensions.validator.core.ExtValContext;
-import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipBeforeInterceptorsException;
-import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipRendererDelegationException;
-import org.apache.myfaces.extensions.validator.core.recorder.ProcessedInformationRecorder;
-import org.apache.myfaces.extensions.validator.util.ExtValUtils;
-
-import javax.faces.context.FacesContext;
-import javax.faces.component.UIComponent;
-import javax.faces.component.EditableValueHolder;
-import javax.faces.convert.ConverterException;
-import javax.faces.render.Renderer;
-import javax.faces.validator.ValidatorException;
-import java.io.IOException;
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * @author Gerhard Petracek
- * @since 1.x.1
- */
-@UsageInformation(UsageCategory.INTERNAL)
-public class ValidationInterceptor extends AbstractRendererInterceptor
-{
-    @Override
-    public void beforeEncodeBegin(FacesContext facesContext, UIComponent uiComponent, Renderer wrapped)
-            throws IOException, SkipBeforeInterceptorsException, SkipRendererDelegationException
-    {
-        initComponent(facesContext, uiComponent);
-    }
-
-    protected void initComponent(FacesContext facesContext, UIComponent uiComponent)
-    {
-        if(!(uiComponent instanceof EditableValueHolder))
-        {
-            return;
-        }
-
-        if(logger.isTraceEnabled())
-        {
-            logger.trace("start to init component " + uiComponent.getClass().getName());
-        }
-
-        ValidationStrategy validationStrategy;
-        MetaDataTransformer metaDataTransformer;
-
-        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
-
-        Map<String, Object> metaData = new HashMap<String, Object>();
-        for (MetaDataEntry entry : metaDataExtractor.extract(facesContext, uiComponent).getMetaDataEntries())
-        {
-            validationStrategy = ExtValUtils.getValidationStrategyForMetaData(entry.getKey());
-
-            if (validationStrategy != null)
-            {
-                if(!skipValidation(facesContext, uiComponent, validationStrategy, entry))
-                {
-                    metaDataTransformer = ExtValUtils.getMetaDataTransformerForValidationStrategy(validationStrategy);
-
-                    if(metaDataTransformer != null)
-                    {
-                        if(this.logger.isDebugEnabled())
-                        {
-                            this.logger.debug(metaDataTransformer.getClass().getName() + " instantiated");
-                        }
-                        
-                        metaData = metaDataTransformer.convertMetaData(entry);
-                    }
-                    else
-                    {
-                        metaData = null;
-                    }
-
-                    if(metaData == null)
-                    {
-                        metaData = new HashMap<String, Object>();
-                    }
-                }
-
-                if(!metaData.isEmpty() &&
-                        Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)))
-                {
-                    metaData.put(CommonMetaDataKeys.SKIP_VALIDATION, true);
-                }
-
-                //get component initializer for the current component and configure it
-                //also in case of skipped validation to reset e.g. the required attribute
-                if(!metaData.isEmpty())
-                {
-                    ExtValUtils.configureComponentWithMetaData(facesContext, uiComponent, metaData);
-                }
-           }
-        }
-
-        if(logger.isTraceEnabled())
-        {
-            logger.trace("init component of " + uiComponent.getClass().getName() + " finished");
-        }
-    }
-
-    @Override
-    public void beforeGetConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object o, Renderer wrapped)
-            throws ConverterException, SkipBeforeInterceptorsException, SkipRendererDelegationException
-    {
-        Object convertedObject = wrapped.getConvertedValue(facesContext, uiComponent, o);
-
-        //recorde user input e.g. for cross-component validation
-        for(ProcessedInformationRecorder recorder : ExtValContext.getContext().getProcessedInformationRecorders())
-        {
-            recorder.recordUserInput(uiComponent, convertedObject);
-
-            if(logger.isTraceEnabled())
-            {
-                logger.trace(recorder.getClass().getName() + " called");
-            }
-        }
-
-        try
-        {
-            processValidation(facesContext, uiComponent, convertedObject);
-        }
-        catch (ValidatorException e)
-        {
-            throw new ConverterException(e.getFacesMessage(), e);
-        }
-    }
-
-    protected void processValidation(FacesContext facesContext, UIComponent uiComponent, Object convertedObject)
-    {
-        if (!(uiComponent instanceof EditableValueHolder))
-        {
-            return;
-        }
-
-        if(logger.isTraceEnabled())
-        {
-            logger.trace("start validation");
-        }
-
-        ValidationStrategy validationStrategy;
-
-        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
-
-        for (MetaDataEntry entry : metaDataExtractor.extract(facesContext, uiComponent).getMetaDataEntries())
-        {
-            validationStrategy = ExtValUtils.getValidationStrategyForMetaData(entry.getKey());
-
-            if (validationStrategy != null)
-            {
-                if(skipValidation(facesContext, uiComponent, validationStrategy, entry))
-                {
-                    //required is a special case - reset it
-                    ((EditableValueHolder)uiComponent).setRequired(false);
-
-                    continue;
-                }
-
-                if(logger.isTraceEnabled())
-                {
-                    logger.trace("validate " + entry.getValue() + " with " +
-                            validationStrategy.getClass().getName());
-                }
-
-                validationStrategy.validate(facesContext, uiComponent, entry, convertedObject);
-            }
-            else
-            {
-                if(logger.isTraceEnabled())
-                {
-                    logger.trace("no validation strategy found for "
-                            + entry.getValue());
-                }
-            }
-        }
-
-        if(logger.isTraceEnabled())
-        {
-            logger.trace("validation finished");
-        }
-    }
-
-    protected boolean skipValidation(FacesContext facesContext,
-                                     UIComponent uiComponent,
-                                     ValidationStrategy validationStrategy,
-                                     MetaDataEntry entry)
-    {
-        //override for custom skip validation support (if needed)
-        return false;
-    }
-}
+/*
+ * 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.interceptor;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+import java.util.Map;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.API)
+public interface ValidationInterceptor
+{
+    /**
+     * @return false if the validation process should be bypassed
+     */
+    boolean beforeValidation(FacesContext facesContext,
+                             UIComponent uiComponent,
+                             Object convertedObject,
+                             Map<String, Object> properties);
+
+    /**
+     * processed if validation was executed
+     * in contrast to ValidationExceptionInterceptor it gets executed in any case
+     */
+    void afterValidation(FacesContext facesContext,
+                         UIComponent uiComponent,
+                         Object convertedObject,
+                         Map<String, Object> properties);
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationRendererInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationRendererInterceptor.java?rev=778236&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationRendererInterceptor.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationRendererInterceptor.java Sun May 24 21:12:14 2009
@@ -0,0 +1,239 @@
+/*
+ * 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.interceptor;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
+import org.apache.myfaces.extensions.validator.core.metadata.extractor.MetaDataExtractor;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipBeforeInterceptorsException;
+import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipRendererDelegationException;
+import org.apache.myfaces.extensions.validator.core.recorder.ProcessedInformationRecorder;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.convert.ConverterException;
+import javax.faces.render.Renderer;
+import javax.faces.validator.ValidatorException;
+import java.io.IOException;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class ValidationRendererInterceptor extends AbstractRendererInterceptor
+{
+    @Override
+    public void beforeEncodeBegin(FacesContext facesContext, UIComponent uiComponent, Renderer wrapped)
+            throws IOException, SkipBeforeInterceptorsException, SkipRendererDelegationException
+    {
+        initComponent(facesContext, uiComponent);
+    }
+
+    protected void initComponent(FacesContext facesContext, UIComponent uiComponent)
+    {
+        if(!(uiComponent instanceof EditableValueHolder))
+        {
+            return;
+        }
+
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("start to init component " + uiComponent.getClass().getName());
+        }
+
+        ValidationStrategy validationStrategy;
+        MetaDataTransformer metaDataTransformer;
+
+        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
+
+        Map<String, Object> metaData = new HashMap<String, Object>();
+        for (MetaDataEntry entry : metaDataExtractor.extract(facesContext, uiComponent).getMetaDataEntries())
+        {
+            validationStrategy = ExtValUtils.getValidationStrategyForMetaData(entry.getKey());
+
+            if (validationStrategy != null)
+            {
+                if(!skipValidation(facesContext, uiComponent, validationStrategy, entry))
+                {
+                    metaDataTransformer = ExtValUtils.getMetaDataTransformerForValidationStrategy(validationStrategy);
+
+                    if(metaDataTransformer != null)
+                    {
+                        if(this.logger.isDebugEnabled())
+                        {
+                            this.logger.debug(metaDataTransformer.getClass().getName() + " instantiated");
+                        }
+                        
+                        metaData = metaDataTransformer.convertMetaData(entry);
+                    }
+                    else
+                    {
+                        metaData = null;
+                    }
+
+                    if(metaData == null)
+                    {
+                        metaData = new HashMap<String, Object>();
+                    }
+                }
+
+                if(!metaData.isEmpty() &&
+                        Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)))
+                {
+                    metaData.put(CommonMetaDataKeys.SKIP_VALIDATION, true);
+                }
+
+                //get component initializer for the current component and configure it
+                //also in case of skipped validation to reset e.g. the required attribute
+                if(!metaData.isEmpty())
+                {
+                    ExtValUtils.configureComponentWithMetaData(facesContext, uiComponent, metaData);
+                }
+           }
+        }
+
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("init component of " + uiComponent.getClass().getName() + " finished");
+        }
+    }
+
+    @Override
+    public void beforeGetConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object o, Renderer wrapped)
+            throws ConverterException, SkipBeforeInterceptorsException, SkipRendererDelegationException
+    {
+        Object convertedObject = wrapped.getConvertedValue(facesContext, uiComponent, o);
+
+        //recorde user input e.g. for cross-component validation
+        for(ProcessedInformationRecorder recorder : ExtValContext.getContext().getProcessedInformationRecorders())
+        {
+            recorder.recordUserInput(uiComponent, convertedObject);
+
+            if(logger.isTraceEnabled())
+            {
+                logger.trace(recorder.getClass().getName() + " called");
+            }
+        }
+
+        try
+        {
+            processValidation(facesContext, uiComponent, convertedObject);
+        }
+        catch (ValidatorException e)
+        {
+            throw new ConverterException(e.getFacesMessage(), e);
+        }
+    }
+
+    protected void processValidation(FacesContext facesContext, UIComponent uiComponent, Object convertedObject)
+    {
+        if (!(uiComponent instanceof EditableValueHolder))
+        {
+            return;
+        }
+
+        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
+
+        PropertyInformation propertyInformation = metaDataExtractor.extract(facesContext, uiComponent);
+
+        if(!ExtValUtils.executeBeforeValidationInterceptors(facesContext, uiComponent, convertedObject,
+                PropertyInformation.class.getName() ,propertyInformation))
+        {
+            return;
+        }
+
+        try
+        {
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("start validation");
+            }
+
+            processFieldValidation(facesContext, uiComponent, convertedObject, propertyInformation);
+
+            if(logger.isTraceEnabled())
+            {
+                logger.trace("validation finished");
+            }
+        }
+        finally
+        {
+            ExtValUtils.executeAfterValidationInterceptors(facesContext, uiComponent, convertedObject,
+                    PropertyInformation.class.getName(), propertyInformation);
+        }
+    }
+
+    protected void processFieldValidation(FacesContext facesContext,
+                                          UIComponent uiComponent,
+                                          Object convertedObject,
+                                          PropertyInformation propertyInformation)
+    {
+        ValidationStrategy validationStrategy;
+        for (MetaDataEntry entry : propertyInformation.getMetaDataEntries())
+        {
+            validationStrategy = ExtValUtils.getValidationStrategyForMetaData(entry.getKey());
+
+            if (validationStrategy != null)
+            {
+                if(skipValidation(facesContext, uiComponent, validationStrategy, entry))
+                {
+                    //required is a special case - reset it
+                    ((EditableValueHolder)uiComponent).setRequired(false);
+
+                    continue;
+                }
+
+                if(logger.isTraceEnabled())
+                {
+                    logger.trace("validate " + entry.getValue() + " with " + validationStrategy.getClass().getName());
+                }
+
+                validationStrategy.validate(facesContext, uiComponent, entry, convertedObject);
+            }
+            else
+            {
+                if(logger.isTraceEnabled())
+                {
+                    logger.trace("no validation strategy found for " + entry.getValue());
+                }
+            }
+        }
+    }
+
+    protected boolean skipValidation(FacesContext facesContext,
+                                     UIComponent uiComponent,
+                                     ValidationStrategy validationStrategy,
+                                     MetaDataEntry entry)
+    {
+        //override for custom skip validation support (if needed)
+        return false;
+    }
+}

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java Sun May 24 21:12:14 2009
@@ -20,7 +20,7 @@
 
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
-import org.apache.myfaces.extensions.validator.core.interceptor.ValidationInterceptor;
+import org.apache.myfaces.extensions.validator.core.interceptor.ValidationRendererInterceptor;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 import org.apache.myfaces.extensions.validator.core.CustomInformation;
 import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
@@ -80,7 +80,7 @@
             }
         }
 
-        ExtValContext.getContext().registerRendererInterceptor(new ValidationInterceptor());
+        ExtValContext.getContext().registerRendererInterceptor(new ValidationRendererInterceptor());
 
         ExtValContext.getContext()
                 .addGlobalProperty(ExtValRendererProxy.KEY, ExtValRendererProxy.class.getName(), false);

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/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_2/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java Sun May 24 21:12:14 2009
@@ -27,6 +27,7 @@
 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.ValidationInterceptor;
 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;
@@ -52,6 +53,7 @@
 import javax.faces.validator.ValidatorException;
 import javax.faces.application.FacesMessage;
 import java.util.Map;
+import java.util.HashMap;
 import java.util.MissingResourceException;
 import java.util.List;
 import java.util.ArrayList;
@@ -419,4 +421,53 @@
 
         return false;
     }
+
+    public static boolean executeBeforeValidationInterceptors(FacesContext facesContext,
+                                                              UIComponent uiComponent,
+                                                              Object convertedObject,
+                                                              String propertyKey,
+                                                              Object properties)
+    {
+        Map<String, Object> propertyMap = new HashMap<String, Object>();
+
+        if(properties != null)
+        {
+            propertyMap.put(propertyKey, properties);
+        }
+        
+        List<ValidationInterceptor> validationInterceptors =
+                ExtValContext.getContext().getValidationValidationInterceptors();
+
+        for(ValidationInterceptor validationInterceptor : validationInterceptors)
+        {
+            if(!validationInterceptor.beforeValidation(facesContext, uiComponent, convertedObject, propertyMap))
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public static void executeAfterValidationInterceptors(FacesContext facesContext,
+                                                          UIComponent uiComponent,
+                                                          Object convertedObject,
+                                                          String propertyKey,
+                                                          Object properties)
+    {
+        Map<String, Object> propertyMap = new HashMap<String, Object>();
+
+        if(properties != null)
+        {
+            propertyMap.put(propertyKey, properties);
+        }
+
+        List<ValidationInterceptor> validationInterceptors =
+                ExtValContext.getContext().getValidationValidationInterceptors();
+
+        for(ValidationInterceptor validationInterceptor : validationInterceptors)
+        {
+            validationInterceptor.afterValidation(facesContext, uiComponent, convertedObject, propertyMap);
+        }
+    }
 }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/INTERNAL_README
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/INTERNAL_README?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/INTERNAL_README (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/INTERNAL_README Sun May 24 21:12:14 2009
@@ -3,4 +3,8 @@
  - ExtValRenderKit
  - BeanValidationInterceptor (isValidationDisabled, mergeFoundGroupsWithValidatorGroups)
  - DefaultELHelper
- - ExtValELResolver
\ No newline at end of file
+ - ExtValELResolver
+ - ExtValBeanValidator
+ - ResetBeanValidationRendererInterceptor
+ - BeanValidationTagAwareValidationInterceptor
+ - JSF2AwareBeanValidationStartupListener

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/faces-config.xml?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/faces-config.xml (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/config/faces-config.xml Sun May 24 21:12:14 2009
@@ -24,6 +24,7 @@
         <application-factory>org.apache.myfaces.extensions.validator.beanval.factory.ExtValApplicationFactory</application-factory>
     </factory>
     <lifecycle>
+        <phase-listener>org.apache.myfaces.extensions.validator.beanval.startup.JSF2AwareBeanValidationStartupListener</phase-listener>
         <phase-listener>org.apache.myfaces.extensions.validator.beanval.startup.BeanValidationStartupListener</phase-listener>
         <phase-listener>org.apache.myfaces.extensions.validator.beanval.validation.ModelValidationPhaseListener</phase-listener>
     </lifecycle>

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/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_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/BeanValidationInterceptor.java Sun May 24 21:12:14 2009
@@ -23,8 +23,6 @@
 import org.apache.myfaces.extensions.validator.core.recorder.ProcessedInformationRecorder;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 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.validation.strategy.ValidationStrategy;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
@@ -34,17 +32,12 @@
 import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
 import org.apache.myfaces.extensions.validator.core.interceptor.AbstractRendererInterceptor;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
-import org.apache.myfaces.extensions.validator.util.ReflectionUtils;
-import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.beanval.property.BeanValidationPropertyInformationKeys;
-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.validation.strategy.BeanValidationStrategyAdapter;
-import org.apache.myfaces.extensions.validator.beanval.validation.ModelValidationEntry;
-import org.apache.myfaces.extensions.validator.beanval.annotation.NoRestrictionGroup;
 import org.apache.myfaces.extensions.validator.internal.ToDo;
 import org.apache.myfaces.extensions.validator.internal.Priority;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 
 import javax.faces.context.FacesContext;
 import javax.faces.component.UIComponent;
@@ -52,8 +45,6 @@
 import javax.faces.render.Renderer;
 import javax.faces.convert.ConverterException;
 import javax.faces.validator.ValidatorException;
-import javax.faces.validator.Validator;
-import javax.faces.validator.BeanValidator;
 import javax.faces.application.FacesMessage;
 import javax.validation.Validation;
 import javax.validation.BeanDescriptor;
@@ -61,20 +52,16 @@
 import javax.validation.ConstraintDescriptor;
 import javax.validation.ValidatorFactory;
 import javax.validation.ConstraintViolation;
-import javax.validation.groups.Default;
 import java.util.Set;
 import java.util.Map;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.io.IOException;
-import java.lang.reflect.Method;
 
 /**
  * @author Gerhard Petracek
- * @since 1.x.3
+ * @since x.x.3
  */
 @ToDo(value = Priority.HIGH, description = "sync jsf 2.0 specific changes with bv-branch")
+@UsageInformation(UsageCategory.INTERNAL)
 public class BeanValidationInterceptor extends AbstractRendererInterceptor
 {
     private ValidatorFactory validationFactory = Validation.buildDefaultValidatorFactory();
@@ -97,15 +84,9 @@
             logger.trace("start to init component " + uiComponent.getClass().getName());
         }
 
-        if(isValidationDisabled(((EditableValueHolder)uiComponent).getValidators()))
-        {
-            return;
-        }
-
         MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
 
-        PropertyInformation propertyInformation = metaDataExtractor.extract(facesContext, uiComponent);
-        PropertyDetails propertyDetails = propertyInformation
+        PropertyDetails propertyDetails = metaDataExtractor.extract(facesContext, uiComponent)
                 .getInformation(PropertyInformationKeys.PROPERTY_DETAILS, PropertyDetails.class);
 
         if(propertyDetails.getBaseObject() == null)
@@ -118,14 +99,15 @@
             return;
         }
 
-        addMetaDataToContext(propertyInformation, uiComponent);
-
-        Class[] foundGroups = ExtValBeanValidationContext.getCurrentInstance().getGroups(
-                facesContext.getViewRoot().getViewId(),
-                uiComponent.getClientId(facesContext));
+        /*TODO
+            //TODO extract groups - see ValidationGroupProvider
+            Class[] foundGroups = ExtValBeanValidationContext.getCurrentInstance().getGroups(
+                    facesContext.getViewRoot().getViewId(),
+                    uiComponent.getClientId(facesContext));
 
-        foundGroups = mergeFoundGroupsWithValidatorGroups(
+            foundGroups = mergeFoundGroupsWithValidatorGroups(
                 foundGroups, ((EditableValueHolder)uiComponent).getValidators());
+         */
 
         BeanDescriptor beanDescriptor = this.validationFactory.getValidator().getConstraintsForClass(
                 propertyDetails.getBaseObject().getClass()/*, foundGroups*/);
@@ -136,7 +118,7 @@
         {
             return;
         }
-
+        
         ValidationStrategy validationStrategy;
         MetaDataTransformer metaDataTransformer;
         MetaDataEntry entry;
@@ -145,7 +127,7 @@
         for (ConstraintDescriptor<?> constraintDescriptor : elementDescriptor.getConstraintDescriptors())
         {
             //TODO check groups
-
+            
             validationStrategy = new BeanValidationStrategyAdapter(constraintDescriptor);
 
             /*
@@ -196,52 +178,6 @@
         }
     }
 
-    @ToDo(value = Priority.HIGH, description = "check if f:validateBean deactivates validation")
-    private boolean isValidationDisabled(Validator[] validators)
-    {
-        //
-        return false;
-    }
-
-
-    @ToDo.List({@ToDo(value = Priority.HIGH, description = "optimize"),
-            @ToDo(value = Priority.HIGH, description = "use reflection instead of BeanValidator for jsf 1.x versions"),
-            @ToDo(value = Priority.HIGH, description = "test")
-    })
-    private Class[] mergeFoundGroupsWithValidatorGroups(Class[] foundGroups, Validator[] validators)
-    {
-        List<String> validatorsOfTagList = new ArrayList<String>();
-
-        for (Validator validator : validators)
-        {
-            if (validator instanceof BeanValidator)
-            {
-                validatorsOfTagList.addAll(
-                        Arrays.asList(((BeanValidator) validator).getValidationGroups().split(",")));
-            }
-        }
-
-        List<Class> result = new ArrayList<Class>(Arrays.asList(foundGroups));
-        Class currentClass;
-        for(String groupClassName : validatorsOfTagList)
-        {
-            currentClass = ClassUtils.tryToLoadClassForName(groupClassName);
-
-            if(currentClass != null && currentClass.isInterface())
-            {
-                result.add(currentClass);
-            }
-            else
-            {
-                if(this.logger.isErrorEnabled())
-                {
-                    this.logger.error(groupClassName + " is no valid group - only existing interfaces are allowed");
-                }
-            }
-        }
-        return result.toArray(new Class[result.size()]);
-    }
-
     @Override
     public void beforeGetConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object o, Renderer wrapped)
             throws ConverterException, SkipBeforeInterceptorsException, SkipRendererDelegationException
@@ -272,7 +208,7 @@
         }
     }
 
-    private boolean processComponent(UIComponent uiComponent)
+    protected boolean processComponent(UIComponent uiComponent)
     {
         return uiComponent instanceof EditableValueHolder;
     }
@@ -280,16 +216,6 @@
     @ToDo(value = Priority.HIGH, description = "use ExtValUtils#createFacesMessage")
     protected void processValidation(FacesContext facesContext, UIComponent uiComponent, Object convertedObject)
     {
-        if (logger.isTraceEnabled())
-        {
-            logger.trace("jsr303 start validation");
-        }
-
-        if(isValidationDisabled(((EditableValueHolder)uiComponent).getValidators()))
-        {
-            return;
-        }
-
         if (!"true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_EMPTY_STRING_INTERPRETATION)
                 && "".equals(convertedObject))
         {
@@ -300,129 +226,32 @@
 
         PropertyInformation propertyInformation = metaDataExtractor.extract(facesContext, uiComponent);
 
-        //extract group validation annotations
-        addMetaDataToContext(propertyInformation, uiComponent);
-
-        processFieldValidation(facesContext, uiComponent, convertedObject, propertyInformation);
-
-        if (logger.isTraceEnabled())
-        {
-            logger.trace("jsr303 validation finished");
-        }
-    }
-
-    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);
-    }
-
-    protected void processFoundGroups(ExtValBeanValidationContext extValBeanValidationContext,
-                                      String currentViewId,
-                                      String clientId,
-                                      List<Class> foundGroupsForPropertyValidation)
-    {
-        for (Class currentGroupClass : foundGroupsForPropertyValidation)
-        {
-            extValBeanValidationContext.addGroup(currentGroupClass, currentViewId, clientId);
-        }
-    }
-
-    protected void processRestrictedGroups(ExtValBeanValidationContext extValBeanValidationContext,
-                                         String currentViewId,
-                                         String clientId,
-                                         List<Class> restrictedGroupsForPropertyValidation)
-    {
-        for (Class currentGroupClass : restrictedGroupsForPropertyValidation)
+        //e.g.: extract groups for validation
+        if(!ExtValUtils.executeBeforeValidationInterceptors(facesContext, uiComponent, convertedObject,
+                PropertyInformation.class.getName() ,propertyInformation))
         {
-            extValBeanValidationContext.restrictGroup(currentGroupClass, currentViewId, clientId);
+            return;
         }
-    }
 
-    protected void initModelValidation(ExtValBeanValidationContext extValBeanValidationContext,
-                                     String currentViewId,
-                                     UIComponent component,
-                                     PropertyDetails propertyDetails,
-                                     List<ModelValidationEntry> modelValidationEntryList,
-                                     List<Class> restrictedGroupsForModelValidation)
-    {
-        for(ModelValidationEntry modelValidationEntry : modelValidationEntryList)
+        try
         {
-            if(!"true".equalsIgnoreCase(org.apache.myfaces.extensions.validator.beanval.WebXmlParameter
-                    .DEACTIVATE_IMPLICIT_DEFAULT_GROUP_VALIDATION))
+            if (logger.isTraceEnabled())
             {
-                modelValidationEntry.addGroup(Default.class);
+                logger.trace("jsr303 start validation");
             }
 
-            for(Class restrictedGroup : restrictedGroupsForModelValidation)
-            {
-                modelValidationEntry.removeGroup(restrictedGroup);
-            }
+            processFieldValidation(facesContext, uiComponent, convertedObject, propertyInformation);
 
-            if(modelValidationEntry.getGroups().length > 0)
+            if (logger.isTraceEnabled())
             {
-                addTargetsForModelValidation(modelValidationEntry, propertyDetails.getBaseObject());
-                extValBeanValidationContext.addModelValidationEntry(modelValidationEntry, currentViewId, component);
+                logger.trace("jsr303 validation finished");
             }
         }
+        finally
+        {
+            ExtValUtils.executeAfterValidationInterceptors(facesContext, uiComponent, convertedObject,
+                    PropertyInformation.class.getName(), propertyInformation);
+        }
     }
 
     protected void processFieldValidation(FacesContext facesContext,
@@ -441,9 +270,6 @@
         Class[] groups = beanValidationContext.getGroups(
                 facesContext.getViewRoot().getViewId(), uiComponent.getClientId(facesContext));
 
-        groups = mergeFoundGroupsWithValidatorGroups(
-                groups, ((EditableValueHolder)uiComponent).getValidators());
-
         if(groups == null)
         {
             return;
@@ -489,292 +315,4 @@
         }
     }
     
-    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 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 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 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 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 processGroups(BeanValidation beanValidation,
-                           List<Class> foundGroupsForPropertyValidation,
-                           List<Class> restrictedGroupsForPropertyValidation)
-    {
-        foundGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.useGroups()));
-
-        if(!(beanValidation.restrictGroups().length == 1 &&
-                beanValidation.restrictGroups()[0].equals(NoRestrictionGroup.class)))
-        {
-            restrictedGroupsForPropertyValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
-        }
-    }
-
-    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 == 1 &&
-                beanValidation.restrictGroups()[0].equals(NoRestrictionGroup.class)))
-        {
-            restrictedGroupsForModelValidation.addAll(Arrays.asList(beanValidation.restrictGroups()));
-        }
-
-        modelValidationEntryList.add(modelValidationEntry);
-    }
-
-    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 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);
-    }
-
-    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;
-    }
 }

Modified: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/factory/ExtValApplicationFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/factory/ExtValApplicationFactory.java?rev=778236&r1=778235&r2=778236&view=diff
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/factory/ExtValApplicationFactory.java (original)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/factory/ExtValApplicationFactory.java Sun May 24 21:12:14 2009
@@ -20,6 +20,8 @@
 
 import org.apache.myfaces.extensions.validator.internal.ToDo;
 import org.apache.myfaces.extensions.validator.internal.Priority;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 
 import javax.faces.application.ApplicationFactory;
 import javax.faces.application.Application;
@@ -29,6 +31,7 @@
  * @author Gerhard Petracek
  * @since 2.x.3
  */
+@UsageInformation(UsageCategory.INTERNAL)
 public class ExtValApplicationFactory extends ApplicationFactory
 {
     private ApplicationFactory wrapped;
@@ -56,7 +59,7 @@
             @Override
             public void addDefaultValidatorId(String s)
             {
-                if(!"javax.faces.Bean".endsWith(s))
+                if(!"javax.faces.Bean".equals(s))
                 {
                     super.addDefaultValidatorId(s);
                 }

Added: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidationTagAwareValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidationTagAwareValidationInterceptor.java?rev=778236&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidationTagAwareValidationInterceptor.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidationTagAwareValidationInterceptor.java Sun May 24 21:12:14 2009
@@ -0,0 +1,119 @@
+/*
+ * 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.core.interceptor.ValidationInterceptor;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.util.ClassUtils;
+import org.apache.myfaces.extensions.validator.internal.ToDo;
+import org.apache.myfaces.extensions.validator.internal.Priority;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.beanval.ExtValBeanValidationContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.validator.BeanValidator;
+import javax.faces.validator.Validator;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Gerhard Petracek
+ * @since 2.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class BeanValidationTagAwareValidationInterceptor implements ValidationInterceptor
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    public boolean beforeValidation(FacesContext facesContext,
+                             UIComponent uiComponent,
+                             Object convertedObject,
+                             Map<String, Object> properties)
+    {
+        if(uiComponent instanceof EditableValueHolder && //"filter" cross-validation calls
+                properties.containsKey(PropertyInformation.class.getName()))
+        {
+            inspectValidators(facesContext.getViewRoot().getViewId(),
+                    (EditableValueHolder)uiComponent,
+                    uiComponent.getClientId(facesContext),
+                    ((EditableValueHolder)uiComponent).getValidators());
+        }
+
+        return true;
+    }
+
+    public void afterValidation(FacesContext facesContext,
+                             UIComponent uiComponent,
+                             Object convertedObject,
+                             Map<String, Object> properties)
+    {
+        //not used
+    }
+
+    @ToDo.List({@ToDo(value = Priority.HIGH, description = "optimize"),
+            @ToDo(value = Priority.HIGH, description = "use reflection instead of BeanValidator for jsf 1.x versions"),
+            @ToDo(value = Priority.HIGH, description = "test")
+    })
+    private void inspectValidators(String viewId,
+                                   EditableValueHolder editableValueHolder,
+                                   String clientId,
+                                   Validator[] validators)
+    {
+        List<String> validatorsOfTagList = new ArrayList<String>();
+
+        for (Validator validator : validators)
+        {
+            //don't check with instanceof
+            if (validator.getClass().getName().equals(BeanValidator.class.getName()))
+            {
+                validatorsOfTagList.addAll(
+                        Arrays.asList(((BeanValidator) validator).getValidationGroups().split(",")));
+
+                //prevent double-validation
+                editableValueHolder.removeValidator(validator);
+                editableValueHolder.addValidator(new BeanValidatorWrapper((BeanValidator)validator));
+            }
+        }
+
+        Class currentClass;
+        for(String groupClassName : validatorsOfTagList)
+        {
+            currentClass = ClassUtils.tryToLoadClassForName(groupClassName);
+
+            if(currentClass != null && currentClass.isInterface())
+            {
+                ExtValBeanValidationContext.getCurrentInstance().addGroup(currentClass, viewId, clientId);
+            }
+            else
+            {
+                if(this.logger.isErrorEnabled())
+                {
+                    this.logger.error(groupClassName + " is no valid group - only existing interfaces are allowed");
+                }
+            }
+        }
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidatorWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidatorWrapper.java?rev=778236&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidatorWrapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/BeanValidatorWrapper.java Sun May 24 21:12:14 2009
@@ -0,0 +1,113 @@
+/*
+ * 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 javax.faces.validator.BeanValidator;
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+
+/**
+ * replacement for BeanValidator which gets added due to f:validateBean
+ *
+ * @author Gerhard Petracek
+ * @since 2.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+class BeanValidatorWrapper extends BeanValidator
+{
+    private BeanValidator wrapped;
+
+    BeanValidatorWrapper(BeanValidator wrapped)
+    {
+        this.wrapped = wrapped;
+    }
+
+    public BeanValidator getWrappedBeanValidator()
+    {
+        return this.wrapped;
+    }
+
+    public void setWrapped(BeanValidator wrapped)
+    {
+        this.wrapped = wrapped;
+    }
+
+    public void setValidationGroups(String s)
+    {
+        wrapped.setValidationGroups(s);
+    }
+
+    public String getValidationGroups()
+    {
+        return wrapped.getValidationGroups();
+    }
+
+    public void validate(FacesContext facesContext, UIComponent uiComponent, Object o)
+    {
+        //don't validate - the extval bean-validation adapter will do that
+    }
+
+    /*
+    public Object saveState(FacesContext facesContext)
+    {
+        Object result[] = new Object[1];
+        result[0] = wrapped.getValidationGroups();
+        return result;
+    }
+
+    public void restoreState(FacesContext facesContext, Object state)
+    {
+        this.wrapped = new BeanValidator();
+
+        if (state != null)
+        {
+            Object values[] = (Object[]) state;
+            this.wrapped.setValidationGroups((String) values[0]);
+        }
+    }
+    */
+
+    public void markInitialState()
+    {
+        wrapped.markInitialState();
+    }
+
+    public boolean initialStateMarked()
+    {
+        return wrapped.initialStateMarked();
+    }
+
+    public void clearInitialState()
+    {
+        wrapped.clearInitialState();
+    }
+
+    public boolean isTransient()
+    {
+        return wrapped.isTransient();
+    }
+
+    public void setTransient(boolean b)
+    {
+        wrapped.setTransient(b);
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ResetBeanValidationRendererInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ResetBeanValidationRendererInterceptor.java?rev=778236&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ResetBeanValidationRendererInterceptor.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/interceptor/ResetBeanValidationRendererInterceptor.java Sun May 24 21:12:14 2009
@@ -0,0 +1,64 @@
+/*
+ * 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.core.interceptor.AbstractRendererInterceptor;
+import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipBeforeInterceptorsException;
+import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipRendererDelegationException;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.render.Renderer;
+import javax.faces.validator.Validator;
+import java.io.IOException;
+
+/**
+ * separated for easier sync
+ *
+ * @author Gerhard Petracek
+ * @since 2.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class ResetBeanValidationRendererInterceptor extends AbstractRendererInterceptor
+{
+    @Override
+    public void beforeEncodeBegin(FacesContext facesContext, UIComponent uiComponent, Renderer wrapped)
+            throws IOException, SkipBeforeInterceptorsException, SkipRendererDelegationException
+    {
+        if(uiComponent instanceof EditableValueHolder)
+        {
+            switchBackValidators((EditableValueHolder)uiComponent);
+        }
+    }
+
+    private void switchBackValidators(EditableValueHolder editableValueHolder)
+    {
+        for(Validator validator : editableValueHolder.getValidators())
+        {
+            if(validator instanceof BeanValidatorWrapper)
+            {
+                editableValueHolder.addValidator(((BeanValidatorWrapper)validator).getWrappedBeanValidator());
+                editableValueHolder.removeValidator(validator);
+            }
+        }
+    }
+}