// Path: ehcachetag/src/main/java/nl/siegmann/ehcachetag/cachetagmodifier/CacheTagModifierFactory.java
// public interface CacheTagModifierFactory {
// 
// 	/**
// 	 * Called once after application is initialized.
// 	 * 
// 	 * @param servletContext
// 	 */
// 	void init(ServletContext servletContext);
// 
// 	/**
// 	 * The names of the available cacheTagModifiers
// 	 * 
// 	 * @return The names of the available cacheTagModifiers
// 	 */
// 	Collection<String> getCacheTagModifierNames();
// 
// 	/**
// 	 * Gets the cacheTagModifier with the given name, null if not found.
// 	 * 
// 	 * @param cacheTagModifierName name of the CacheTagModifier we're looking for.
// 	 * 
// 	 * @return the CacheTagModifier with the given name, null if not found.
// 	 */
// 	CacheTagModifier getCacheTagModifier(String cacheTagModifierName);
// 
// 	/**
// 	 * Called once on application destroy.
// 	 * 
// 	 */
// 	void destroy();
// }
// 
// Path: ehcachetag/src/main/java/nl/siegmann/ehcachetag/cachetagmodifier/DefaultCacheTagModifierFactory.java
// public class DefaultCacheTagModifierFactory implements CacheTagModifierFactory {
// 
// 	public static final String DEFAULT_CACHETAG_MODIFIER_NAME = "default";
// 	
// 	private static final Logger LOG = LoggerFactory.getLogger(DefaultCacheTagModifierFactory.class);
// 	private Map<String, CacheTagModifier> cacheTagModifiers = new HashMap<String, CacheTagModifier>();
// 	private CacheTagModifier defaultCacheTagModifier;
// 	
// 	public void init(ServletContext servletContext) {
// 
// 		// get the configuration of the cacheKeyMetaFactory
// 		String propertiesString = servletContext.getInitParameter(EHCacheTagConstants.MODIFIER_FACTORY_CONFIG_PARAM);
// 
// 		Map<String, Object> createBeansFromProperties = BeanFactory.createBeansFromProperties(propertiesString);
// 		
// 		for (Map.Entry<String, Object> mapEntry: createBeansFromProperties.entrySet()) {
// 			if (! (mapEntry.getValue() instanceof CacheTagModifier)) {
// 				LOG.error("cacheTagPreProcessor \'" + mapEntry.getKey() + "\' must be an instance of " + CacheTagModifier.class.getName() + " but is of unexpected type " + mapEntry.getValue().getClass().getName());
// 				continue;
// 			}
// 			CacheTagModifier cacheTagPreProcessor = (CacheTagModifier) mapEntry.getValue();
// 			cacheTagPreProcessor.init(servletContext);
// 			
// 			String name = mapEntry.getKey();
// 			if (DEFAULT_CACHETAG_MODIFIER_NAME.equalsIgnoreCase(name)) {
// 				defaultCacheTagModifier = cacheTagPreProcessor;
// 			}
// 			cacheTagModifiers.put(mapEntry.getKey(), cacheTagPreProcessor);
// 		}
// 		if (defaultCacheTagModifier == null) {
// 			defaultCacheTagModifier = CacheTagModifier.NULL_CACHETAG_MODIFIER;
// 		}
// 	}
// 
// 	@Override
// 	public CacheTagModifier getCacheTagModifier(String cacheTagModifierName) {
// 		if (StringUtils.isBlank(cacheTagModifierName) || DEFAULT_CACHETAG_MODIFIER_NAME.equals(cacheTagModifierName)) {
// 			return defaultCacheTagModifier;
// 		}
// 		
// 		return cacheTagModifiers.get(cacheTagModifierName);
// 	}
// 
// 	@Override
// 	public Collection<String> getCacheTagModifierNames() {
// 		return cacheTagModifiers.keySet();
// 	}
// 	
// 	@Override
// 	public void destroy() {
// 		for (CacheTagModifier cacheTagPreProcessor: cacheTagModifiers.values()) {
// 			try {
// 				cacheTagPreProcessor.destroy();
// 			} catch(Exception e) {
// 				LOG.error(e.toString());
// 			}
// 		}
// 	}
// }


import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import net.sf.ehcache.CacheManager;
import nl.siegmann.ehcachetag.cachetagmodifier.CacheTagModifierFactory;
import nl.siegmann.ehcachetag.cachetagmodifier.DefaultCacheTagModifierFactory;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package nl.siegmann.ehcachetag;




public class EHCacheTagServletContextListener implements ServletContextListener {

	private static final Logger LOG = LoggerFactory.getLogger(EHCacheTagServletContextListener.class);
	
	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		
		ServletContext servletContext = servletContextEvent.getServletContext();
		
		// get the class name of the cacheKeyMetaFactory
		String metaFactoryClassName = servletContext.getInitParameter(EHCacheTagConstants.MODIFIER_FACTORY_CLASS_PARAM);

		// create the metaFactory
		CacheTagModifierFactory cacheKeyMetaFactory;
		
