EXTVAL-100 sync with branch

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/validator/trunk@964028 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/DefaultExtValTrinidadSupportModuleConfiguration.java b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/DefaultExtValTrinidadSupportModuleConfiguration.java
new file mode 100644
index 0000000..bb85a3a
--- /dev/null
+++ b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/DefaultExtValTrinidadSupportModuleConfiguration.java
@@ -0,0 +1,49 @@
+/*

+ * 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.trinidad;

+

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public class DefaultExtValTrinidadSupportModuleConfiguration extends ExtValTrinidadSupportModuleConfiguration

+{

+    /*

+     * web.xml config

+     */

+

+    public boolean deactivateClientSideValidation()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_CLIENT_SIDE_TRINIDAD_VALIDATION);

+    }

+

+    public boolean deactivateCoreOutputLabelInitialization()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_TRINIDAD_CORE_OUTPUT_LABEL_INITIALIZATION);

+    }

+

+    public boolean deactivateValidationExceptionInterceptor()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_TRINIDAD_VALIDATION_EXCEPTION_INTERCEPTOR);

+    }

+}

diff --git a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/ExtValTrinidadSupportModuleConfiguration.java b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/ExtValTrinidadSupportModuleConfiguration.java
new file mode 100644
index 0000000..60f574b
--- /dev/null
+++ b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/ExtValTrinidadSupportModuleConfiguration.java
@@ -0,0 +1,60 @@
+/*

+ * 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.trinidad;

+

+import org.apache.myfaces.extensions.validator.core.ExtValContext;

+import org.apache.myfaces.extensions.validator.core.ExtValModuleConfiguration;

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public abstract class ExtValTrinidadSupportModuleConfiguration implements ExtValModuleConfiguration

+{

+    private static ExtValContext extValContext = ExtValContext.getContext();

+

+    protected ExtValTrinidadSupportModuleConfiguration()

+    {

+    }

+

+    public static ExtValTrinidadSupportModuleConfiguration get()

+    {

+        return extValContext.getModuleConfiguration(ExtValTrinidadSupportModuleConfiguration.class);

+    }

+

+    @UsageInformation(UsageCategory.INTERNAL)

+    public static boolean use(ExtValTrinidadSupportModuleConfiguration config, boolean forceOverride)

+    {

+        return extValContext.addModuleConfiguration(

+                ExtValTrinidadSupportModuleConfiguration.class, config, forceOverride);

+    }

+

+    /*

+     * web.xml config

+     */

+

+    public abstract boolean deactivateClientSideValidation();

+

+    public abstract boolean deactivateCoreOutputLabelInitialization();

+

+    public abstract boolean deactivateValidationExceptionInterceptor();

+}

diff --git a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/WebXmlParameter.java b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/WebXmlParameter.java
index 4e0cb74..6ba4033 100644
--- a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/WebXmlParameter.java
+++ b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/WebXmlParameter.java
@@ -29,7 +29,7 @@
  * @since 1.x.1

  */

 @UsageInformation(UsageCategory.INTERNAL)

-public interface WebXmlParameter

