View Javadoc

1   package com.atlassian.gzipfilter.selector;
2   
3   import org.tuckey.web.filters.urlrewrite.Conf;
4   import org.tuckey.web.filters.urlrewrite.UrlRewriter;
5   
6   import javax.servlet.FilterConfig;
7   import javax.servlet.http.HttpServletRequest;
8   import java.io.InputStream;
9   
10  import com.atlassian.gzipfilter.util.IOUtils;
11  
12  /**
13   * This factory will parse the urlrewrite config file, and use that to select whether to gzip or not.
14   * It will load the filter init param <code>urlrewrite.configfile</code> for the file to load rules from.  If this
15   * is not specified (or does not exist), look up <code>/WEB-INF/urlrewrite-gzip.xml</code>.  If this is not available
16   * then use the default config file (shipped with atlassian-gzipfilter)
17   * <code>com/atlassian/gzipfilter/urlrewrite-gzip-default.xml</code>.
18   */
19  public class DefaultGzipCompatibilitySelectorFactory implements GzipCompatibilitySelectorFactory
20  {
21      private static final String DEFAULT_CONFIG_FILENAME = "/WEB-INF/urlrewrite-gzip.xml";
22      private static final String INTERNAL_CONFIG_FILE = "com/atlassian/gzipfilter/urlrewrite-gzip-default.xml";
23      private static final String CONFIG_FILE_INIT_PARAM = "urlrewrite.configfile";
24      private UrlRewriter rewriter;
25  
26      public GzipCompatibilitySelector getSelector(final FilterConfig filterConfig, final HttpServletRequest request)
27      {
28          if (rewriter == null)
29              rewriter = getUrlRewriter(filterConfig);
30  
31          return new UrlRewriteGzipCompatibilitySelector(rewriter, request);
32      }
33  
34      private UrlRewriter getUrlRewriter(FilterConfig filterConfig)
35      {
36          String configFileName = filterConfig.getServletContext().getInitParameter(CONFIG_FILE_INIT_PARAM);
37          if (configFileName == null)
38          {
39              configFileName = DEFAULT_CONFIG_FILENAME;
40          }
41          InputStream is = null;
42          try
43          {
44              is = filterConfig.getServletContext().getResourceAsStream(configFileName);
45  
46              if (is == null)
47              { // load the default configuration
48                  is = getClass().getClassLoader().getResourceAsStream(INTERNAL_CONFIG_FILE);
49              }
50  
51              if (is == null)
52              { // load the default configuration using another classloader
53                  is = Thread.currentThread().getContextClassLoader().getResourceAsStream(INTERNAL_CONFIG_FILE);
54              }
55  
56              if (is == null)
57              {
58                  throw new IllegalStateException("Cannot load default '" + INTERNAL_CONFIG_FILE + "' configuration from jar");
59              }
60  
61              Conf conf = new Conf(filterConfig.getServletContext(), is, null, null);
62              return new UrlRewriter(conf);
63          }
64          finally
65          {
66              IOUtils.closeQuietly(is);
67          }
68      }
69  }