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 00:45:47 UTC

svn commit: r831617 - in /myfaces/extensions/validator/trunk: component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/ core/src/main/java/org/apache/myfaces/extensions/validator/core/ core/src/main/...

Author: gpetracek
Date: Sat Oct 31 23:45:46 2009
New Revision: 831617

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

Added:
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/PhaseIdRecordingPhaseListener.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ComponentInitializationAwareMetaDataExtractionInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorage.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorageManager.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/FacesInformationStorage.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/mapper/DefaultFacesInformationStorageNameMapper.java
Modified:
    myfaces/extensions/validator/trunk/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/TrinidadMetaDataExtractionInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/FacesMessagePropertyValidationInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/CommonMetaDataKeys.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/ViolationSeverityInterpreter.java
    myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/ExtValBeanValidationContext.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/extractor/DefaultGroupControllerScanningExtractor.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/AbstractBeanValidationMetaDataTransformer.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/DefaultModelValidationStorage.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationEntry.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationStorage.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
    myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/validation/ModelValidationPhaseListener.java
    myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/config/faces-config.xml
    myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
    myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationSkipValidationEvaluator.java

Modified: myfaces/extensions/validator/trunk/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/TrinidadMetaDataExtractionInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/TrinidadMetaDataExtractionInterceptor.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/TrinidadMetaDataExtractionInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/interceptor/TrinidadMetaDataExtractionInterceptor.java Sat Oct 31 23:45:46 2009
@@ -19,7 +19,8 @@
 package org.apache.myfaces.extensions.validator.trinidad.interceptor;
 
 import org.apache.myfaces.extensions.validator.core.InvocationOrder;
-import org.apache.myfaces.extensions.validator.core.interceptor.MetaDataExtractionInterceptor;
+import org.apache.myfaces.extensions.validator.core.interceptor
+        .ComponentInitializationAwareMetaDataExtractionInterceptor;
 import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
 import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
@@ -35,19 +36,30 @@
  * @since x.x.3
  */
 @InvocationOrder(300)