		if (StringUtils.isBlank(metaFactoryClassName)) {
			// create Default CacheKeyMetaFactory
			cacheKeyMetaFactory = new DefaultCacheTagModifierFactory();
			try {
// Path: ehcachetag/src/main/java/nl/siegmann/ehcachetag/cachetagmodifier/CacheTagModifierFactory.java
// public interface CacheTagModifierFactory {
// 
// 	/**
// 	 * Called once after application is initialized.
// 	 * 
// 	 * @param servletContext
// 	 */
// 	void init(ServletContext servletContext);
// 
// 	/**
// 	 * The names of the available cacheTagModifiers
// 	 * 
// 	 * @return The names of the available cacheTagModifiers
// 	 */
// 	Collection<String> getCacheTagModifierNames();
// 
// 	/**
// 	 * Gets the cacheTagModifier with the given name, null if not found.
// 	 * 
// 	 * @param cacheTagModifierName name of the CacheTagModifier we're looking for.
// 	 * 
// 	 * @return the CacheTagModifier with the given name, null if not found.
// 	 */
// 	CacheTagModifier getCacheTagModifier(String cacheTagModifierName);
// 
// 	/**
// 	 * Called once on application destroy.
// 	 * 
// 	 */
// 	void destroy();
// }
// 
// Path: ehcachetag/src/main/java/nl/siegmann/ehcachetag/cachetagmodifier/DefaultCacheTagModifierFactory.java
// public class DefaultCacheTagModifierFactory implements CacheTagModifierFactory {
// 
// 	public static final String DEFAULT_CACHETAG_MODIFIER_NAME = "default";
// 	
// 	private static final Logger LOG = LoggerFactory.getLogger(DefaultCacheTagModifierFactory.class);
// 	private Map<String, CacheTagModifier> cacheTagModifiers = new HashMap<String, CacheTagModifier>();
// 	private CacheTagModifier defaultCacheTagModifier;
// 	
// 	public void init(ServletContext servletContext) {
// 
// 		// get the configuration of the cacheKeyMetaFactory
// 		String propertiesString = servletContext.getInitParameter(EHCacheTagConstants.MODIFIER_FACTORY_CONFIG_PARAM);
// 
// 		Map<String, Object> createBeansFromProperties = BeanFactory.createBeansFromProperties(propertiesString);
// 		
// 		for (Map.Entry<String, Object> mapEntry: createBeansFromProperties.entrySet()) {
// 			if (! (mapEntry.getValue() instanceof CacheTagModifier)) {
// 				LOG.error("cacheTagPreProcessor \'" + mapEntry.getKey() + "\' must be an instance of " + CacheTagModifier.class.getName() + " but is of unexpected type " + mapEntry.getValue().getClass().getName());
// 				continue;
// 			}
// 			CacheTagModifier cacheTagPreProcessor = (CacheTagModifier) mapEntry.getValue();
// 			cacheTagPreProcessor.init(servletContext);
// 			
// 			String name = mapEntry.getKey();
// 			if (DEFAULT_CACHETAG_MODIFIER_NAME.equalsIgnoreCase(name)) {
// 				defaultCacheTagModifier = cacheTagPreProcessor;
// 			}
// 			cacheTagModifiers.put(mapEntry.getKey(), cacheTagPreProcessor);
// 		}
// 		if (defaultCacheTagModifier == null) {
// 			defaultCacheTagModifier = CacheTagModifier.NULL_CACHETAG_MODIFIER;
// 		}
// 	}
// 
// 	@Override
// 	public CacheTagModifier getCacheTagModifier(String cacheTagModifierName) {
// 		if (StringUtils.isBlank(cacheTagModifierName) || DEFAULT_CACHETAG_MODIFIER_NAME.equals(cacheTagModifierName)) {
// 			return defaultCacheTagModifier;
// 		}
// 		
// 		return cacheTagModifiers.get(cacheTagModifierName);
// 	}
// 
// 	@Override
// 	public Collection<String> getCacheTagModifierNames() {
// 		return cacheTagModifiers.keySet();
// 	}
// 	
// 	@Override
// 	public void destroy() {
// 		for (CacheTagModifier cacheTagPreProcessor: cacheTagModifiers.values()) {
// 			try {
// 				cacheTagPreProcessor.destroy();
// 			} catch(Exception e) {
// 				LOG.error(e.toString());
// 			}
// 		}
// 	}
// }


// Path: ehcachetag/src/main/java/nl/siegmann/ehcachetag/EHCacheTagServletContextListener.java
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import net.sf.ehcache.CacheManager;
import nl.siegmann.ehcachetag.cachetagmodifier.CacheTagModifierFactory;
import nl.siegmann.ehcachetag.cachetagmodifier.DefaultCacheTagModifierFactory;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

package nl.siegmann.ehcachetag;




public class EHCacheTagServletContextListener implements ServletContextListener {

	private static final Logger LOG = LoggerFactory.getLogger(EHCacheTagServletContextListener.class);
	
	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		
		ServletContext servletContext = servletContextEvent.getServletContext();
		
		// get the class name of the cacheKeyMetaFactory
		String metaFactoryClassName = servletContext.getInitParameter(EHCacheTagConstants.MODIFIER_FACTORY_CLASS_PARAM);

		// create the metaFactory
		CacheTagModifierFactory cacheKeyMetaFactory;
		
		if (StringUtils.isBlank(metaFactoryClassName)) {
			// create Default CacheKeyMetaFactory
			cacheKeyMetaFactory = new DefaultCacheTagModifierFactory();
			try {
				cacheKeyMetaFactory.init(servletContext);