You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/02/24 17:30:28 UTC

svn commit: r1074201 - in /cxf/trunk: rt/core/src/main/java/org/apache/cxf/feature/ rt/core/src/main/java/org/apache/cxf/interceptor/transform/ rt/transports/http/src/main/java/org/apache/cxf/transport/http/ rt/transports/http/src/main/java/org/apache/...

Author: sergeyb
Date: Thu Feb 24 16:30:28 2011
New Revision: 1074201

URL: http://svn.apache.org/viewvc?rev=1074201&view=rev
Log:
[CXF-3338] Adding a contextPropertyName property which can be used to indicate what client request/responses the transformation should apply to

Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
    cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
    cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml
    cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/web.xml

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/feature/StaxTransformFeature.java Thu Feb 24 16:30:28 2011
@@ -83,4 +83,9 @@ public class StaxTransformFeature extend
     public void setInTransformElements(Map<String, String> inElements) {
         in.setInTransformElements(inElements);
     }
+    
+    public void setContextPropertyName(String propertyName) {
+        in.setContextPropertyName(propertyName);
+        out.setContextPropertyName(propertyName);
+    }
 }

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformInInterceptor.java Thu Feb 24 16:30:28 2011
@@ -28,6 +28,7 @@ import javax.xml.stream.XMLStreamReader;
 
 import org.apache.cxf.interceptor.StaxInInterceptor;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
 import org.apache.cxf.staxutils.transform.TransformUtils;
@@ -42,6 +43,7 @@ public class TransformInInterceptor exte
     private Map<String, String> inElementsMap;
     private Map<String, String> inAppendMap;
     private boolean blockOriginalReader = true;
+    private String contextPropertyName;
     
     public TransformInInterceptor() {
         super(Phase.POST_STREAM);
@@ -49,6 +51,10 @@ public class TransformInInterceptor exte
     }
     
     public void handleMessage(Message message) {
+        if (contextPropertyName != null 
+            && !MessageUtils.getContextualBoolean(message, contextPropertyName, false)) {
+            return;
+        }
         XMLStreamReader reader = message.getContent(XMLStreamReader.class);
         InputStream is = message.getContent(InputStream.class);
         
@@ -83,4 +89,8 @@ public class TransformInInterceptor exte
     public void setBlockOriginalReader(boolean blockOriginalReader) {
         this.blockOriginalReader = blockOriginalReader;
     }
+    
+    public void setContextPropertyName(String propertyName) {
+        contextPropertyName = propertyName;
+    }
 }

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/transform/TransformOutInterceptor.java Thu Feb 24 16:30:28 2011
@@ -49,6 +49,7 @@ public class TransformOutInterceptor ext
     private Map<String, String> outAppendMap;
     private List<String> outDropElements;
     private boolean attributesToElements;
+    private String contextPropertyName;
     
     public TransformOutInterceptor() {
         super(Phase.PRE_STREAM);
@@ -68,6 +69,14 @@ public class TransformOutInterceptor ext
         if (!isHttpVerbSupported(message)) {
             return;
         }
+        
+        if (contextPropertyName != null 
+            && !MessageUtils.getContextualBoolean(message.getExchange().getInMessage(),
+                                               contextPropertyName, 
+                                               false)) {
+            return;
+        }
+        
         XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
         OutputStream out = message.getContent(OutputStream.class);
         
@@ -112,4 +121,8 @@ public class TransformOutInterceptor ext
         return  isRequestor(message) && isGET(message) ? false : true;
     }
     
+    public void setContextPropertyName(String propertyName) {
+        contextPropertyName = propertyName;
+    }
+    
 }

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java Thu Feb 24 16:30:28 2011
@@ -94,6 +94,8 @@ public abstract class AbstractHTTPDestin
     public static final String REQUEST_REDIRECTED = "http.request.redirected";
     public static final String CXF_CONTINUATION_MESSAGE = "cxf.continuation.message";
 
+    public static final String SERVICE_REDIRECTION = "http.service.redirection";
+    
     private static final Logger LOG = LogUtils.getL7dLogger(AbstractHTTPDestination.class);
     
     private static final long serialVersionUID = 1L;
@@ -199,6 +201,8 @@ public abstract class AbstractHTTPDestin
             LOG.fine("Get the message from the request for processing");
         }
 
+        copyKnownRequestParameters(req, inMessage);
+        
         try {    
             incomingObserver.onMessage(inMessage);
         } catch (SuspendedInvocationException ex) {
@@ -207,9 +211,14 @@ public abstract class AbstractHTTPDestin
             }
             //else nothing to do, just finishing the processing
         }
+
  
     }
 
+    private void copyKnownRequestParameters(HttpServletRequest request, Message message) {
+        message.put(SERVICE_REDIRECTION, request.getParameter(SERVICE_REDIRECTION));
+    }
+    
     protected void setupMessage(Message inMessage,
                                 final ServletContext context, 
                                 final HttpServletRequest req, 

Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/AbstractHTTPServlet.java Thu Feb 24 16:30:28 2011
@@ -39,6 +39,7 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.transport.http.AbstractHTTPDestination;
 
 
 
@@ -55,6 +56,7 @@ public abstract class AbstractHTTPServle
     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_QUERY_CHECK_PARAMETER = "redirect-query-check";
     
     private static final Map<String, String> STATIC_CONTENT_TYPES;
     
@@ -71,6 +73,7 @@ public abstract class AbstractHTTPServle
     private List<String> redirectList; 
     private String dispatcherServletPath;
     private String dispatcherServletName;
+    private boolean redirectQueryCheck;
     
     public void init(ServletConfig servletConfig) throws ServletException {
         super.init(servletConfig);
@@ -78,6 +81,7 @@ public abstract class AbstractHTTPServle
         staticResourcesList = parseListSequence(servletConfig.getInitParameter(STATIC_RESOURCES_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);
     }
@@ -164,24 +168,32 @@ public abstract class AbstractHTTPServle
     
     protected void handleRequest(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException {
-        
-        if (redirectList != null 
-            && matchPath(redirectList, request.getPathInfo())) {
+        if ((dispatcherServletPath != null || dispatcherServletName != null)
+            && (redirectList != null && matchPath(redirectList, request)
+                || redirectList == null)) {
+            // if no redirectList is provided then this servlet is redirecting only
             redirect(request, response, request.getPathInfo());
             return;
         }
         
         if (staticResourcesList != null 
-            && matchPath(staticResourcesList, request.getPathInfo())) {
+            && matchPath(staticResourcesList, request)) {
             serveStaticContent(request, response, request.getPathInfo());
             return;
         }
         invoke(request, response);
     }
     
-    private static boolean matchPath(List<String> values, String pathInfo) {
+    private boolean matchPath(List<String> values, HttpServletRequest request) {
+        String path = request.getPathInfo();
+        if (redirectQueryCheck) {
+            String queryString = request.getQueryString();
+            if (queryString != null && queryString.length() > 0) {
+                path += "?" + queryString; 
+            }
+        }
         for (String value : values) {
-            if (pathInfo.matches(value)) {
+            if (path.matches(value)) {
                 return true;
             }
         }
@@ -263,9 +275,20 @@ public abstract class AbstractHTTPServle
         
         @Override
         public String getRequestURI() {
-            return getContextPath() + servletPath + pathInfo;
+            String contextPath = getContextPath();
+            if ("/".equals(contextPath)) {
+                contextPath = "";
+            }
+            return contextPath + servletPath + pathInfo;
         }
         
+        @Override
+        public String getParameter(String name) {
+            if (AbstractHTTPDestination.SERVICE_REDIRECTION.equals(name)) {
+                return "true";
+            }
+            return super.getParameter(name);
+        }
     }
 
 }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Thu Feb 24 16:30:28 2011
@@ -89,7 +89,7 @@ public class JAXRSSoapBookTest extends A
     @BeforeClass
     public static void startServers() throws Exception {
         assertTrue("server did not launch correctly", 
-                   launchServer(BookServerRestSoap.class));
+                   launchServer(BookServerRestSoap.class, true));
     }
     
     @Test
@@ -158,7 +158,7 @@ public class JAXRSSoapBookTest extends A
     public void testGetBookTransform() throws Exception {
         
         String address = "http://localhost:" + PORT 
-                         + "/test/services/rest-transform/bookstore/books/123";
+                         + "/test/v1/rest-transform/bookstore/books/123";
         WebClient client = WebClient.create(address);
         Response r = client.get();
         String str = getStringFromInputStream((InputStream)r.getEntity());
@@ -169,7 +169,7 @@ public class JAXRSSoapBookTest extends A
     public void testPostBookTransform() throws Exception {
            
         String address = "http://localhost:" + PORT 
-                         + "/test/services/rest-transform/bookstore/books";
+                         + "/test/v1/rest-transform/bookstore/books";
         
         TransformOutInterceptor out =  new TransformOutInterceptor();
         out.setOutTransformElements(
@@ -194,6 +194,17 @@ public class JAXRSSoapBookTest extends A
     }
     
     @Test
+    public void testPostBookTransformV2() throws Exception {
+           
+        String address = "http://localhost:" + PORT 
+                         + "/test/v2/rest-transform/bookstore/books";
+        WebClient client = WebClient.create(address);
+        Book book = client.accept("text/xml").post(new Book(), Book.class);
+        assertEquals(124L, book.getId());
+    }
+    
+    
+    @Test
     public void testGetBookFastinfoset() throws Exception {
         
         JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
@@ -674,11 +685,11 @@ public class JAXRSSoapBookTest extends A
     
     @Test
     public void testGetUnqualifiedBookSoap() throws Exception {
+        
         String wsdlAddress =
-            "http://localhost:" + PORT + "/test/services/soap-transform/bookservice?wsdl"; 
-        URL wsdlUrl = new URL(wsdlAddress);
+            "http://localhost:" + PORT + "/test/services/soap-transform/bookservice?wsdl";
         BookSoapService service = 
-            new BookSoapService(wsdlUrl,
+            new BookSoapService(new URL(wsdlAddress), 
                                 new QName("http://books.com", "BookService"));
         BookStoreJaxrsJaxws store = service.getBookPort();
         
@@ -715,6 +726,21 @@ public class JAXRSSoapBookTest extends A
         
         Book book = store.getBook(new Long(123));
         assertEquals("id is wrong", book.getId(), 123);
+        
+    }
+    
+    @Test
+    @Ignore
+    public void testGetBookSoapTransformDirect() throws Exception {
+        String wsdlAddress =
+            "http://localhost:" + PORT + "/test/v2/soap-transform/bookservice?wsdl"; 
+        URL wsdlUrl = new URL(wsdlAddress);
+        BookSoapService service = 
+            new BookSoapService(wsdlUrl,
+                                new QName("http://books.com", "BookService"));
+        BookStoreJaxrsJaxws store = service.getBookPort();
+        Book book = store.getBook(new Long(123));
+        assertEquals("id is wrong", book.getId(), 123);
     }
     
     @Test

Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml Thu Feb 24 16:30:28 2011
@@ -186,6 +186,12 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
   </jaxrs:server> 
    
   <bean id="transformFeatureRest" class="org.apache.cxf.feature.StaxTransformFeature">
+      <!-- 
+         apply the transformation only if the boolean property with the given name
+         is set to true on the message
+      -->   
+      <property name="contextPropertyName" value="http.service.redirection"/>
+      
       <property name="outTransformElements">
         <map>
          <entry key="Book" value="TheBook"/>
@@ -204,12 +210,15 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
       id="soapservice-transform"
       implementor="#bookstore-simple"
       address="/soap-transform/bookservice">
+      
       <jaxws:features>
        <ref bean="transformFeatureSoap" />
       </jaxws:features>
+      
    </jaxws:endpoint> 
    
    <bean id="transformFeatureSoap" class="org.apache.cxf.feature.StaxTransformFeature">
+      
       <property name="outTransformElements">
         <map>
          <entry key="{http://jaxws.jaxrs.systest.cxf.apache.org/}*" value="*"/>

Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/web.xml?rev=1074201&r1=1074200&r2=1074201&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/web.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/web.xml Thu Feb 24 16:30:28 2011
@@ -37,16 +37,72 @@
 
 	<servlet>
 		<servlet-name>CXFServlet</servlet-name>
-		<display-name>CXF Servlet</display-name>
+		<display-name>CXFServlet</display-name>
 		<servlet-class>
 			org.apache.cxf.transport.servlet.CXFServlet
 		</servlet-class>
-		<load-on-startup>1</load-on-startup>
+			<load-on-startup>1</load-on-startup>
 	</servlet>
 
 	<servlet-mapping>
 		<servlet-name>CXFServlet</servlet-name>
 		<url-pattern>/services/*</url-pattern>
+		<load-on-startup>1</load-on-startup>
+	</servlet-mapping>
+	
+	<servlet>
+		<servlet-name>CXFServletV1</servlet-name>
+		<display-name>CXFServletV1</display-name>
+		<servlet-class>
+			org.apache.cxf.transport.servlet.CXFServlet
+		</servlet-class>
+		<!-- 
+		   If redirects-list is not provided and 
+		   only redirect-servlet-path or redirect-servlet-name is set then
+		   this servlet will only redirect
+		-->    
+		<init-param>
+    		<param-name>redirects-list</param-name>
+	    	<param-value>
+	    	    /rest-transform/.*
+	    	</param-value>
+	    </init-param>
+	    <init-param>
+    		<param-name>redirect-servlet-path</param-name>
+	    	<param-value>/v2</param-value>
+	    </init-param>
+		<load-on-startup>1</load-on-startup>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>CXFServletV1</servlet-name>
+		<url-pattern>/v1/*</url-pattern>
+		<load-on-startup>1</load-on-startup>
+	</servlet-mapping>
+	
+	<servlet>
+		<servlet-name>CXFServletV2</servlet-name>
+		<display-name>CXFServletV2</display-name>
+		<servlet-class>
+			org.apache.cxf.transport.servlet.CXFServlet
+		</servlet-class>
+		<!-- 
+		     thread safe access to multiple destinations via
+		     a single CXF servlet, in this case older clients
+		     accessing CXFServlet listening on /v1 are redirected to
+		     this servlet which is also serving the new clients directly
+		     accessing /v2 
+		-->
+		<init-param>
+		      <param-name>disable-address-updates</param-name>
+		      <param-value>true</param-value>    
+		</init-param>
+		<load-on-startup>1</load-on-startup>
+	</servlet>
+
+	<servlet-mapping>
+		<servlet-name>CXFServletV2</servlet-name>
+		<url-pattern>/v2/*</url-pattern>
 	</servlet-mapping>
 </web-app>
 <!-- END SNIPPET: webxml -->
\ No newline at end of file