-public class TrinidadMetaDataExtractionInterceptor implements MetaDataExtractionInterceptor
+public class TrinidadMetaDataExtractionInterceptor extends ComponentInitializationAwareMetaDataExtractionInterceptor
 {
-    public void afterExtracting(PropertyInformation propertyInformation)
+    protected void afterExtractingForComponentInitialization(PropertyInformation propertyInformation)
     {
-        for (MetaDataEntry entry : propertyInformation.getMetaDataEntries())
+        processMetaDataEntries(propertyInformation.getMetaDataEntries());
+    }
+
+    private void processMetaDataEntries(MetaDataEntry[] metaDataEntries)
+    {
+        for (MetaDataEntry entry : metaDataEntries)
         {
-            if (entry.getValue() instanceof Annotation && isClientValidationDisabled(entry))
+            if (processEntry(entry) && isClientValidationDisabled(entry))
             {
                 disableClientSideValidation(entry);
             }
         }
     }
 
+    //e.g. returns false for jsr303 entries
+    private boolean processEntry(MetaDataEntry entry)
+    {
+        return entry.getValue() instanceof Annotation;
+    }
+
     private boolean isClientValidationDisabled(MetaDataEntry entry)
     {
         return ExtValUtils.getValidationParameterExtractor()
@@ -55,6 +67,7 @@
                 .iterator().hasNext();
     }
 
+    @SuppressWarnings({"unchecked"})
     private void disableClientSideValidation(MetaDataEntry entry)
     {
         if(entry.getProperty(CommonMetaDataKeys.DISABLE_CLIENT_SIDE_VALIDATION) == null)

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/PhaseIdRecordingPhaseListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/PhaseIdRecordingPhaseListener.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/PhaseIdRecordingPhaseListener.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/PhaseIdRecordingPhaseListener.java Sat Oct 31 23:45:46 2009
@@ -0,0 +1,59 @@
+/*
+ * 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 org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.core.storage.FacesInformationStorage;
+
+import javax.faces.event.PhaseListener;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+
+/**
+ * e.g. to allow in metadata extraction interceptors to know if they are invoked during validation or
+ * component initialization (if needed)
+ * example: client-side validation - some functionality shouldn't be processed during rendering
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class PhaseIdRecordingPhaseListener implements PhaseListener
+{
+    private static final long serialVersionUID = 2791240514014867457L;
+
+    public void afterPhase(PhaseEvent phaseEvent)
+    {
+    }
+
+    public void beforePhase(PhaseEvent phaseEvent)
+    {
+        FacesInformationStorage facesInformationStorage = ExtValUtils
+                .getStorage(FacesInformationStorage.class, FacesInformationStorage.class.getName());
+
+        facesInformationStorage.setCurrentPhaseId(phaseEvent.getPhaseId());
+    }
+
+    public PhaseId getPhaseId()
+    {
+        return PhaseId.ANY_PHASE;
+    }
+}

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java Sat Oct 31 23:45:46 2009
@@ -165,11 +165,12 @@
 
     protected boolean processComponent(UIComponent uiComponent)
     {
-        if (!(uiComponent instanceof EditableValueHolder) || isComponentInitializationDeactivated())
-        {
-            return false;
-        }
+        return uiComponent instanceof EditableValueHolder &&
+                !isComponentInitializationDeactivated() && isValueBindingOfComponentValid(uiComponent);
+    }
 
+    private boolean isValueBindingOfComponentValid(UIComponent uiComponent)
+    {
         try
         {
             return ExtValUtils.getELHelper().getPropertyDetailsOfValueBinding(uiComponent) != null;

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ComponentInitializationAwareMetaDataExtractionInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ComponentInitializationAwareMetaDataExtractionInterceptor.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ComponentInitializationAwareMetaDataExtractionInterceptor.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ComponentInitializationAwareMetaDataExtractionInterceptor.java Sat Oct 31 23:45:46 2009
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.interceptor;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.core.InvocationOrderSupport;
+import org.apache.myfaces.extensions.validator.core.storage.FacesInformationStorage;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+
+import javax.faces.event.PhaseId;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@InvocationOrderSupport
+@UsageInformation(UsageCategory.API)
+public abstract class ComponentInitializationAwareMetaDataExtractionInterceptor implements MetaDataExtractionInterceptor
+{
+    public final void afterExtracting(PropertyInformation propertyInformation)
+    {
+        if(isRenderResponsePhase())
+        {
+            afterExtractingForComponentInitialization(propertyInformation);
+        }
+    }
+
+    protected abstract void afterExtractingForComponentInitialization(PropertyInformation propertyInformation);
+
+    private boolean isRenderResponsePhase()
+    {
+        return PhaseId.RENDER_RESPONSE.equals(getFacesInformationStorage().getCurrentPhaseId());
+    }
+
+    private FacesInformationStorage getFacesInformationStorage()
+    {
+        return ExtValUtils.getStorage(FacesInformationStorage.class, FacesInformationStorage.class.getName());
+    }
+}

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/FacesMessagePropertyValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/FacesMessagePropertyValidationInterceptor.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/FacesMessagePropertyValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/FacesMessagePropertyValidationInterceptor.java Sat Oct 31 23:45:46 2009
@@ -55,6 +55,7 @@
         if(facesMessageStorage != null)
         {
             facesMessageStorage.addAll();
+            ExtValUtils.resetStorage(FacesMessageStorage.class, FacesMessageStorage.class.getName());
         }
     }
 }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/ValidationInterceptor.java Sat Oct 31 23:45:46 2009
@@ -128,6 +128,11 @@
             {
                 if(skipValidationEvaluator.skipValidation(facesContext, uiComponent, validationStrategy, entry))
                 {
+                    if(logger.isTraceEnabled())
+                    {
+                        logger.trace("skip validation of " + entry.getValue() +
+                                " with " + validationStrategy.getClass().getName());
+                    }
                     //don't break maybe there are constraints which don't support the skip-mechanism
                     continue;
                 }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/CommonMetaDataKeys.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/CommonMetaDataKeys.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/CommonMetaDataKeys.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/CommonMetaDataKeys.java Sat Oct 31 23:45:46 2009
@@ -55,4 +55,6 @@
     static final String CUSTOM = "custom";
     static final String SKIP_VALIDATION = "skip_validation";
     static final String DISABLE_CLIENT_SIDE_VALIDATION = "disable_client_side_validation";
+    //available for add-ons not used internally due to performance reasons
+    static final String DISABLE_SHOW_INDICATION = "disable_show_indication";
 }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java Sat Oct 31 23:45:46 2009
@@ -27,6 +27,7 @@
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 import org.apache.myfaces.extensions.validator.core.CustomInformation;
 import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
+import org.apache.myfaces.extensions.validator.core.PhaseIdRecordingPhaseListener;
 import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
         .BeanValidationStrategyToMetaDataTransformerNameMapper;
 import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
@@ -61,6 +62,7 @@
 import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.util.JsfUtils;
 import org.apache.myfaces.extensions.validator.ExtValInformation;
 
 /**
@@ -93,8 +95,9 @@
 
         initNameMappers();
         initValidationExceptionInterceptors();
-        initViolationSeverityInterceptors();
+        initViolationSeverityInterpreter();
         initPropertyValidationInterceptors();
+        initPhaseListeners();
         executeCustomStartupListener();
     }
 
@@ -185,7 +188,7 @@
                 new ViolationSeverityValidationExceptionInterceptor());
     }
 
-    private void initViolationSeverityInterceptors()
+    private void initViolationSeverityInterpreter()
     {
         ExtValContext.getContext().setViolationSeverityInterpreter(new DefaultViolationSeverityInterpreter(), false);
     }
@@ -194,4 +197,9 @@
     {
         ExtValContext.getContext().addPropertyValidationInterceptor(new FacesMessagePropertyValidationInterceptor());
     }
+
+    private void initPhaseListeners()
+    {
+        JsfUtils.registerPhaseListener(new PhaseIdRecordingPhaseListener());
+    }
 }

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorage.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorage.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorage.java Sat Oct 31 23:45:46 2009
@@ -0,0 +1,44 @@
+/*
+ * 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.storage;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import javax.faces.event.PhaseId;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class DefaultFacesInformationStorage implements FacesInformationStorage
+{
+    private PhaseId currentPhaseId;
+
+    public void setCurrentPhaseId(PhaseId phaseId)
+    {
+        this.currentPhaseId = phaseId;
+    }
+
+    public PhaseId getCurrentPhaseId()
+    {
+        return this.currentPhaseId;
+    }
+}

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorageManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorageManager.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorageManager.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultFacesInformationStorageManager.java Sat Oct 31 23:45:46 2009
@@ -0,0 +1,41 @@
+/*
+ * 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.storage;
+
+import org.apache.myfaces.extensions.validator.core.storage.mapper.DefaultFacesInformationStorageNameMapper;
+
+/**
+ * default storage-manager for jsf information not available via jsf-api
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+class DefaultFacesInformationStorageManager extends
+        AbstractRequestScopeAwareStorageManager<FacesInformationStorage>
+{
+    DefaultFacesInformationStorageManager()
+    {
+        register(new DefaultFacesInformationStorageNameMapper());
+    }
+
+    public String getStorageManagerKey()
+    {
+        return StorageManager.class.getName() + "_FOR_FACES_INFORMATION_STORAGE:KEY";
+    }
+}

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java Sat Oct 31 23:45:46 2009
@@ -63,6 +63,9 @@
         setStorageManager(GroupStorage.class, new DefaultGroupStorageManager(), false);
         setStorageManager(MetaDataStorage.class, new DefaultMetaDataStorageManager(), false);
         setStorageManager(FacesMessageStorage.class, new DefaultFacesMessageStorageManager(), false);
+
+        setStorageManager(
+                FacesInformationStorage.class, new DefaultFacesInformationStorageManager(), false);
     }
 
     public StorageManager create(Class storageType)

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/FacesInformationStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/FacesInformationStorage.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/FacesInformationStorage.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/FacesInformationStorage.java Sat Oct 31 23:45:46 2009
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.storage;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import javax.faces.event.PhaseId;
+
+/**
+ * storage for additional information about the current faces request
+ * for now it just contains information about the current phase of the lifecycle
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation(UsageCategory.API)
+public interface FacesInformationStorage
+{
+    void setCurrentPhaseId(PhaseId phaseId);
+
+    PhaseId getCurrentPhaseId();
+}

Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/mapper/DefaultFacesInformationStorageNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/mapper/DefaultFacesInformationStorageNameMapper.java?rev=831617&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/mapper/DefaultFacesInformationStorageNameMapper.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/mapper/DefaultFacesInformationStorageNameMapper.java Sat Oct 31 23:45:46 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.storage.mapper;
+
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
+import org.apache.myfaces.extensions.validator.core.storage.FacesInformationStorage;
+import org.apache.myfaces.extensions.validator.core.storage.DefaultFacesInformationStorage;
+
+/**
+ * use a public class to allow optional deregistration
+ *
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+public class DefaultFacesInformationStorageNameMapper implements NameMapper<String>
+{
+    public String createName(String source)
+    {
+        return (FacesInformationStorage.class.getName().equals(source)) ?
+                DefaultFacesInformationStorage.class.getName() : null;
+    }
+}

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/ViolationSeverityInterpreter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/ViolationSeverityInterpreter.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/ViolationSeverityInterpreter.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/ViolationSeverityInterpreter.java Sat Oct 31 23:45:46 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 javax.faces.context.FacesContext;
 import javax.faces.component.UIComponent;
@@ -76,12 +78,15 @@
             FacesContext facesContext, UIComponent uiComponent, FacesMessage.Severity severity);
 
     /**
+     * available for add-ons not used internally due to performance reasons
+     *
      * @param facesContext current faces context
      * @param uiComponent current component
      * @param severity jsf severity for faces messages
      * @return true if the constraint with the given severity
      * should cause e.g. a required marker independent of client-side validation (if supported)
      */
+    @ToDo(Priority.HIGH)
     boolean severityShowsIndication(
             FacesContext facesContext, UIComponent uiComponent, FacesMessage.Severity severity);
 }

Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java Sat Oct 31 23:45:46 2009
@@ -51,7 +51,6 @@
 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.metadata.MetaDataEntry;
-import org.apache.myfaces.extensions.validator.core.metadata.CommonMetaDataKeys;
 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;
@@ -279,13 +278,12 @@
                                                                                   String targetExpression)
     {
         Object baseObject;
-        if(ExtValUtils.getELHelper().isELTermWellFormed(targetExpression))
+        if(getELHelper().isELTermWellFormed(targetExpression))
         {
             ValueBindingExpression vbe = new ValueBindingExpression(targetExpression);
 
             String expression = vbe.getExpressionString();
-            baseObject = ExtValUtils.getELHelper()
-                    .getValueOfExpression(FacesContext.getCurrentInstance(), vbe.getBaseExpression());
+            baseObject = getELHelper().getValueOfExpression(FacesContext.getCurrentInstance(), vbe.getBaseExpression());
             return new PropertyDetails(
                 expression.substring(2, expression.length() - 1), baseObject, vbe.getProperty());
         }
@@ -369,9 +367,9 @@
 
     public static boolean isSkipableValidationStrategy(Class<? extends ValidationStrategy> targetClass)
     {
-        for(Class currentClass : ExtValUtils.getSkipValidationSupportClassList())
+        for(Class currentClass : getSkipValidationSupportClassList())
         {
-            if(ExtValUtils.isSkipValidationSupported(currentClass, targetClass))
+            if(isSkipValidationSupported(currentClass, targetClass))
             {
                 return true;
             }
@@ -383,7 +381,7 @@
     public static boolean processMetaDataEntryAfterSkipValidation(
             Class<? extends ValidationStrategy> targetClass, MetaDataEntry entry)
     {
-        return ExtValUtils.isSkipableValidationStrategy(targetClass) &&
+        return isSkipableValidationStrategy(targetClass) &&
                 Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class));
     }
 
@@ -573,10 +571,9 @@
     public static Map<String, Object> getTransformedMetaData(FacesContext facesContext, UIComponent uiComponent)
     {
         ValidationStrategy validationStrategy;
-        MetaDataTransformer metaDataTransformer;
 
         SkipValidationEvaluator skipValidationEvaluator = ExtValContext.getContext().getSkipValidationEvaluator();
-        MetaDataExtractor metaDataExtractor = ExtValUtils.getComponentMetaDataExtractor();
+        MetaDataExtractor metaDataExtractor = getComponentMetaDataExtractor();
 
         Map<String, Object> metaData;
         Map<String, Object> metaDataResult = new HashMap<String, Object>();
@@ -584,58 +581,62 @@
         for (MetaDataEntry entry : metaDataExtractor.extract(facesContext, uiComponent).getMetaDataEntries())
         {
             metaData = new HashMap<String, Object>();
-            validationStrategy = ExtValUtils.getValidationStrategyForMetaData(entry.getKey());
+            validationStrategy = getValidationStrategyForMetaData(entry.getKey());
 
             if (validationStrategy != null)
             {
-                if(!skipValidationEvaluator.skipValidation(facesContext, uiComponent, validationStrategy, entry))
-                {
-                    metaDataTransformer = ExtValUtils.getMetaDataTransformerForValidationStrategy(validationStrategy);
-
-                    if(metaDataTransformer != null)
-                    {
-                        if(LOGGER.isDebugEnabled())
-                        {
-                            LOGGER.debug(metaDataTransformer.getClass().getName() + " instantiated");
-                        }
-
-                        if(isClientSideValidationEnabled(entry))
-                        {
-                            metaData = metaDataTransformer.convertMetaData(entry);
-                        }
-                    }
-                    else
-                    {
-                        metaData = null;
-                    }
+                metaData = transformMetaData(
+                        facesContext, uiComponent, validationStrategy, skipValidationEvaluator, metaData, entry);
 
-                    if(metaData == null)
-                    {
-                        metaData = new HashMap<String, Object>();
-                    }
-                }
-
-                if(metaData.isEmpty() ||
-                      (Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)) &&
-                        ExtValUtils.isSkipableValidationStrategy(validationStrategy.getClass())))
+                if(!isComponentInitializationSkipped(metaData, entry, validationStrategy))
                 {
                     //don't break maybe there are constraints which don't support the skip-mechanism
-                    continue;
+                    metaDataResult.putAll(metaData);
                 }
-
-                metaDataResult.putAll(metaData);
            }
         }
 
         return metaDataResult;
     }
 