+interface WebXmlParameter

 {

     /*

      * deactivate

diff --git a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java
index 54b756b..b1d75a0 100644
--- a/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java
+++ b/component-support/trinidad-support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/startup/TrinidadModuleStartupListener.java
@@ -20,12 +20,14 @@
 

 import org.apache.myfaces.extensions.validator.core.startup.AbstractStartupListener;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.storage.StorageManagerHolder;

 import org.apache.myfaces.extensions.validator.core.renderkit.AbstractRenderKitWrapperFactory;

 import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;

 import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;

 import org.apache.myfaces.extensions.validator.trinidad.initializer.component.TrinidadComponentInitializer;

-import org.apache.myfaces.extensions.validator.trinidad.WebXmlParameter;

+import org.apache.myfaces.extensions.validator.trinidad.ExtValTrinidadSupportModuleConfiguration;

+import org.apache.myfaces.extensions.validator.trinidad.DefaultExtValTrinidadSupportModuleConfiguration;

 import org.apache.myfaces.extensions.validator.trinidad.storage.TrinidadClientValidatorStorage;

 import org.apache.myfaces.extensions.validator.trinidad.storage.DefaultClientValidatorStorageManager;

 import org.apache.myfaces.extensions.validator.trinidad.validation.message.TrinidadFacesMessageFactory;

@@ -47,8 +49,15 @@
 {

     private static final long serialVersionUID = -8034089244903966999L;

 

+    protected void initModuleConfig()

+    {

+        ExtValTrinidadSupportModuleConfiguration.use(new DefaultExtValTrinidadSupportModuleConfiguration(), false);

+    }

+

     protected void init()

     {

+        initModuleConfig();

+

         deactivateDefaultExtValRenderKitWrapperFactory();

 

         initClientSideValidationSupport();

@@ -82,7 +91,7 @@
 

     private void initClientSideValidationSupport()

     {

-        if(isClientSideValidationSupportEnabled(WebXmlParameter.DEACTIVATE_CLIENT_SIDE_TRINIDAD_VALIDATION))

+        if(!ExtValTrinidadSupportModuleConfiguration.get().deactivateClientSideValidation())

         {

             ExtValContext.getContext().addComponentInitializer(new TrinidadComponentInitializer());

         }

@@ -90,7 +99,7 @@
 

     private void initLabelInitializationSupport()

     {

-        if(isLabelInitializationEnabled(WebXmlParameter.DEACTIVATE_TRINIDAD_CORE_OUTPUT_LABEL_INITIALIZATION))

+        if(!ExtValTrinidadSupportModuleConfiguration.get().deactivateCoreOutputLabelInitialization())

         {

             ExtValContext.getContext().registerRendererInterceptor(new TrinidadRendererInterceptor());

         }

@@ -98,7 +107,7 @@
 

     private void initValidationExceptionInterception()

     {

-        if(useValidationExceptionInterception(WebXmlParameter.DEACTIVATE_TRINIDAD_VALIDATION_EXCEPTION_INTERCEPTOR))

+        if(!ExtValTrinidadSupportModuleConfiguration.get().deactivateValidationExceptionInterceptor())

         {

             ExtValContext.getContext().addValidationExceptionInterceptor(new TrinidadValidationExceptionInterceptor());

         }

@@ -131,22 +140,6 @@
                         new DefaultClientValidatorStorageManager(), false);

     }

 

-    private boolean isLabelInitializationEnabled(String deactivateInitCoreOutputLabel)

-    {

-        return deactivateInitCoreOutputLabel == null || !deactivateInitCoreOutputLabel.equalsIgnoreCase("true");

-    }

-

-    private boolean isClientSideValidationSupportEnabled(String deactivateClientSideValidation)

-    {

-        return deactivateClientSideValidation == null || !deactivateClientSideValidation.equalsIgnoreCase("true");

-    }

-

-    private boolean useValidationExceptionInterception(String deactivateTrinidadValidationExceptionInterceptor)

-    {

-        return deactivateTrinidadValidationExceptionInterceptor == null ||

-                !deactivateTrinidadValidationExceptionInterceptor.equalsIgnoreCase("true");

-    }

-

     protected void initRequiredInitialization()

     {

         if(!isRequiredInitializationDeactivated())

@@ -160,7 +153,6 @@
 

     private boolean isRequiredInitializationDeactivated()

     {

-        return "false".equalsIgnoreCase(

-                org.apache.myfaces.extensions.validator.core.WebXmlParameter.ACTIVATE_REQUIRED_INITIALIZATION);

+        return !ExtValCoreConfiguration.get().activateRequiredInitialization();

     }

 }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/ExtValInformation.java b/core/src/main/java/org/apache/myfaces/extensions/validator/ExtValInformation.java
index 77d5d1c..6e5b513 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/ExtValInformation.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/ExtValInformation.java
@@ -31,7 +31,8 @@
 @UsageInformation(UsageCategory.INTERNAL)

 public interface ExtValInformation

 {

-    static final String EXTENSIONS_VALIDATOR_BASE_PACKAGE_NAME = ExtValInformation.class.getPackage().getName();

-    static final String WEBXML_PARAM_PREFIX = ExtValInformation.class.getPackage().getName();

+    // getPackage isn't working with a custom class loader

+    static final String EXTENSIONS_VALIDATOR_BASE_PACKAGE_NAME = ClassUtils.getPackageName(ExtValInformation.class);

+    static final String WEBXML_PARAM_PREFIX = ClassUtils.getPackageName(ExtValInformation.class);

     static final String VERSION = ClassUtils.getJarVersion(ExtValInformation.class);

 }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/DefaultExtValCoreConfiguration.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/DefaultExtValCoreConfiguration.java
new file mode 100644
index 0000000..adb41cf
--- /dev/null
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/DefaultExtValCoreConfiguration.java
@@ -0,0 +1,271 @@
+/*

+ * 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.core.proxy.ProxyHelper;

+import org.apache.myfaces.extensions.validator.core.proxy.DefaultProxyHelper;

+import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;

+import org.apache.myfaces.extensions.validator.core.validation.ConstraintSource;

+import org.apache.myfaces.extensions.validator.core.validation.IgnoreConstraintSource;

+import org.apache.myfaces.extensions.validator.core.validation.TargetProperty;

+import org.apache.myfaces.extensions.validator.core.validation.TargetPropertyId;

+import org.apache.myfaces.extensions.validator.core.validation.parameter.DisableClientSideValidation;

+import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameter;

+import org.apache.myfaces.extensions.validator.core.validation.parameter.ViolationSeverity;

+import org.apache.myfaces.extensions.validator.util.ClassUtils;

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+import java.lang.annotation.Annotation;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public class DefaultExtValCoreConfiguration extends ExtValCoreConfiguration

+{

+    public String customMessageBundleBaseName()

+    {

+        return WebXmlParameter.CUSTOM_MESSAGE_BUNDLE;

+    }

+

+    public String customBasePackage()

+    {

+        return WebXmlParameter.CUSTOM_BASE_PACKAGE;

+    }

+

+    public String customInformationProviderBeanClassName()

+    {

+        return WebXmlParameter.CUSTOM_INFORMATION_PROVIDER_BEAN;

+    }

+

+    public String customComponentMetaDataExtractorClassName()

+    {

+        return WebXmlParameter.CUSTOM_COMPONENT_META_DATA_EXTRACTOR;

+    }

+

+    public String customValidationParameterExtractorClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_EXTRACTOR;

+    }

+

+    public String customStaticValidationStrategyMappingSource()

+    {

+        return WebXmlParameter.CUSTOM_STATIC_VALIDATION_STRATEGY_MAPPING;

+    }

+

+    public String customComponentInitializerClassName()

+    {

+        return WebXmlParameter.CUSTOM_COMPONENT_INITIALIZER;

+    }

+

+    public String customValidationExceptionInterceptorClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_EXCEPTION_INTERCEPTOR;

+    }

+

+    public String customPropertyValidationInterceptorClassName()

+    {

+        return WebXmlParameter.CUSTOM_PROPERTY_VALIDATION_INTERCEPTOR;

+    }

+

+    public String customMetaDataExtractionInterceptorClassName()

+    {

+        return WebXmlParameter.CUSTOM_META_DATA_EXTRACTION_INTERCEPTOR;

+    }

+

+    public ProxyHelper proxyHelper()

+    {

+        String customProxyHelperClassName = WebXmlParameter.CUSTOM_PROXY_HELPER;

+

+        if (customProxyHelperClassName != null && !"".equals(customProxyHelperClassName))

+        {

+            return (ProxyHelper) ClassUtils.tryToInstantiateClassForName(customProxyHelperClassName);

+        }

+

+        return new DefaultProxyHelper();

+    }

+

+    public ProjectStageResolver projectStageResolver()

+    {

+        return new DefaultProjectStageResolver();

+    }

+

+    public Class<? extends ExtValRendererProxy> rendererProxy()

+    {

+        String proxyClassName = (String) ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);

+

+        if (proxyClassName != null && !proxyClassName.endsWith(getClass().getName()))

+        {

+            Class<? extends ExtValRendererProxy> targetClass = ClassUtils.tryToLoadClassForName(proxyClassName);

+

+            if (targetClass == null)

+            {

+                throw new IllegalStateException("a custom invalid renderer proxy is configured: " + proxyClassName);

+            }

+

+            return targetClass;

+        }

+

+        return null;

+    }

+

+    public Class violationSeverity()

+    {

+        return ViolationSeverity.class;

+    }

+

+    public String customValidationStrategyToMessageResolverNameMapperClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_TO_MESSAGE_RESOLVER_NAME_MAPPER;

+    }

+

+    public String customMetaDataToValidationStrategyNameMapperClassName()

+    {

+        return WebXmlParameter.CUSTOM_META_DATA_TO_VALIDATION_STRATEGY_NAME_MAPPER;

+    }

+

+    public String customValidationStrategyToMetaDataTransformerNameMapperClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_TO_META_DATA_TRANSFORMER_NAME_MAPPER;

+    }

+

+    public String customMetaDataStorageFilterClassName()

+    {

+        return WebXmlParameter.CUSTOM_META_DATA_STORAGE_FILTER;

+    }

+

+    public String customValidationStrategyFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_FACTORY;

+    }

+

+    public String customMessageResolverFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_MESSAGE_RESOLVER_FACTORY;

+    }

+

+    public String customComponentMetaDataExtractorFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_COMPONENT_META_DATA_EXTRACTOR_FACTORY;

+    }

+

+    public String customValidationParameterExtractorFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_EXTRACTOR_FACTORY;

+    }

+

+    public String customValidationParameterFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_FACTORY;

+    }

+

+    public String customMetaDataTransformerFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_META_DATA_TRANSFORMER_FACTORY;

+    }

+

+    public String customStorageManagerFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_STORAGE_MANAGER_FACTORY;

+    }

+

+    public String customFacesMessageFactoryClassName()

+    {

+        return WebXmlParameter.CUSTOM_FACES_MESSAGE_FACTORY;

+    }

+

+    public Class<? extends Annotation> constraintSourceAnnotation()

+    {

+        return ConstraintSource.class;

+    }

+

+    public Class<? extends Annotation> ignoreConstraintSourceAnnotation()

+    {

+        return IgnoreConstraintSource.class;

+    }

+

+    public Class<? extends Annotation> targetPropertyAnnotation()

+    {

+        return TargetProperty.class;

+    }

+

+    public Class<? extends Annotation> targetPropertyIdAnnotation()

+    {

+        return TargetPropertyId.class;

+    }

+

+    public Class<? extends ValidationParameter> disableClientSideValidationValidationParameter()

+    {

+        return DisableClientSideValidation.class;

+    }

+

+    public boolean activateRequiredInitialization()

+    {

+        return WebXmlParameter.ACTIVATE_REQUIRED_INITIALIZATION != null &&

+                "true".equalsIgnoreCase(WebXmlParameter.ACTIVATE_REQUIRED_INITIALIZATION.trim());

+    }

+

+    public boolean deactivateDefaultConvention()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_DEFAULT_CONVENTION);

+    }

+

+    public boolean deactivateDefaultNameMappers()

+    {

+        String deactivateDefaultNameMappers = WebXmlParameter.DEACTIVATE_DEFAULT_NAME_MAPPERS;

+        return deactivateDefaultNameMappers != null && deactivateDefaultNameMappers.trim().equalsIgnoreCase("true");

+    }

+

+    public boolean deactivateElResolver()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_EL_RESOLVER);

+    }

+

+    public boolean deactivateComponentInitialization()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_COMPONENT_INITIALIZATION);

+    }

+

+    public boolean deactivateValidationParameters()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_VALIDATION_PARAMETERS);

+    }

+

+    public boolean deactivateRenderKitFactory()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_RENDER_KIT_FACTORY);

+    }

+

+    public boolean deactivateRequiredAttributeSupport()

+    {

+        return activateRequiredInitialization();

+    }

+

+    public boolean interpretEmptyStringSubmittedValuesAsNull()

+    {

+        return !"false".equalsIgnoreCase(WebXmlParameter.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL);

+    }

+

+    public boolean validateEmptyFields()

+    {

+        return !"false".equalsIgnoreCase(WebXmlParameter.VALIDATE_EMPTY_FIELDS);

+    }

+}

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
index 7467e8e..3f16820 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
@@ -46,6 +46,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
 
+import static org.apache.myfaces.extensions.validator.util.WebXmlUtils.getInitParameter;
+
 /**
  * @author Gerhard Petracek
  * @since 1.x.1
@@ -61,6 +63,9 @@
     private static final String CUSTOM_EXTVAL_CONTEXT_CLASS_NAME =
             ExtValContext.class.getName().replace(".core.", ".custom.");
 
+    private static final String CUSTOM_EXTVAL_MODULE_CONFIGURATION_RESOLVER_CLASS_NAME =
+            ExtValModuleConfigurationResolver.class.getName().replace(".core.", ".custom.");
+
     private ViolationSeverityInterpreter violationSeverityInterpreter;
     private FactoryFinder factoryFinder = DefaultFactoryFinder.getInstance();
     private Map<String, RendererInterceptor> rendererInterceptors =
@@ -73,6 +78,11 @@
 
     private Map<String, Object> globalProperties = new HashMap<String, Object>();
 
+    private Map<Class<? extends ExtValModuleConfiguration>, ExtValModuleConfiguration> extValConfig =
+            new ConcurrentHashMap<Class<? extends ExtValModuleConfiguration>, ExtValModuleConfiguration>();
+
+    private ExtValModuleConfigurationResolver defaultModuleConfigurationResolver;
+
     private Map<StaticConfigurationNames, List<StaticConfiguration<String, String>>> staticConfigMap
             = new HashMap<StaticConfigurationNames, List<StaticConfiguration<String, String>>>();
 
@@ -83,6 +93,30 @@
     {
         this.contextHelper = new ExtValContextInternals();
         this.invocationOrderAwareContextHelper = new ExtValContextInvocationOrderAwareInternals(this.contextHelper);
+
+        Object customExtValModuleConfigurationResolver =
+                ClassUtils.tryToInstantiateClassForName(CUSTOM_EXTVAL_MODULE_CONFIGURATION_RESOLVER_CLASS_NAME);
+
+        if(customExtValModuleConfigurationResolver instanceof ExtValModuleConfigurationResolver)
+        {
+            this.defaultModuleConfigurationResolver =
+                    (ExtValModuleConfigurationResolver)customExtValModuleConfigurationResolver;
+        }
+
+        String customExtValModuleConfigurationResolverClassName =
+                getInitParameter(null, ExtValModuleConfigurationResolver.class.getName());
+
+        if(customExtValModuleConfigurationResolverClassName != null)
+        {
+            customExtValModuleConfigurationResolver =
+                    ClassUtils.tryToInstantiateClassForName(customExtValModuleConfigurationResolverClassName);
+
+            if(customExtValModuleConfigurationResolver instanceof ExtValModuleConfigurationResolver)
+            {
+                this.defaultModuleConfigurationResolver =
+                        (ExtValModuleConfigurationResolver)customExtValModuleConfigurationResolver;
+            }
+        }
     }
 
     public static ExtValContext getContext()
@@ -408,4 +442,82 @@
     {
         return this.globalProperties.get(name);
     }
+    
+    public <T extends ExtValModuleConfiguration> T getModuleConfiguration(Class<T> targetType)
+    {
+        ExtValModuleConfiguration result = this.extValConfig.get(targetType);
+
+        //noinspection unchecked
+        return (T)result;
+    }
+
+    public boolean addModuleConfiguration(Class<? extends ExtValModuleConfiguration> key,
+                                          ExtValModuleConfiguration extValConfig)
+    {
+        return addModuleConfiguration(key, extValConfig, true);
+    }
+
+    public boolean addModuleConfiguration(Class<? extends ExtValModuleConfiguration> key,
+                                          ExtValModuleConfiguration config,
+                                          boolean forceOverride)
+    {
+        if (this.extValConfig.containsKey(key))
+        {
+            if (!forceOverride)
+            {
+                return false;
+            }
+
+            this.logger.info("override config for key '" + config.getClass() + "'");
+        }
+
+        //anonymous class are only supported for test-cases and
+        //there we don't need a custom config defined in the web.xml
+        if(!config.getClass().isAnonymousClass())
+        {
+            config = tryToLoadCustomConfigImplementation(config);
+        }
+
+        this.extValConfig.put(key, config);
+
+        if(JsfProjectStage.is(JsfProjectStage.Development))
+        {
+            this.logger.info("config for key [" + config.getClass() + "] added");
+        }
+
+        return true;
+    }
+
+    private ExtValModuleConfiguration tryToLoadCustomConfigImplementation(ExtValModuleConfiguration config)
+    {
+
+        Class configClass = config.getClass().getSuperclass();
+
+        if(!ExtValModuleConfiguration.class.isAssignableFrom(configClass))
+        {
+            return config;
+        }
+
+        @SuppressWarnings({"unchecked"})
+        Class<? extends ExtValModuleConfiguration> configDefinitionClass =
+                (Class<? extends  ExtValModuleConfiguration>)configClass;
+
+        if(this.defaultModuleConfigurationResolver != null)
+        {
+            config = this.defaultModuleConfigurationResolver.getCustomConfiguration(configDefinitionClass);
+        }
+
+        String customConfigClassName = getInitParameter(null, configDefinitionClass.getName());
+
+        if(customConfigClassName != null)
+        {
+            Object customConfig = ClassUtils.tryToInstantiateClassForName(customConfigClassName);
+
+            if(customConfig instanceof ExtValModuleConfiguration)
+            {
+                return (ExtValModuleConfiguration)customConfig;
+            }
+        }
+        return config;
+    }
 }
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInternals.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInternals.java
index d2cfd5c..a60ec25 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInternals.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInternals.java
@@ -39,15 +39,15 @@
 {
     boolean isComponentInitializationActivated()
     {
-        return !"true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_COMPONENT_INITIALIZATION);
+        return !ExtValCoreConfiguration.get().deactivateComponentInitialization();
     }
 
     @SuppressWarnings({"unchecked"})
-    InformationProviderBean initInformationProviderBean(Map applicationMap)
+    synchronized InformationProviderBean initInformationProviderBean(Map applicationMap)
     {
         List<String> informationProviderBeanClassNames = new ArrayList<String>();
 
-        informationProviderBeanClassNames.add(WebXmlParameter.CUSTOM_INFORMATION_PROVIDER_BEAN);
+        informationProviderBeanClassNames.add(ExtValCoreConfiguration.get().customInformationProviderBeanClassName());
         informationProviderBeanClassNames.add(InformationProviderBean.CUSTOM_BEAN);
 
         InformationProviderBean informationProviderBean;
@@ -72,7 +72,7 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    void tryToInitCustomConfiguredInformationProviderBeanClassName(Map applicationMap)
+    synchronized void tryToInitCustomConfiguredInformationProviderBeanClassName(Map applicationMap)
     {
         InformationProviderBean bean = (InformationProviderBean) ExtValUtils.getELHelper()
                 .getBean(InformationProviderBean.CUSTOM_BEAN.replace(".", "_"));
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
index 5071509..a9c700d 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
@@ -273,7 +273,7 @@
         List<String> validationExceptionInterceptorClassNames = new ArrayList<String>();
 
         validationExceptionInterceptorClassNames
-                .add(WebXmlParameter.CUSTOM_VALIDATION_EXCEPTION_INTERCEPTOR);
+                .add(ExtValCoreConfiguration.get().customValidationExceptionInterceptorClassName());
         validationExceptionInterceptorClassNames
                 .add(this.contextHelper.getInformationProviderBean().get(
                         CustomInformation.VALIDATION_EXCEPTION_INTERCEPTOR));
@@ -309,7 +309,7 @@
         List<String> metaDataExtractionInterceptorClassNames = new ArrayList<String>();
 
         metaDataExtractionInterceptorClassNames
-                .add(WebXmlParameter.CUSTOM_META_DATA_EXTRACTION_INTERCEPTOR);
+                .add(ExtValCoreConfiguration.get().customMetaDataExtractionInterceptorClassName());
         metaDataExtractionInterceptorClassNames
                 .add(this.contextHelper.getInformationProviderBean().get(
                         CustomInformation.META_DATA_EXTRACTION_INTERCEPTOR));
@@ -338,7 +338,7 @@
         componentInitializers = new CopyOnWriteArrayList<ComponentInitializer>();
         List<String> componentInitializerClassNames = new ArrayList<String>();
         componentInitializerClassNames
-                .add(WebXmlParameter.CUSTOM_COMPONENT_INITIALIZER);
+                .add(ExtValCoreConfiguration.get().customComponentInitializerClassName());
         componentInitializerClassNames
                 .add(this.contextHelper.getInformationProviderBean().get(CustomInformation.COMPONENT_INITIALIZER));
 
@@ -372,7 +372,7 @@
         List<String> validationInterceptorClassNames = new ArrayList<String>();
 
         validationInterceptorClassNames
-                .add(WebXmlParameter.CUSTOM_PROPERTY_VALIDATION_INTERCEPTOR);
+                .add(ExtValCoreConfiguration.get().customPropertyValidationInterceptorClassName());
         validationInterceptorClassNames
                 .add(this.contextHelper.getInformationProviderBean().get(
                         CustomInformation.PROPERTY_VALIDATION_INTERCEPTOR));
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValCoreConfiguration.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValCoreConfiguration.java
new file mode 100644
index 0000000..2eccf12
--- /dev/null
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValCoreConfiguration.java
@@ -0,0 +1,188 @@
+/*

+ * 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.core.proxy.ProxyHelper;

+import org.apache.myfaces.extensions.validator.core.renderkit.ExtValRendererProxy;

+import org.apache.myfaces.extensions.validator.core.validation.parameter.ValidationParameter;

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+import java.lang.annotation.Annotation;

+import java.util.logging.Logger;

+

+/**

+ * 'custom' as prefix is used for 'optional' configurations. that means

+ * if a method returns null extval uses a different approach to find an implementation e.g. via a naming convention

+ * -> all other methods aren't allowed to return null if there is no additional rule

+ *

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public abstract class ExtValCoreConfiguration implements ExtValModuleConfiguration

+{

+    private static ExtValContext extValContext = ExtValContext.getContext();

+

+    private static final Logger LOGGER = Logger.getLogger(ExtValCoreConfiguration.class.getName());

+

+    private static final String MISSING_MODULE_CONFIG_MESSAGE =

+            "no config for " + ExtValCoreConfiguration.class.getName() + " found. " +

+            "maybe the call of ExtValCoreConfig#get is triggered before the registration process." +

+            "the default config gets used.";

+

+    protected ExtValCoreConfiguration()

+    {

+    }

+

+    public static ExtValCoreConfiguration get()

+    {

+        ExtValCoreConfiguration moduleConfig = extValContext.getModuleConfiguration(ExtValCoreConfiguration.class);

+

+        if(moduleConfig == null)

+        {

+            LOGGER.fine(MISSING_MODULE_CONFIG_MESSAGE);

+        }

+        return moduleConfig != null ? moduleConfig : new DefaultExtValCoreConfiguration();

+    }

+

+    @UsageInformation(UsageCategory.INTERNAL)

+    public static boolean use(ExtValCoreConfiguration config, boolean forceOverride)

+    {

+        return extValContext.addModuleConfiguration(ExtValCoreConfiguration.class, config, forceOverride);

+    }

+

+    /*

+     * web.xml config

+     */

+    public abstract String customMessageBundleBaseName();

+

+    public abstract String customBasePackage();

+

+    public abstract String customInformationProviderBeanClassName();

+

+    public abstract String customComponentMetaDataExtractorClassName();

+

+    public abstract String customValidationParameterExtractorClassName();

+

+    public abstract String customStaticValidationStrategyMappingSource();

+

+    public abstract String customComponentInitializerClassName();

+

+    public abstract String customValidationExceptionInterceptorClassName();

+

+    public abstract String customPropertyValidationInterceptorClassName();

+

+    public abstract String customMetaDataExtractionInterceptorClassName();

+

+    /*

+     * others

+     */

+    public abstract ProxyHelper proxyHelper();

+

+    public abstract ProjectStageResolver projectStageResolver();

+

+    public abstract Class<? extends ExtValRendererProxy> rendererProxy();

+

+    /*

+     * ConstraintSource

+     */

+

+    public abstract Class<? extends Annotation> constraintSourceAnnotation();

+

+    public abstract Class<? extends Annotation> ignoreConstraintSourceAnnotation();

+

+    public abstract Class<? extends Annotation> targetPropertyAnnotation();

+

+    public abstract Class<? extends Annotation> targetPropertyIdAnnotation();

+

+    /*

+     * validation parameter

+     */

+

+    public abstract Class violationSeverity();

+

+    public abstract Class<? extends ValidationParameter> disableClientSideValidationValidationParameter();

+

+    /*

+     * name mapper

+     */

+    public abstract String customValidationStrategyToMessageResolverNameMapperClassName();

+

+    public abstract String customMetaDataToValidationStrategyNameMapperClassName();

+

+    public abstract String customValidationStrategyToMetaDataTransformerNameMapperClassName();

+

+    /*

+     * filter

+     */

+    public abstract String customMetaDataStorageFilterClassName();

+

+    /*

+     * factories

+     */

+    public abstract String customValidationStrategyFactoryClassName();

+

+    public abstract String customMessageResolverFactoryClassName();

+

+    public abstract String customComponentMetaDataExtractorFactoryClassName();

+

+    public abstract String customValidationParameterExtractorFactoryClassName();

+

+    public abstract String customValidationParameterFactoryClassName();

+

+    public abstract String customMetaDataTransformerFactoryClassName();

+

+    public abstract String customStorageManagerFactoryClassName();

+

+    public abstract String customFacesMessageFactoryClassName();

+

+    /*

+     * activate

+     */

+    public abstract boolean activateRequiredInitialization();

+

+    /*

+     * deactivate

+     */

+    //currently just used by AbstractValidationErrorMessageResolver

+    public abstract boolean deactivateDefaultConvention();

+

+    public abstract boolean deactivateDefaultNameMappers();

+

+    public abstract boolean deactivateElResolver();

+

+    public abstract boolean deactivateComponentInitialization();

+

+    public abstract boolean deactivateValidationParameters();

+

+    public abstract boolean deactivateRenderKitFactory();

+

+    //there is nothing like DEACTIVATE_DEFAULT_VALIDATION_INTERCEPTOR

+    //use ExtValContext.getContext().denyRendererInterceptor(...) within an extval-StartupListener

+

+    public abstract boolean deactivateRequiredAttributeSupport();

+

+    /*

+     * spec parameters

+     */

+    public abstract boolean interpretEmptyStringSubmittedValuesAsNull();

+

+    public abstract boolean validateEmptyFields();

+}

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfiguration.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfiguration.java
new file mode 100644
index 0000000..993b6b1
--- /dev/null
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfiguration.java
@@ -0,0 +1,31 @@
+/*

+ * 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.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public interface ExtValModuleConfiguration

+{

+}

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfigurationResolver.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfigurationResolver.java
new file mode 100644
index 0000000..f658b40
--- /dev/null
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValModuleConfigurationResolver.java
@@ -0,0 +1,32 @@
+/*

+ * 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.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation({UsageCategory.API, UsageCategory.CUSTOMIZABLE})

+public interface ExtValModuleConfigurationResolver

+{

+    <T extends ExtValModuleConfiguration> ExtValModuleConfiguration getCustomConfiguration(Class<T> configType);

+}

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java
index 6ccc001..b6d95fb 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/InformationProviderBean.java
@@ -19,11 +19,11 @@
 package org.apache.myfaces.extensions.validator.core;

 

 import org.apache.myfaces.extensions.validator.ExtValInformation;

+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 

 import java.util.Map;

-import java.util.HashMap;

 import java.util.logging.Logger;

 

 /**

@@ -55,11 +55,12 @@
         applyCustomValues(this.customizableInfos);

     }

 

-    private Map<CustomInformation, String> customizableInfos = new HashMap<CustomInformation, String>();

+    private Map<CustomInformation, String> customizableInfos =

+            new NullValueAwareConcurrentHashMap<CustomInformation, String>(String.class);

 

     private void setupCustomizableInformation()

     {

-        String basePackage = WebXmlParameter.CUSTOM_BASE_PACKAGE;

+        String basePackage = ExtValCoreConfiguration.get().customBasePackage();

 

         if (basePackage == null)

         {

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ProjectStage.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ProjectStage.java
index 9ba444d..5899a1a 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/ProjectStage.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/ProjectStage.java
@@ -56,12 +56,11 @@
     private static ProjectStageName getCurrentProjectStage()

     {

         //set ProjectStageResolver to null to tweak the performance

-        Object projectStageResolver = ExtValContext.getContext()

-                .getGlobalProperty(ProjectStageResolver.class.getName());

+        ProjectStageResolver projectStageResolver = ExtValCoreConfiguration.get().projectStageResolver();

 

-        if(projectStageResolver instanceof ProjectStageResolver)

+        if(projectStageResolver != null)

         {

-            return ((ProjectStageResolver)projectStageResolver).getCurrentProjectStage().getValue();

+            return (projectStageResolver).getCurrentProjectStage().getValue();

         }

         return ExtValUtils.getDefaultStageName();

     }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java
index 7931abe..99d4112 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/WebXmlParameter.java
@@ -29,7 +29,7 @@
  * @since 1.x.1

  */

 @UsageInformation(UsageCategory.INTERNAL)

