EXTVAL-100 ExtValModuleConfigurationResolver

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/validator/branches/branch_for_extval-100@963753 13f79535-47bb-0310-9956-ffa450edef68
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 0252d34..fc26155 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
@@ -36,7 +36,6 @@
 import org.apache.myfaces.extensions.validator.internal.UsageInformation;
 import org.apache.myfaces.extensions.validator.util.ClassUtils;
 import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
-import static org.apache.myfaces.extensions.validator.util.ClassUtils.getPackageName;
 import static org.apache.myfaces.extensions.validator.util.WebXmlUtils.getInitParameter;
 
 import javax.faces.component.UIComponent;
@@ -63,6 +62,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 =
@@ -84,10 +86,36 @@
     private ExtValContextInternals contextHelper;
     private ExtValContextInvocationOrderAwareInternals invocationOrderAwareContextHelper;
 
+    private ExtValModuleConfigurationResolver moduleConfigurationResolver;
+
     protected ExtValContext()
     {
         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.moduleConfigurationResolver =
+                    (ExtValModuleConfigurationResolver)customExtValModuleConfigurationResolver;
+        }
+
+        String customExtValModuleConfigurationResolverClassName =
+                getInitParameter(null, ExtValModuleConfigurationResolver.class.getName());
+
+        if(customExtValModuleConfigurationResolverClassName != null)
+        {
+            customExtValModuleConfigurationResolver =
+                    ClassUtils.tryToInstantiateClassForName(customExtValModuleConfigurationResolverClassName);
+
+            if(customExtValModuleConfigurationResolver instanceof ExtValModuleConfigurationResolver)
+            {
+                this.moduleConfigurationResolver =
+                        (ExtValModuleConfigurationResolver)customExtValModuleConfigurationResolver;
+            }
+        }
     }
 
     public static ExtValContext getContext()
@@ -461,18 +489,32 @@
 
     private ExtValModuleConfiguration tryToLoadCustomConfigImplementation(ExtValModuleConfiguration config)
     {
-        Class configDefinitionClass = config.getClass().getSuperclass();
-        String customConfigClassName = getInitParameter(
-                getPackageName(configDefinitionClass), configDefinitionClass.getSimpleName());
+
+        Class configClass = config.getClass().getSuperclass();
+
+        if(!ExtValModuleConfiguration.class.isAssignableFrom(configClass))
+        {
+            return config;
+        }
+
+        @SuppressWarnings({"unchecked"})
+        Class<? extends ExtValModuleConfiguration> configDefinitionClass =
+                (Class<? extends  ExtValModuleConfiguration>)configClass;
+
+        if(this.moduleConfigurationResolver != null)
+        {
+            config = this.moduleConfigurationResolver.getCustomConfiguration(configDefinitionClass);
+        }
+
+        String customConfigClassName = getInitParameter(null, configDefinitionClass.getName());
 
         if(customConfigClassName != null)
         {
-            ExtValModuleConfiguration customConfig =
-                    (ExtValModuleConfiguration) ClassUtils.tryToInstantiateClassForName(customConfigClassName);
+            Object customConfig = ClassUtils.tryToInstantiateClassForName(customConfigClassName);
 
-            if(customConfig != null)
+            if(customConfig instanceof ExtValModuleConfiguration)
             {
-                return customConfig;
+                return (ExtValModuleConfiguration)customConfig;
             }
         }
         return config;
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);

+}