You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2009/11/13 03:48:58 UTC

svn commit: r835712 [6/19] - in /myfaces/extensions/validator/branches/branch_for_jsf_2_0: ./ assembly/ assembly/src/ assembly/src/main/ assembly/src/main/assembly/ assembly/src/main/resources/ component-support/ component-support/generic-support/ comp...

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/DefaultComponentMetaDataExtractorFactory.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,102 @@
+/*
+ * 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.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.util.ClassUtils;
+import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.internal.ToDo;
+import org.apache.myfaces.extensions.validator.internal.Priority;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This factory creates a meta-data extractor which extracts the meta-data
+ * of the value binding of a component.
+ * <p/>
+ * order:<br/>
+ * <ol>
+ *   <li>configured meta-data extractor (web.xml)</li>
+ *   <li>configured meta-data extractor (information provider bean)</li>
+ *   <li>default implementation</li>
+ * </ol>
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class DefaultComponentMetaDataExtractorFactory implements ComponentMetaDataExtractorFactory
+{
+    private final Log logger = LogFactory.getLog(getClass());
+
+    private static MetaDataExtractor metaDataExtractor = null;
+
+    public DefaultComponentMetaDataExtractorFactory()
+    {
+        if(logger.isDebugEnabled())
+        {
+            logger.debug(getClass().getName() + " instantiated");
+        }
+    }
+
+    @ToDo(value = Priority.MEDIUM, description = "logging")
+    public MetaDataExtractor create()
+    {
+        return createWith(null);
+    }
+
+    public MetaDataExtractor createWith(Map<String, Object> properties)
+    {
+        if (metaDataExtractor == null)
+        {
+            List<String> metaDataExtractorClassNames = new ArrayList<String>();
+
+            metaDataExtractorClassNames.add(WebXmlParameter.CUSTOM_COMPONENT_META_DATA_EXTRACTOR);
+            metaDataExtractorClassNames
+                .add(ExtValContext.getContext().getInformationProviderBean()
+                    .get(CustomInformation.COMPONENT_META_DATA_EXTRACTOR));
+            metaDataExtractorClassNames.add(DefaultComponentMetaDataExtractor.class.getName());
+
+            for (String className : metaDataExtractorClassNames)
+            {
+                metaDataExtractor = (MetaDataExtractor) ClassUtils.tryToInstantiateClassForName(className);
+
+                if (metaDataExtractor != null)
+                {
+                    break;
+                }
+            }
+        }
+
+        if(logger.isTraceEnabled())
+        {
+            logger.trace(metaDataExtractor.getClass().getName() + " created");
+        }
+
+        return ExtValUtils.createInterceptedMetaDataExtractorWith(metaDataExtractor, properties);
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/MetaDataExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/MetaDataExtractor.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/MetaDataExtractor.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/extractor/MetaDataExtractor.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.metadata.extractor;
+
+import org.apache.myfaces.extensions.validator.core.property.PropertyInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * An meta-data extractor is responsible to analyze an object
+ * and returns all available meta-data information
+ * 
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.API)
+public interface MetaDataExtractor
+{
+    PropertyInformation extract(FacesContext facesContext, Object object);
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapter.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapter.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapter.java Fri Nov 13 02:48:45 2009
@@ -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.core.metadata.transformer;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+
+/**
+ * it's just a helper for proxies - you just need it, if you define the equivalent validation strategy as bean and
+ * e.g. spring creates a proxy for it.
+ *
+ * if there is also a proxy for the extractor you can use the className property to manually repeat the
+ * full qualified class name.
+ *
+ * @see org.apache.myfaces.extensions.validator.core.validation.strategy.BeanValidationStrategyAdapter
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation({UsageCategory.REUSE})
+public interface BeanMetaDataTransformerAdapter extends MetaDataTransformer
+{
+    String getMetaDataTransformerClassName();
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapterImpl.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapterImpl.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapterImpl.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/BeanMetaDataTransformerAdapterImpl.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,85 @@
+/*
+ * 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.metadata.transformer;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Map;
+
+/**
+ * it's just a helper for proxies - you just need it, if you define the equivalent validation strategy as bean and
+ * e.g. spring creates a proxy for it.
+ *
+ * if there is also a proxy for the transformer you can use the className property to manually repeat the
+ * full qualified class name.
+ *
+ * @see org.apache.myfaces.extensions.validator.core.validation.strategy.BeanValidationStrategyAdapter
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation({UsageCategory.REUSE})
+public class BeanMetaDataTransformerAdapterImpl implements MetaDataTransformer, BeanMetaDataTransformerAdapter
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    private MetaDataTransformer metaDataTransformer;
+    private String metaDataTransformerClassName;
+
+    public Map<String, Object> convertMetaData(MetaDataEntry metaDataEntry)
+    {
+        return this.metaDataTransformer.convertMetaData(metaDataEntry);
+    }
+
+    public String getMetaDataTransformerClassName()
+    {
+        if(metaDataTransformerClassName != null)
+        {
+            return metaDataTransformerClassName;
+        }
+        if(metaDataTransformer.getClass().getPackage() != null)
+        {
+            metaDataTransformer.getClass();
+        }
+
+        return null;
+    }
+
+    /*
+     * generated
+     */
+    public void setMetaDataTransformerClassName(String metaDataTransformerClassName)
+    {
+        this.metaDataTransformerClassName = metaDataTransformerClassName;
+    }
+
+    public MetaDataTransformer getMetaDataTransformer()
+    {
+        return metaDataTransformer;
+    }
+
+    public void setMetaDataTransformer(MetaDataTransformer metaDataTransformer)
+    {
+        this.metaDataTransformer = metaDataTransformer;
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,265 @@
+/*
+ * 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.metadata.transformer;
+
+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.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.BeanValidationStrategyAdapter;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.IdentifiableValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
+import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
+import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfiguration;
+import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationNames;
+import org.apache.myfaces.extensions.validator.core.initializer.configuration.StaticConfigurationEntry;
+import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper.
+        ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper;
+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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Factory which creates the MetaDataTransformer for a given ValidationStrategy
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+/*
+ * ValidationStrategy -> MetaDataTransformer instead of Meta-Data -> MetaDataTransformer
+ * to avoid a second static mapping e.g. for jpa annotations
+ */
+@UsageInformation({UsageCategory.INTERNAL, UsageCategory.CUSTOMIZABLE})
+public class DefaultMetaDataTransformerFactory extends AbstractNameMapperAwareFactory<ValidationStrategy>
+        implements ClassMappingFactory<ValidationStrategy, MetaDataTransformer>
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    private Map<String, String> validationStrategyToMetaDataTransformerMapping;
+    private List<NameMapper<ValidationStrategy>> nameMapperList = new ArrayList<NameMapper<ValidationStrategy>>();
+    private List<NameMapper<ValidationStrategy>> subNameMapperList =
+            new ArrayList<NameMapper<ValidationStrategy>>();
+
+    public DefaultMetaDataTransformerFactory()
+    {
+        if(logger.isDebugEnabled())
+        {
+            logger.debug(getClass().getName() + " instantiated");
+        }
+
+        //since there is no guarantee that the startup listener of the core gets executed first
+        register(new ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper());
+    }
+
+    public MetaDataTransformer create(ValidationStrategy validationStrategy)
+    {
+        String validationStrategyName = createValidationStrategyName(validationStrategy);
+
+        tryToInitStaticMappings();
+
+        MetaDataTransformer metaDataTransformer =
+                tryToResolveCachedMetaDataTransformer(validationStrategy, validationStrategyName);
+
+        if(metaDataTransformer != null)
+        {
+            return metaDataTransformer;
+        }
+
+        return createAndCacheMetaDataTransformer(validationStrategy, validationStrategyName);
+    }
+
+    private String createValidationStrategyName(ValidationStrategy validationStrategy)
+    {
+        boolean isProxyDetected = isProxy(validationStrategy);
+        //in case of a proxy and the usage of a BeanValidationStrategyAdapter
+        if (isProxyDetected && validationStrategy instanceof BeanValidationStrategyAdapter)
+        {
+            return ((BeanValidationStrategyAdapter)validationStrategy)
+                                        .getValidationStrategyClassName();
+        }
+
+        return !isProxyDetected ? validationStrategy.getClass().getName() : null;
+    }
+
+    private void tryToInitStaticMappings()
+    {
+        if (validationStrategyToMetaDataTransformerMapping == null)
+        {
+            initStaticMappings();
+        }
+    }
+
+    private boolean isProxy(ValidationStrategy validationStrategy)
+    {
+        return validationStrategy.getClass().getPackage() == null;
+    }
+
+    private MetaDataTransformer createAndCacheMetaDataTransformer(
+            ValidationStrategy validationStrategy, String validationStrategyName)
+    {
+        MetaDataTransformer metaDataTransformer;
+        String transformerName;
+        //null -> use name mappers
+        for (NameMapper<ValidationStrategy> nameMapper : nameMapperList)
+        {
+            transformerName = nameMapper.createName(validationStrategy);
+
+            if (transformerName == null)
+            {
+                continue;
+            }
+
+            metaDataTransformer = tryToCreateAndCacheMetaDataTransformer(
+                    validationStrategy, validationStrategyName, transformerName);
+
+            if(metaDataTransformer != null)
+            {
+                return metaDataTransformer;
+            }
+        }
+
+        return null;
+    }
+
+    private MetaDataTransformer tryToResolveCachedMetaDataTransformer(
+            ValidationStrategy validationStrategy, String validationStrategyName)
+    {
+        if (validationStrategyToMetaDataTransformerMapping.containsKey(validationStrategyName))
+        {
+            return (MetaDataTransformer)ClassUtils.tryToInstantiateClassForName(
+                validationStrategyToMetaDataTransformerMapping.get(validationStrategyName));
+        }
+
+        if(validationStrategy instanceof IdentifiableValidationStrategy)
+        {
+            String newValidationStrategyName = validationStrategyName + IdentifiableValidationStrategy.ID_PREFIX +
+                    ((IdentifiableValidationStrategy)validationStrategy).getId();
+
+            if (validationStrategyToMetaDataTransformerMapping.containsKey(newValidationStrategyName))
+            {
+                return (MetaDataTransformer)ClassUtils.tryToInstantiateClassForName(
+                    validationStrategyToMetaDataTransformerMapping.get(newValidationStrategyName));
+            }
+        }
+
+        return null;
+    }
+
+    private MetaDataTransformer tryToCreateAndCacheMetaDataTransformer(
+            ValidationStrategy validationStrategy, String validationStrategyName, String transformerName)
+    {
+        MetaDataTransformer metaDataTransformer = (MetaDataTransformer)
+                ClassUtils.tryToInstantiateClassForName(transformerName);
+
+        if (metaDataTransformer != null)
+        {
+            if(validationStrategyName != null)
+            {
+                if(validationStrategy instanceof IdentifiableValidationStrategy)
+                {
+                    validationStrategyName += IdentifiableValidationStrategy.ID_PREFIX +
+                            ((IdentifiableValidationStrategy)validationStrategy).getId();
+                }
+                addMapping(validationStrategyName, transformerName);
+            }
+            return metaDataTransformer;
+        }
+
+        return null;
+    }
+
+    private synchronized void initStaticMappings()
+    {
+        validationStrategyToMetaDataTransformerMapping = new HashMap<String, String>();
+
+        //setup internal static mappings
+        for (StaticConfiguration<String, String> staticConfig :
+            ExtValContext.getContext().getStaticConfiguration(
+                StaticConfigurationNames.VALIDATION_STRATEGY_TO_META_DATA_TRANSFORMER_CONFIG))
+        {
+            setupStrategyMappings(staticConfig.getMapping());
+        }
+    }
+
+    private void setupStrategyMappings(List<StaticConfigurationEntry<String, String>> mappings)
+    {
+        for(StaticConfigurationEntry<String, String> mapping : mappings)
+        {
+            addMapping(mapping.getSource(), mapping.getTarget());
+        }
+    }
+
+    private synchronized void addMapping(String validationStrategyName, String transformerName)
+    {
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("adding validation strategy to meta-data transformer mapping: "
+                + validationStrategyName + " -> " + transformerName);
+        }
+
+        validationStrategyToMetaDataTransformerMapping.put(validationStrategyName, transformerName);
+    }
+
+    protected List<NameMapper<ValidationStrategy>> getNameMapperList()
+    {
+        return new SortedNameMapperList<NameMapper<ValidationStrategy>>(this.nameMapperList, this.subNameMapperList);
+    }
+
+    @Override
+    public void register(NameMapper<ValidationStrategy> validationStrategyNameMapper)
+    {
+        tryToInitNameMapperWithExistingSubMappers(validationStrategyNameMapper);
+        super.register(validationStrategyNameMapper);
+    }
+
+    /**
+     * it's a very special case due to the missing order in the execution of startup-listeners (phase listeners)
+     * packaged in faces-config.xml files of jars
+     *
+     * normally the default SubMapperAwareNameMapper should be enough
+     * anyway, if a module adds a new SubMapperAwareNameMapper,
+     * all previous added SubNameMappers have to be added to avoid confusion in special cases.
+     * if a SubMapperAwareNameMapper should be considered as final extend the interface and filter it in addNameMapper
+     * 
+     * @param validationStrategyNameMapper which has to be added
+     */
+    private void tryToInitNameMapperWithExistingSubMappers(NameMapper<ValidationStrategy> validationStrategyNameMapper)
+    {
+        if(validationStrategyNameMapper instanceof SubMapperAwareNameMapper)
+        {
+            for(NameMapper<ValidationStrategy> nameMapper : this.subNameMapperList)
+            {
+                if(nameMapper.getClass().isAnnotationPresent(Nested.class))
+                {
+                    ((SubMapperAwareNameMapper<ValidationStrategy>)validationStrategyNameMapper)
+                            .addNameMapper(nameMapper);
+                }
+            }
+        }
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/MetaDataTransformer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/MetaDataTransformer.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/MetaDataTransformer.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/MetaDataTransformer.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.metadata.transformer;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+
+import java.util.Map;
+
+/**
+ * Allows to transform concrete meta-data to a more abstract form.<br/>
+ * e.g.: @Required, @Column(nullable = false,...), @Length(minimum = 1), ... -> required = true
+ * 
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.API)
+//*Transformer instead of *Converter to avoid naming confusion 
+public interface MetaDataTransformer
+{
+    Map<String, Object> convertMetaData(MetaDataEntry metaData);
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,214 @@
+/*
+ * 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.metadata.transformer;
+
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
+import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+
+import java.util.List;
+import java.util.Collections;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.ListIterator;
+
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@UsageInformation({UsageCategory.INTERNAL})
+class SortedNameMapperList<T extends NameMapper> implements List<T>
+{
+    private List<T> wrapped;
+    private List<T> globalSubNameMapperList;
+
+    SortedNameMapperList(List<T> wrapped, List<T> subNameMapperList)
+    {
+        this.wrapped = wrapped;
+        this.globalSubNameMapperList = subNameMapperList;
+    }
+
+    public boolean add(T t)
+    {
+        if (t != null && t.getClass().isAnnotationPresent(Nested.class))
+        {
+            return addSubNameMapper(t);
+        }
+        else
+        {
+            boolean result = wrapped.add(t);
+
+            Collections.sort(wrapped, new Comparator<T>()
+            {
+                public int compare(T nm1, T nm2)
+                {
+                    if (nm1 instanceof SubMapperAwareNameMapper && nm2 instanceof SubMapperAwareNameMapper)
+                    {
+                        return 0;
+                    }
+                    return nm1 instanceof SubMapperAwareNameMapper ? 1 : -1;
+                }
+            });
+            return result;
+        }
+    }
+
+    @SuppressWarnings({"unchecked"})
+    private boolean addSubNameMapper(T subNameMapper)
+    {
+        boolean result = false;
+        for (NameMapper nameMapper : this.wrapped)
+        {
+            if (nameMapper instanceof SubMapperAwareNameMapper)
+            {
+                ((SubMapperAwareNameMapper) nameMapper).addNameMapper(subNameMapper);
+                result = true;
+            }
+        }
+
+        tryToAddMapperAsGlobalSubNameMapper(subNameMapper);
+        return result;
+    }
+
+    private void tryToAddMapperAsGlobalSubNameMapper(T subNameMapper)
+    {
+        if(!this.globalSubNameMapperList.contains(subNameMapper))
+        {
+            this.globalSubNameMapperList.add(subNameMapper);
+        }
+    }
+
+    /*
+     * generated
+     */
+    public int size()
+    {
+        return wrapped.size();
+    }
+
+    public boolean isEmpty()
+    {
+        return wrapped.isEmpty();
+    }
+
+    public boolean contains(Object o)
+    {
+        return wrapped.contains(o);
+    }
+
+    public Iterator<T> iterator()
+    {
+        return wrapped.iterator();
+    }
+
+    public Object[] toArray()
+    {
+        return wrapped.toArray();
+    }
+
+    @SuppressWarnings({"SuspiciousToArrayCall"})
+    public <T> T[] toArray(T[] a)
+    {
+        return wrapped.toArray(a);
+    }
+
+    public boolean remove(Object o)
+    {
+        return wrapped.remove(o);
+    }
+
+    public boolean containsAll(Collection<?> c)
+    {
+        return wrapped.containsAll(c);
+    }
+
+    public boolean addAll(Collection<? extends T> c)
+    {
+        return wrapped.addAll(c);
+    }
+
+    public boolean addAll(int index, Collection<? extends T> c)
+    {
+        return wrapped.addAll(index, c);
+    }
+
+    public boolean removeAll(Collection<?> c)
+    {
+        return wrapped.removeAll(c);
+    }
+
+    public boolean retainAll(Collection<?> c)
+    {
+        return wrapped.retainAll(c);
+    }
+
+    public void clear()
+    {
+        wrapped.clear();
+    }
+
+    public T get(int index)
+    {
+        return wrapped.get(index);
+    }
+
+    public T set(int index, T element)
+    {
+        return wrapped.set(index, element);
+    }
+
+    public void add(int index, T element)
+    {
+        wrapped.add(index, element);
+    }
+
+    public T remove(int index)
+    {
+        return wrapped.remove(index);
+    }
+
+    public int indexOf(Object o)
+    {
+        return wrapped.indexOf(o);
+    }
+
+    public int lastIndexOf(Object o)
+    {
+        return wrapped.lastIndexOf(o);
+    }
+
+    public ListIterator<T> listIterator()
+    {
+        return wrapped.listIterator();
+    }
+
+    public ListIterator<T> listIterator(int index)
+    {
+        return wrapped.listIterator(index);
+    }
+
+    public List<T> subList(int fromIndex, int toIndex)
+    {
+        return wrapped.subList(fromIndex, toIndex);
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/AbstractValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/AbstractValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/AbstractValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/AbstractValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,45 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation({UsageCategory.INTERNAL})
+public abstract class AbstractValidationStrategyToMetaDataTransformerNameMapper
+    implements NameMapper<ValidationStrategy>
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    public AbstractValidationStrategyToMetaDataTransformerNameMapper()
+    {
+        if(logger.isDebugEnabled())
+        {
+            logger.debug(getClass().getName() + " instantiated");
+        }
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/BeanValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/BeanValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/BeanValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/BeanValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,46 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.BeanValidationStrategyAdapter;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+/**
+ * It's an alternative Mapper - if there is a proxy around the validation strategy.
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@InvocationOrder(500)
+@UsageInformation({UsageCategory.INTERNAL})
+public class BeanValidationStrategyToMetaDataTransformerNameMapper extends
+    AbstractValidationStrategyToMetaDataTransformerNameMapper
+{
+    public String createName(ValidationStrategy validationStrategy)
+    {
+        if(validationStrategy instanceof BeanValidationStrategyAdapter)
+        {
+            return ((BeanValidationStrategyAdapter)validationStrategy).getMetaDataTransformerClassName();
+        }
+        return null;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.core.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.validation.strategy.ValidationStrategy;
+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;
+
+/**
+ * To provide a custom NameMapper to map ValidationStrategies to MetaDataTransformers.
+ * (configured via web.xml)
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@InvocationOrder(100)
+@UsageInformation({UsageCategory.INTERNAL, UsageCategory.CUSTOMIZABLE})
+public class CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper extends
+    AbstractCustomNameMapper<ValidationStrategy>
+{
+    protected String getCustomNameMapperClassName()
+    {
+        return WebXmlParameter.CUSTOM_VALIDATION_STRATEGY_TO_META_DATA_TRANSFORMER_NAME_MAPPER;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConventionValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConventionValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConventionValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/CustomConventionValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,48 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+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.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.CustomInformation;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+/**
+ * To provide a custom NameMapper to map ValidationStrategies to MetaDataTransformers.
+ * (configured via information provider bean)
+ * The bean provides the default name (convention).
+ * It's possible to provide a custom full qualified name. (= customizable convention)
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@InvocationOrder(200)
+@UsageInformation({UsageCategory.INTERNAL, UsageCategory.CUSTOMIZABLE})
+public class CustomConventionValidationStrategyToMetaDataTransformerNameMapper extends
+    AbstractCustomNameMapper<ValidationStrategy>
+{
+    protected String getCustomNameMapperClassName()
+    {
+        return ExtValContext.getContext().getInformationProviderBean()
+            .get(CustomInformation.VALIDATION_STRATEGY_TO_META_DATA_TRANSFORMER_NAME_MAPPER);
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/DefaultValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/DefaultValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/DefaultValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/DefaultValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,48 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.InternalConventionProvider;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+/**
+ * Default implementation which maps ExtVal ValidationStrategies to MetaDataTransformers.
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@InvocationOrder(300)
+@UsageInformation(UsageCategory.INTERNAL)
+public class DefaultValidationStrategyToMetaDataTransformerNameMapper extends
+    AbstractValidationStrategyToMetaDataTransformerNameMapper
+{
+    public String createName(ValidationStrategy validationStrategy)
+    {
+        return InternalConventionProvider.getMetaDataTransformerClassName(
+                validationStrategy.getClass(), getClassName(validationStrategy.getClass().getSimpleName()));
+    }
+
+    protected String getClassName(String validationStrategyClassName)
+    {
+        return InternalConventionProvider.getMetaDataTransformerClassName(validationStrategyClassName);
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/SimpleValidationStrategyToMetaDataTransformerNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/SimpleValidationStrategyToMetaDataTransformerNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/SimpleValidationStrategyToMetaDataTransformerNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/SimpleValidationStrategyToMetaDataTransformerNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,69 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.core.ExtValContext;
+import org.apache.myfaces.extensions.validator.core.CustomInformation;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+/**
+ * It's an alternative Mapper to place ValidationStrategies and MetaDataTransformers in the same package.
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@InvocationOrder(400)
+@UsageInformation({UsageCategory.INTERNAL})
+public class SimpleValidationStrategyToMetaDataTransformerNameMapper extends
+    AbstractValidationStrategyToMetaDataTransformerNameMapper
+{
+    public String createName(ValidationStrategy validationStrategy)
+    {
+        if(validationStrategy.getClass().getPackage() == null)
+        {
+            return null;
+        }
+        return getSimpleMetaDataTransformerName(validationStrategy.getClass().getPackage().getName() + ".",
+                                                validationStrategy.getClass().getSimpleName());
+    }
+
+    public String getSimpleMetaDataTransformerName(String validationStrategyPackageName,
+                                                 String validationStrategyClassName)
+    {
+        String postfix = ExtValContext.getContext().getInformationProviderBean()
+            .get(CustomInformation.META_DATA_TRANSFORMER_POSTFIX);
+
+        if(validationStrategyClassName.endsWith("ValidationStrategy") ||
+           validationStrategyClassName.endsWith("Strategy"))
+        {
+            return validationStrategyPackageName + validationStrategyClassName
+                    .replace(ExtValContext.getContext().getInformationProviderBean()
+                        .get(CustomInformation.VALIDATION_STRATEGY_POSTFIX) ,postfix)
+                    .replace("ValidationStrategy", postfix)
+                    .replace("Strategy", postfix);
+        }
+
+        //in case of a static validation strategy mapping
+        return validationStrategyPackageName + validationStrategyClassName + postfix;
+    }
+
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,75 @@
+/*
+ * 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.metadata.transformer.mapper;
+
+import org.apache.myfaces.extensions.validator.core.mapper.NameMapper;
+import org.apache.myfaces.extensions.validator.core.mapper.SubMapperAwareNameMapper;
+import org.apache.myfaces.extensions.validator.core.Nested;
+import org.apache.myfaces.extensions.validator.core.InvocationOrderComparator;
+import org.apache.myfaces.extensions.validator.core.InvocationOrder;
+import org.apache.myfaces.extensions.validator.core.validation.strategy.ValidationStrategy;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * @author Gerhard Petracek
+ * @since x.x.3
+ */
+@InvocationOrder(100)
+@UsageInformation({UsageCategory.INTERNAL})
+public class ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper
+    extends AbstractValidationStrategyToMetaDataTransformerNameMapper
+    implements SubMapperAwareNameMapper<ValidationStrategy>
+{
+    private List<NameMapper<ValidationStrategy>> subNameMappers = new ArrayList<NameMapper<ValidationStrategy>>();
+
+    public void addNameMapper(NameMapper<ValidationStrategy> nameMapper)
+    {
+        if(!this.subNameMappers.contains(nameMapper) && nameMapper.getClass().isAnnotationPresent(Nested.class))
+        {
+            this.subNameMappers.add(nameMapper);
+            sortSubNameMappers();
+        }
+    }
+
+    private void sortSubNameMappers()
+    {
+        Collections.sort(this.subNameMappers, new InvocationOrderComparator<NameMapper<ValidationStrategy>>());
+    }
+
+    public String createName(ValidationStrategy source)
+    {
+        String result = null;
+
+        for(NameMapper<ValidationStrategy> mapper : this.subNameMappers)
+        {
+            result = mapper.createName(source);
+
+            if(result != null)
+            {
+                return result;
+            }
+        }
+        return result;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,89 @@
+/*
+ * 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.property;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class DefaultPropertyInformation implements PropertyInformation
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    private Map<String, Object> informationMap = new HashMap<String, Object>();
+    private List<MetaDataEntry> metaDataList = new ArrayList<MetaDataEntry>();
+
+    public boolean containsInformation(String key)
+    {
+        return informationMap.containsKey(key);
+    }
+
+    public Object getInformation(String key)
+    {
+        return informationMap.get(key);
+    }
+
+    public <T> T getInformation(String key, Class<T> targetClass)
+    {
+        return (T) getInformation(key);
+    }
+
+    public void setInformation(String key, Object value)
+    {
+        if(this.logger.isTraceEnabled())
+        {
+            this.logger.trace("new information added key: " + key + " value: " + value);
+        }
+
+        informationMap.put(key, value);
+    }
+
+    public MetaDataEntry[] getMetaDataEntries()
+    {
+        return metaDataList.toArray(new MetaDataEntry[metaDataList.size()]);
+    }
+
+    public void addMetaDataEntry(MetaDataEntry metaDataEntry)
+    {
+        metaDataEntry.setProperties(this.informationMap);
+        this.metaDataList.add(metaDataEntry);
+    }
+
+    public void resetMetaDataEntries()
+    {
+        if(this.logger.isTraceEnabled())
+        {
+            this.logger.trace("resetting meta-data entries");
+        }
+
+        this.metaDataList.clear();
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,68 @@
+/*
+ * 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.property;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+public class PropertyDetails
+{
+    //forms the id for cross-validation within complex components
+    private String key;
+    private Object baseObject;
+    private String property;
+
+    public PropertyDetails(String key, Object baseObject, String property)
+    {
+        this.key = key;
+        this.baseObject = baseObject;
+        this.property = property;
+    }
+
+    public String getKey()
+    {
+        return key;
+    }
+
+    public void setKey(String key)
+    {
+        this.key = key;
+    }
+
+    public Object getBaseObject()
+    {
+        return baseObject;
+    }
+
+    public void setBaseObject(Object baseObject)
+    {
+        this.baseObject = baseObject;
+    }
+
+    public String getProperty()
+    {
+        return property;
+    }
+
+    public void setProperty(String property)
+    {
+        this.property = property;
+    }
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformation.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformation.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformation.java Fri Nov 13 02:48:45 2009
@@ -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.core.property;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.API)
+public interface PropertyInformation
+{
+    boolean containsInformation(String key);
+    Object getInformation(String key);
+    <T> T getInformation(String key, Class<T> targetClass);
+    void setInformation(String key, Object value);
+
+    MetaDataEntry[] getMetaDataEntries();
+    void addMetaDataEntry(MetaDataEntry metaDataEntry);
+    void resetMetaDataEntries();
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyInformationKeys.java Fri Nov 13 02:48:45 2009
@@ -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.core.property;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public interface PropertyInformationKeys
+{
+    static final String PROPERTY_DETAILS = "property_details";
+    static final String SKIP_VALIDATION = "skip_validation";
+    static final String LABEL = "label";
+    static final String CUSTOM_PROPERTIES = "custom_properties";
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/recorder/ProcessedInformationRecorder.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/recorder/ProcessedInformationRecorder.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/recorder/ProcessedInformationRecorder.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/recorder/ProcessedInformationRecorder.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,36 @@
+/*
+ * 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.recorder;
+
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+
+import javax.faces.component.UIComponent;
+
+/**
+ * Allows to capture converted values.
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.API)
+public interface ProcessedInformationRecorder
+{
+    void recordUserInput(UIComponent uiComponent, Object value);
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/AbstractRenderKitWrapperFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/AbstractRenderKitWrapperFactory.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/AbstractRenderKitWrapperFactory.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/AbstractRenderKitWrapperFactory.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,105 @@
+/*
+ * 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.renderkit;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.core.factory.ClassMappingFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.render.RenderKit;
+
+/**
+ * Base for all RenderKitWrapperFactories to force a specific behaviour
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.API)
+public abstract class AbstractRenderKitWrapperFactory implements ClassMappingFactory<RenderKit, RenderKit>
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    protected AbstractRenderKitWrapperFactory wrapped;
+    private boolean deactivated = false;
+
+    protected AbstractRenderKitWrapperFactory()
+    {
+        if(logger.isDebugEnabled())
+        {
+            logger.debug(getClass().getName() + " instantiated");
+        }
+    }
+
+    public void addRenderKitWrapperFactory(AbstractRenderKitWrapperFactory renderKitWrapperFactory)
+    {
+        if(logger.isTraceEnabled())
+        {
+            logger.trace(renderKitWrapperFactory.getClass().getName() + " added");
+        }
+
+        if(this.wrapped != null)
+        {
+            this.wrapped.addRenderKitWrapperFactory(renderKitWrapperFactory);
+            return;
+        }
+
+        this.wrapped = renderKitWrapperFactory;
+    }
+
+    public void deactivate()
+    {
+        if(logger.isTraceEnabled())
+        {
+            logger.trace(getClass().getName() + " deactivated");
+        }
+
+        this.deactivated = true;
+    }
+
+    public boolean isDeactivated()
+    {
+        return deactivated;
+    }
+
+    public final RenderKit create(RenderKit renderKit)
+    {
+        if(isDeactivated())
+        {
+            return null;
+        }
+
+        RenderKit result = null;
+
+        if(this.wrapped != null)
+        {
+            result = this.wrapped.create(renderKit);
+        }
+
+        if(result == null)
+        {
+            return createWrapper(renderKit);
+        }
+
+        return result;
+    }
+
+    protected abstract RenderKit createWrapper(RenderKit renderKit);
+}

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/DefaultRenderKitWrapperFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/DefaultRenderKitWrapperFactory.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/DefaultRenderKitWrapperFactory.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/DefaultRenderKitWrapperFactory.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,66 @@
+/*
+ * 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.renderkit;
+
+import org.apache.myfaces.extensions.validator.internal.UsageCategory;
+import org.apache.myfaces.extensions.validator.internal.UsageInformation;
+import org.apache.myfaces.extensions.validator.util.ClassUtils;
+
+import javax.faces.render.RenderKit;
+
+/**
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+public class DefaultRenderKitWrapperFactory extends AbstractRenderKitWrapperFactory
+{
+    private RenderKit renderKit;
+    private static final String GENERIC_RENDER_KIT_WRAPPER_FACTORY =
+            "org.apache.myfaces.extensions.validator.generic.renderkit.GenericRenderKitWrapperFactory";
+    private static Boolean useGenericRenderKitWrapperFactory = null;
+
+    protected RenderKit createWrapper(RenderKit renderKit)
+    {
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("extval renderkit wrapper created for " + renderKit.getClass().getName());
+        }
+
+        //workaround for mojarra (EXTVAL-38)
+        if(useGenericRenderKitWrapperFactory == null)
+        {
+            Class genericFactory = ClassUtils.tryToLoadClassForName(GENERIC_RENDER_KIT_WRAPPER_FACTORY);
+            useGenericRenderKitWrapperFactory = genericFactory != null;
+        }
+
+        if(useGenericRenderKitWrapperFactory)
+        {
+            AbstractRenderKitWrapperFactory renderKitWrapperFactory = (AbstractRenderKitWrapperFactory)ClassUtils
+                    .tryToInstantiateClassForName(GENERIC_RENDER_KIT_WRAPPER_FACTORY);
+            return renderKitWrapperFactory.createWrapper(renderKit);
+        }
+
+        if(this.renderKit == null)
+        {
+            this.renderKit = new ExtValRenderKit(renderKit);
+        }
+        return this.renderKit;
+    }
+}
\ No newline at end of file

Added: myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java?rev=835712&view=auto
==============================================================================
--- myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java (added)
+++ myfaces/extensions/validator/branches/branch_for_jsf_2_0/core/src/main/java/org/apache/myfaces/extensions/validator/core/renderkit/ExtValLazyRendererProxy.java Fri Nov 13 02:48:45 2009
@@ -0,0 +1,141 @@
+/*
+ * 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.renderkit;
+
+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.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.render.Renderer;
+import javax.faces.component.UIComponent;
+import javax.faces.convert.ConverterException;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+
+/**
+ * to support a custom proxy
+ *
+ * @author Gerhard Petracek
+ * @since 1.x.1
+ */
+@UsageInformation(UsageCategory.INTERNAL)
+class ExtValLazyRendererProxy extends Renderer
+{
+    protected final Log logger = LogFactory.getLog(getClass());
+
+    private Renderer wrapped;
+
+    public ExtValLazyRendererProxy(Renderer renderer)
+    {
+        this.wrapped = renderer;
+
+        if(logger.isTraceEnabled())
+        {
+            logger.trace("simple proxy created for " + renderer.getClass().getName());
+        }
+    }
+
+    @Override
+    public void decode(FacesContext facesContext, UIComponent uiComponent)
+    {
+        getLazyRenderer().decode(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeBegin(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeBegin(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeChildren(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeChildren(facesContext, uiComponent);
+    }
+
+    @Override
+    public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
+        throws IOException
+    {
+        getLazyRenderer().encodeEnd(facesContext, uiComponent);
+    }
+
+    @Override
+    public String convertClientId(FacesContext facesContext, String s)
+    {
+        return getLazyRenderer().convertClientId(facesContext, s);
+    }
+
+    @Override
+    public boolean getRendersChildren()
+    {
+        return getLazyRenderer().getRendersChildren();
+    }
+
+    @Override
+    public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object o)
+        throws ConverterException
+    {
+        return getLazyRenderer().getConvertedValue(facesContext, uiComponent, o);
+    }
+
+    private Renderer getLazyRenderer()
+    {
+        String proxyClassName = (String) ExtValContext.getContext().getGlobalProperty(ExtValRendererProxy.KEY);
+
+        if(proxyClassName != null && !proxyClassName.endsWith(getClass().getName()))
+        {
+            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;
+
+            try
+            {
+                Constructor constructor = targetClass.getConstructor(argClasses);
+                return (Renderer)constructor.newInstance(this.wrapped);
+            }
+            catch (Throwable t)
+            {
+                if(logger.isWarnEnabled())
+                {
+                    logger.warn("couldn't create: " + targetClass.getName());
+                }
+
+                return this.wrapped;
+            }
+        }
+        else
+        {
+            return this.wrapped;
+        }
+    }
+
+}
\ No newline at end of file