Modified: cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java (original) +++ cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java Thu Nov 5 18:41:19 2009 @@ -19,16 +19,25 @@ package org.apache.cxf.transport.servlet; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import org.apache.cxf.helpers.IOUtils; + public abstract class AbstractHTTPServlet extends HttpServlet { @@ -39,39 +48,75 @@ private static final List<String> KNOWN_HTTP_VERBS = Arrays.asList(new String[]{"POST", "GET", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE"}); + private static final String STATIC_RESOURCES_PARAMETER = "static-resources-list"; + + private static final String REDIRECTS_PARAMETER = "redirects-list"; + private static final String REDIRECT_SERVLET_NAME_PARAMETER = "redirect-servlet-name"; + private static final String REDIRECT_SERVLET_PATH_PARAMETER = "redirect-servlet-path"; + + private List<String> staticResourcesList; + private List<String> redirectList; + private String dispatcherServletPath; + private String dispatcherServletName; + + public void init(ServletConfig servletConfig) throws ServletException { + super.init(servletConfig); + + staticResourcesList = parseListSequence(servletConfig.getInitParameter(STATIC_RESOURCES_PARAMETER)); + + redirectList = parseListSequence(servletConfig.getInitParameter(REDIRECTS_PARAMETER)); + dispatcherServletName = servletConfig.getInitParameter(REDIRECT_SERVLET_NAME_PARAMETER); + dispatcherServletPath = servletConfig.getInitParameter(REDIRECT_SERVLET_PATH_PARAMETER); + } + + private static List<String> parseListSequence(String values) { + if (values != null) { + List<String> list = new LinkedList<String>(); + String[] pathValues = values.split(" "); + for (String value : pathValues) { + String theValue = value.trim(); + if (theValue.length() > 0) { + list.add(theValue); + } + } + return list; + } else { + return null; + } + } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { - invoke(request, response); + handleRequest(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { - invoke(request, response); + handleRequest(request, response); } @Override protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - invoke(request, response); + handleRequest(request, response); } @Override protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - invoke(request, response); + handleRequest(request, response); } @Override protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - invoke(request, response); + handleRequest(request, response); } @Override protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - invoke(request, response); + handleRequest(request, response); } /** @@ -100,11 +145,105 @@ if (KNOWN_HTTP_VERBS.contains(method)) { super.service(request, response); } else { - invoke(request, response); + handleRequest(request, response); + } + } + + protected void handleRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException { + if (staticResourcesList != null + && matchPath(staticResourcesList, request.getPathInfo())) { + serveStaticContent(request, response, request.getPathInfo()); + return; } + if (redirectList != null + && matchPath(redirectList, request.getPathInfo())) { + redirect(request, response, request.getPathInfo()); + return; + } + invoke(request, response); + } + + private static boolean matchPath(List<String> values, String pathInfo) { + for (String value : values) { + if (pathInfo.matches(value)) { + return true; + } + } + return false; + } + + protected void serveStaticContent(HttpServletRequest request, + HttpServletResponse response, + String pathInfo) throws ServletException { + InputStream is = super.getServletContext().getResourceAsStream(pathInfo); + if (is == null) { + throw new ServletException("Static resource " + pathInfo + " is not available"); + } + try { + ServletOutputStream os = response.getOutputStream(); + IOUtils.copy(is, os); + os.flush(); + } catch (IOException ex) { + throw new ServletException("Static resource " + pathInfo + + " can not be written to the output stream"); + } + + } + + protected void redirect(HttpServletRequest request, HttpServletResponse response, String pathInfo) + throws ServletException { + + String theServletPath = dispatcherServletPath == null ? "/" : dispatcherServletPath; + + ServletContext sc = super.getServletContext(); + RequestDispatcher rd = dispatcherServletName != null + ? sc.getNamedDispatcher(dispatcherServletName) + : sc.getRequestDispatcher(theServletPath + pathInfo); + if (rd == null) { + throw new ServletException("No RequestDispatcher can be created for path " + pathInfo); + } + try { + HttpServletRequestFilter servletRequest = + new HttpServletRequestFilter(request, pathInfo, theServletPath); + rd.forward(servletRequest, response); + } catch (Throwable ex) { + throw new ServletException("RequestDispatcher for path " + pathInfo + " has failed"); + } } protected abstract void invoke(HttpServletRequest request, HttpServletResponse response) throws ServletException; + + private static class HttpServletRequestFilter extends HttpServletRequestWrapper { + + private String pathInfo; + private String servletPath; + + public HttpServletRequestFilter(HttpServletRequest request, + String pathInfo, + String servletPath) { + super(request); + this.pathInfo = pathInfo; + this.servletPath = servletPath; + } + + @Override + public String getServletPath() { + return servletPath; + } + + @Override + public String getPathInfo() { + return pathInfo; + } + + @Override + public String getRequestURI() { + String query = super.getQueryString(); + return query != null ? pathInfo + "?" + query : pathInfo; + } + + } }
Modified: cxf/branches/2.2.x-fixes/systests/jaxrs/pom.xml URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxrs/pom.xml?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/systests/jaxrs/pom.xml (original) +++ cxf/branches/2.2.x-fixes/systests/jaxrs/pom.xml Thu Nov 5 18:41:19 2009 @@ -65,6 +65,21 @@ </profiles> <dependencies> <dependency> + <groupId>org.apache.ant</groupId> + <artifactId>ant</artifactId> + <version>1.7.0</version> + </dependency> + <dependency> + <groupId>jetty</groupId> + <artifactId>jsp-api</artifactId> + <version>2.1-6.0.2</version> + </dependency> + <dependency> + <groupId>jetty</groupId> + <artifactId>jsp</artifactId> + <version>2.1-6.0.2</version> + </dependency> + <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-servlet_2.5_spec</artifactId> </dependency> Modified: cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java (original) +++ cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java Thu Nov 5 18:41:19 2009 @@ -44,10 +44,14 @@ providers.add(p); providers.add(new GenericHandlerWriter()); + providers.add(new FaultyRequestHandler()); sf.setProviders(providers); - List<Interceptor> ints = new ArrayList<Interceptor>(); - ints.add(new CustomOutInterceptor()); - sf.setOutInterceptors(ints); + List<Interceptor> outInts = new ArrayList<Interceptor>(); + outInts.add(new CustomOutInterceptor()); + sf.setOutInterceptors(outInts); + List<Interceptor> outFaultInts = new ArrayList<Interceptor>(); + outFaultInts.add(new CustomOutFaultInterceptor()); + sf.setOutFaultInterceptors(outFaultInts); sf.setResourceProvider(BookStore.class, new SingletonResourceProvider(new BookStore(), true)); sf.setAddress("http://localhost:9080/"); Modified: cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java (original) +++ cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java Thu Nov 5 18:41:19 2009 @@ -33,6 +33,7 @@ import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; @@ -116,6 +117,14 @@ } @GET + @Path("propogateexception3") + public Book propogateException3() throws BookNotFoundFault { + PhaseInterceptorChain.getCurrentMessage().getExchange() + .put("org.apache.cxf.systest.for-out-fault-interceptor", Boolean.TRUE); + throw new BookNotFoundFault("Book Exception"); + } + + @GET @Path("books/check/{id}") @Produces("text/plain") public boolean checkBook(@PathParam("id") Long id) { @@ -447,6 +456,15 @@ } @POST + @Path("/books/customstatus") + @Produces("text/xml") + @Consumes("text/xml") + public Response addBookCustomFailure(Book book, @Context HttpServletResponse response) { + response.setStatus(333); + return null; + } + + @POST @Path("/booksinfo") @Produces("text/xml") @Consumes("application/xml") Modified: cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java (original) +++ cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java Thu Nov 5 18:41:19 2009 @@ -76,6 +76,20 @@ } @Test + public void testPropogateException3() throws Exception { + String data = "<nobook/>"; + getAndCompare("http://localhost:9080/bookstore/propogateexception3", + data, "application/xml", 500); + } + + @Test + public void testPropogateException4() throws Exception { + String data = "<nobook/>"; + getAndCompare("http://localhost:9080/bookstore/propogateexception4", + data, "application/xml", 500); + } + + @Test public void testWebApplicationException() throws Exception { getAndCompare("http://localhost:9080/bookstore/webappexception", "This is a WebApplicationException", @@ -288,8 +302,8 @@ @Test public void testNoMessageWriterFound() throws Exception { - String msg1 = ".No message body writer found for response class : GregorianCalendar."; - String msg2 = ".No message body writer found for response class : Calendar."; + String msg1 = "No message body writer has been found for response class GregorianCalendar."; + String msg2 = "No message body writer has been found for response class Calendar."; getAndCompareStrings("http://localhost:9080/bookstore/timetable", new String[]{msg1, msg2}, "*/*", 500); @@ -585,6 +599,21 @@ } @Test + public void testAddBookNoBody() throws Exception { + PostMethod post = new PostMethod("http://localhost:9080/bookstore/books"); + post.setRequestHeader("Content-Type", "application/xml"); + HttpClient httpclient = new HttpClient(); + + try { + int result = httpclient.executeMethod(post); + assertEquals(400, result); + } finally { + // Release current connection to the connection pool once you are done + post.releaseConnection(); + } + } + + @Test public void testAddBook() throws Exception { doAddBook("http://localhost:9080/bookstore/books"); } @@ -615,6 +644,27 @@ } } + + @Test + public void testAddBookCustomFailureStatus() throws Exception { + String endpointAddress = "http://localhost:9080/bookstore/books/customstatus"; + + File input = new File(getClass().getResource("resources/update_book.txt").toURI()); + PostMethod put = new PostMethod(endpointAddress); + RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1"); + put.setRequestEntity(entity); + HttpClient httpclient = new HttpClient(); + + try { + int result = httpclient.executeMethod(put); + assertEquals(333, result); + } finally { + // Release current connection to the connection pool once you are + // done + put.releaseConnection(); + } + } + @Test public void testUpdateBook() throws Exception { String endpointAddress = "http://localhost:9080/bookstore/books"; Modified: cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java?rev=833119&r1=833118&r2=833119&view=diff ============================================================================== --- cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java (original) +++ cxf/branches/2.2.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSMultipartTest.java Thu Nov 5 18:41:19 2009 @@ -355,6 +355,22 @@ assertEquals("java.jpg", cd2.getParameter("filename")); } + @Test + public void testMultipartRequestNoBody() throws Exception { + PostMethod post = new PostMethod("http://localhost:9085/bookstore/books/image"); + String ct = "multipart/mixed"; + post.setRequestHeader("Content-Type", ct); + HttpClient httpclient = new HttpClient(); + + try { + int result = httpclient.executeMethod(post); + assertEquals(400, result); + } finally { + // Release current connection to the connection pool once you are done + post.releaseConnection(); + } + } + private void doAddBook(String address, String resourceName, int status) throws Exception { doAddBook("multipart/related", address, resourceName, status); }
