View Javadoc

1   package com.atlassian.plugin.servlet.filter;
2   
3   import java.io.IOException;
4   
5   import javax.servlet.Filter;
6   import javax.servlet.FilterChain;
7   import javax.servlet.FilterConfig;
8   import javax.servlet.ServletException;
9   import javax.servlet.ServletRequest;
10  import javax.servlet.ServletResponse;
11  import javax.servlet.http.HttpServletRequest;
12  
13  import com.atlassian.plugin.servlet.PluginHttpRequestWrapper;
14  import com.atlassian.plugin.servlet.descriptors.ServletFilterModuleDescriptor;
15  import com.atlassian.plugin.servlet.util.ClassLoaderStack;
16  
17  /**
18   * We wrap the plugins filter so that we can set some things up before the plugins filter is called. Currently we do 
19   * the following:
20   *      <ul>
21   *        <li>set the Threads classloader to the plugins classloader)</li>
22   *        <li>wrap the request so that path info is right for the filters</li>
23   *      </ul>
24   *      
25   * @since 2.1.0
26   */
27  public class DelegatingPluginFilter implements Filter
28  {
29      private final ServletFilterModuleDescriptor descriptor;
30      private final Filter filter;
31      
32      public DelegatingPluginFilter(ServletFilterModuleDescriptor descriptor)
33      {
34          this.descriptor = descriptor;
35          this.filter = descriptor.getModule();
36      }
37  
38      public void init(FilterConfig filterConfig) throws ServletException
39      {
40          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
41          try
42          {
43              filter.init(filterConfig);
44          }
45          finally
46          {
47              ClassLoaderStack.pop();
48          }
49      }
50  
51      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
52          throws IOException, ServletException
53      {
54          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
55          try
56          {
57              filter.doFilter(new PluginHttpRequestWrapper((HttpServletRequest) request, descriptor), response, chain);
58          }
59          finally
60          {
61              ClassLoaderStack.pop();
62          }
63      }
64      
65      public void destroy()
66      {
67          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
68          try
69          {
70              filter.destroy();
71          }
72          finally
73          {
74              ClassLoaderStack.pop();
75          }
76      }
77  }