-    private static boolean isClientSideValidationEnabled(MetaDataEntry entry)
+    private static Map<String, Object> transformMetaData(FacesContext facesContext,
+                                                         UIComponent uiComponent,
+                                                         ValidationStrategy validationStrategy,
+                                                         SkipValidationEvaluator skipValidationEvaluator,
+                                                         Map<String, Object> metaData, MetaDataEntry entry)
     {
-        List<String> keysToDisable = entry.getProperty(
-                                CommonMetaDataKeys.DISABLE_CLIENT_SIDE_VALIDATION, List.class);
+        if(!skipValidationEvaluator.skipValidation(facesContext, uiComponent, validationStrategy, entry))
+        {
+            MetaDataTransformer metaDataTransformer = getMetaDataTransformerForValidationStrategy(validationStrategy);
 
-        return keysToDisable == null || !keysToDisable.contains(entry.getKey());
+            if(metaDataTransformer != null)
+            {
+                if(LOGGER.isDebugEnabled())
+                {
+                    LOGGER.debug(metaDataTransformer.getClass().getName() + " instantiated");
+                }
+
+                metaData = metaDataTransformer.convertMetaData(entry);
+            }
+            else
+            {
+                metaData = null;
+            }
+
+            if(metaData == null)
+            {
+                return new HashMap<String, Object>();
+            }
+        }
+        return metaData;
+    }
+
+    private static boolean isComponentInitializationSkipped(Map<String, Object> metaData, MetaDataEntry entry,
+                                                            ValidationStrategy validationStrategy)
+    {
+        return metaData.isEmpty() ||
+              (Boolean.TRUE.equals(entry.getProperty(PropertyInformationKeys.SKIP_VALIDATION, Boolean.class)) &&
+                isSkipableValidationStrategy(validationStrategy.getClass()));
     }
 
     public static boolean interpretEmptyStringValuesAsNull()