-public interface WebXmlParameter

+interface WebXmlParameter

 {

     /*

      * misc

@@ -121,10 +121,6 @@
     /*

      * deactivate

      */

-    @Deprecated

-    static final String DEACTIVATE_RENDERKIT = WebXmlUtils

-        .getInitParameter("DEACTIVATE_RENDERKIT");

-

     //currently just used by AbstractValidationErrorMessageResolver

     static final String DEACTIVATE_DEFAULT_CONVENTION = WebXmlUtils

         .getInitParameter("DEACTIVATE_DEFAULT_CONVENTION");

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/el/DefaultELHelper.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/el/DefaultELHelper.java
index 97ca749..52b03aa 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/el/DefaultELHelper.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/el/DefaultELHelper.java
@@ -24,8 +24,8 @@
 import org.apache.myfaces.extensions.validator.internal.Priority;

 import org.apache.myfaces.extensions.validator.util.ReflectionUtils;

 import org.apache.myfaces.extensions.validator.util.ProxyUtils;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.ExtValInformation;

 

 import javax.el.ValueExpression;

@@ -54,7 +54,7 @@
 @UsageInformation(UsageCategory.INTERNAL)

 public class DefaultELHelper implements ELHelper

 {

-    private static final String DEACTIVATE_EL_RESOLVER = WebXmlParameter.DEACTIVATE_EL_RESOLVER;

+    private static final boolean DEACTIVATE_EL_RESOLVER = ExtValCoreConfiguration.get().deactivateElResolver();

 

     protected final Logger logger = Logger.getLogger(getClass().getName());

 

@@ -143,7 +143,7 @@
 

     public PropertyDetails getPropertyDetailsOfValueBinding(UIComponent uiComponent)

     {

-        if("true".equalsIgnoreCase(DEACTIVATE_EL_RESOLVER))

+        if(DEACTIVATE_EL_RESOLVER)

         {

             return getPropertyDetailsViaReflectionFallback(uiComponent);

         }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java
index d7038a1..e2d2097 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java
@@ -23,9 +23,9 @@
 import org.apache.myfaces.extensions.validator.internal.ToDo;

 import org.apache.myfaces.extensions.validator.internal.Priority;

 import org.apache.myfaces.extensions.validator.core.metadata.extractor.DefaultComponentMetaDataExtractorFactory;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.core.CustomInformation;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.storage.DefaultStorageManagerFactory;

 import org.apache.myfaces.extensions.validator.core.el.DefaultELHelperFactory;

 import org.apache.myfaces.extensions.validator.core.renderkit.DefaultRenderKitWrapperFactory;

@@ -140,7 +140,7 @@
 

         List<String> metaDataExtractorFactoryClassNames = new ArrayList<String>();

 

-        metaDataExtractorFactoryClassNames.add(WebXmlParameter.CUSTOM_COMPONENT_META_DATA_EXTRACTOR_FACTORY);

+        metaDataExtractorFactoryClassNames.add(getCoreConfig().customComponentMetaDataExtractorFactoryClassName());

         metaDataExtractorFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                 .get(CustomInformation.COMPONENT_META_DATA_EXTRACTOR_FACTORY));

@@ -165,7 +165,7 @@
 

         List<String> validationStrategyFactoryClassNames = new ArrayList<String>();

 

-        validationStrategyFactoryClassNames.add(WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_FACTORY);

+        validationStrategyFactoryClassNames.add(getCoreConfig().customValidationStrategyFactoryClassName());

         validationStrategyFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                     .get(CustomInformation.VALIDATION_STRATEGY_FACTORY));

@@ -190,7 +190,7 @@
         Object factory = null;

         List<String> messageResolverFactoryClassNames = new ArrayList<String>();

 

-        messageResolverFactoryClassNames.add(WebXmlParameter.CUSTOM_MESSAGE_RESOLVER_FACTORY);

+        messageResolverFactoryClassNames.add(getCoreConfig().customMessageResolverFactoryClassName());

         messageResolverFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                     .get(CustomInformation.MESSAGE_RESOLVER_FACTORY));

