Package org.springmodules.validation.bean.conf.loader.xml

Source Code of org.springmodules.validation.bean.conf.loader.xml.AbstractResourceBasedBeanValidationConfigurationLoader

/*
* Copyright 2004-2005 the original author or authors.
*
* Licensed 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.springmodules.validation.bean.conf.loader.xml;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.ClassUtils;
import org.springmodules.validation.bean.conf.BeanValidationConfiguration;
import org.springmodules.validation.bean.conf.loader.BeanValidationConfigurationLoader;

/**
* A base class for all bean validation configuration loaders that are resource based (that is, load configuration from
* files, urls, etc...)
*
* @author Uri Boness
*/
public abstract class AbstractResourceBasedBeanValidationConfigurationLoader
    implements BeanValidationConfigurationLoader, InitializingBean {

    private final static Log logger = LogFactory.getLog(AbstractResourceBasedBeanValidationConfigurationLoader.class);

    private final static String DEFAULT_RESOURCE_EXTENTION = ".vld.xml";

    private Map configurationByClass;

    private Resource[] resources;

    /**
     * Constructs a new AbstractResourceBasedBeanValidationConfigurationLoader.
     */
    public AbstractResourceBasedBeanValidationConfigurationLoader() {
        this(new Resource[0]);
    }

    /**
     * Constructs a new AbstractResourceBasedBeanValidationConfigurationLoader with the given resources.
     *
     * @param resources The resources from which this loader will load the bean validation configurations.
     */
    public AbstractResourceBasedBeanValidationConfigurationLoader(Resource[] resources) {
        this.resources = resources;
        configurationByClass = new HashMap();
    }

    /**
     * Loads the bean validation configuration for the given class from the configured resources.
     *
     * @see org.springmodules.validation.bean.conf.loader.BeanValidationConfigurationLoader#loadConfiguration(Class)
     */
    public final BeanValidationConfiguration loadConfiguration(Class clazz) {
        BeanValidationConfiguration configuration = (BeanValidationConfiguration) configurationByClass.get(clazz);
        if (configuration != null) {
            return configuration;
        }
        return loadDefaultConfiguration(clazz);
    }

    /**
     * Determines whether the given class is supported by this loader.
     *
     * @see BeanValidationConfigurationLoader#supports(Class)
     */
    public final boolean supports(Class clazz) {
        return configurationByClass.get(clazz) != null;
    }

    /**
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    public void afterPropertiesSet() throws Exception {
        for (int i = 0; i < resources.length; i++) {
            Map configurations = loadConfigurations(resources[i]);
            configurationByClass.putAll(configurations);
        }
    }

    /**
     * Loads all the bean validation configurations from the given resource and returns them as a map where the
     * value is a {@link BeanValidationConfiguration} instance and the key is the associated class.
     *
     * @param resource The resource from which the configurations will be loaded.
     * @return A map of bean validation configuration by the associated class.
     */
    protected abstract Map loadConfigurations(Resource resource);

    //=============================================== Setter/Getter ====================================================

    /**
     * Returns the resouces this loader uses to load bean validation configurations.
     *
     * @return The resouces this loader uses to load bean validation configurations.
     */
    public Resource[] getResources() {
        return resources;
    }

    /**
     * Sets the resources this loader will use to load bean validation configurations.
     *
     * @param resources The resources this loader will use to load bean validation configurations.
     */
    public void setResources(Resource[] resources) {
        this.resources = resources;
    }

    /**
     * If this loader is configured with only on resource, use this method to retreive it.
     *
     * @return The single resource this loader uses to load bean validation configuration from. If the loader uses
     *         multiple resources, the first one is returned.
     */
    public Resource getResource() {
        return (resources[0] != null) ? resources[0] : null;
    }

    /**
     * Sets a single resource this loader will use to load the bean validation configurations from.
     *
     * @param resource The one resource this loader will use to load the bean validation configurations from.
     */
    public void setResource(Resource resource) {
        setResources(new Resource[]{resource});
    }

    //=============================================== Helper Methods ===================================================

    /**
     * Loads the default validation configuration for the given class, caches it and returns it. The configuration
     * resource for the given class is resolved by the {@link #createDefaultConfigurationFileName(Class)} method.
     *
     * @param clazz The class for which the default configuration should be loaded.
     * @return The default validation configuration of the given class.
     */
    protected BeanValidationConfiguration loadDefaultConfiguration(Class clazz) {
        String fileName = createDefaultConfigurationFileName(clazz);
        Resource resource = new ClassPathResource(fileName, clazz);
        if (resource.exists()) {
            Map configurationByClass = loadConfigurations(resource);
            this.configurationByClass.putAll(configurationByClass);
            return (BeanValidationConfiguration) configurationByClass.get(clazz);
        }
        logger.warn("Could not find the default validation configuration for class '" + clazz.getName() + "'");
        this.configurationByClass.put(clazz, null);
        return null;
    }

    /**
     * Creates the default configuration file name for the given class. This method will search in the classpath for
     * a file that is located where the class itself is located, named after the class, and has the extention of
     * ".vld.xml". For example, the default configuration file name for class
     * <code>Person</code> will be <code>Person.vld.xml</code>.
     *
     * @param clazz The class for which the default configuration will be created.
     * @return The default validatoin configuration resource for the given class.
     */
    protected String createDefaultConfigurationFileName(Class clazz) {
        return ClassUtils.getShortName(clazz) + DEFAULT_RESOURCE_EXTENTION;
    }

}
TOP

Related Classes of org.springmodules.validation.bean.conf.loader.xml.AbstractResourceBasedBeanValidationConfigurationLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.