@@ -729,11 +730,7 @@
             }
             else
             {
-                if(LOGGER.isWarnEnabled())
-                {
-                    LOGGER.warn("no component was found that might happen with test-frameworks" +
-                            " and shouldn't happen in real applications");
-                }
+                addFacesMessage(null, facesMessage);
             }
         }
         tryToBlocksNavigationForComponent(uiComponent, facesMessage);
@@ -789,6 +786,7 @@
         return interpreter.severityBlocksSubmit(facesContext, targetComponent, facesMessage.getSeverity());
     }
 
+    //available for add-ons not used internally due to performance reasons
     public static boolean severityShowsIndicationForComponentId(String clientId, FacesMessage facesMessage)
     {
         ViolationSeverityInterpreter interpreter =

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/ExtValBeanValidationContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/ExtValBeanValidationContext.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/ExtValBeanValidationContext.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/ExtValBeanValidationContext.java Sat Oct 31 23:45:46 2009
@@ -34,7 +34,6 @@
 import org.apache.commons.logging.LogFactory;
 
 import javax.faces.context.FacesContext;
-import javax.faces.component.UIComponent;
 import javax.validation.MessageInterpolator;
 import javax.validation.Validation;
 import javax.validation.ValidatorFactory;
@@ -127,9 +126,9 @@
         return this.groupStorage.getGroups(viewId, clientId);
     }
 