@@ -216,7 +216,7 @@
         Object factory = null;

         List<String> metaDataTransformerFactoryClassNames = new ArrayList<String>();

 

-        metaDataTransformerFactoryClassNames.add(WebXmlParameter.CUSTOM_META_DATA_TRANSFORMER_FACTORY );

+        metaDataTransformerFactoryClassNames.add(getCoreConfig().customMetaDataTransformerFactoryClassName());

         metaDataTransformerFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                     .get(CustomInformation.META_DATA_TRANSFORMER_FACTORY));

@@ -247,7 +247,7 @@
 

         List<String> facesMessageFactoryClassNames = new ArrayList<String>();

 

-        facesMessageFactoryClassNames.add(WebXmlParameter.CUSTOM_FACES_MESSAGE_FACTORY);

+        facesMessageFactoryClassNames.add(getCoreConfig().customFacesMessageFactoryClassName());

         facesMessageFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                     .get(CustomInformation.FACES_MESSAGE_FACTORY));

@@ -285,7 +285,7 @@
         List<String> validationParameterExtractorFactoryClassNames = new ArrayList<String>();

 

         validationParameterExtractorFactoryClassNames

-                .add(WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_EXTRACTOR_FACTORY);

+                .add(getCoreConfig().customValidationParameterExtractorFactoryClassName());

         validationParameterExtractorFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                 .get(CustomInformation.VALIDATION_PARAMETER_EXTRACTOR_FACTORY));

@@ -310,7 +310,7 @@
         List<String> storageManagerFactoryClassNames = new ArrayList<String>();

 

         storageManagerFactoryClassNames

-                .add(WebXmlParameter.CUSTOM_STORAGE_MANAGER_FACTORY);

+                .add(getCoreConfig().customStorageManagerFactoryClassName());

         storageManagerFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                 .get(CustomInformation.STORAGE_MANAGER_FACTORY));

@@ -335,7 +335,7 @@
         List<String> validationParameterFactoryClassNames = new ArrayList<String>();

 

         validationParameterFactoryClassNames

-                .add(WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_FACTORY);

+                .add(getCoreConfig().customValidationParameterFactoryClassName());

         validationParameterFactoryClassNames

             .add(ExtValContext.getContext().getInformationProviderBean()

                 .get(CustomInformation.VALIDATION_PARAMETER_FACTORY));

@@ -353,4 +353,8 @@
         return factory;

     }

 

+    private ExtValCoreConfiguration getCoreConfig()

+    {

+        return ExtValCoreConfiguration.get();

+    }

 }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
index 547b271..b95e8e3 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/interceptor/AbstractValidationInterceptor.java
@@ -21,8 +21,8 @@
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
 import org.apache.myfaces.extensions.validator.core.ValidationModuleKey;
+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
 import org.apache.myfaces.extensions.validator.core.metadata.extractor.MetaDataExtractor;
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
 import org.apache.myfaces.extensions.validator.core.storage.RendererInterceptorPropertyStorage;
@@ -254,7 +254,7 @@
 
     private boolean isComponentInitializationDeactivated()
     {
-        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_COMPONENT_INITIALIZATION);
+        return ExtValCoreConfiguration.get().deactivateComponentInitialization();
     }
 
     protected boolean recordProcessedInformation()
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
index 912c6ef..3193512 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
@@ -18,9 +18,9 @@
  */
 package org.apache.myfaces.extensions.validator.core.metadata.extractor;
 
-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
 import org.apache.myfaces.extensions.validator.core.CustomInformation;
+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 import org.apache.myfaces.extensions.validator.internal.ToDo;
@@ -71,7 +71,7 @@
         {
             List<String> metaDataExtractorClassNames = new ArrayList<String>();
 
-            metaDataExtractorClassNames.add(WebXmlParameter.CUSTOM_COMPONENT_META_DATA_EXTRACTOR);
+            metaDataExtractorClassNames.add(ExtValCoreConfiguration.get().customComponentMetaDataExtractorClassName());
             metaDataExtractorClassNames
                 .add(ExtValContext.getContext().getInformationProviderBean()
                     .get(CustomInformation.COMPONENT_META_DATA_EXTRACTOR));
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java
index e21aaf9..65bbcd1 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java
@@ -18,8 +18,8 @@
  */

 package org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper;

 

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.InvocationOrder;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;

 import org.apache.myfaces.extensions.validator.core.mapper.AbstractCustomNameMapper;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

@@ -39,6 +39,6 @@
 {

     protected String getCustomNameMapperClassName()

     {

-        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_TO_META_DATA_TRANSFORMER_NAME_MAPPER;

+        return ExtValCoreConfiguration.get().customValidationStrategyToMetaDataTransformerNameMapperClassName();

     }

 }
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
index e58b199..0191f92 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
@@ -20,8 +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.ExtValContext;
-import org.apache.myfaces.extensions.validator.util.ClassUtils;
+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
 
 import javax.faces.context.FacesContext;
 import javax.faces.render.Renderer;
@@ -109,17 +108,10 @@
 
     private Renderer getLazyRenderer()
     {
-        String proxyClassName = (String) ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);
+        Class<? extends Renderer> targetClass = ExtValCoreConfiguration.get().rendererProxy();
 
-        if(proxyClassName != null && !proxyClassName.endsWith(getClass().getName()))
+        if(targetClass != null)
         {
-            Class targetClass = ClassUtils.tryToLoadClassForName(proxyClassName);
-
-            if(targetClass == null)
-            {
-                throw new IllegalStateException("a custom invalid renderer proxy is configured: " + proxyClassName);
-            }
-
             Class[] argClasses = new Class[1];
             argClasses[0] = Renderer.class;
 
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKit.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKit.java
index 4461379..9cdb5c0 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKit.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKit.java
@@ -68,8 +68,6 @@
             return renderer instanceof ExtValRendererWrapper ? renderer : createWrapper(renderer);
         }
 
-        this.logger.finest("no renderer found for family " + family + " and type " + rendererType);
-
         return renderer;
     }
 
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKitFactory.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKitFactory.java
index b924402..2ec6303 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKitFactory.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRenderKitFactory.java
@@ -21,7 +21,7 @@
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;
+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
 import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
@@ -99,7 +99,7 @@
 
             if(this.defaultRenderKitWrapperFactory.isApplicationInitialized())
             {
-                this.isDeactivated = isRenderKitFactoryDeactivatedViaWebXml();
+                this.isDeactivated = isRenderKitFactoryDeactivated();
             }
             else
             {
@@ -149,9 +149,9 @@
         return this.wrapped.getRenderKitIds();
     }
 
-    private boolean isRenderKitFactoryDeactivatedViaWebXml()
+    private boolean isRenderKitFactoryDeactivated()
     {
-        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_RENDER_KIT_FACTORY);
+        return ExtValCoreConfiguration.get().deactivateRenderKitFactory();
     }
 
     private boolean isRenderKitFactoryDeactivatedViaVMParameter()
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java
index 32479eb..52fdfc1 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValRendererWrapper.java
@@ -22,10 +22,10 @@
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.core.interceptor.RendererInterceptor;
 import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipBeforeInterceptorsException;
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipAfterInterceptorsException;
 import org.apache.myfaces.extensions.validator.core.renderkit.exception.SkipRendererDelegationException;
-import org.apache.myfaces.extensions.validator.util.ClassUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
@@ -59,19 +59,9 @@
 
     public ExtValRendererWrapper(Renderer renderer)
     {
-        String proxyClassName = (String)ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);
+        Class<? extends ExtValRendererProxy> proxyClass = ExtValCoreConfiguration.get().rendererProxy();
 
