Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Auge2016-04-12 03:27:12 +0000
committerRaymond Auge2016-04-12 15:33:16 +0000
commit0d5a1a04a5679853ed95fa8e097c578791add100 (patch)
tree7aa99b0432e56f2f8a5ce26507ff18f6f48f4602
parentbe3041a6f69e1780d35e13380f5d1191b16263ef (diff)
downloadrt.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
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/DispatchingTest.java671
-rw-r--r--bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/util/DispatchResultServlet.java76
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/DispatchTargets.java109
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/HttpServletRequestWrapperImpl.java386
-rw-r--r--bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/servlet/ResponseStateHandler.java155
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

Back to the top