Author: sergeyb
Date: Fri Jun 29 14:02:39 2012
New Revision: 1355395

URL: http://svn.apache.org/viewvc?rev=1355395&view=rev
Log:
Merged revisions 1355380 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1355380 | sergeyb | 2012-06-29 14:38:13 +0100 (Fri, 29 Jun 2012) | 1 line
  
  [CXF-4400] Better handling of redirect and static resource requests in 
AbstractHttpServlet
........

Added:
    
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/welcomeBook.html
      - copied unchanged from r1355380, 
cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_dispatch/welcomeBook.html
Modified:
    cxf/branches/2.6.x-fixes/   (props changed)
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java
    
cxf/branches/2.6.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
    
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
    
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSRequestDispatcherTest.java
    
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/WEB-INF/web.xml

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
    svn:mergeinfo = /cxf/trunk:1355380

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: 
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java?rev=1355395&r1=1355394&r2=1355395&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java
 (original)
+++ 
cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/servlet/CXFNonSpringJaxrsServlet.java
 Fri Jun 29 14:02:39 2012
@@ -129,30 +129,15 @@ public class CXFNonSpringJaxrsServlet ex
     }
     
     protected void setExtensions(JAXRSServerFactoryBean bean, ServletConfig 
servletConfig) {
-        
bean.setExtensionMappings(handleMapSequence(servletConfig.getInitParameter(EXTENSIONS_PARAM)));
-        
bean.setLanguageMappings(handleMapSequence(servletConfig.getInitParameter(LANGUAGES_PARAM)));
+        bean.setExtensionMappings(
+             CastUtils.cast((Map<?, 
?>)parseMapSequence(servletConfig.getInitParameter(EXTENSIONS_PARAM))));
+        bean.setLanguageMappings(
+             CastUtils.cast((Map<?, 
?>)parseMapSequence(servletConfig.getInitParameter(LANGUAGES_PARAM))));
         bean.setProperties(CastUtils.cast(
-                
handleMapSequence(servletConfig.getInitParameter(PROPERTIES_PARAM)),
+                
parseMapSequence(servletConfig.getInitParameter(PROPERTIES_PARAM)),
                 String.class, Object.class));
     }
     
-    protected Map<Object, Object> handleMapSequence(String sequence) {
-        if (sequence != null) {
-            sequence = sequence.trim();
-            Map<Object, Object> map = new HashMap<Object, Object>();
-            String[] pairs = sequence.split(" ");
-            for (String pair : pairs) {
-                String[] value = pair.split("=");
-                if (value.length == 2) {
-                    map.put(value[0].trim(), value[1].trim());
-                }
-            }
-            return map;
-        } else {
-            return Collections.emptyMap();    
-        }
-    }
-    
     protected void setAllInterceptors(JAXRSServerFactoryBean bean, 
ServletConfig servletConfig) {
         setInterceptors(bean, servletConfig, OUT_INTERCEPTORS_PARAM);
         setInterceptors(bean, servletConfig, IN_INTERCEPTORS_PARAM);
@@ -270,8 +255,7 @@ public class CXFNonSpringJaxrsServlet ex
         String theName = cName.trim();
         int ind = theName.indexOf("(");
         if (ind != -1 && theName.endsWith(")")) {
-            
props.putAll(CastUtils.cast(handleMapSequence(theName.substring(ind + 1, 
theName.length() - 1)),
-                    String.class, String.class));
+            props.putAll(parseMapSequence(theName.substring(ind + 1, 
theName.length() - 1)));
             theName = theName.substring(0, ind).trim();
         }
         return theName;

Modified: 
cxf/branches/2.6.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java?rev=1355395&r1=1355394&r2=1355395&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
 (original)
+++ 
cxf/branches/2.6.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
 Fri Jun 29 14:02:39 2012
@@ -21,10 +21,12 @@ package org.apache.cxf.transport.servlet
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
@@ -38,6 +40,7 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 
@@ -54,10 +57,12 @@ public abstract class AbstractHTTPServle
         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 STATIC_WELCOME_FILE_PARAMETER = 
"static-welcome-file";
     
     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 static final String REDIRECT_ATTRIBUTES_PARAMETER = 
"redirect-attributes";
     private static final String REDIRECT_QUERY_CHECK_PARAMETER = 
"redirect-query-check";
     
     private static final Map<String, String> STATIC_CONTENT_TYPES;
@@ -72,31 +77,38 @@ public abstract class AbstractHTTPServle
         // TODO : add more types if needed
     }
     