-        if(proxyClassName == null)
-        {
-            logger.finest("no extval renderer proxy configured");
-
-            this.wrapped = new ExtValLazyRendererProxy(renderer);
-            return;
-        }
-
-        Class targetClass = ClassUtils.tryToLoadClassForName(proxyClassName);
-
-        if(targetClass == null)
+        if(proxyClass == null)
         {
             logger.finest("no extval renderer proxy configured");
 
@@ -84,7 +74,7 @@
 
         try
         {
-            Constructor constructor = targetClass.getConstructor(argClasses);
+            Constructor constructor = proxyClass.getConstructor(argClasses);
             this.wrapped = (Renderer)constructor.newInstance(renderer);
         }
         catch (Throwable t)
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/AbstractStartupListener.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/AbstractStartupListener.java
index b426903..b29f1a2 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/AbstractStartupListener.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/AbstractStartupListener.java
@@ -25,7 +25,7 @@
 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.core.ProjectStageResolver;

-import org.apache.myfaces.extensions.validator.core.DefaultProjectStageResolver;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 

 import javax.faces.event.PhaseEvent;

 import javax.faces.event.PhaseId;

@@ -76,6 +76,8 @@
                     {

                         if(!isStartupListenerDeactivated())

                         {

+                            initModuleConfig();

+

                             initProjectStageResolver();

 

                             init();

@@ -109,6 +111,11 @@
         }

     }

 

+    protected void initModuleConfig()

+    {

+        //override if needed

+    }

+

     public PhaseId getPhaseId()

     {

         return PhaseId.RESTORE_VIEW;

@@ -132,7 +139,7 @@
 

     protected ProjectStageResolver getProjectStageResolver()

     {

-        return new DefaultProjectStageResolver();

+        return ExtValCoreConfiguration.get().projectStageResolver();

     }

 

     protected abstract void init();

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
index 8aa6568..e63cabc 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/startup/ExtValStartupListener.java
@@ -26,7 +26,8 @@
 import org.apache.myfaces.extensions.validator.core.interceptor.FacesMessagePropertyValidationInterceptor;
 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.ExtValCoreConfiguration;
+import org.apache.myfaces.extensions.validator.core.DefaultExtValCoreConfiguration;
 import org.apache.myfaces.extensions.validator.core.PhaseIdRecordingPhaseListener;
 import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
         .BeanValidationStrategyToMetaDataTransformerNameMapper;
@@ -61,10 +62,6 @@
 import org.apache.myfaces.extensions.validator.core.validation.parameter.DefaultViolationSeverityInterpreter;
 import org.apache.myfaces.extensions.validator.core.validation.parameter.ViolationSeverity;
 import org.apache.myfaces.extensions.validator.core.validation.parameter.DisableClientSideValidation;
-import org.apache.myfaces.extensions.validator.core.validation.ConstraintSource;
-import org.apache.myfaces.extensions.validator.core.validation.IgnoreConstraintSource;
-import org.apache.myfaces.extensions.validator.core.validation.TargetProperty;
-import org.apache.myfaces.extensions.validator.core.validation.TargetPropertyId;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.ExtValUtils;
 import org.apache.myfaces.extensions.validator.util.JsfUtils;
@@ -79,6 +76,11 @@
 {
     private static final long serialVersionUID = -2504826421086572012L;
 
+    protected void initModuleConfig()
+    {
+        ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration(), false);
+    }
+
     protected void init()
     {
         if(ExtValInformation.VERSION != null)
@@ -100,15 +102,13 @@
         initViolationSeverityKey();
         initDisableClientSideValidationKey();
         initRequiredInitialization();
-        initDefaultConstraintSourceAnnotations();
 
         executeCustomStartupListener();
     }
 
     private void initNameMappers()
     {
-        String deactivateDefaultNameMappers = WebXmlParameter.DEACTIVATE_DEFAULT_NAME_MAPPERS;
-        if ((deactivateDefaultNameMappers != null && deactivateDefaultNameMappers.equalsIgnoreCase("true")))
+        if (ExtValCoreConfiguration.get().deactivateDefaultNameMappers())
         {
             return;
         }
@@ -201,50 +201,45 @@
         JsfUtils.registerPhaseListener(new PhaseIdRecordingPhaseListener());
     }
 
+    @Deprecated
     private void initViolationSeverityKey()
     {
-        ExtValContext.getContext().addGlobalProperty(ViolationSeverity.class.getName(), ViolationSeverity.class, false);
+        ExtValContext.getContext().addGlobalProperty(ViolationSeverity.class.getName(),
+                ExtValCoreConfiguration.get().violationSeverity(), false);
     }
 
+    @Deprecated
     private void initDisableClientSideValidationKey()
     {
-        ExtValContext.getContext().addGlobalProperty(
-                DisableClientSideValidation.class.getName(), DisableClientSideValidation.class, false);
+        ExtValContext.getContext().addGlobalProperty(DisableClientSideValidation.class.getName(),
+                ExtValCoreConfiguration.get().disableClientSideValidationValidationParameter(), false);
     }
 
     private void initRequiredInitialization()
     {
-        if(WebXmlParameter.ACTIVATE_REQUIRED_INITIALIZATION != null)
-        {
-            boolean requiredInitialization = "true".equalsIgnoreCase(WebXmlParameter.ACTIVATE_REQUIRED_INITIALIZATION);
+        boolean requiredInitialization = ExtValCoreConfiguration.get().activateRequiredInitialization();
 
-            ExtValContext.getContext().addGlobalProperty("mode:init:required", requiredInitialization, false);
+        //noinspection deprecation
+        addRequiredInitializationAsGlobalProperty(requiredInitialization);
 
-            if(requiredInitialization)
-            {
-                deactivateRequiredAttributeSupport();
-            }
-        }
+        initRequiredAttributeSupport();
     }
 
-    private void initDefaultConstraintSourceAnnotations()
+    @Deprecated
+    private void addRequiredInitializationAsGlobalProperty(boolean requiredInitialization)
     {
-        ExtValContext.getContext()
-                .addGlobalProperty(ConstraintSource.class.getName(), ConstraintSource.class, false);
-        ExtValContext.getContext()
-                .addGlobalProperty(IgnoreConstraintSource.class.getName(), IgnoreConstraintSource.class, false);
-        ExtValContext.getContext()
-                .addGlobalProperty(TargetProperty.class.getName(), TargetProperty.class, false);
-        ExtValContext.getContext()
-                .addGlobalProperty(TargetPropertyId.class.getName(), TargetPropertyId.class, false);
+        ExtValContext.getContext().addGlobalProperty("mode:init:required", requiredInitialization, false);
     }
 
     /**
      * if it's configured that required init should happen,
      * it's required to deactivate the support for the required attribute
      */
-    private void deactivateRequiredAttributeSupport()
+    @Deprecated
+    private void initRequiredAttributeSupport()
     {
-        ExtValContext.getContext().addGlobalProperty("mode:reset:required", Boolean.TRUE, false);
+        ExtValContext.getContext().addGlobalProperty("mode:reset:required",
+                ExtValCoreConfiguration.get().deactivateRequiredAttributeSupport(),
+                false);
     }
 }
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java
index 1228ff3..77c53cc 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java
@@ -79,14 +79,17 @@
 

         if(!storageMap.containsKey(storageKey))

         {

-            storageMap.put(storageKey, (T)ClassUtils.tryToInstantiateClassForName(storageClassName));

+            synchronized (storageMap)

+            {

+                storageMap.put(storageKey, (T)ClassUtils.tryToInstantiateClassForName(storageClassName));

+            }

         }

         return storageMap.get(storageKey);

     }

 

     protected abstract Map<String, T> resolveStorageMap();

 

-    public void reset(String storageKey)

