content: /**
   * Copyright Alex Objelean
   */
  package ro.isdc.wro.http;
  
  import java.util.Properties;
  
  import javax.servlet.FilterConfig;
  
  import ro.isdc.wro.config.factory.PropertyWroConfigurationFactory;
  import ro.isdc.wro.config.jmx.ConfigConstants;
  import ro.isdc.wro.config.jmx.WroConfiguration;
  import ro.isdc.wro.manager.factory.ConfigurableWroManagerFactory;
  import ro.isdc.wro.manager.factory.DefaultWroManagerFactory;
  import ro.isdc.wro.manager.factory.WroManagerFactory;
  import ro.isdc.wro.util.ObjectFactory;
  
  
  /**
   * An extension of {@link WroFilter} which allows configuration by injecting some of the properties. This class can be
   * very useful when using DelegatingFilterProxy (spring extension of Filter) and configuring the fields with values from
   * some properties file which may vary depending on environment.
   *
   * @author Alex Objelean
   */
  public class ConfigurableWroFilter
      extends WroFilter {
    /**
     * Properties to be injected with default values set. These values are deprecated. Prefer setting the "properties"
     * field instead.
     */
    @Deprecated
    private boolean debug = true;
    @Deprecated
    private boolean gzipEnabled = true;
    @Deprecated
    private boolean jmxEnabled = true;
    @Deprecated
    private String mbeanName;
    @Deprecated
    private long cacheUpdatePeriod = 0;
    @Deprecated
    private long modelUpdatePeriod = 0;
    @Deprecated
    private boolean disableCache;
    @Deprecated
    private String encoding;
  
    /**
     * This {@link Properties} object will hold the configurations and it will replace all other fields.
     */
    private Properties properties;
  
    /**
     * {@inheritDoc}
     */
    @Override
    protected ObjectFactory<WroConfiguration> newWroConfigurationFactory(final FilterConfig filterConfig) {
      if (properties == null) {
        // when no
        properties = new Properties();
        properties.setProperty(ConfigConstants.debug.name(), String.valueOf(debug));
        properties.setProperty(ConfigConstants.gzipResources.name(), String.valueOf(gzipEnabled));
        properties.setProperty(ConfigConstants.jmxEnabled.name(), String.valueOf(jmxEnabled));
        properties.setProperty(ConfigConstants.cacheUpdatePeriod.name(), String.valueOf(cacheUpdatePeriod));
        properties.setProperty(ConfigConstants.modelUpdatePeriod.name(), String.valueOf(modelUpdatePeriod));
        properties.setProperty(ConfigConstants.disableCache.name(), String.valueOf(disableCache));
        if (encoding != null) {
          properties.setProperty(ConfigConstants.encoding.name(), encoding);
        }
        if (mbeanName != null) {
          properties.setProperty(ConfigConstants.mbeanName.name(), mbeanName);
        }
      }
      final PropertyWroConfigurationFactory factory = new PropertyWroConfigurationFactory(properties);
      return factory;
    }
  
    /**
     * @param disableCache
     *          the disableCache to set
     */
    public void setDisableCache(final boolean disableCache) {
      this.disableCache = disableCache;
    }
  
    /**
     * {@inheritDoc}
     */
    @Override
    protected String newMBeanName() {
      if (mbeanName != null) {
        return mbeanName;
      }
      return super.newMBeanName();
    }
  
    /**
     * The default implementation of ConfigurableWroFilter should allow setting of pre & post processors in configuration
     * properties. This will work only if no custom {@link WroManagerFactory} is configured.
     */
    @Override
    protected WroManagerFactory newWroManagerFactory() {
      return new DefaultWroManagerFactory(properties) {
        @Override
        protected WroManagerFactory newManagerFactory() {
          return new ConfigurableWroManagerFactory() {
            @Override
            protected Properties newConfigProperties() {
              return properties;
            }
          };
        }
      };
    }
  
    /**
     * @param mbeanName
     *          the mbeanName to set
     */
    public void setMbeanName(final String mbeanName) {
      this.mbeanName = mbeanName;
    }
  
    /**
     * @param jmxEnabled
     *          the jmxEnabled to set
     */
    public void setJmxEnabled(final boolean jmxEnabled) {
      this.jmxEnabled = jmxEnabled;
    }
  
    /**
     * @param debug
     *          the debug to set
     */
    public final void setDebug(final boolean debug) {
      this.debug = debug;
    }
  
    /**
     * @param gzipEnabled
     *          the gzipEnabled to set
     */
    public final void setGzipEnabled(final boolean gzipEnabled) {
      this.gzipEnabled = gzipEnabled;
    }
  
    /**
     * @param cacheUpdatePeriod
     *          the cacheUpdatePeriod to set
     */
    public final void setCacheUpdatePeriod(final long cacheUpdatePeriod) {
      this.cacheUpdatePeriod = cacheUpdatePeriod;
    }
  
    /**
     * @param modelUpdatePeriod
     *          the modelUpdatePeriod to set
     */
    public final void setModelUpdatePeriod(final long modelUpdatePeriod) {
      this.modelUpdatePeriod = modelUpdatePeriod;
    }
  
    /**
     * @param properties
     *          the properties to set
     */
    public void setProperties(final Properties properties) {
      this.properties = properties;
    }
  
    /**
     * @return the encoding
     */
    public String getEncoding() {
      return this.encoding;
    }
  
    /**
     * @param encoding
     *          the encoding to set
     */
    public void setEncoding(final String encoding) {
      this.encoding = encoding;
    }
  }
  