diff options
author | Raymond Auge | 2016-04-12 03:27:12 +0000 |
---|---|---|
committer | Raymond Auge | 2016-04-12 15:33:16 +0000 |
commit | 0d5a1a04a5679853ed95fa8e097c578791add100 (patch) | |
tree | 7aa99b0432e56f2f8a5ce26507ff18f6f48f4602 | |
parent | be3041a6f69e1780d35e13380f5d1191b16263ef (diff) | |
download | rt.equinox.bundles-0d5a1a04a5679853ed95fa8e097c578791add100.tar.gz rt.equinox.bundles-0d5a1a04a5679853ed95fa8e097c578791add100.tar.xz rt.equinox.bundles-0d5a1a04a5679853ed95fa8e097c578791add100.zip |
Bug 476069 - [http servlet] various dispatching fixes including named, error handling
5 files changed, 454 insertions, 943 deletions
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java index 99c17f05e..d9b8194d6 100644 --- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java +++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java @@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.equinox.http.servlet.testbase.BaseTest; import org.eclipse.equinox.http.servlet.tests.util.BaseServlet; +import org.eclipse.equinox.http.servlet.tests.util.DispatchResultServlet; import org.junit.Assert; import org.junit.Test; import org.osgi.service.http.HttpContext; @@ -55,39 +56,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a"); @@ -101,11 +69,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); + Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); } @Test @@ -120,39 +88,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -182,7 +117,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -193,7 +128,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); + Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); Assert.assertTrue(filter.getCalled()); } @@ -205,41 +140,8 @@ public class DispatchingTest extends BaseTest { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.getRequestDispatcher("/s2/b?u=5").forward(request, response); - } - }; - - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); + request.getRequestDispatcher("/s2/i4?u=5").forward(request, response); } - }; TestFilter filter = new TestFilter() { @@ -271,7 +173,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -282,7 +184,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("b/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1b", response); + Assert.assertEquals("b/a|/i4|u=5|/a/s2/i4|/s2|/a|/d|p=1|/a/s1/d|/s1b", response); Assert.assertEquals(2, filter.getCount()); } @@ -308,39 +210,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet3 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1"); @@ -359,11 +228,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet3, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("c1/s1/i1?p1=1"); - Assert.assertEquals("/c1|/i3|p3=3&p2=2&p1=1|/c1/s3/i3|/s3|/c1|/i1|p1=1|/c1/s1/i1|/s1", response); + Assert.assertEquals("/c1|/i3|p3=3|/c1/s3/i3|/s3|/c1|/i1|p1=1|/c1/s1/i1|/s1", response); } @Test @@ -398,39 +267,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet4 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1"); @@ -454,11 +290,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s4/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet4, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("c1/s1/i1?p1=1"); - Assert.assertEquals("/c1|/i4|p4=4&p3=3&p2=2&p1=1|/c1/s4/i4|/s4|/c1|/i1|p1=1|/c1/s1/i1|/s1", response); + Assert.assertEquals("/c1|/i4|p4=4|/c1/s4/i4|/s4|/c1|/i1|p1=1|/c1/s1/i1|/s1", response); } @Test @@ -487,7 +323,7 @@ public class DispatchingTest extends BaseTest { throws ServletException, IOException { PrintWriter writer = resp.getWriter(); - writer.write(req.getQueryString()); + writer.write(String.valueOf(req.getQueryString())); writer.write("|"); writer.write(String.valueOf(req.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); writer.write("|"); @@ -536,37 +372,6 @@ public class DispatchingTest extends BaseTest { requestDispatcher.forward(req, resp); } }; - Servlet sB = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void doGet( - HttpServletRequest request, HttpServletResponse resp) - throws ServletException, IOException { - - PrintWriter writer = resp.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(String.valueOf(request.getPathInfo())); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(String.valueOf(request.getRequestURI())); - writer.write("|"); - writer.write(String.valueOf(request.getServletPath())); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - }; Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); @@ -583,11 +388,11 @@ public class DispatchingTest extends BaseTest { props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); - registrations.add(getBundleContext().registerService(Servlet.class, sB, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String result = requestAdvisor.request("c1/s1/a?p=1&p=2"); - Assert.assertEquals("/c1|/c1/s1/a|p=1&p=2|/c1/s1/a||null|null|null|null|null", result); + Assert.assertEquals("/c1|/a|p=1&p=2|/c1/s1/a|/s1|null|null|null|null|null", result); } @Test @@ -636,7 +441,7 @@ public class DispatchingTest extends BaseTest { String result = requestAdvisor.request("Servlet13A/a?p=1&p=2"); - Assert.assertEquals("p=3&p=4&p=1&p=2|p=1&p=2|3|[3, 4, 1, 2]", result); + Assert.assertEquals("p=3&p=4|p=1&p=2|3|[3, 4, 1, 2]", result); } @Test @@ -651,39 +456,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a"); @@ -697,11 +469,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); + Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); } @Test @@ -716,39 +488,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -778,7 +517,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -789,7 +528,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); + Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response); Assert.assertTrue(filter.getCalled()); } @@ -805,39 +544,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -867,7 +573,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -878,7 +584,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("b/a|/b|u=5&p=1|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1b", response); + Assert.assertEquals("b/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1b", response); Assert.assertEquals(2, filter.getCount()); } @@ -933,39 +639,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a"); @@ -979,11 +652,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response); + Assert.assertEquals("/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response); } @Test @@ -998,39 +671,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -1060,7 +700,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -1071,7 +711,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("b/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response); + Assert.assertEquals("b/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response); Assert.assertTrue(filter.getCalled()); } @@ -1087,39 +727,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -1149,7 +756,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -1160,7 +767,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("bb/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response); + Assert.assertEquals("bb/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response); Assert.assertEquals(2, filter.getCount()); } @@ -1186,39 +793,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet3 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1"); @@ -1237,11 +811,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet3, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("c1/s1/i1?p1=1"); - Assert.assertEquals("/c1|/i1|p3=3&p2=2&p1=1|/c1/s1/i1|/s1|/c1|/i3|p3=3|/c1/s3/i3|/s3", response); + Assert.assertEquals("/c1|/i1|p1=1|/c1/s1/i1|/s1|/c1|/i3|p3=3|/c1/s3/i3|/s3", response); } @Test @@ -1276,39 +850,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet4 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - PrintWriter writer = response.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1"); @@ -1332,11 +873,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s4/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet4, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("c1/s1/i1?p1=1"); - Assert.assertEquals("/c1|/i1|p4=4&p3=3&p2=2&p1=1|/c1/s1/i1|/s1|/c1|/i4|p4=4|/c1/s4/i4|/s4", response); + Assert.assertEquals("/c1|/i1|p1=1|/c1/s1/i1|/s1|/c1|/i4|p4=4|/c1/s4/i4|/s4", response); } @Test @@ -1414,37 +955,6 @@ public class DispatchingTest extends BaseTest { requestDispatcher.include(req, resp); } }; - Servlet sB = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void doGet( - HttpServletRequest request, HttpServletResponse resp) - throws ServletException, IOException { - - PrintWriter writer = resp.getWriter(); - - writer.write(request.getContextPath()); - writer.write("|"); - writer.write(request.getPathInfo()); - writer.write("|"); - writer.write(request.getQueryString()); - writer.write("|"); - writer.write(request.getRequestURI()); - writer.write("|"); - writer.write(request.getServletPath()); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - writer.write("|"); - writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - }; Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1"); @@ -1461,11 +971,11 @@ public class DispatchingTest extends BaseTest { props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); - registrations.add(getBundleContext().registerService(Servlet.class, sB, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String result = requestAdvisor.request("c1/s1/a?p=1&p=2"); - Assert.assertEquals("/c1|/c1/s1/a|p=1&p=2|/c1/s1/a||null|null|null|null|null", result); + Assert.assertEquals("/c1|/a|p=1&p=2|/c1/s1/a|/s1|null|null|null|null|null", result); } @Test @@ -1514,7 +1024,7 @@ public class DispatchingTest extends BaseTest { String result = requestAdvisor.request("Servlet13A/a?p=1&p=2"); - Assert.assertEquals("p=3&p=4&p=1&p=2|p=3&p=4|3|[3, 4, 1, 2]", result); + Assert.assertEquals("p=1&p=2|p=3&p=4|3|[3, 4, 1, 2]", result); } @Test @@ -1529,39 +1039,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - Dictionary<String, Object> props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a"); @@ -1575,11 +1052,11 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response); + Assert.assertEquals("/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response); } @Test @@ -1594,39 +1071,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -1656,7 +1100,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -1667,7 +1111,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("b/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response); + Assert.assertEquals("b/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response); Assert.assertTrue(filter.getCalled()); } @@ -1683,39 +1127,6 @@ public class DispatchingTest extends BaseTest { } }; - Servlet servlet2 = new HttpServlet() { - private static final long serialVersionUID = 1L; - - @Override - protected void service( - HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - - ServletOutputStream outputStream = response.getOutputStream(); - - write(outputStream, request.getContextPath()); - write(outputStream, "|"); - write(outputStream, request.getPathInfo()); - write(outputStream, "|"); - write(outputStream, request.getQueryString()); - write(outputStream, "|"); - write(outputStream, request.getRequestURI()); - write(outputStream, "|"); - write(outputStream, request.getServletPath()); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); - write(outputStream, "|"); - write(outputStream, String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); - } - - }; - TestFilter filter = new TestFilter() { @Override @@ -1745,7 +1156,7 @@ public class DispatchingTest extends BaseTest { props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*"); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); - registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props)); + registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props)); props = new Hashtable<String, Object>(); props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)"); @@ -1756,7 +1167,7 @@ public class DispatchingTest extends BaseTest { String response = requestAdvisor.request("a/s1/d?p=1"); - Assert.assertEquals("bb/a|/d|u=5&p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response); + Assert.assertEquals("bb/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response); Assert.assertEquals(2, filter.getCount()); } diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/util/DispatchResultServlet.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/util/DispatchResultServlet.java new file mode 100644 index 000000000..20cc56668 --- /dev/null +++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/util/DispatchResultServlet.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2016 Raymond Augé and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Raymond Augé <raymond.auge@liferay.com> - initial implementation + *******************************************************************************/ +package org.eclipse.equinox.http.servlet.tests.util; + +import java.io.IOException; +import java.io.StringWriter; + +import javax.servlet.DispatcherType; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DispatchResultServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + @Override + protected void service( + HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + StringWriter writer = new StringWriter(); + + writer.write(request.getContextPath()); + writer.write("|"); + writer.write(request.getPathInfo()); + writer.write("|"); + writer.write(request.getQueryString()); + writer.write("|"); + writer.write(request.getRequestURI()); + writer.write("|"); + writer.write(request.getServletPath()); + writer.write("|"); + + if (request.getDispatcherType() == DispatcherType.INCLUDE) { + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH))); + } + else if (request.getDispatcherType() == DispatcherType.FORWARD) { + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_PATH_INFO))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI))); + writer.write("|"); + writer.write(String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH))); + } + + try { + response.getWriter().write(writer.toString()); + } + catch (IllegalStateException ise) { + response.getOutputStream().write(writer.toString().getBytes("UTF8")); + } + + } + +} diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java index 0b69b37d8..3fc8e1ec3 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java @@ -11,12 +11,10 @@ package org.eclipse.equinox.http.servlet.internal.context; -import java.io.IOException; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.URLDecoder; import java.util.*; -import javax.servlet.DispatcherType; -import javax.servlet.ServletException; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.equinox.http.servlet.internal.registration.EndpointRegistration; @@ -52,25 +50,65 @@ public class DispatchTargets { this.matchingFilterRegistrations = matchingFilterRegistrations; this.servletName = servletName; this.requestURI = requestURI; - this.servletPath = servletPath; + this.servletPath = (servletPath == null) ? Const.BLANK : servletPath; this.pathInfo = pathInfo; - this.parameterMap = queryStringToParameterMap(queryString); this.queryString = queryString; this.string = SIMPLE_NAME + '[' + contextController.getFullContextPath() + requestURI + (queryString != null ? '?' + queryString : "") + ", " + endpointRegistration.toString() + ']'; //$NON-NLS-1$ //$NON-NLS-2$ } + public void addRequestParameters(HttpServletRequest request) { + if (queryString == null) { + parameterMap = request.getParameterMap(); + queryString = request.getQueryString(); + + return; + } + + Map<String, String[]> parameterMapCopy = queryStringToParameterMap(queryString); + + for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { + String[] values = parameterMapCopy.get(entry.getKey()); + values = Params.append(values, entry.getValue()); + parameterMapCopy.put(entry.getKey(), values); + } + + parameterMap = Collections.unmodifiableMap(parameterMapCopy); + } + public void doDispatch( - HttpServletRequest request, HttpServletResponse response, - String path, DispatcherType dispatcherType) + HttpServletRequest originalRequest, HttpServletResponse response, + String path, DispatcherType requestedDispatcherType) throws ServletException, IOException { - HttpServletRequestWrapperImpl requestWrapper = HttpServletRequestWrapperImpl.findHttpRuntimeRequest(request); + setDispatcherType(requestedDispatcherType); + + RequestAttributeSetter setter = new RequestAttributeSetter(originalRequest); + + if (dispatcherType == DispatcherType.INCLUDE) { + setter.setAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH, contextController.getContextPath()); + setter.setAttribute(RequestDispatcher.INCLUDE_PATH_INFO, getPathInfo()); + setter.setAttribute(RequestDispatcher.INCLUDE_QUERY_STRING, getQueryString()); + setter.setAttribute(RequestDispatcher.INCLUDE_REQUEST_URI, getRequestURI()); + setter.setAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH, getServletPath()); + } + else if (dispatcherType == DispatcherType.FORWARD) { + response.resetBuffer(); + + setter.setAttribute(RequestDispatcher.FORWARD_CONTEXT_PATH, originalRequest.getContextPath()); + setter.setAttribute(RequestDispatcher.FORWARD_PATH_INFO, originalRequest.getPathInfo()); + setter.setAttribute(RequestDispatcher.FORWARD_QUERY_STRING, originalRequest.getQueryString()); + setter.setAttribute(RequestDispatcher.FORWARD_REQUEST_URI, originalRequest.getRequestURI()); + setter.setAttribute(RequestDispatcher.FORWARD_SERVLET_PATH, originalRequest.getServletPath()); + } + + HttpServletRequest request = originalRequest; + HttpServletRequestWrapperImpl requestWrapper = HttpServletRequestWrapperImpl.findHttpRuntimeRequest(originalRequest); HttpServletResponse responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response); try { if (requestWrapper == null) { - requestWrapper = new HttpServletRequestWrapperImpl(request); + requestWrapper = new HttpServletRequestWrapperImpl(originalRequest); request = requestWrapper; } @@ -79,15 +117,16 @@ public class DispatchTargets { response = responseWrapper; } - requestWrapper.push(this, dispatcherType); + requestWrapper.push(this); - ResponseStateHandler responseStateHandler = new ResponseStateHandler( - request, response, this, dispatcherType); + ResponseStateHandler responseStateHandler = new ResponseStateHandler(request, response, this); responseStateHandler.processRequest(); } finally { requestWrapper.pop(); + + setter.close(); } } @@ -95,6 +134,10 @@ public class DispatchTargets { return contextController; } + public DispatcherType getDispatcherType() { + return dispatcherType; + } + public List<FilterRegistration> getMatchingFilterRegistrations() { return matchingFilterRegistrations; } @@ -130,6 +173,10 @@ public class DispatchTargets { return endpointRegistration; } + public void setDispatcherType(DispatcherType dispatcherType) { + this.dispatcherType = dispatcherType; + } + @Override public String toString() { return string; @@ -137,7 +184,7 @@ public class DispatchTargets { private static Map<String, String[]> queryStringToParameterMap(String queryString) { if ((queryString == null) || (queryString.length() == 0)) { - return Collections.emptyMap(); + return new HashMap<String, String[]>(); } try { @@ -154,21 +201,49 @@ public class DispatchTargets { values = Params.append(values, value); parameterMap.put(name, values); } - return Collections.unmodifiableMap(parameterMap); + return parameterMap; } catch (UnsupportedEncodingException unsupportedEncodingException) { throw new RuntimeException(unsupportedEncodingException); } } + private static class RequestAttributeSetter implements Closeable { + + private final ServletRequest servletRequest; + private final Map<String, Object> oldValues = new HashMap<String, Object>(); + + public RequestAttributeSetter(ServletRequest servletRequest) { + this.servletRequest = servletRequest; + } + + public void setAttribute(String name, Object value) { + oldValues.put(name, servletRequest.getAttribute(name)); + + servletRequest.setAttribute(name, value); + } + + public void close() { + for (Map.Entry<String, Object> oldValue : oldValues.entrySet()) { + if (oldValue.getValue() == null) { + servletRequest.removeAttribute(oldValue.getKey()); + } + else { + servletRequest.setAttribute(oldValue.getKey(), oldValue.getValue()); + } + } + } + } + private static final String SIMPLE_NAME = DispatchTargets.class.getSimpleName(); private final ContextController contextController; + private DispatcherType dispatcherType; private final EndpointRegistration<?> endpointRegistration; private final List<FilterRegistration> matchingFilterRegistrations; private final String pathInfo; - private final Map<String, String[]> parameterMap; - private final String queryString; + private Map<String, String[]> parameterMap; + private String queryString; private final String requestURI; private final String servletPath; private final String servletName; diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/HttpServletRequestWrapperImpl.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/HttpServletRequestWrapperImpl.java index 25ae25930..1abe4efcb 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/HttpServletRequestWrapperImpl.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/HttpServletRequestWrapperImpl.java @@ -17,106 +17,22 @@ import javax.servlet.*; import javax.servlet.http.*; import org.eclipse.equinox.http.servlet.internal.context.ContextController; import org.eclipse.equinox.http.servlet.internal.context.DispatchTargets; -import org.eclipse.equinox.http.servlet.internal.util.*; +import org.eclipse.equinox.http.servlet.internal.util.Const; +import org.eclipse.equinox.http.servlet.internal.util.EventListeners; import org.osgi.service.http.HttpContext; public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { - public class State { - - public State( - DispatchTargets dispatchTargets, - DispatcherType dispatcherType, Map<String, Object> previousAttributes, - Map<String, String[]> previousParams, String previousQueryString) { - - this.dispatchTargets = dispatchTargets; - this.dispatcherType = dispatcherType; - - Map<String, Object> attributesCopy = new HashMap<String, Object>(); - - attributesCopy.putAll(previousAttributes); - - this.attributes = attributesCopy; - - Map<String, String[]> parameterMapCopy = new HashMap<String, String[]>(); - - // add the dispatchers query string parameters first - for (Map.Entry<String, String[]> entry : dispatchTargets.getParameterMap().entrySet()) { - String[] values = parameterMapCopy.get(entry.getKey()); - values = Params.append(values, entry.getValue()); - parameterMapCopy.put(entry.getKey(), values); - } - - // add the previous dispatcher's parameters next - if (previousParams != null) { - for (Map.Entry<String, String[]> entry : previousParams.entrySet()) { - String[] values = parameterMapCopy.get(entry.getKey()); - values = Params.append(values, entry.getValue()); - parameterMapCopy.put(entry.getKey(), values); - } - } - - this.parameterMap = parameterMapCopy; - - String queryStringCopy = previousQueryString; - - if ((dispatchTargets.getQueryString() != null) && (dispatchTargets.getQueryString().length() > 0) && - (queryStringCopy != null) && (queryStringCopy.length() > 0)) { - - queryStringCopy = dispatchTargets.getQueryString() + Const.AMP + queryStringCopy; - } - - this.queryString = queryStringCopy; - this.previousQueryString = previousQueryString; - - this.string = getClass().getSimpleName() + '[' + dispatcherType + ", " + dispatchTargets + ", " + queryString + ']'; //$NON-NLS-1$ //$NON-NLS-2$ - } - - public Map<String, Object> getAttributes() { - return attributes; - } - - public DispatcherType getDispatcherType() { - return dispatcherType; - } - - public DispatchTargets getDispatchTargets() { - return dispatchTargets; - } - - public Map<String, Object> getOverloadedAttributes() { - return overloadedAttributes; - } - - public Map<String, String[]> getParameterMap() { - return parameterMap; - } - - public String getPreviousQueryString() { - return previousQueryString; - } - - public String getQueryString() { - return queryString; - } - - @Override - public String toString() { - return string; - } - - private final Map<String, Object> attributes; - private final DispatchTargets dispatchTargets; - private final DispatcherType dispatcherType; - private final Map<String, Object> overloadedAttributes = new HashMap<String, Object>(); - private final Map<String, String[]> parameterMap; - private final String previousQueryString; - private final String queryString; - private final String string; - - } + private final Stack<DispatchTargets> dispatchTargets = new Stack<DispatchTargets>(); + private final HttpServletRequest request; private static final String[] dispatcherAttributes = new String[] { + RequestDispatcher.ERROR_EXCEPTION, + RequestDispatcher.ERROR_EXCEPTION_TYPE, + RequestDispatcher.ERROR_MESSAGE, + RequestDispatcher.ERROR_REQUEST_URI, + RequestDispatcher.ERROR_SERVLET_NAME, + RequestDispatcher.ERROR_STATUS_CODE, RequestDispatcher.FORWARD_CONTEXT_PATH, RequestDispatcher.FORWARD_PATH_INFO, RequestDispatcher.FORWARD_QUERY_STRING, @@ -129,11 +45,6 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { RequestDispatcher.INCLUDE_SERVLET_PATH }; - private final Deque<State> state = new ArrayDeque<State>(); - - private final HttpServletRequest request; - private final Map<String, Object> attributes; - public static HttpServletRequestWrapperImpl findHttpRuntimeRequest( HttpServletRequest request) { @@ -151,19 +62,6 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { public HttpServletRequestWrapperImpl(HttpServletRequest request) { super(request); this.request = request; - - Map<String, Object> attributes = new HashMap<String, Object>(); - - for (Enumeration<String> names = request.getAttributeNames(); names.hasMoreElements();) { - String name = names.nextElement(); - attributes.put(name, request.getAttribute(name)); - } - - this.attributes = attributes; - } - - public void destroy() { - state.clear(); } public String getAuthType() { @@ -183,17 +81,15 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { } public String getPathInfo() { - State current = currentState(); - State original = originalState(); - if (current.getDispatchTargets().getServletName() != null) - return original.getDispatchTargets().getRequestURI(); - if (current.getDispatcherType() == DispatcherType.INCLUDE) - return original.getDispatchTargets().getPathInfo(); - return current.getDispatchTargets().getPathInfo(); + if ((dispatchTargets.peek().getServletName() != null) || + (dispatchTargets.peek().getDispatcherType() == DispatcherType.INCLUDE)) { + return this.dispatchTargets.get(0).getPathInfo(); + } + return this.dispatchTargets.peek().getPathInfo(); } public DispatcherType getDispatcherType() { - return currentState().getDispatcherType(); + return dispatchTargets.peek().getDispatcherType(); } public String getParameter(String name) { @@ -205,7 +101,7 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { } public Map<String, String[]> getParameterMap() { - return currentState().getParameterMap(); + return dispatchTargets.peek().getParameterMap(); } public Enumeration<String> getParameterNames() { @@ -218,108 +114,151 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { @Override public String getQueryString() { - return currentState().getQueryString(); + if ((dispatchTargets.peek().getServletName() != null) || + (dispatchTargets.peek().getDispatcherType() == DispatcherType.INCLUDE)) { + return request.getQueryString(); + } + return this.dispatchTargets.peek().getQueryString(); + } + + @Override + public String getRequestURI() { + if ((dispatchTargets.peek().getServletName() != null) || + (dispatchTargets.peek().getDispatcherType() == DispatcherType.INCLUDE)) { + return request.getRequestURI(); + } + return this.dispatchTargets.peek().getRequestURI(); } public ServletContext getServletContext() { - return currentState().getDispatchTargets().getServletRegistration().getServletContext(); + return dispatchTargets.peek().getServletRegistration().getServletContext(); } public String getServletPath() { - if (currentState().getDispatchTargets().getServletName() != null) + if ((dispatchTargets.peek().getServletName() != null) || + (dispatchTargets.peek().getDispatcherType() == DispatcherType.INCLUDE)) { + return this.dispatchTargets.get(0).getServletPath(); + } + if (dispatchTargets.peek().getServletPath().equals(Const.SLASH)) { return Const.BLANK; - if (currentState().getDispatcherType() == DispatcherType.INCLUDE) - return originalState().getDispatchTargets().getServletPath(); - return currentState().getDispatchTargets().getServletPath(); + } + return this.dispatchTargets.peek().getServletPath(); } public String getContextPath() { - if (currentState().getDispatcherType() == DispatcherType.INCLUDE) - return originalState().getDispatchTargets().getContextController().getFullContextPath(); - return currentState().getDispatchTargets().getContextController().getFullContextPath(); - } - - @Override - public String getRequestURI() { - State current = currentState(); - DispatchTargets currentDispatchTargets = current.getDispatchTargets(); - if ((currentDispatchTargets.getServletName() != null) || - (current.getDispatcherType() == DispatcherType.INCLUDE)) { - return originalState().getDispatchTargets().getRequestURI(); - } - return currentDispatchTargets.getRequestURI(); + return dispatchTargets.peek().getContextController().getFullContextPath(); } public Object getAttribute(String attributeName) { - State current = currentState(); - DispatchTargets currentDispatchTargets = current.getDispatchTargets(); + DispatchTargets current = dispatchTargets.peek(); - if (Arrays.binarySearch(dispatcherAttributes, attributeName) > -1) { - if (currentDispatchTargets.getServletName() != null) { - return null; - } + if (current.getDispatcherType() == DispatcherType.ERROR) { + if ((Arrays.binarySearch(dispatcherAttributes, attributeName) > -1) && + !attributeName.startsWith("javax.servlet.error.")) { //$NON-NLS-1$ - if (current.getOverloadedAttributes().containsKey(attributeName)) { - return current.getOverloadedAttributes().get(attributeName); + return null; } } - - if (current.getDispatcherType() == DispatcherType.INCLUDE) { + else if (current.getDispatcherType() == DispatcherType.INCLUDE) { if (attributeName.equals(RequestDispatcher.INCLUDE_CONTEXT_PATH)) { - return currentDispatchTargets.getContextController().getFullContextPath(); - } else if (attributeName.equals(RequestDispatcher.INCLUDE_PATH_INFO)) { - return currentDispatchTargets.getPathInfo(); - } else if (attributeName.equals(RequestDispatcher.INCLUDE_QUERY_STRING)) { - return currentDispatchTargets.getQueryString(); - } else if (attributeName.equals(RequestDispatcher.INCLUDE_REQUEST_URI)) { - return currentDispatchTargets.getRequestURI(); - } else if (attributeName.equals(RequestDispatcher.INCLUDE_SERVLET_PATH)) { - return currentDispatchTargets.getServletPath(); + if (current.getServletName() != null) { + return null; + } + if (super.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH) != null) { + return super.getAttribute(RequestDispatcher.INCLUDE_CONTEXT_PATH); + } + return current.getContextController().getContextPath(); + } + else if (attributeName.equals(RequestDispatcher.INCLUDE_PATH_INFO)) { + if (current.getServletName() != null) { + return null; + } + if (super.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO) != null) { + return super.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO); + } + return current.getPathInfo(); + } + else if (attributeName.equals(RequestDispatcher.INCLUDE_QUERY_STRING)) { + if (current.getServletName() != null) { + return null; + } + if (super.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING) != null) { + return super.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING); + } + return current.getQueryString(); + } + else if (attributeName.equals(RequestDispatcher.INCLUDE_REQUEST_URI)) { + if (current.getServletName() != null) { + return null; + } + if (super.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null) { + return super.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI); + } + return current.getRequestURI(); + } + else if (attributeName.equals(RequestDispatcher.INCLUDE_SERVLET_PATH)) { + if (current.getServletName() != null) { + return null; + } + if (super.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH) != null) { + return super.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); + } + return current.getServletPath(); + } + + if (Arrays.binarySearch(dispatcherAttributes, attributeName) > -1) { + return null; } } - if (current.getDispatcherType() == DispatcherType.FORWARD) { - State original = originalState(); - DispatchTargets originalDispatchTargets = original.getDispatchTargets(); + else if (current.getDispatcherType() == DispatcherType.FORWARD) { + DispatchTargets original = dispatchTargets.get(0); if (attributeName.equals(RequestDispatcher.FORWARD_CONTEXT_PATH)) { - return originalDispatchTargets.getContextController().getFullContextPath(); - } else if (attributeName.equals(RequestDispatcher.FORWARD_PATH_INFO)) { - return originalDispatchTargets.getPathInfo(); - } else if (attributeName.equals(RequestDispatcher.FORWARD_QUERY_STRING)) { + if (current.getServletName() != null) { + return null; + } + return original.getContextController().getContextPath(); + } + else if (attributeName.equals(RequestDispatcher.FORWARD_PATH_INFO)) { + if (current.getServletName() != null) { + return null; + } + return original.getPathInfo(); + } + else if (attributeName.equals(RequestDispatcher.FORWARD_QUERY_STRING)) { + if (current.getServletName() != null) { + return null; + } return original.getQueryString(); - } else if (attributeName.equals(RequestDispatcher.FORWARD_REQUEST_URI)) { - return originalDispatchTargets.getRequestURI(); - } else if (attributeName.equals(RequestDispatcher.FORWARD_SERVLET_PATH)) { - return originalDispatchTargets.getServletPath(); } - } + else if (attributeName.equals(RequestDispatcher.FORWARD_REQUEST_URI)) { + if (current.getServletName() != null) { + return null; + } + return original.getRequestURI(); + } + else if (attributeName.equals(RequestDispatcher.FORWARD_SERVLET_PATH)) { + if (current.getServletName() != null) { + return null; + } + return original.getServletPath(); + } - Map<String, Object> attributes = current.getAttributes(); - if (attributes.containsKey(attributeName)) { - return attributes.get(attributeName); + if (Arrays.binarySearch(dispatcherAttributes, attributeName) > -1) { + return null; + } } return request.getAttribute(attributeName); } - @Override - public Enumeration<String> getAttributeNames() { - State current = currentState(); - - Set<String> names = new HashSet<String>(); - names.addAll(current.getAttributes().keySet()); - names.addAll(current.getOverloadedAttributes().keySet()); - - return Collections.enumeration(names); - } - public RequestDispatcher getRequestDispatcher(String path) { - State current = currentState(); - ContextController contextController = current.getDispatchTargets().getContextController(); + ContextController contextController = + this.dispatchTargets.peek().getContextController(); // support relative paths if (!path.startsWith(Const.SLASH)) { - path = current.getDispatchTargets().getServletPath() + Const.SLASH + path; + path = this.dispatchTargets.peek().getServletPath() + Const.SLASH + path; } // if the path starts with the full context path strip it else if (path.startsWith(contextController.getFullContextPath())) { @@ -345,9 +284,8 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { public HttpSession getSession() { HttpSession session = request.getSession(); if (session != null) { - DispatchTargets dispatchTargets = currentState().getDispatchTargets(); - return dispatchTargets.getContextController().getSessionAdaptor( - session, dispatchTargets.getServletRegistration().getT().getServletConfig().getServletContext()); + return dispatchTargets.peek().getContextController().getSessionAdaptor( + session, dispatchTargets.peek().getServletRegistration().getT().getServletConfig().getServletContext()); } return null; @@ -356,40 +294,28 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { public HttpSession getSession(boolean create) { HttpSession session = request.getSession(create); if (session != null) { - DispatchTargets dispatchTargets = currentState().getDispatchTargets(); - return dispatchTargets.getContextController().getSessionAdaptor( - session, dispatchTargets.getServletRegistration().getT().getServletConfig().getServletContext()); + return dispatchTargets.peek().getContextController().getSessionAdaptor( + session, dispatchTargets.peek().getServletRegistration().getT().getServletConfig().getServletContext()); } return null; } public synchronized void pop() { - getState().pop(); + if (dispatchTargets.size() > 1) { + this.dispatchTargets.pop(); + } } - public synchronized void push(DispatchTargets dispatchTargets, DispatcherType dispatcherType) { - Deque<State> curState = getState(); - State previous = curState.peek(); - if (previous == null) { - curState.push(new State(dispatchTargets, dispatcherType, attributes, request.getParameterMap(), request.getQueryString())); - return; - } - curState.push(new State(dispatchTargets, dispatcherType, previous.getAttributes(), previous.getParameterMap(), previous.getQueryString())); + public synchronized void push(DispatchTargets toPush) { + toPush.addRequestParameters(request); + this.dispatchTargets.push(toPush); } public void removeAttribute(String name) { - State current = getState().peek(); + request.removeAttribute(name); - if ((Arrays.binarySearch(dispatcherAttributes, name) > -1) && - current.getOverloadedAttributes().containsKey(name)) { - current.getOverloadedAttributes().remove(name); - } - else { - current.getAttributes().remove(name); - } - - EventListeners eventListeners = current.getDispatchTargets().getContextController().getEventListeners(); + EventListeners eventListeners = dispatchTargets.peek().getContextController().getEventListeners(); List<ServletRequestAttributeListener> listeners = eventListeners.get( ServletRequestAttributeListener.class); @@ -400,7 +326,7 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { ServletRequestAttributeEvent servletRequestAttributeEvent = new ServletRequestAttributeEvent( - current.getDispatchTargets().getServletRegistration().getServletContext(), this, name, null); + dispatchTargets.peek().getServletRegistration().getServletContext(), this, name, null); for (ServletRequestAttributeListener servletRequestAttributeListener : listeners) { servletRequestAttributeListener.attributeRemoved( @@ -409,20 +335,10 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { } public void setAttribute(String name, Object value) { - State current = getState().peek(); - - boolean added = !current.getAttributes().containsKey(name); - - if (Arrays.binarySearch(dispatcherAttributes, name) > -1) { - added = !current.getOverloadedAttributes().containsKey(name); - - current.getOverloadedAttributes().put(name, value); - } - else { - current.getAttributes().put(name, value); - } + boolean added = (request.getAttribute(name) == null); + request.setAttribute(name, value); - EventListeners eventListeners = current.getDispatchTargets().getContextController().getEventListeners(); + EventListeners eventListeners = dispatchTargets.peek().getContextController().getEventListeners(); List<ServletRequestAttributeListener> listeners = eventListeners.get( ServletRequestAttributeListener.class); @@ -433,7 +349,7 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { ServletRequestAttributeEvent servletRequestAttributeEvent = new ServletRequestAttributeEvent( - current.getDispatchTargets().getServletRegistration().getServletContext(), this, name, value); + dispatchTargets.peek().getServletRegistration().getServletContext(), this, name, value); for (ServletRequestAttributeListener servletRequestAttributeListener : listeners) { if (added) { @@ -447,16 +363,4 @@ public class HttpServletRequestWrapperImpl extends HttpServletRequestWrapper { } } - private State currentState() { - return getState().peek(); - } - - private State originalState() { - return getState().peekLast(); - } - - private Deque<State> getState() { - return state; - } - }
\ No newline at end of file diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ResponseStateHandler.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ResponseStateHandler.java index fad2c498d..97292935c 100644 --- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ResponseStateHandler.java +++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ResponseStateHandler.java @@ -29,12 +29,11 @@ public class ResponseStateHandler { public ResponseStateHandler( HttpServletRequest request, HttpServletResponse response, - DispatchTargets dispatchTargets, DispatcherType dispatcherType) { + DispatchTargets dispatchTargets) { this.request = request; this.response = response; this.dispatchTargets = dispatchTargets; - this.dispatcherType = dispatcherType; } public void processRequest() throws IOException, ServletException { @@ -51,15 +50,7 @@ public class ResponseStateHandler { ServletRequestEvent servletRequestEvent = null; try { - if (dispatcherType == DispatcherType.FORWARD) { - if (response.isCommitted()) { - throw new IllegalStateException("Response is committed"); //$NON-NLS-1$ - } - - response.resetBuffer(); - } - - if ((dispatcherType == DispatcherType.REQUEST) && !servletRequestListeners.isEmpty()) { + if ((dispatchTargets.getDispatcherType() == DispatcherType.REQUEST) && !servletRequestListeners.isEmpty()) { servletRequestEvent = new ServletRequestEvent(endpoint.getServletContext(), request); for (ServletRequestListener servletRequestListener : servletRequestListeners) { servletRequestListener.requestInitialized(servletRequestEvent); @@ -74,7 +65,7 @@ public class ResponseStateHandler { Collections.sort(filters); FilterChain chain = new FilterChainImpl( - filters, endpoint, dispatcherType); + filters, endpoint, dispatchTargets.getDispatcherType()); chain.doFilter(request, response); } @@ -90,7 +81,7 @@ public class ResponseStateHandler { setException(e); - if (dispatcherType != DispatcherType.REQUEST) { + if (dispatchTargets.getDispatcherType() != DispatcherType.REQUEST) { throwException(e); } } @@ -101,7 +92,7 @@ public class ResponseStateHandler { filterRegistration.removeReference(); } - if (dispatcherType == DispatcherType.FORWARD) { + if (dispatchTargets.getDispatcherType() == DispatcherType.FORWARD) { response.flushBuffer(); HttpServletResponseWrapperImpl responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response); @@ -132,7 +123,7 @@ public class ResponseStateHandler { } } - if (dispatcherType == DispatcherType.REQUEST) { + if (dispatchTargets.getDispatcherType() == DispatcherType.REQUEST) { handleErrors(); for (ServletRequestListener servletRequestListener : servletRequestListeners) { @@ -178,36 +169,64 @@ public class ResponseStateHandler { ContextController contextController = dispatchTargets.getContextController(); Class<? extends Exception> clazz = exception.getClass(); - String className = clazz.getName(); + final String className = clazz.getName(); - DispatchTargets errorDispatchTargets = contextController.getDispatchTargets( + final DispatchTargets errorDispatchTargets = contextController.getDispatchTargets( className, null, null, null, null, null, Match.EXACT, null); if (errorDispatchTargets == null) { throwException(exception); } - request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, exception); - request.setAttribute(RequestDispatcher.ERROR_EXCEPTION_TYPE, className); - request.setAttribute(RequestDispatcher.ERROR_MESSAGE, exception.getMessage()); - request.setAttribute( - RequestDispatcher.ERROR_REQUEST_URI, request.getRequestURI()); - request.setAttribute( - RequestDispatcher.ERROR_SERVLET_NAME, - errorDispatchTargets.getServletRegistration().getName()); - request.setAttribute( - RequestDispatcher.ERROR_STATUS_CODE, - HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + HttpServletRequestWrapperImpl httpRuntimeRequest = HttpServletRequestWrapperImpl.findHttpRuntimeRequest(request); + + try { + errorDispatchTargets.setDispatcherType(DispatcherType.ERROR); + + httpRuntimeRequest.push(errorDispatchTargets); + + HttpServletRequest wrapperRequest = new HttpServletRequestWrapper(request) { + + @Override + public Object getAttribute(String attributeName) { + if (getDispatcherType() == DispatcherType.ERROR) { + if (attributeName.equals(RequestDispatcher.ERROR_EXCEPTION)) { + return exception; + } else if (attributeName.equals(RequestDispatcher.ERROR_EXCEPTION_TYPE)) { + return className; + } else if (attributeName.equals(RequestDispatcher.ERROR_MESSAGE)) { + return exception.getMessage(); + } else if (attributeName.equals(RequestDispatcher.ERROR_REQUEST_URI)) { + return request.getRequestURI(); + } else if (attributeName.equals(RequestDispatcher.ERROR_SERVLET_NAME)) { + return dispatchTargets.getServletRegistration().getName(); + } else if (attributeName.equals(RequestDispatcher.ERROR_STATUS_CODE)) { + return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; + } + } + return super.getAttribute(attributeName); + } + + @Override + public DispatcherType getDispatcherType() { + return DispatcherType.ERROR; + } + + }; - responseWrapper.setCompleted(false); - //responseWrapper = new HttpServletResponseWrapperImpl(wrappedResponse); + HttpServletResponseWrapper wrapperResponse = + new HttpServletResponseWrapperImpl(wrappedResponse); - ResponseStateHandler responseStateHandler = new ResponseStateHandler( - request, responseWrapper, errorDispatchTargets, DispatcherType.ERROR); + ResponseStateHandler responseStateHandler = new ResponseStateHandler( + wrapperRequest, wrapperResponse, errorDispatchTargets); - responseStateHandler.processRequest(); + responseStateHandler.processRequest(); - wrappedResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + wrappedResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + finally { + httpRuntimeRequest.pop(); + } } private void handleResponseCode() throws IOException, ServletException { @@ -215,13 +234,13 @@ public class ResponseStateHandler { throw new IllegalStateException("Response isn't a wrapper"); //$NON-NLS-1$ } - HttpServletResponseWrapperImpl responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response); + final HttpServletResponseWrapperImpl responseWrapper = HttpServletResponseWrapperImpl.findHttpRuntimeResponse(response); if (responseWrapper == null) { throw new IllegalStateException("Can't locate response impl"); //$NON-NLS-1$ } - int status = responseWrapper.getStatus(); + final int status = responseWrapper.getStatus(); if (status < HttpServletResponse.SC_BAD_REQUEST) { return; @@ -252,24 +271,51 @@ public class ResponseStateHandler { return; } - request.setAttribute( - RequestDispatcher.ERROR_MESSAGE, responseWrapper.getMessage()); - request.setAttribute( - RequestDispatcher.ERROR_REQUEST_URI, request.getRequestURI()); - request.setAttribute( - RequestDispatcher.ERROR_SERVLET_NAME, - errorDispatchTargets.getServletRegistration().getName()); - request.setAttribute(RequestDispatcher.ERROR_STATUS_CODE, status); + HttpServletRequestWrapperImpl httpRuntimeRequest = HttpServletRequestWrapperImpl.findHttpRuntimeRequest(request); + + try { + errorDispatchTargets.setDispatcherType(DispatcherType.ERROR); + + httpRuntimeRequest.push(errorDispatchTargets); + + HttpServletRequest wrapperRequest = new HttpServletRequestWrapper(request) { + + @Override + public Object getAttribute(String attributeName) { + if (getDispatcherType() == DispatcherType.ERROR) { + if (attributeName.equals(RequestDispatcher.ERROR_MESSAGE)) { + return responseWrapper.getMessage(); + } else if (attributeName.equals(RequestDispatcher.ERROR_REQUEST_URI)) { + return request.getRequestURI(); + } else if (attributeName.equals(RequestDispatcher.ERROR_SERVLET_NAME)) { + return dispatchTargets.getServletRegistration().getName(); + } else if (attributeName.equals(RequestDispatcher.ERROR_STATUS_CODE)) { + return status; + } + } + return super.getAttribute(attributeName); + } + + @Override + public DispatcherType getDispatcherType() { + return DispatcherType.ERROR; + } + + }; - responseWrapper.setCompleted(false); - //responseWrapper = new HttpServletResponseWrapperImpl(wrappedResponse); + HttpServletResponseWrapper wrapperResponse = + new HttpServletResponseWrapperImpl(wrappedResponse); - ResponseStateHandler responseStateHandler = new ResponseStateHandler( - request, responseWrapper, errorDispatchTargets, DispatcherType.ERROR); + ResponseStateHandler responseStateHandler = new ResponseStateHandler( + wrapperRequest, wrapperResponse, errorDispatchTargets); - wrappedResponse.setStatus(status); + wrappedResponse.setStatus(status); - responseStateHandler.processRequest(); + responseStateHandler.processRequest(); + } + finally { + httpRuntimeRequest.pop(); + } } private void throwException(Exception e) @@ -286,10 +332,9 @@ public class ResponseStateHandler { } } - private DispatchTargets dispatchTargets; - private DispatcherType dispatcherType; - private Exception exception; - private HttpServletRequest request; - private HttpServletResponse response; + DispatchTargets dispatchTargets; + Exception exception; + HttpServletRequest request; + HttpServletResponse response; }
\ No newline at end of file |