content: /*
   * Copyright (C) 2011.
   * All rights reserved.
   */
  package ro.isdc.wro.config.factory;
  
  import java.io.InputStream;
  import java.util.Properties;
  
  import javax.servlet.ServletContext;
  
  import org.apache.commons.io.IOUtils;
  import org.apache.commons.lang3.Validate;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import ro.isdc.wro.config.jmx.WroConfiguration;
  import ro.isdc.wro.util.ObjectFactory;
  
  
  /**
   * Load {@link WroConfiguration} from a servletContext relative location. By default loads properties file from (
   * <code>/WEB-INF/wro.properties</code>) location.
   * 
   * @author Alex Objelean
   * @created 7 May 2012
   * @since 1.4.6
   */
  public class ServletContextPropertyWroConfigurationFactory
      implements ObjectFactory<WroConfiguration> {
    private static final Logger LOG = LoggerFactory.getLogger(ServletContextPropertyWroConfigurationFactory.class);
    /**
     * The default name of the properties file holding wro configurations.
     */
    private static final String DEFAULT_PROPERTIES_FILE_NAME = "/WEB-INF/wro.properties";
    private ServletContext servletContext;
  
    public ServletContextPropertyWroConfigurationFactory(final ServletContext servletContext) {
      Validate.notNull(servletContext);
      this.servletContext = servletContext;
    }
  
    /**
     * @return default path to configuration file relative to {@link ServletContext} location.
     */
    protected String getConfigPath() {
      return DEFAULT_PROPERTIES_FILE_NAME;
    }
    
    /**
     * {@inheritDoc}
     */
    public final WroConfiguration create() {
      return new PropertyWroConfigurationFactory(createProperties()).create();
    }
    
    /**
     * @return {@link Properties} loaded from the stream from servletContext location specified by
     *         {@link ServletContextPropertyWroConfigurationFactory#getConfigPath()} method.
     */
    public Properties createProperties() {
      // Merge Properties file content with the filterConfig content.
      final Properties props = new Properties();
      InputStream propertyStream = null;
      try {
        LOG.debug("loading config resource from: {}", getConfigPath());
        propertyStream = servletContext.getResourceAsStream(getConfigPath());
        Validate.notNull(propertyStream);
        props.load(propertyStream);
      } catch (final Exception e) {
        LOG.error("[FAIL] Cannot read properties file stream from default location: {}. Using default configuration.", getConfigPath());
      } finally {
        IOUtils.closeQuietly(propertyStream);
      }
      return props;
    }
  }
  