+    public synchronized void reset(String storageKey)

     {

         Map<String, T> storageMap = resolveStorageMap();

 

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
index 9a31810..5f8ac64 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
@@ -18,6 +18,7 @@
  */

 package org.apache.myfaces.extensions.validator.core.storage;

 

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 import org.apache.myfaces.extensions.validator.internal.ToDo;

 import org.apache.myfaces.extensions.validator.internal.Priority;

@@ -27,7 +28,6 @@
 import org.apache.myfaces.extensions.validator.core.property.PropertyInformationKeys;

 import org.apache.myfaces.extensions.validator.core.property.DefaultPropertyInformation;

 import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.CustomInformation;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.util.ClassUtils;

@@ -67,7 +67,7 @@
         List<String> metaDataStorageFilterClassNames = new ArrayList<String>();

 

         metaDataStorageFilterClassNames

-            .add(WebXmlParameter.CUSTOM_META_DATA_STORAGE_FILTER);

+            .add(ExtValCoreConfiguration.get().customMetaDataStorageFilterClassName());

         metaDataStorageFilterClassNames

             .add(ExtValContext.getContext().getInformationProviderBean().get(

                     CustomInformation.META_DATA_STORAGE_FILTER));

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/AbstractValidationErrorMessageResolver.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/AbstractValidationErrorMessageResolver.java
index 4b33720..2c80567 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/AbstractValidationErrorMessageResolver.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/AbstractValidationErrorMessageResolver.java
@@ -18,9 +18,9 @@
  */

 package org.apache.myfaces.extensions.validator.core.validation.message.resolver;

 

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.core.CustomInformation;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 import org.apache.myfaces.extensions.validator.util.ExtValUtils;

@@ -46,7 +46,7 @@
 

     protected final Logger logger = Logger.getLogger(getClass().getName());

 

-    private static String deactivateDefaultConvention = WebXmlParameter.DEACTIVATE_DEFAULT_CONVENTION;

+    private static boolean deactivateDefaultConvention = ExtValCoreConfiguration.get().deactivateDefaultConvention();

     private static ResourceBundle defaultBundle = null;

     private String messageBundleBaseName;

     //with jsf 1.1 only available if there is a custom bean

@@ -162,8 +162,7 @@
 

     private String tryToUseMessageBundleConvention(String key, Locale locale)

     {

-        if ((deactivateDefaultConvention == null || !deactivateDefaultConvention.equalsIgnoreCase("true"))

-            && isDefaultMessageBundleConventionActive())

+        if ((deactivateDefaultConvention) && isDefaultMessageBundleConventionActive())

         {

             if (defaultBundle == null)

             {

@@ -175,7 +174,7 @@
                 catch (Exception e)

                 {

                     //do nothing

-                    deactivateDefaultConvention = "true";

+                    deactivateDefaultConvention = true;

                 }

             }

 

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultValidationErrorMessageResolver.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultValidationErrorMessageResolver.java
index 079edc6..38e37ec 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultValidationErrorMessageResolver.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultValidationErrorMessageResolver.java
@@ -18,8 +18,8 @@
  */

 package org.apache.myfaces.extensions.validator.core.validation.message.resolver;

 

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.InternalConventionProvider;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 

@@ -33,12 +33,19 @@
 @UsageInformation({UsageCategory.INTERNAL, UsageCategory.CUSTOMIZABLE})

 public class DefaultValidationErrorMessageResolver extends AbstractValidationErrorMessageResolver

 {

-    private static final String CUSTOM_BUNDLE = WebXmlParameter.CUSTOM_MESSAGE_BUNDLE;

+    private static final String CUSTOM_BUNDLE = ExtValCoreConfiguration.get().customMessageBundleBaseName();

+

+    private final String baseName;

+

+    public DefaultValidationErrorMessageResolver()

+    {

+        this.baseName = InternalConventionProvider.getModuleMessageBundleName(getClass().getPackage().getName());

+    }

 

     //not used at the moment - just for a convention

     protected String getBaseName()

     {

-        return InternalConventionProvider.getModuleMessageBundleName(getClass().getPackage().getName());

+        return this.baseName;

     }

 

     protected String getCustomBaseName()

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/mapper/CustomConfiguredValidationStrategyToMsgResolverNameMapper.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/mapper/CustomConfiguredValidationStrategyToMsgResolverNameMapper.java
index 76c08e8..b0731a4 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/mapper/CustomConfiguredValidationStrategyToMsgResolverNameMapper.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/mapper/CustomConfiguredValidationStrategyToMsgResolverNameMapper.java
@@ -18,8 +18,8 @@
  */

 package org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper;

 

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.InvocationOrder;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.mapper.AbstractCustomNameMapper;

 import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

@@ -40,6 +40,6 @@
 

     protected String getCustomNameMapperClassName()

     {

-        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_TO_MESSAGE_RESOLVER_NAME_MAPPER;

+        return ExtValCoreConfiguration.get().customValidationStrategyToMessageResolverNameMapperClassName();

     }

 }
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterExtractorFactory.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterExtractorFactory.java
index 613ef5a..6ea844a 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterExtractorFactory.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterExtractorFactory.java
@@ -20,9 +20,9 @@
 

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.core.CustomInformation;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.util.ClassUtils;

 

 import java.util.ArrayList;

@@ -51,7 +51,8 @@
         {

             List<String> validationParameterExtractorClassNames = new ArrayList<String>();

 

-            validationParameterExtractorClassNames.add(WebXmlParameter.CUSTOM_VALIDATION_PARAMETER_EXTRACTOR);

+            validationParameterExtractorClassNames

+                    .add(ExtValCoreConfiguration.get().customValidationParameterExtractorClassName());

             validationParameterExtractorClassNames

                 .add(ExtValContext.getContext().getInformationProviderBean()

                     .get(CustomInformation.VALIDATION_PARAMETER_EXTRACTOR));

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java
index 7841cad..e7976f3 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java
@@ -18,9 +18,9 @@
  */

 package org.apache.myfaces.extensions.validator.core.validation.strategy;

 

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.factory.ClassMappingFactory;

 import org.apache.myfaces.extensions.validator.core.factory.AbstractNameMapperAwareFactory;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.core.CustomInformation;

 import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;

@@ -158,7 +158,7 @@
         }

 

         //setup custom mapping - overrides all other mappings

-        String customMappingBaseName = WebXmlParameter.CUSTOM_STATIC_VALIDATION_STRATEGY_MAPPING;

+        String customMappingBaseName = ExtValCoreConfiguration.get().customStaticValidationStrategyMappingSource();

         if (customMappingBaseName != null)

         {

             try

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/mapper/CustomConfiguredAnnotationToValidationStrategyNameMapper.java b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/mapper/CustomConfiguredAnnotationToValidationStrategyNameMapper.java
index fd03206..fc2bcfc 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/mapper/CustomConfiguredAnnotationToValidationStrategyNameMapper.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/mapper/CustomConfiguredAnnotationToValidationStrategyNameMapper.java
@@ -18,8 +18,8 @@
  */

 package org.apache.myfaces.extensions.validator.core.validation.strategy.mapper;

 

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

 import org.apache.myfaces.extensions.validator.core.InvocationOrder;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.mapper.AbstractCustomNameMapper;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

@@ -36,8 +36,15 @@
 public class CustomConfiguredAnnotationToValidationStrategyNameMapper extends

     AbstractCustomNameMapper<String>

 {

+    private final String customNameMapperClassName;

+    public CustomConfiguredAnnotationToValidationStrategyNameMapper()

+    {

+        this.customNameMapperClassName =

+                ExtValCoreConfiguration.get().customMetaDataToValidationStrategyNameMapperClassName();

+    }

+

     protected String getCustomNameMapperClassName()

     {

-        return WebXmlParameter.CUSTOM_META_DATA_TO_VALIDATION_STRATEGY_NAME_MAPPER;

+        return this.customNameMapperClassName;

     }

 }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ClassUtils.java b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ClassUtils.java
index 6c9c03b..7de82c9 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ClassUtils.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ClassUtils.java
@@ -117,4 +117,23 @@
             return null;

         }

     }

+

+    /**

+     * Gets the package name.

+     * Needed for ClassLoaderTestSuite

+     *

+     * @param targetClass the the class

+     * @return the package name

+     */

+    public static String getPackageName(Class targetClass)

+    {

+        Package currentPackage = targetClass.getPackage();

+

+        if(currentPackage != null)

+        {

+            return currentPackage.getName();

+        }

+

+        return targetClass.getName().substring(0, targetClass.getName().lastIndexOf("."));

+    }

 }

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ConstraintSourceUtils.java b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ConstraintSourceUtils.java
index a7aca49..5423aa5 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ConstraintSourceUtils.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ConstraintSourceUtils.java
@@ -23,14 +23,10 @@
 import java.beans.Introspector;

 import java.lang.reflect.Method;

 

-import org.apache.myfaces.extensions.validator.core.ExtValContext;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.property.PropertyDetails;

 import org.apache.myfaces.extensions.validator.core.storage.MappedConstraintSourceStorage;

 import org.apache.myfaces.extensions.validator.core.storage.PropertyStorage;

-import org.apache.myfaces.extensions.validator.core.validation.ConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.IgnoreConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.TargetProperty;

-import org.apache.myfaces.extensions.validator.core.validation.TargetPropertyId;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 

@@ -42,7 +38,7 @@
 @SuppressWarnings("unchecked")

 public final class ConstraintSourceUtils

 {

-    private ConstraintSourceUtils()

+    protected ConstraintSourceUtils()

     {

         // Utility class, don't allow instantiation.

     }

@@ -108,8 +104,8 @@
 

     private static Class findMappedClass(PropertyStorage storage, Class baseBeanClass, String property)

     {

-        Class<? extends Annotation> constraintSourceAnnotationImplementation = (Class) ExtValContext.getContext()

-                .getGlobalProperty(ConstraintSource.class.getName());

+        Class<? extends Annotation> constraintSourceAnnotationImplementation = ExtValCoreConfiguration.get()

+                .constraintSourceAnnotation();

 

         Annotation foundConstraintSourceAnnotation = tryToGetAnnotationFromProperty(

                 storage, baseBeanClass, property, constraintSourceAnnotationImplementation);

@@ -166,12 +162,12 @@
 

     private static Class<? extends Annotation> getTargetPropertyAnnotationImplementation()

     {

-        return (Class) ExtValContext.getContext().getGlobalProperty(TargetProperty.class.getName());

+        return ExtValCoreConfiguration.get().targetPropertyAnnotation();

     }

 

     private static Class<? extends Annotation> getTargetPropertyIdAnnotationImplementation()

     {

-        return (Class) ExtValContext.getContext().getGlobalProperty(TargetPropertyId.class.getName());

+        return ExtValCoreConfiguration.get().targetPropertyIdAnnotation();

     }

 

     private static String extractNewPropertyName(Class targetClass, Annotation annotation)

@@ -302,7 +298,7 @@
 

     private static Class<? extends Annotation> getIgnoreConstraintSourceAnnotationImplementation()

     {

-        return (Class) ExtValContext.getContext().getGlobalProperty(IgnoreConstraintSource.class.getName());

+        return ExtValCoreConfiguration.get().ignoreConstraintSourceAnnotation();

     }

 

     private static Annotation tryToGetAnnotationFromField(

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
index 6e1bf73..48d2300 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ExtValUtils.java
@@ -19,7 +19,7 @@
 package org.apache.myfaces.extensions.validator.util;

 

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.ValidationModuleKey;

 import org.apache.myfaces.extensions.validator.core.ProjectStageName;

 import org.apache.myfaces.extensions.validator.core.el.AbstractELHelperFactory;

@@ -532,7 +532,7 @@
 

     private static boolean isValidationParameterExtractionDeactivated()

     {

-        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_VALIDATION_PARAMETERS);

+        return ExtValCoreConfiguration.get().deactivateValidationParameters();

     }

 

     public static boolean executeLocalBeforeValidationInterceptors(FacesContext facesContext,

@@ -848,12 +848,12 @@
     public static boolean interpretEmptyStringValuesAsNull()

     {

         //to deactivate: the parameter has to be explicitly false

-        return !"false".equalsIgnoreCase(WebXmlParameter.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL);

+        return ExtValCoreConfiguration.get().interpretEmptyStringSubmittedValuesAsNull();

     }

 

     public static boolean validateEmptyFields()

     {

-        return !"false".equalsIgnoreCase(WebXmlParameter.VALIDATE_EMPTY_FIELDS);

+        return ExtValCoreConfiguration.get().validateEmptyFields();

     }

 

     public static PropertyDetails getPropertyDetails(PropertyInformation propertyInformation)

@@ -1020,7 +1020,7 @@
      */

     public static boolean isRequiredInitializationActive()

     {

-        return Boolean.TRUE.equals(ExtValContext.getContext().getGlobalProperty("mode:init:required"));

+        return ExtValCoreConfiguration.get().activateRequiredInitialization();

     }

 

     /**

@@ -1032,7 +1032,7 @@
      */

     public static boolean isRequiredResetActivated()

     {

-        return Boolean.TRUE.equals(ExtValContext.getContext().getGlobalProperty("mode:reset:required"));

+        return ExtValCoreConfiguration.get().deactivateRequiredAttributeSupport();

     }

 

     public static ProjectStageName getDefaultStageName()

diff --git a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ProxyUtils.java b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ProxyUtils.java
index c75c23e..7a48950 100644
--- a/core/src/main/java/org/apache/myfaces/extensions/validator/util/ProxyUtils.java
+++ b/core/src/main/java/org/apache/myfaces/extensions/validator/util/ProxyUtils.java
@@ -20,7 +20,7 @@
 

 import org.apache.myfaces.extensions.validator.core.proxy.ProxyHelper;

 import org.apache.myfaces.extensions.validator.core.proxy.DefaultProxyHelper;

-import org.apache.myfaces.extensions.validator.core.WebXmlParameter;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.internal.UsageCategory;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

 

@@ -73,26 +73,8 @@
                 return new DefaultProxyHelper();

             }

 

-            proxyHelper = createProxyHelper();

+            proxyHelper = ExtValCoreConfiguration.get().proxyHelper();

         }

         return proxyHelper;

     }

-

-    //don't use the default approach (factory finder) - ProxyHelper is called too often...

-    private static ProxyHelper createProxyHelper()

-    {

-        String customProxyHelperClassName = WebXmlParameter.CUSTOM_PROXY_HELPER;

-

-        ProxyHelper result = null;

-        if(customProxyHelperClassName != null && !"".equals(customProxyHelperClassName))

-        {

-            result = (ProxyHelper)ClassUtils.tryToInstantiateClassForName(customProxyHelperClassName);

-        }

-        if(result == null)

-        {

-            result = new DefaultProxyHelper();

-        }

-

-        return result;

-    }

 }

diff --git a/test-modules/base-test-infrastructure/src/test/java/org/apache/myfaces/extensions/validator/test/base/AbstractExValTestCase.java b/test-modules/base-test-infrastructure/src/test/java/org/apache/myfaces/extensions/validator/test/base/AbstractExValTestCase.java
index de92ec6..74fc549 100644
--- a/test-modules/base-test-infrastructure/src/test/java/org/apache/myfaces/extensions/validator/test/base/AbstractExValTestCase.java
+++ b/test-modules/base-test-infrastructure/src/test/java/org/apache/myfaces/extensions/validator/test/base/AbstractExValTestCase.java
@@ -30,7 +30,8 @@
 import org.apache.myfaces.extensions.validator.core.factory.DefaultFactoryFinder;

 import org.apache.myfaces.extensions.validator.core.factory.FactoryNames;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

-import org.apache.myfaces.extensions.validator.core.ProjectStageResolver;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

+import org.apache.myfaces.extensions.validator.core.DefaultExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.core.el.AbstractELHelperFactory;

 import org.apache.myfaces.extensions.validator.core.el.ELHelper;

 import org.apache.myfaces.shared_impl.config.MyfacesConfig;

@@ -119,6 +120,9 @@
         servletContext.addInitParameter(ExtValInformation.WEBXML_PARAM_PREFIX + ".CUSTOM_VALIDATION_STRATEGY_FACTORY", MockValidationStrategyFactory.class.getName());

         servletContext.addInitParameter(ExtValInformation.WEBXML_PARAM_PREFIX + ".CUSTOM_MESSAGE_RESOLVER_FACTORY", MockMessageResolverFactory.class.getName());

         servletContext.addInitParameter(ExtValInformation.WEBXML_PARAM_PREFIX + ".CUSTOM_META_DATA_TRANSFORMER_FACTORY", MockMetaDataTransformerFactory.class.getName());

+

+        addInitializationParameters();

+

         config = new MockServletConfig(servletContext);

         session = new MockHttpSession();

         session.setServletContext(servletContext);

@@ -169,15 +173,29 @@
                     }

                 });

 

+        final ExtValCoreConfiguration customExtValCoreConfiguration = getCustomExtValCoreConfiguration();

