All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opensymphony.module.sitemesh.factory.BaseFactory Maven / Gradle / Ivy

/*
 * Title:        BaseFactory
 * Description:
 *
 * This software is published under the terms of the OpenSymphony Software
 * License version 1.1, of which a copy has been included with this
 * distribution in the LICENSE.txt file.
 */

package com.opensymphony.module.sitemesh.factory;

import com.opensymphony.module.sitemesh.Config;
import com.opensymphony.module.sitemesh.DecoratorMapper;
import com.opensymphony.module.sitemesh.Factory;
import com.opensymphony.module.sitemesh.PageParser;
import com.opensymphony.module.sitemesh.util.ClassLoaderUtil;
import com.opensymphony.module.sitemesh.mapper.PathMapper;

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

/**
 * Base Factory implementation. Provides utility methods for implementation.
 *
 * @author Joe Walnes
 * @version $Revision: 1.9 $
 */
public abstract class BaseFactory extends Factory {
    /** ServletConfig or FilterConfig. */
    protected Config config = null;

    /**
     * Instance of {@link com.opensymphony.module.sitemesh.DecoratorMapper}.
     * Because it is thread-safe, it can be shared by multiple clients. This
     * is only the last DecoratorMapper in the chain, and all parents will be
     * automatically delegated to it.
     */
    protected DecoratorMapper decoratorMapper = null;

    /** Map that associates content-types with PageParser instances. */
    protected Map pageParsers = null;

    /** A map of paths that are excluded from decoration */
    protected PathMapper excludeUrls = null;

    /**
     * Constructor for default implementation of Factory.
     * Should never be called by client. Singleton instance should be
     * obtained instead.
     *
     * @see #getInstance(com.opensymphony.module.sitemesh.Config config)
     */
    protected BaseFactory(Config config) {
        this.config = config;
        clearDecoratorMappers();
        clearParserMappings();
        clearExcludeUrls();
    }

    /** Return instance of DecoratorMapper. */
    public DecoratorMapper getDecoratorMapper() {
        return decoratorMapper;
    }

    /**
     * Create a PageParser suitable for the given content-type.
     *
     * 

For example, if the supplied parameter is text/html * a parser shall be returned that can parse HTML accordingly. Returns * null if no parser can be found for the supplied content type.

* * @param contentType The MIME content-type of the data to be parsed * @return Appropriate PageParser for reading data, or * null if no suitable parser was found. */ public PageParser getPageParser(String contentType) { return (PageParser) pageParsers.get(contentType); } /** * Determine whether a Page of given content-type should be parsed or not. */ public boolean shouldParsePage(String contentType) { return pageParsers.containsKey(contentType); } /** * Returns true if the supplied path matches one of the exclude * URLs specified in sitemesh.xml, otherwise returns false. * @param path * @return whether the path is excluded */ public boolean isPathExcluded(String path) { return excludeUrls.get(path) != null; } /** * Clear all current DecoratorMappers. */ protected void clearDecoratorMappers() { decoratorMapper = null; } /** Push new DecoratorMapper onto end of chain. */ protected void pushDecoratorMapper(String className, Properties properties) { try { Class decoratorMapperClass = ClassLoaderUtil.loadClass(className, getClass()); DecoratorMapper newMapper = getDecoratorMapper(decoratorMapperClass); newMapper.init(config, properties, decoratorMapper); decoratorMapper = newMapper; } catch (ClassNotFoundException e) { throw new FactoryException("Could not load DecoratorMapper class : " + className, e); } catch (Exception e) { throw new FactoryException("Could not initialize DecoratorMapper : " + className, e); } } protected DecoratorMapper getDecoratorMapper(Class decoratorMapperClass) throws InstantiationException, IllegalAccessException { return (DecoratorMapper) decoratorMapperClass.newInstance(); } /** Clear all PageParser mappings. */ protected void clearParserMappings() { pageParsers = new HashMap(); } /** * Map new PageParser to given content-type. contentType = null signifies default * PageParser for unknown content-types. */ protected void mapParser(String contentType, String className) { if (className.endsWith(".DefaultPageParser")) { return; // Backwards compatability - this can safely be ignored. } try { PageParser pp = (PageParser) ClassLoaderUtil.loadClass(className, getClass()).newInstance(); // Store the parser even if the content type is NULL. [This // is most probably the legacy default page parser which // we no longer have a use for] pageParsers.put(contentType, pp); } catch (ClassNotFoundException e) { throw new FactoryException("Could not load PageParser class : " + className, e); } catch (Exception e) { throw new FactoryException("Could not instantiate PageParser : " + className, e); } } protected void addExcludeUrl(String path) { excludeUrls.put("", path); } /** * Clears all exclude URLs. */ protected void clearExcludeUrls() { excludeUrls = new PathMapper(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy