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