-    public void addModelValidationEntry(ModelValidationEntry modelValidationEntry, String viewId, UIComponent component)
+    public void addModelValidationEntry(ModelValidationEntry modelValidationEntry)
     {
-        this.modelValidationStorage.addModelValidationEntry(modelValidationEntry, viewId, component);
+        this.modelValidationStorage.addModelValidationEntry(modelValidationEntry);
     }
 
     public List<ModelValidationEntry> getModelValidationEntriesToValidate()

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/extractor/DefaultGroupControllerScanningExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/extractor/DefaultGroupControllerScanningExtractor.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/extractor/DefaultGroupControllerScanningExtractor.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/annotation/extractor/DefaultGroupControllerScanningExtractor.java Sat Oct 31 23:45:46 2009
@@ -22,6 +22,7 @@
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
 import org.apache.myfaces.extensions.validator.core.property.DefaultPropertyInformation;
 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
 
 import javax.faces.context.FacesContext;
 
@@ -44,7 +45,8 @@
         Class entityClass = propertyDetails.getBaseObject().getClass();
 
         PropertyInformation propertyInformation = new DefaultPropertyInformation();
-        
+        propertyInformation.setInformation(PropertyInformationKeys.PROPERTY_DETAILS, propertyDetails);
+
         /*
          * find and add annotations
          */

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/AbstractBeanValidationMetaDataTransformer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/AbstractBeanValidationMetaDataTransformer.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/AbstractBeanValidationMetaDataTransformer.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/metadata/transformer/AbstractBeanValidationMetaDataTransformer.java Sat Oct 31 23:45:46 2009
@@ -40,6 +40,7 @@
 @UsageInformation({UsageCategory.REUSE})
 public abstract class AbstractBeanValidationMetaDataTransformer<T extends Annotation> implements MetaDataTransformer
 {
+    @SuppressWarnings({"unchecked"})
     public Map<String, Object> convertMetaData(MetaDataEntry metaDataEntry)
     {
         ConstraintDescriptor<? extends T> constraintDescriptor = metaDataEntry.getValue(ConstraintDescriptor.class);

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/startup/BeanValidationStartupListener.java Sat Oct 31 23:45:46 2009
@@ -58,8 +58,8 @@
         registerMetaDataTransformerNameMapper();
         registerGroupStorageNameMapper();
         registerModelValidationStorageNameMapper();
-        registerModelValidationPhaseListener();
         registerComponentInitializers();
+        registerPhaseListeners();
     }
 
     protected void registerValidatorFactory()
@@ -107,20 +107,20 @@
         getStorageManagerHolder().setStorageManager(ModelValidationStorage.class, modelValidationStorageManager, false);
     }
 
-    protected void registerModelValidationPhaseListener()
-    {
-        JsfUtils.registerPhaseListener(new ModelValidationPhaseListener());
-    }
-
     protected void registerComponentInitializers()
     {
         ExtValContext.getContext().addComponentInitializer(new HtmlCoreComponentsComponentInitializer());
     }
 
-    private StorageManagerHolder getStorageManagerHolder()
+    protected StorageManagerHolder getStorageManagerHolder()
     {
         return (ExtValContext.getContext()
                 .getFactoryFinder()
                 .getFactory(FactoryNames.STORAGE_MANAGER_FACTORY, StorageManagerHolder.class));
     }
+
+    protected void registerPhaseListeners()
+    {
+        JsfUtils.registerPhaseListener(new ModelValidationPhaseListener());
+    }
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/DefaultModelValidationStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/DefaultModelValidationStorage.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/DefaultModelValidationStorage.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/DefaultModelValidationStorage.java Sat Oct 31 23:45:46 2009
@@ -22,7 +22,6 @@
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import static org.apache.myfaces.extensions.validator.internal.UsageCategory.INTERNAL;
 
-import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import java.util.List;
 import java.util.Map;
@@ -43,26 +42,25 @@
 
     private List<String> componentsOfRequest = new ArrayList<String>();
 
