View Javadoc
1   package com.atlassian.plugin.servlet;
2   
3   import com.atlassian.plugin.servlet.util.ServletContextServletModuleManagerAccessor;
4   import org.slf4j.Logger;
5   import org.slf4j.LoggerFactory;
6   
7   import javax.servlet.ServletConfig;
8   import javax.servlet.ServletException;
9   import javax.servlet.UnavailableException;
10  import javax.servlet.http.HttpServlet;
11  import javax.servlet.http.HttpServletRequest;
12  import javax.servlet.http.HttpServletResponse;
13  import java.io.IOException;
14  
15  /**
16   * Applications need to create a concrete subclass of this for use in their webapp.  This servlets responsiblity
17   * is to retrieve the servlet to be used to serve the request from the {@link ServletModuleManager}.  If no servlet
18   * can be found to serve the request, a 404 should be sent back to the client.
19   */
20  public class ServletModuleContainerServlet extends HttpServlet {
21      private static final Logger log = LoggerFactory.getLogger(ServletModuleContainerServlet.class);
22      private ServletConfig servletConfig;
23  
24      public void init(ServletConfig servletConfig) throws ServletException {
25          super.init(servletConfig);
26          this.servletConfig = servletConfig;
27      }
28  
29      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30          if (getServletModuleManager() == null) {
31              log.error("Could not get ServletModuleManager?");
32              response.sendError(500, "Could not get ServletModuleManager.");
33              return;
34          }
35  
36          HttpServlet servlet = getServletModuleManager().getServlet(getPathInfo(request), servletConfig);
37  
38          if (servlet == null) {
39              log.debug("No servlet found for: " + getRequestURI(request));
40              response.sendError(404, "Could not find servlet for: " + getRequestURI(request));
41              return;
42          }
43  
44          try {
45              servlet.service(request, response);
46          } catch (UnavailableException e) // prevent this servlet from unloading itself (PLUG-79)
47          {
48              log.error(e.getMessage(), e);
49              response.sendError(500, e.getMessage());
50          } catch (ServletException e) {
51              log.error(e.getMessage(), e);
52              response.sendError(500, e.getMessage());
53          }
54      }
55  
56      /**
57       * @return the DefaultServletModuleManager from your container framework.  Uses the {@link com.atlassian.plugin.servlet.util.ServletContextServletModuleManagerAccessor}
58       * by default.
59       */
60      protected ServletModuleManager getServletModuleManager() {
61          return ServletContextServletModuleManagerAccessor.getServletModuleManager(getServletContext());
62      }
63  
64      private String getPathInfo(HttpServletRequest request) {
65          String pathInfo = (String) request.getAttribute(RequestAttributes.PATH_INFO);
66          if (pathInfo == null) {
67              pathInfo = request.getPathInfo();
68          }
69          return pathInfo;
70      }
71  
72      private String getRequestURI(HttpServletRequest request) {
73          String requestURI = (String) request.getAttribute(RequestAttributes.REQUEST_URI);
74          if (requestURI == null) {
75              requestURI = request.getRequestURI();
76          }
77          return requestURI;
78      }
79  
80      private static class RequestAttributes {
81          static final String PATH_INFO = "javax.servlet.include.path_info";
82          static final String REQUEST_URI = "javax.servlet.include.request_uri";
83      }
84  }