-    private List<String> staticResourcesList;
-    private List<String> redirectList; 
+    private List<Pattern> staticResourcesList;
+    private String staticWelcomeFile;
+    private List<Pattern> redirectList; 
     private String dispatcherServletPath;
     private String dispatcherServletName;
+    private Map<String, String> redirectAttributes;
     private boolean redirectQueryCheck;
     
     public void init(ServletConfig servletConfig) throws ServletException {
         super.init(servletConfig);
 
         staticResourcesList = 
parseListSequence(servletConfig.getInitParameter(STATIC_RESOURCES_PARAMETER));
+        staticWelcomeFile = 
servletConfig.getInitParameter(STATIC_WELCOME_FILE_PARAMETER);
         
         redirectList = 
parseListSequence(servletConfig.getInitParameter(REDIRECTS_PARAMETER));
         redirectQueryCheck = 
Boolean.valueOf(servletConfig.getInitParameter(REDIRECT_QUERY_CHECK_PARAMETER));
         dispatcherServletName = 
servletConfig.getInitParameter(REDIRECT_SERVLET_NAME_PARAMETER);
         dispatcherServletPath = 
servletConfig.getInitParameter(REDIRECT_SERVLET_PATH_PARAMETER);
+        
+        redirectAttributes = 
parseMapSequence(servletConfig.getInitParameter(REDIRECT_ATTRIBUTES_PARAMETER));
+            
+        
     }
     
-    private static List<String> parseListSequence(String values) {
+    protected static List<Pattern> parseListSequence(String values) {
         if (values != null) {
-            List<String> list = new LinkedList<String>();
+            List<Pattern> list = new LinkedList<Pattern>();
             String[] pathValues = values.split(" ");
             for (String value : pathValues) {
                 String theValue = value.trim();
                 if (theValue.length() > 0) {
-                    list.add(theValue);
+                    list.add(Pattern.compile(theValue));
                 }
             }
             return list;
@@ -105,6 +117,25 @@ public abstract class AbstractHTTPServle
         }
     }
     
+    protected static Map<String, String> parseMapSequence(String sequence) {
+        if (sequence != null) {
+            sequence = sequence.trim();
+            Map<String, String> map = new HashMap<String, String>();
+            String[] pairs = sequence.split(" ");
+            for (String pair : pairs) {
+                String[] value = pair.split("=");
+                if (value.length == 2) {
+                    map.put(value[0].trim(), value[1].trim());
+                } else {
+                    map.put(pair.trim(), "");
+                }
+            }
+            return map;
+        } else {
+            return Collections.emptyMap();
+        }
+    }
+    
     protected void doPost(HttpServletRequest request, HttpServletResponse 
response) 
         throws ServletException {
         handleRequest(request, response);
@@ -180,14 +211,17 @@ public abstract class AbstractHTTPServle
         }
         
         if (staticResourcesList != null 
-            && matchPath(staticResourcesList, request)) {
-            serveStaticContent(request, response, request.getPathInfo());
+            && matchPath(staticResourcesList, request)
+            || staticWelcomeFile != null 
+                && (StringUtils.isEmpty(request.getPathInfo()) || 
request.getPathInfo().equals("/"))) {
+            serveStaticContent(request, response, 
+                               staticWelcomeFile != null ? staticWelcomeFile : 
request.getPathInfo());
             return;
         }
         invoke(request, response);
     }
     
