View Javadoc
1   package com.atlassian.plugin.servlet;
2   
3   import com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor;
4   import com.atlassian.plugin.util.ClassLoaderStack;
5   
6   import javax.servlet.ServletConfig;
7   import javax.servlet.ServletContext;
8   import javax.servlet.ServletException;
9   import javax.servlet.http.HttpServlet;
10  import javax.servlet.http.HttpServletRequest;
11  import javax.servlet.http.HttpServletResponse;
12  import java.io.IOException;
13  import java.util.Enumeration;
14  
15  /**
16   * We are wrapping the plugins servlet in another servlet so that we can set some things up before
17   * the plugins servlet is called. Currently we do the following:
18   * <ul>
19   * <li>the Threads classloader to the plugins classloader)</li>
20   * <li>wrap the request so that path info is right for the servlets</li>
21   * </ul>
22   */
23  public class DelegatingPluginServlet extends HttpServlet {
24      private final ServletModuleDescriptor descriptor;
25  
26      private final HttpServlet servlet;
27  
28      public DelegatingPluginServlet(final ServletModuleDescriptor descriptor) {
29          this.descriptor = descriptor;
30          servlet = descriptor.getModule();
31      }
32  
33      @Override
34      public void service(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException {
35          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
36          try {
37              servlet.service(new PluginHttpRequestWrapper(req, descriptor), res);
38          } finally {
39              ClassLoaderStack.pop();
40          }
41      }
42  
43      @Override
44      public void init(final ServletConfig config) throws ServletException {
45          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
46          try {
47              servlet.init(config);
48          } finally {
49              ClassLoaderStack.pop();
50          }
51      }
52  
53      @Override
54      public void destroy() {
55          ClassLoaderStack.push(descriptor.getPlugin().getClassLoader());
56          try {
57              servlet.destroy();
58          } finally {
59              ClassLoaderStack.pop();
60          }
61      }
62  
63      @Override
64      public boolean equals(final Object obj) {
65          return servlet.equals(obj);
66      }
67  
68      @Override
69      public String getInitParameter(final String name) {
70          return servlet.getInitParameter(name);
71      }
72  
73      @Override
74      public Enumeration<String> getInitParameterNames() {
75          @SuppressWarnings("unchecked")
76          final Enumeration<String> initParameterNames = servlet.getInitParameterNames();
77          return initParameterNames;
78      }
79  
80      @Override
81      public ServletConfig getServletConfig() {
82          return servlet.getServletConfig();
83      }
84  
85      @Override
86      public ServletContext getServletContext() {
87          return servlet.getServletContext();
88      }
89  
90      @Override
91      public String getServletInfo() {
92          return servlet.getServletInfo();
93      }
94  
95      @Override
96      public String getServletName() {
97          return servlet.getServletName();
98      }
99  
100     @Override
101     public int hashCode() {
102         return servlet.hashCode();
103     }
104 
105     @Override
106     public void init() throws ServletException {
107         servlet.init();
108     }
109 
110     @Override
111     public void log(final String message, final Throwable t) {
112         servlet.log(message, t);
113     }
114 
115     @Override
116     public void log(final String msg) {
117         servlet.log(msg);
118     }
119 
120     @Override
121     public String toString() {
122         return servlet.toString();
123     }
124 
125     public ServletModuleDescriptor getModuleDescriptor() {
126         return descriptor;
127     }
128 
129     HttpServlet getDelegatingServlet() {
130         return servlet;
131     }
132 }