-    public void addModelValidationEntry(
-            ModelValidationEntry modelValidationEntry, String viewId, UIComponent component)
+    public void addModelValidationEntry(ModelValidationEntry modelValidationEntry)
     {
-        modelValidationEntry.setComponent(component);
-
         String clientId = null;
 
-        if(component != null)
+        if(modelValidationEntry.getComponent() != null)
         {
-            clientId = component.getClientId(FacesContext.getCurrentInstance());
+            clientId = modelValidationEntry.getComponent().getClientId(FacesContext.getCurrentInstance());
             this.componentsOfRequest.add(clientId);
         }
 
         List<ModelValidationEntry> modelValidationEntryList =
-                this.modelValidationEntries.get(GroupUtils.getGroupKey(viewId, clientId));
+                this.modelValidationEntries.get(GroupUtils.getGroupKey(
+                        modelValidationEntry.getViewId(), clientId));
 
         if(modelValidationEntryList == null)
         {
             modelValidationEntryList = new ArrayList<ModelValidationEntry>();
-            this.modelValidationEntries.put(GroupUtils.getGroupKey(viewId, clientId), modelValidationEntryList);
+            this.modelValidationEntries.put(GroupUtils.getGroupKey(
+                    modelValidationEntry.getViewId(), clientId), modelValidationEntryList);
         }
 
         if(!modelValidationEntryList.contains(modelValidationEntry))

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationEntry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationEntry.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationEntry.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationEntry.java Sat Oct 31 23:45:46 2009
@@ -23,6 +23,7 @@
 import static org.apache.myfaces.extensions.validator.internal.UsageCategory.INTERNAL;
 
 import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
 import java.util.List;
 import java.util.ArrayList;
 
@@ -38,6 +39,7 @@
     private List<Class> groups = new ArrayList<Class>();
     private List<Object> validationTargets = new ArrayList<Object>();
     private Object metaDataSourceObject;
+    private String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
 
     public void addGroup(Class group)
     {
@@ -122,7 +124,7 @@
 
     public void setValidationTargets(List<Object> validationTargets)
     {
-        this.validationTargets = new ArrayList<Object>();
+        this.validationTargets = validationTargets;
     }
 
     public Object getMetaDataSourceObject()
@@ -135,6 +137,7 @@
         this.metaDataSourceObject = metaDataSourceObject;
     }
 
+    @SuppressWarnings({"RedundantIfStatement"})
     @Override
     public boolean equals(Object o)
     {
@@ -173,4 +176,14 @@
         result = 31 * result + validationTargets.hashCode();
         return result;
     }
+
+    public String getViewId()
+    {
+        return viewId;
+    }
+
+    public void setViewId(String viewId)
+    {
+        this.viewId = viewId;
+    }
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationStorage.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationStorage.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/storage/ModelValidationStorage.java Sat Oct 31 23:45:46 2009
@@ -21,7 +21,6 @@
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 
-import javax.faces.component.UIComponent;
 import java.util.List;
 
 /**
@@ -35,8 +34,7 @@
 @UsageInformation(UsageCategory.API)
 public interface ModelValidationStorage
 {
-    void addModelValidationEntry(
-            ModelValidationEntry modelValidationEntry, String viewId, UIComponent component);
+    void addModelValidationEntry(ModelValidationEntry modelValidationEntry);
 
     List<ModelValidationEntry> getModelValidationEntriesToValidate();
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/util/BeanValidationUtils.java Sat Oct 31 23:45:46 2009
@@ -126,7 +126,7 @@
         processRestrictedGroups(extValBeanValidationContext, currentViewId, clientId,
                 restrictedGroupsForPropertyValidation);
 
-        initModelValidation(extValBeanValidationContext, currentViewId, component, propertyDetails,
+        initModelValidation(extValBeanValidationContext, component, propertyDetails,
                 modelValidationEntryList, restrictedGroupsForModelValidation);
     }
 
@@ -220,7 +220,6 @@
     }
 
     private static void initModelValidation(ExtValBeanValidationContext extValBeanValidationContext,
-                                            String currentViewId,
                                             UIComponent component,
                                             PropertyDetails propertyDetails,
                                             List<ModelValidationEntry> modelValidationEntryList,
@@ -239,7 +238,8 @@
             if (modelValidationEntry.getGroups().length > 0)
             {
                 addTargetsForModelValidation(modelValidationEntry, propertyDetails.getBaseObject());
-                extValBeanValidationContext.addModelValidationEntry(modelValidationEntry, currentViewId, component);
+                modelValidationEntry.setComponent(component);
+                extValBeanValidationContext.addModelValidationEntry(modelValidationEntry);
             }
         }
     }
@@ -477,15 +477,18 @@
                                                    boolean firstErrorCausesAnException)
     {
         List<FacesMessageHolder> facesMessageHolderList = new ArrayList<FacesMessageHolder>();
-        FacesMessageHolder facesMessageHolder;
 
+        FacesMessage facesMessage;
         for (ConstraintViolation violation : violations)
         {
-            facesMessageHolder = new FacesMessageHolder(
-                    createFacesMessageForConstraintViolation(uiComponent, convertedObject, violation));
-            facesMessageHolder.setClientId(uiComponent.getClientId(facesContext));
+            facesMessage = createFacesMessageForConstraintViolation(uiComponent, convertedObject, violation);
 
-            facesMessageHolderList.add(facesMessageHolder);
+            if(facesMessage == null)
+            {
+                continue;
+            }
+
+            processFacesMessage(facesContext, uiComponent, facesMessageHolderList, facesMessage);
         }
 
         processViolationMessages(facesMessageHolderList, firstErrorCausesAnException);
@@ -504,7 +507,10 @@
 
         ValidatorException validatorException = createValidatorException(labeledMessage, severity);
 
-        executeAfterThrowingInterceptors(uiComponent, convertedObject, validatorException);
+        if(!executeAfterThrowingInterceptors(uiComponent, convertedObject, validatorException))
+        {
+            return null;
+        }
 
         if (isMessageTextUnchanged(validatorException, labeledMessage))
         {
@@ -542,11 +548,21 @@
         return FacesMessage.SEVERITY_ERROR;
     }
 
-    private static void executeAfterThrowingInterceptors(UIComponent uiComponent,
+    private static void processFacesMessage(FacesContext facesContext, UIComponent uiComponent,
+                                            List<FacesMessageHolder> facesMessageHolderList, FacesMessage facesMessage)
+    {
+        FacesMessageHolder facesMessageHolder = new FacesMessageHolder(facesMessage);
+
+        facesMessageHolder.setClientId(uiComponent.getClientId(facesContext));
+
+        facesMessageHolderList.add(facesMessageHolder);
+    }
+
+    private static boolean executeAfterThrowingInterceptors(UIComponent uiComponent,
                                                          Object convertedObject,
                                                          ValidatorException validatorException)
     {
-        ExtValUtils.executeAfterThrowingInterceptors(
+        return ExtValUtils.executeAfterThrowingInterceptors(
                 uiComponent,
                 null,
                 convertedObject,
@@ -569,6 +585,11 @@
     public static void processViolationMessages(List<FacesMessageHolder> violationMessageHolderList,
                                                 boolean firstErrorCausesAnException)
     {
+        if(violationMessageHolderList == null || violationMessageHolderList.isEmpty())
+        {
+            return;
+        }
+
         List<FacesMessageHolder> facesMessageListWithLowSeverity =
                 getFacesMessageListWithLowSeverity(violationMessageHolderList);
         List<FacesMessageHolder> facesMessageListWithHighSeverity =

Modified: myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/validation/ModelValidationPhaseListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/validation/ModelValidationPhaseListener.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/validation/ModelValidationPhaseListener.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/bean-validation/src/main/java/org/apache/myfaces/extensions/validator/beanval/validation/ModelValidationPhaseListener.java Sat Oct 31 23:45:46 2009
@@ -21,12 +21,16 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.extensions.validator.beanval.ExtValBeanValidationContext;
+import org.apache.myfaces.extensions.validator.beanval.BeanValidationModuleKey;
 import org.apache.myfaces.extensions.validator.beanval.annotation.ModelValidation;
 import org.apache.myfaces.extensions.validator.beanval.storage.ModelValidationEntry;
 import org.apache.myfaces.extensions.validator.beanval.util.BeanValidationUtils;
-import org.apache.myfaces.extensions.validator.internal.ToDo;
-import org.apache.myfaces.extensions.validator.internal.Priority;
 import org.apache.myfaces.extensions.validator.core.validation.message.FacesMessageHolder;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.core.property.DefaultPropertyInformation;
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;
+import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
@@ -72,6 +76,8 @@
 
         processViolations(results);
 
+        executeGlobalAfterValidationInterceptorsFor(results);
+
         if (logger.isTraceEnabled())
         {
             logger.trace("jsr303 validation finished");
@@ -87,8 +93,19 @@
                                         List<Object> processedValidationTargets,
                                         Map<String, ModelValidationResult> results)
     {
+        FacesContext facesContext = FacesContext.getCurrentInstance();
+        PropertyInformation propertyInformation;
+
         for (Object validationTarget : modelValidationEntry.getValidationTargets())
         {
+            propertyInformation = createPropertyInformation(modelValidationEntry, validationTarget);
+
+            if(!executeGlobalBeforeValidationInterceptors(
+                    facesContext, modelValidationEntry.getComponent(), validationTarget, propertyInformation))
+            {
+                return;
+            }
+
             if (processedValidationTargets.contains(validationTarget) &&
                     !modelValidationEntry.getMetaData().displayInline())
             {
@@ -104,7 +121,43 @@
         }
     }
 
-    @ToDo(value = Priority.HIGH, description = "refactor and remove FacesContext#renderResponse")
+    private PropertyInformation createPropertyInformation(
+            ModelValidationEntry modelValidationEntry, Object validationTarget)
+    {
+        PropertyInformation propertyInformation;
+        PropertyDetails propertyDetails;
+        propertyInformation = new DefaultPropertyInformation();
+        if(modelValidationEntry.getComponent() != null)
+        {
+            propertyDetails = ExtValUtils.getELHelper()
+                    .getPropertyDetailsOfValueBinding(modelValidationEntry.getComponent());
+        }
+        else
+        {
+            propertyDetails = new PropertyDetails(null, validationTarget, null);
+        }
+        propertyInformation.setInformation(PropertyInformationKeys.PROPERTY_DETAILS, propertyDetails);
+        return propertyInformation;
+    }
+
+    private boolean executeGlobalBeforeValidationInterceptors(FacesContext facesContext,
+                                                              UIComponent uiComponent,
+                                                              Object validationTarget,
+                                                              PropertyInformation propertyInformation)
+    {
+        return ExtValUtils.executeGlobalBeforeValidationInterceptors(facesContext, uiComponent, validationTarget,
+                PropertyInformation.class.getName(), propertyInformation, BeanValidationModuleKey.class);
+    }
+
+    private void executeGlobalAfterValidationInterceptors(FacesContext facesContext,
+                                                          UIComponent uiComponent,
+                                                          Object validationTarget,
+                                                          PropertyInformation propertyInformation)
+    {
+        ExtValUtils.executeGlobalAfterValidationInterceptors(facesContext, uiComponent, validationTarget,
+                PropertyInformation.class.getName(), propertyInformation, BeanValidationModuleKey.class);
+    }
+    
     private void validateTarget(ModelValidationEntry modelValidationEntry,
                                 Object validationTarget,
                                 Class[] groups,
@@ -119,7 +172,6 @@
         if (violations != null && !violations.isEmpty())
         {
             FacesContext facesContext = FacesContext.getCurrentInstance();
-            facesContext.renderResponse();
 
             //jsf 2.0 is able to display multiple messages per component - so process all violations
             //jsf < 2.0 will just use the first one (it's only a little overhead)
@@ -266,6 +318,24 @@
         }
     }
 
+    private void executeGlobalAfterValidationInterceptorsFor(Map<String, ModelValidationResult> results)
+    {
+        FacesContext facesContext = FacesContext.getCurrentInstance();
+        UIComponent component;
+        for (ModelValidationResult result : results.values())
+        {
+            for(FacesMessageHolder facesMessageHolder : result.getFacesMessageHolderList())
+            {
+                component = null;
+                if(facesMessageHolder.getClientId() != null && !facesMessageHolder.getClientId().equals("*"))
+                {
+                    component = facesContext.getViewRoot().findComponent(facesMessageHolder.getClientId());
+                }
+                executeGlobalAfterValidationInterceptors(facesContext, component, null, null);
+            }
+        }
+    }
+
     public void beforePhase(PhaseEvent phaseEvent)
     {
         //do nothing

Modified: myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/config/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/config/faces-config.xml?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/config/faces-config.xml (original)
+++ myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/config/faces-config.xml Sat Oct 31 23:45:46 2009
@@ -23,8 +23,4 @@
     <lifecycle>
         <phase-listener>org.apache.myfaces.extensions.validator.PropertyValidationModuleStartupListener</phase-listener>
     </lifecycle>
-
-    <lifecycle>
-        <phase-listener>org.apache.myfaces.extensions.validator.crossval.CrossValidationPhaseListener</phase-listener>
-    </lifecycle>
 </faces-config>
\ No newline at end of file

Modified: myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java Sat Oct 31 23:45:46 2009
@@ -43,7 +43,9 @@
 import org.apache.myfaces.extensions.validator.crossval.storage.ProcessedInformationStorage;
 import org.apache.myfaces.extensions.validator.crossval.storage.mapper.CrossValidationStorageNameMapper;
 import org.apache.myfaces.extensions.validator.crossval.storage.mapper.ProcessedInformationStorageNameMapper;
+import org.apache.myfaces.extensions.validator.crossval.CrossValidationPhaseListener;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.util.JsfUtils;
 
 /**
  * @author Gerhard Petracek
@@ -56,14 +58,19 @@
 
     protected void init()
     {
-        ExtValContext.getContext().addProcessedInformationRecorder(new CrossValidationUserInputRecorder());
-
+        initProcessedInformationRecorders();
         initStaticStrategyMappings();
         initDefaultComponentInitializer();
         addSkipValidationSupport();
         initStorageManagerAndNameMappers();
         initSkipValidationEvaluator();
         initMetaDataStorageFilters();
+        initPhaseListeners();
+    }
+
+    private void initProcessedInformationRecorders()
+    {
+        ExtValContext.getContext().addProcessedInformationRecorder(new CrossValidationUserInputRecorder());
     }
 
     private void initStaticStrategyMappings()
@@ -148,4 +155,9 @@
 
         metaDataStorage.registerFilter(new JoinValidationMetaDataStorageFilter());
     }
+
+    private void initPhaseListeners()
+    {
+        JsfUtils.registerPhaseListener(new CrossValidationPhaseListener());
+    }
 }

Modified: myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationSkipValidationEvaluator.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationSkipValidationEvaluator.java?rev=831617&r1=831616&r2=831617&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationSkipValidationEvaluator.java (original)
+++ myfaces/extensions/validator/trunk/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationSkipValidationEvaluator.java Sat Oct 31 23:45:46 2009
@@ -23,10 +23,15 @@
 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
 import org.apache.myfaces.extensions.validator.core.validation.SkipValidationEvaluator;
 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.storage.FacesInformationStorage;
 import org.apache.myfaces.extensions.validator.util.PropertyValidationUtils;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 
 import javax.faces.context.FacesContext;
 import javax.faces.component.UIComponent;
+import javax.faces.event.PhaseId;
+import java.util.List;
 
 /**
  * @author Gerhard Petracek
@@ -40,6 +45,31 @@
                                      ValidationStrategy validationStrategy,
                                      MetaDataEntry metaDataEntry)
     {
-        return PropertyValidationUtils.isValidationSkipped(facesContext, validationStrategy, metaDataEntry);
+        boolean result = false;
+        
+        if(isRenderResponsePhase())
+        {
+            result = !isClientSideValidationEnabled(metaDataEntry);
+        }
+        return result || PropertyValidationUtils.isValidationSkipped(facesContext, validationStrategy, metaDataEntry);
+    }
+
+    private boolean isRenderResponsePhase()
+    {
+        return PhaseId.RENDER_RESPONSE.equals(getFacesInformationStorage().getCurrentPhaseId());
+    }
+
+    private FacesInformationStorage getFacesInformationStorage()
+    {
+        return ExtValUtils.getStorage(FacesInformationStorage.class, FacesInformationStorage.class.getName());
+    }
+
+    @SuppressWarnings({"unchecked"})
+    private boolean isClientSideValidationEnabled(MetaDataEntry entry)
+    {
+        List<String> keysToDisable = entry.getProperty(
+                                CommonMetaDataKeys.DISABLE_CLIENT_SIDE_VALIDATION, List.class);
+
+        return keysToDisable == null || !keysToDisable.contains(entry.getKey());
     }
 }
\ No newline at end of file