-    private boolean matchPath(List<String> values, HttpServletRequest request) 
{
+    private boolean matchPath(List<Pattern> values, HttpServletRequest 
request) {
         String path = request.getPathInfo();
         if (path == null) {
             path = "/";
@@ -198,8 +232,8 @@ public abstract class AbstractHTTPServle
                 path += "?" + queryString; 
             }
         }
-        for (String value : values) {
-            if (path.matches(value)) {
+        for (Pattern pattern : values) {
+            if (pattern.matcher(path).matches()) {
                 return true;
             }
         }
@@ -249,6 +283,9 @@ public abstract class AbstractHTTPServle
             throw new ServletException(errorMessage);
         }
         try {
+            for (Map.Entry<String, String> entry : 
redirectAttributes.entrySet()) {
+                request.setAttribute(entry.getKey(), entry.getValue());
+            }
             HttpServletRequestFilter servletRequest = 
                 new HttpServletRequestFilter(request, pathInfo, 
theServletPath);
             rd.forward(servletRequest, response);

Modified: 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java?rev=1355395&r1=1355394&r2=1355395&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
 (original)
+++ 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
 Fri Jun 29 14:02:39 2012
@@ -554,6 +554,26 @@ public class BookStore {
     }
     
     @GET
+    @Path("/books/{fiql}/chapter/{i}")
+    @Produces("application/xml")
+    public Chapter getInChapterFromSelectedBook(@Context SearchContext 
searchContext,
+                                           @PathParam("fiql") PathSegment 
fiqlSegment,
+                                           @PathParam("i") int chapterIndex) 
throws BookNotFoundFault {
+        
+        SearchCondition<Book> sc = searchContext.getCondition(Book.class);
+        if (sc == null) {
+            throw new BookNotFoundFault("Search exception");
+        }
+        List<Book> found = sc.findAll(books.values());
+        if (found.size() != 1) {
+            throw new BookNotFoundFault("Single book is expected");
+        }
+        
+        Book book = found.get(0);
+        return book.getChapter(chapterIndex);
+    }
+    
+    @GET
     @Path("/books/text/xml/{bookId}")
     @Produces("text/xml")
     public Book getBookTextXml(@PathParam("bookId") String id) throws 
BookNotFoundFault {

Modified: 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSRequestDispatcherTest.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSRequestDispatcherTest.java?rev=1355395&r1=1355394&r2=1355395&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSRequestDispatcherTest.java
 (original)
+++ 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSRequestDispatcherTest.java
 Fri Jun 29 14:02:39 2012
@@ -97,4 +97,33 @@ public class JAXRSRequestDispatcherTest 
         String value = 
source.getValue("xhtml:html/xhtml:body/xhtml:ul/books:bookTag", namespaces);
         assertEquals("CXF Rocks", value);
     }
+    @Test
+    public void testGetBookHTMLFromWelcomeList() throws Exception {
+        String endpointAddress = "http://localhost:"; + PORT + "/welcome";
+        doTestGetBookHTMLFromWelcomeList(endpointAddress);
+    }
+    
+    @Test
+    public void testGetBookHTMLFromWelcomeList2() throws Exception {
+        String endpointAddress = "http://localhost:"; + PORT + "/the";
+        doTestGetBookHTMLFromWelcomeList(endpointAddress);
+    }
+    
+    @Test
+    public void testGetBookHTMLFromStaticWelcomeFile() throws Exception {
+        String endpointAddress = "http://localhost:"; + PORT + "/welcome2";
+        doTestGetBookHTMLFromWelcomeList(endpointAddress);
+    }
+    
+    private void doTestGetBookHTMLFromWelcomeList(String address) throws 
Exception {
+        WebClient client = WebClient.create(address);
+        client.accept("text/html");
+        
WebClient.getConfig(client).getHttpConduit().getClient().setReceiveTimeout(100000000);
+        XMLSource source = client.accept("text/html").get(XMLSource.class);
+        Map<String, String> namespaces = new HashMap<String, String>();
+        namespaces.put("xhtml", "http://www.w3.org/1999/xhtml";);
+        namespaces.put("books", "http://www.w3.org/books";);
+        String value = 
source.getValue("xhtml:html/xhtml:body/xhtml:ul/books:bookTag", namespaces);
+        assertEquals("Welcome to CXF", value);
+    }
 }

Modified: 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/WEB-INF/web.xml?rev=1355395&r1=1355394&r2=1355395&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/WEB-INF/web.xml
 (original)
+++ 
cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_dispatch/WEB-INF/web.xml
 Fri Jun 29 14:02:39 2012
@@ -28,7 +28,7 @@
                <param-name>contextConfigLocation</param-name>
                <param-value>WEB-INF/beans.xml</param-value>
        </context-param>
-
+       
        <listener>
                <listener-class>
                        org.springframework.web.context.ContextLoaderListener
@@ -41,6 +41,22 @@
                <servlet-class>
                        org.apache.cxf.transport.servlet.CXFServlet
                </servlet-class>
+               <init-param>
+               <param-name>redirects-list</param-name>
+               <param-value>
+                 /
+               </param-value>
+           </init-param>
+           <init-param>
+               <param-name>redirect-attributes</param-name>
+               <param-value>
+                 javax.servlet.include.request_uri
+               </param-value>
+           </init-param>
+           <init-param>
+               <param-name>redirect-servlet-name</param-name>
+               <param-value>default</param-value>
+           </init-param>
                <load-on-startup>1</load-on-startup>
        </servlet>
 
@@ -48,7 +64,6 @@
                <servlet-name>CXFServlet</servlet-name>
                <url-pattern>/the/*</url-pattern>
        </servlet-mapping>
-       
        <servlet>
                <servlet-name>RedirectCXFServlet</servlet-name>
                <display-name>Redirect CXF Servlet</display-name>
@@ -57,14 +72,10 @@
                </servlet-class>
                <init-param>
                <param-name>redirects-list</param-name>
-               <param-value>/(\w)+.html</param-value>
+               <param-value>
+                 /(\w)+.html
+               </param-value>
            </init-param>
-           <!--
-           <init-param>
-               <param-name>reditect-servlet-name</param-name>
-               <param-value>DefaultCXFServlet</param-value>
-           </init-param>
-           -->
            <init-param>
                <param-name>redirect-servlet-path</param-name>
                <param-value>/static</param-value>
@@ -74,9 +85,8 @@
 
     <servlet-mapping>
                <servlet-name>RedirectCXFServlet</servlet-name>
-               <url-pattern>/*</url-pattern>
+               <url-pattern>/book.html</url-pattern>
        </servlet-mapping>
-       
        <servlet>
                <servlet-name>DefaultCXFServlet</servlet-name>
                <display-name>Default CXF Servlet</display-name>
@@ -89,11 +99,63 @@
            </init-param>       
                <load-on-startup>1</load-on-startup>
        </servlet>
-
-    <servlet-mapping>
+       
+       <servlet-mapping>
                <servlet-name>DefaultCXFServlet</servlet-name>
                <url-pattern>/static/*</url-pattern>
        </servlet-mapping>
        
+       <servlet>
+               <servlet-name>WelcomeCXFServlet</servlet-name>
+               <display-name>Welcome CXF Servlet</display-name>
+               <servlet-class>
+                       org.apache.cxf.transport.servlet.CXFServlet
+               </servlet-class>
+               <init-param>
+               <param-name>redirects-list</param-name>
+               <param-value>
+                 /
+               </param-value>
+           </init-param>
+           <init-param>
+               <param-name>redirect-attributes</param-name>
+               <param-value>
+                 javax.servlet.include.request_uri
+               </param-value>
+           </init-param>
+           <init-param>
+               <param-name>redirect-servlet-name</param-name>
+               <param-value>default</param-value>
+           </init-param>
+           <load-on-startup>1</load-on-startup>
+       </servlet>
+       
+
+    <servlet-mapping>
+               <servlet-name>WelcomeCXFServlet</servlet-name>
+               <url-pattern>/welcome/*</url-pattern>
+       </servlet-mapping>
+       
+       <servlet>
+               <servlet-name>WelcomeCXFServlet2</servlet-name>
+               <display-name>Welcome CXF Servlet2</display-name>
+               <servlet-class>
+                       org.apache.cxf.transport.servlet.CXFServlet
+               </servlet-class>
+               <init-param>
+               <param-name>static-welcome-file</param-name>
+               <param-value>/welcomeBook.html</param-value>
+           </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+       
+    <servlet-mapping>
+               <servlet-name>WelcomeCXFServlet2</servlet-name>
+               <url-pattern>/welcome2/*</url-pattern>
+       </servlet-mapping>
+       
+       <welcome-file-list>
+               <welcome-file>welcomeBook.html</welcome-file>
+       </welcome-file-list>
 </web-app>
 <!-- END SNIPPET: webxml -->
\ No newline at end of file


Reply via email to