+

         //execute startup listener

         new ExtValStartupListener() {

             private static final long serialVersionUID = -3861810605160281884L;

 

             @Override

+            protected void initModuleConfig()

+            {

+                if(customExtValCoreConfiguration != null)

+                {

+                    ExtValCoreConfiguration.use(customExtValCoreConfiguration, true);

+                }

+                else

+                {

+                    ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration(), true);

+                }

+            }

+

+            @Override

             protected void init()

             {

-                ExtValContext.getContext()

-                        .addGlobalProperty(ProjectStageResolver.class.getName(), getProjectStageResolver(), false);

+                initModuleConfig();

                 super.init();

             }

         }.init();

@@ -185,7 +203,23 @@
         invokeStartupListeners();

     }

 

-    protected abstract void invokeStartupListeners();

+    protected ExtValCoreConfiguration getCustomExtValCoreConfiguration()

+    {

+	    //override it - if needed

+        return null;

+    }

+

+    protected void addInitializationParameters()

+	{

+	    //override it - if needed		

+	}

+    

+    protected void addInitParameter(String key, String value)

+	{

+    	servletContext.addInitParameter(key, value);

+    }

+

+	protected abstract void invokeStartupListeners();

 

     /**

      * Tear down the test environment.

diff --git a/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/AbstractBeanValidationTestCase.java b/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/AbstractBeanValidationTestCase.java
index e8c4b7e..ff5e3f0 100644
--- a/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/AbstractBeanValidationTestCase.java
+++ b/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/AbstractBeanValidationTestCase.java
@@ -41,6 +41,7 @@
             @Override

             protected void init()

             {

+                super.initModuleConfig();

                 super.init();

             }

         }.init();

diff --git a/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/ConstraintSourceAwareValidation6TestCase.java b/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/ConstraintSourceAwareValidation6TestCase.java
index 12a43a9..4a9e264 100644
--- a/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/ConstraintSourceAwareValidation6TestCase.java
+++ b/test-modules/bean-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/beanval/ConstraintSourceAwareValidation6TestCase.java
@@ -20,18 +20,16 @@
 

 import junit.framework.Test;

 import junit.framework.TestSuite;

-import org.apache.myfaces.extensions.validator.test.beanval.model.ConstraintSourceAware6Bean;

+import org.apache.myfaces.extensions.validator.core.DefaultExtValCoreConfiguration;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.test.beanval.custom.CustomConstraintSource;

 import org.apache.myfaces.extensions.validator.test.beanval.custom.CustomIgnoreConstraintSource;

 import org.apache.myfaces.extensions.validator.test.beanval.custom.CustomTargetProperty;

 import org.apache.myfaces.extensions.validator.test.beanval.custom.CustomTargetPropertyId;

-import org.apache.myfaces.extensions.validator.core.ExtValContext;

-import org.apache.myfaces.extensions.validator.core.validation.ConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.IgnoreConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.TargetProperty;

-import org.apache.myfaces.extensions.validator.core.validation.TargetPropertyId;

+import org.apache.myfaces.extensions.validator.test.beanval.model.ConstraintSourceAware6Bean;

 

 import javax.faces.application.FacesMessage;

+import java.lang.annotation.Annotation;

 

 /**

  * EXTVAL-83

@@ -59,12 +57,32 @@
     protected void setUp() throws Exception

     {

         super.setUp();

-        ExtValContext extValContext = ExtValContext.getContext();

 

-        extValContext.addGlobalProperty(ConstraintSource.class.getName(), CustomConstraintSource.class);

-        extValContext.addGlobalProperty(IgnoreConstraintSource.class.getName(), CustomIgnoreConstraintSource.class);

-        extValContext.addGlobalProperty(TargetProperty.class.getName(), CustomTargetProperty.class);

-        extValContext.addGlobalProperty(TargetPropertyId.class.getName(), CustomTargetPropertyId.class);

+        ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration() {

+            @Override

+            public Class<? extends Annotation> constraintSourceAnnotation()

+            {

+                return CustomConstraintSource.class;

+            }

+

+            @Override

+            public Class<? extends Annotation> ignoreConstraintSourceAnnotation()

+            {

+                return CustomIgnoreConstraintSource.class;

+            }

+

+            @Override

+            public Class<? extends Annotation> targetPropertyAnnotation()

+            {

+                return CustomTargetProperty.class;

+            }

+

+            @Override

+            public Class<? extends Annotation> targetPropertyIdAnnotation()

+            {

+                return CustomTargetPropertyId.class;

+            }

+        }, true);

     }

 

     public void testCustomAnnotations1()

diff --git a/test-modules/core-tests/src/test/java/org/apache/myfaces/extensions/validator/test/core/stage/IndependentProjectStageTestCase.java b/test-modules/core-tests/src/test/java/org/apache/myfaces/extensions/validator/test/core/stage/IndependentProjectStageTestCase.java
index ceb2a2c..2583a75 100644
--- a/test-modules/core-tests/src/test/java/org/apache/myfaces/extensions/validator/test/core/stage/IndependentProjectStageTestCase.java
+++ b/test-modules/core-tests/src/test/java/org/apache/myfaces/extensions/validator/test/core/stage/IndependentProjectStageTestCase.java
@@ -49,51 +49,58 @@
     {

         super.setUp();

 

-        ExtValContext.getContext().addGlobalProperty(ProjectStageResolver.class.getName(), new DefaultProjectStageResolver()

+        ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration()

         {

             @Override

-            public ProjectStage getCurrentProjectStage()

+            public ProjectStageResolver projectStageResolver()

             {

-                String jsfProjectStageName = resolveProjectStageName("javax.faces.PROJECT_STAGE");

-                String independentProjectStageName = resolveProjectStageName(INDEPENDENT_PROJECT_STAGE);

-

-                if (!(jsfProjectStageName == null || "".equals(jsfProjectStageName)))

+                return new DefaultProjectStageResolver()

                 {

-                    ProjectStageName result = ProjectStage.createStageName(jsfProjectStageName.trim());

-                    for(JsfProjectStage jsfProjectStage : JsfProjectStage.values())

+                    @Override

+                    public ProjectStage getCurrentProjectStage()

                     {

-                        if(jsfProjectStage.getValue().equals(result))

+                        String jsfProjectStageName = resolveProjectStageName("javax.faces.PROJECT_STAGE");

+                        String independentProjectStageName = resolveProjectStageName(INDEPENDENT_PROJECT_STAGE);

+

+                        if (!(jsfProjectStageName == null || "".equals(jsfProjectStageName)))

                         {

-                            return ProjectStage.createStage(result);

+                            ProjectStageName result = ProjectStage.createStageName(jsfProjectStageName.trim());

+                            for (JsfProjectStage jsfProjectStage : JsfProjectStage.values())

+                            {

+                                if (jsfProjectStage.getValue().equals(result))

+                                {

+                                    return ProjectStage.createStage(result);

+                                }

+                            }

                         }

-                    }

-                }

 

-                if(!(independentProjectStageName == null || "".equals(independentProjectStageName)))

-                {

-                    ProjectStageName independentResult = ProjectStage.createStageName(independentProjectStageName.trim());

-

-                    //check jsf stage values first

-                    ProjectStageName result = ProjectStage.createStageName(independentProjectStageName.trim());

-                    for(JsfProjectStage jsfProjectStage : JsfProjectStage.values())

-                    {

-                        if(jsfProjectStage.getValue().equals(result))

+                        if (!(independentProjectStageName == null || "".equals(independentProjectStageName)))

                         {

-                            return ProjectStage.createStage(result);

+                            ProjectStageName independentResult = ProjectStage.createStageName(independentProjectStageName.trim());

+

+                            //check jsf stage values first

+                            ProjectStageName result = ProjectStage.createStageName(independentProjectStageName.trim());

+                            for (JsfProjectStage jsfProjectStage : JsfProjectStage.values())

+                            {

+                                if (jsfProjectStage.getValue().equals(result))

+                                {

+                                    return ProjectStage.createStage(result);

+                                }

+                            }

+

+                            //check custom stage values

+                            if (ProjectStage.createStageName(CUSTOM_DEV).equals(independentResult) ||

+                                    ProjectStage.createStageName(CUSTOM_TEST).equals(independentResult))

+                            {

+                                return ProjectStage.createStage(independentResult);

+                            }

                         }

-                    }

 

-                    //check custom stage values

-                    if(ProjectStage.createStageName(CUSTOM_DEV).equals(independentResult) ||

-                            ProjectStage.createStageName(CUSTOM_TEST).equals(independentResult))

-                    {

-                        return ProjectStage.createStage(independentResult);

+                        return createProjectStage(ProjectStage.createStageName(CUSTOM_PROD));

                     }

-                }

-

-                return createProjectStage(ProjectStage.createStageName(CUSTOM_PROD));

+                };

             }

-        });

+        }, true);

     }

 

     private String resolveProjectStageName(String parameterName)

@@ -109,13 +116,6 @@
         }

     }

 

-    @Override

-    protected void tearDown() throws Exception

-    {

-        super.tearDown();

-        ExtValContext.getContext().addGlobalProperty(ProjectStageResolver.class.getName(), new DefaultProjectStageResolver());

-    }

-

     public void testDevelopmentStage()

     {

         servletContext.addInitParameter(INDEPENDENT_PROJECT_STAGE, CUSTOM_DEV);

@@ -165,4 +165,4 @@
     {

         assertFalse(ProjectStage.is(ProjectStage.createStageName(CUSTOM_TEST)));

     }

-}
\ No newline at end of file
+}

diff --git a/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/AbstractPropertyValidationTestCase.java b/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/AbstractPropertyValidationTestCase.java
index 50953d6..04efbca 100644
--- a/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/AbstractPropertyValidationTestCase.java
+++ b/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/AbstractPropertyValidationTestCase.java
@@ -40,6 +40,7 @@
             @Override

             protected void init()

             {

+                super.initModuleConfig();

                 super.init();

             }

         }.init();

diff --git a/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/constraintsource/ConstraintSourceAwareValidation6TestCase.java b/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/constraintsource/ConstraintSourceAwareValidation6TestCase.java
index f819967..217a8ca 100644
--- a/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/constraintsource/ConstraintSourceAwareValidation6TestCase.java
+++ b/test-modules/property-validation-tests/src/test/java/org/apache/myfaces/extensions/validator/test/propval/constraintsource/ConstraintSourceAwareValidation6TestCase.java
@@ -1,21 +1,18 @@
 package org.apache.myfaces.extensions.validator.test.propval.constraintsource;

 

-import javax.faces.application.FacesMessage;

-

 import junit.framework.Test;

 import junit.framework.TestSuite;

-

-import org.apache.myfaces.extensions.validator.core.ExtValContext;

-import org.apache.myfaces.extensions.validator.core.validation.ConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.IgnoreConstraintSource;

-import org.apache.myfaces.extensions.validator.core.validation.TargetProperty;

-import org.apache.myfaces.extensions.validator.core.validation.TargetPropertyId;

+import org.apache.myfaces.extensions.validator.core.DefaultExtValCoreConfiguration;

+import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;

 import org.apache.myfaces.extensions.validator.test.propval.constraintsource.custom.CustomConstraintSource;

 import org.apache.myfaces.extensions.validator.test.propval.constraintsource.custom.CustomIgnoreConstraintSource;

 import org.apache.myfaces.extensions.validator.test.propval.constraintsource.custom.CustomTargetProperty;

 import org.apache.myfaces.extensions.validator.test.propval.constraintsource.custom.CustomTargetPropertyId;

 import org.apache.myfaces.extensions.validator.test.propval.constraintsource.model.ConstraintSourceAware6Bean;

 

+import javax.faces.application.FacesMessage;

+import java.lang.annotation.Annotation;

+

 public class ConstraintSourceAwareValidation6TestCase extends

         AbstractConstraintSourceTestCase<ConstraintSourceAware6Bean>

 {

@@ -38,16 +35,31 @@
     protected void setUp() throws Exception

     {

         super.setUp();

-        ExtValContext extValContext = ExtValContext.getContext();

+        ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration() {

+            @Override

+            public Class<? extends Annotation> constraintSourceAnnotation()

+            {

+                return CustomConstraintSource.class;

+            }

 

-        extValContext.addGlobalProperty(ConstraintSource.class.getName(),

-                CustomConstraintSource.class);

-        extValContext.addGlobalProperty(IgnoreConstraintSource.class.getName(),

-                CustomIgnoreConstraintSource.class);

-        extValContext.addGlobalProperty(TargetProperty.class.getName(),

-                CustomTargetProperty.class);

-        extValContext.addGlobalProperty(TargetPropertyId.class.getName(),

-                CustomTargetPropertyId.class);

+            @Override

+            public Class<? extends Annotation> ignoreConstraintSourceAnnotation()

+            {

+                return CustomIgnoreConstraintSource.class;

+            }

+

+            @Override

+            public Class<? extends Annotation> targetPropertyAnnotation()

+            {

+                return CustomTargetProperty.class;

+            }

+

+            @Override

+            public Class<? extends Annotation> targetPropertyIdAnnotation()

+            {

+                return CustomTargetPropertyId.class;

+            }

+        }, true);

     }

 

     public void testCustomAnnotations1()

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
index 395bbe9..ad03cf6 100644
--- a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/PropertyValidationModuleStartupListener.java
@@ -18,7 +18,8 @@
  */

 package org.apache.myfaces.extensions.validator;

 

