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
17
18
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)
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
58
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 }