View Javadoc

1   package com.atlassian.plugin.servlet;
2   
3   import java.io.IOException;
4   
5   import javax.servlet.ServletConfig;
6   import javax.servlet.ServletException;
7   import javax.servlet.UnavailableException;
8   import javax.servlet.http.HttpServlet;
9   import javax.servlet.http.HttpServletRequest;
10  import javax.servlet.http.HttpServletResponse;
11  
12  import com.atlassian.plugin.servlet.util.ServletContextServletModuleManagerAccessor;
13  import org.slf4j.Logger;
14  import org.slf4j.LoggerFactory;
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  {
23      private static final Logger log = LoggerFactory.getLogger(ServletModuleContainerServlet.class);
24      private ServletConfig servletConfig;
25  
26      public void init(ServletConfig servletConfig) throws ServletException
27      {
28          super.init(servletConfig);
29          this.servletConfig = servletConfig;
30      }
31  
32      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
33      {
34          if (getServletModuleManager() == null)
35          {
36              log.error("Could not get ServletModuleManager?");
37              response.sendError(500, "Could not get ServletModuleManager.");
38              return;
39          }
40  
41          HttpServlet servlet = getServletModuleManager().getServlet(getPathInfo(request), servletConfig);
42  
43          if (servlet == null)
44          {
45              log.debug("No servlet found for: " + getRequestURI(request));
46              response.sendError(404, "Could not find servlet for: " + getRequestURI(request));
47              return;
48          }
49  
50          try
51          {
52              servlet.service(request, response);
53          }
54          catch (UnavailableException e) // prevent this servlet from unloading itself (PLUG-79)
55          {
56              log.error(e.getMessage(), e);
57              response.sendError(500, e.getMessage());
58          }
59          catch (ServletException e)
60          {
61              log.error(e.getMessage(), e);
62              response.sendError(500, e.getMessage());
63          }
64      }
65  
66      /**
67       * @return the DefaultServletModuleManager from your container framework.  Uses the {@link com.atlassian.plugin.servlet.util.ServletContextServletModuleManagerAccessor}
68       * by default.
69       */
70      protected ServletModuleManager getServletModuleManager()
71      {
72          return ServletContextServletModuleManagerAccessor.getServletModuleManager(getServletContext());
73      }
74  
75      private String getPathInfo(HttpServletRequest request)
76      {
77          String pathInfo = (String) request.getAttribute(RequestAttributes.PATH_INFO);
78          if (pathInfo == null)
79          {
80              pathInfo = request.getPathInfo();
81          }
82          return pathInfo;
83      }
84  
85      private String getRequestURI(HttpServletRequest request)
86      {
87          String requestURI = (String) request.getAttribute(RequestAttributes.REQUEST_URI);
88          if (requestURI == null)
89          {
90              requestURI = request.getRequestURI();
91          }
92          return requestURI;
93      }
94  
95      private static class RequestAttributes
96      {
97          static final String PATH_INFO = "javax.servlet.include.path_info";
98          static final String REQUEST_URI = "javax.servlet.include.request_uri";
99      }
100 }