-import org.apache.myfaces.extensions.validator.baseval.WebXmlParameter;

+import org.apache.myfaces.extensions.validator.baseval.ExtValBaseValidationModuleConfiguration;

+import org.apache.myfaces.extensions.validator.baseval.DefaultExtValBaseValidationModuleConfiguration;

 import org.apache.myfaces.extensions.validator.baseval.annotation.SkipValidationSupport;

 import org.apache.myfaces.extensions.validator.core.startup.AbstractStartupListener;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

@@ -44,6 +45,8 @@
 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.crossval.ExtValCrossValidationModuleConfiguration;

+import org.apache.myfaces.extensions.validator.crossval.DefaultExtValCrossValidationModuleConfiguration;

 import org.apache.myfaces.extensions.validator.util.ExtValUtils;

 import org.apache.myfaces.extensions.validator.util.JsfUtils;

 

@@ -56,6 +59,12 @@
 {

     private static final long serialVersionUID = -2474361612857222283L;

 

+    protected void initModuleConfig()

+    {

+        ExtValBaseValidationModuleConfiguration.use(new DefaultExtValBaseValidationModuleConfiguration(), false);

+        ExtValCrossValidationModuleConfiguration.use(new DefaultExtValCrossValidationModuleConfiguration(), false);

+    }

+    

     protected void init()

     {

         initProcessedInformationRecorders();

@@ -76,9 +85,7 @@
 

     private void initStaticStrategyMappings()

     {

-        String jpaBasedValidation = WebXmlParameter.DEACTIVATE_JPA_BASED_VALIDATION;

-        if (jpaBasedValidation == null

-                || !jpaBasedValidation.equalsIgnoreCase("true"))

+        if (!ExtValBaseValidationModuleConfiguration.get().deactivateJpaBasedValidation())

         {

             StaticConfiguration<String, String> staticConfig = new StaticResourceBundleConfiguration();

             staticConfig.setSourceOfMapping(

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/DefaultExtValBaseValidationModuleConfiguration.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/DefaultExtValBaseValidationModuleConfiguration.java
new file mode 100644
index 0000000..368205b
--- /dev/null
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/DefaultExtValBaseValidationModuleConfiguration.java
@@ -0,0 +1,40 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+package org.apache.myfaces.extensions.validator.baseval;

+

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public class DefaultExtValBaseValidationModuleConfiguration extends ExtValBaseValidationModuleConfiguration

+{

+    public String jpaValidationErrorMessages()

+    {

+        return WebXmlParameter.VALIDATION_MESSAGES_JPA;

+    }

+

+    public boolean deactivateJpaBasedValidation()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_JPA_BASED_VALIDATION);

+    }

+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/ExtValBaseValidationModuleConfiguration.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/ExtValBaseValidationModuleConfiguration.java
new file mode 100644
index 0000000..3ac052b
--- /dev/null
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/ExtValBaseValidationModuleConfiguration.java
@@ -0,0 +1,58 @@
+/*

+ * 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.baseval;

+

+import org.apache.myfaces.extensions.validator.core.ExtValContext;

+import org.apache.myfaces.extensions.validator.core.ExtValModuleConfiguration;

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public abstract class ExtValBaseValidationModuleConfiguration implements ExtValModuleConfiguration

+{

+    private static ExtValContext extValContext = ExtValContext.getContext();

+

+    protected ExtValBaseValidationModuleConfiguration()

+    {

+    }

+

+    public static ExtValBaseValidationModuleConfiguration get()

+    {

+        return extValContext.getModuleConfiguration(ExtValBaseValidationModuleConfiguration.class);

+    }

+

+    @UsageInformation(UsageCategory.INTERNAL)

+    public static boolean use(ExtValBaseValidationModuleConfiguration config, boolean forceOverride)

+    {

+        return extValContext.addModuleConfiguration(

+                ExtValBaseValidationModuleConfiguration.class, config, forceOverride);

+    }

+

+    /*

+     * web.xml config

+     */

+

+    public abstract String jpaValidationErrorMessages();

+

+    public abstract boolean deactivateJpaBasedValidation();

+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/WebXmlParameter.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/WebXmlParameter.java
index b777a4e..9a43d45 100644
--- a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/WebXmlParameter.java
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/WebXmlParameter.java
@@ -32,10 +32,10 @@
  */

 @ToDo(value = Priority.MEDIUM, description = "documentation")

 @UsageInformation(UsageCategory.INTERNAL)

-public interface WebXmlParameter

+interface WebXmlParameter

 {

     static final String VALIDATION_MESSAGES_JPA = WebXmlUtils

             .getInitParameter("JPA_VALIDATION_ERROR_MESSAGES");

     static final String DEACTIVATE_JPA_BASED_VALIDATION = WebXmlUtils

             .getInitParameter("DEACTIVATE_JPA_BASED_VALIDATION");

-}
\ No newline at end of file
+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/message/resolver/JpaValidationErrorMessageResolver.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/message/resolver/JpaValidationErrorMessageResolver.java
index d476ad9..5aff2af 100644
--- a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/message/resolver/JpaValidationErrorMessageResolver.java
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/baseval/message/resolver/JpaValidationErrorMessageResolver.java
@@ -18,7 +18,7 @@
  */

 package org.apache.myfaces.extensions.validator.baseval.message.resolver;

 

-import org.apache.myfaces.extensions.validator.baseval.WebXmlParameter;

+import org.apache.myfaces.extensions.validator.baseval.ExtValBaseValidationModuleConfiguration;

 import org.apache.myfaces.extensions.validator.core.validation.message.resolver.AbstractValidationErrorMessageResolver;

 import org.apache.myfaces.extensions.validator.core.ExtValContext;

 import org.apache.myfaces.extensions.validator.internal.UsageInformation;

@@ -37,7 +37,9 @@
 {

     public static final String JPA_VALIDATION_ERROR_MESSAGES = "JPA_VALIDATION_ERROR_MESSAGES";

 

-    private static final String CUSTOM_BASE_NAME = WebXmlParameter.VALIDATION_MESSAGES_JPA;

+    private static final String CUSTOM_BASE_NAME =

+            ExtValBaseValidationModuleConfiguration.get().jpaValidationErrorMessages();

+    

     private static final String BASE_NAME = JpaValidationErrorMessageResolver.class

             .getPackage().getName().replace(".message.resolver", ".message.bundle")+ ".jpa_messages";

 

@@ -56,4 +58,4 @@
         return BASE_NAME;

     }

 

-}
\ No newline at end of file
+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/CrossValidationPhaseListener.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/CrossValidationPhaseListener.java
index 571d3d6..3cf179e 100644
--- a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/CrossValidationPhaseListener.java
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/CrossValidationPhaseListener.java
@@ -151,8 +151,7 @@
     {

         if (!isInitialized)

         {

-            if (WebXmlParameter.DEACTIVATE_CROSSVALIDATION != null

-                    && WebXmlParameter.DEACTIVATE_CROSSVALIDATION.equalsIgnoreCase("true"))

+            if (ExtValCrossValidationModuleConfiguration.get().deactivateCrossvalidation())

             {

                 JsfUtils.deregisterPhaseListener(this);

             }

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/DefaultExtValCrossValidationModuleConfiguration.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/DefaultExtValCrossValidationModuleConfiguration.java
new file mode 100644
index 0000000..15f624f
--- /dev/null
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/DefaultExtValCrossValidationModuleConfiguration.java
@@ -0,0 +1,35 @@
+/*

+ * 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.crossval;

+

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public class DefaultExtValCrossValidationModuleConfiguration extends ExtValCrossValidationModuleConfiguration

+{

+    public boolean deactivateCrossvalidation()

+    {

+        return "true".equalsIgnoreCase(WebXmlParameter.DEACTIVATE_CROSSVALIDATION);

+    }

+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/ExtValCrossValidationModuleConfiguration.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/ExtValCrossValidationModuleConfiguration.java
new file mode 100644
index 0000000..2dfc830
--- /dev/null
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/ExtValCrossValidationModuleConfiguration.java
@@ -0,0 +1,56 @@
+/*

+ * 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.crossval;

+

+import org.apache.myfaces.extensions.validator.core.ExtValContext;

+import org.apache.myfaces.extensions.validator.core.ExtValModuleConfiguration;

+import org.apache.myfaces.extensions.validator.internal.UsageInformation;

+import org.apache.myfaces.extensions.validator.internal.UsageCategory;

+

+/**

+ * @author Gerhard Petracek

+ * @since r4

+ */

+@UsageInformation(UsageCategory.INTERNAL)

+public abstract class ExtValCrossValidationModuleConfiguration implements ExtValModuleConfiguration

+{

+    private static ExtValContext extValContext = ExtValContext.getContext();

+

+    protected ExtValCrossValidationModuleConfiguration()

+    {

+    }

+

+    public static ExtValCrossValidationModuleConfiguration get()

+    {

+        return extValContext.getModuleConfiguration(ExtValCrossValidationModuleConfiguration.class);

+    }

+

+    @UsageInformation(UsageCategory.INTERNAL)

+    public static boolean use(ExtValCrossValidationModuleConfiguration config, boolean forceOverride)

+    {

+        return extValContext.addModuleConfiguration(

+                ExtValCrossValidationModuleConfiguration.class, config, forceOverride);

+    }

+

+    /*

+     * web.xml config

+     */

+

+    abstract boolean deactivateCrossvalidation();

+}

diff --git a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/WebXmlParameter.java b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/WebXmlParameter.java
index 1c40279..9440880 100644
--- a/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/WebXmlParameter.java
+++ b/validation-modules/property-validation/src/main/java/org/apache/myfaces/extensions/validator/crossval/WebXmlParameter.java
@@ -29,8 +29,8 @@
  * @since 1.x.1

  */

 @UsageInformation(UsageCategory.INTERNAL)

-public interface WebXmlParameter

+interface WebXmlParameter

 {

     static final String DEACTIVATE_CROSSVALIDATION = WebXmlUtils

             .getInitParameter("DEACTIVATE_CROSSVALIDATION");

-}
\ No newline at end of file
+}