You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2020/09/10 02:32:28 UTC

[cxf] 01/02: CXF-8227: Failure to comply with JAX-RS spec with ContainerRequestContext and WriterInterceptorContext (#692)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit f35bf79d7c44286281e2c1fb857052255da55419
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Wed Sep 9 20:02:12 2020 -0400

    CXF-8227: Failure to comply with JAX-RS spec with ContainerRequestContext and WriterInterceptorContext (#692)
    
    * CXF-8227: Failure to comply with JAX-RS spec with ContainerRequestContext and WriterInterceptorContext. Addressing review comments
    (cherry picked from commit 6d5fddfa467cb7d9a54c066029b2a6d055fb5546)
---
 .../cxf/jaxrs/impl/PropertyHolderFactory.java      | 59 ++++++++++++++++++
 .../jaxrs/impl/ServletRequestPropertyHolder.java   | 70 ----------------------
 .../apache/cxf/systest/jaxrs/BookApplication.java  | 12 +++-
 .../jaxrs/JAXRSClientServerNonSpringBookTest.java  | 19 +++++-
 4 files changed, 88 insertions(+), 72 deletions(-)

diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PropertyHolderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PropertyHolderFactory.java
index 23be014..052eb48 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PropertyHolderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/PropertyHolderFactory.java
@@ -20,8 +20,13 @@ package org.apache.cxf.jaxrs.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.message.Message;
@@ -41,6 +46,60 @@ public final class PropertyHolderFactory {
         void setProperty(String name, Object value);
         Collection<String> getPropertyNames();
     }
+    
+    private static class ServletRequestPropertyHolder extends MessagePropertyHolder {
+        private static final String ENDPOINT_ADDRESS_PROPERTY = "org.apache.cxf.transport.endpoint.address";
+        private final HttpServletRequest request;
+        
+        ServletRequestPropertyHolder(Message m) {
+            super(m);
+            request = (HttpServletRequest)m.get("HTTP.REQUEST");
+        }
+
+        @Override
+        public Object getProperty(String name) {
+            final Object value = request.getAttribute(name);
+
+            if (value != null) {
+                return value;
+            }
+            
+            return super.getProperty(name);
+        }
+
+        @Override
+        public void removeProperty(String name) {
+            super.removeProperty(name);
+            request.removeAttribute(name);
+        }
+
+        @Override
+        public void setProperty(String name, Object value) {
+            if (value == null) {
+                removeProperty(name);
+            } else {
+                super.setProperty(name, value);
+                request.setAttribute(name, value);
+            }
+        }
+
+        @Override
+        public Collection<String> getPropertyNames() {
+            final Set<String> list = new LinkedHashSet<>();
+            
+            Enumeration<String> attrNames = request.getAttributeNames();
+            while (attrNames.hasMoreElements()) {
+                String name = attrNames.nextElement();
+                if (!ENDPOINT_ADDRESS_PROPERTY.equals(name)) {
+                    list.add(name);
+                }
+            }
+            
+            list.addAll(super.getPropertyNames());
+            return list;
+        }
+
+    }
 
     private static class MessagePropertyHolder implements PropertyHolder {
         private static final String PROPERTY_KEY = "jaxrs.filter.properties";
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ServletRequestPropertyHolder.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ServletRequestPropertyHolder.java
deleted file mode 100644
index 88b2ba2..0000000
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ServletRequestPropertyHolder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cxf.jaxrs.impl;
-
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.cxf.jaxrs.impl.PropertyHolderFactory.PropertyHolder;
-import org.apache.cxf.message.Message;
-
-public class ServletRequestPropertyHolder implements PropertyHolder {
-    private static final String ENDPOINT_ADDRESS_PROPERTY = "org.apache.cxf.transport.endpoint.address";
-    private HttpServletRequest request;
-    public ServletRequestPropertyHolder(Message m) {
-        request = (HttpServletRequest)m.get("HTTP.REQUEST");
-    }
-
-    @Override
-    public Object getProperty(String name) {
-        return request.getAttribute(name);
-    }
-
-    @Override
-    public void removeProperty(String name) {
-        request.removeAttribute(name);
-    }
-
-    @Override
-    public void setProperty(String name, Object value) {
-        if (value == null) {
-            removeProperty(name);
-        } else {
-            request.setAttribute(name, value);
-        }
-    }
-
-    @Override
-    public Collection<String> getPropertyNames() {
-        List<String> list = new LinkedList<>();
-        Enumeration<String> attrNames = request.getAttributeNames();
-        while (attrNames.hasMoreElements()) {
-            String name = attrNames.nextElement();
-            if (!ENDPOINT_ADDRESS_PROPERTY.equals(name)) {
-                list.add(name);
-            }
-        }
-        return list;
-    }
-
-}
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java
index 605d5a6..0465916 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java
@@ -106,6 +106,12 @@ public class BookApplication extends Application {
         public void aroundWriteTo(WriterInterceptorContext context) throws IOException,
             WebApplicationException {
             context.getHeaders().putSingle("BookWriter", "TheBook");
+            
+            final Object property = context.getProperty("property");
+            if (property != null) {
+                context.getHeaders().putSingle("X-Property-WriterInterceptor", property);
+            }
+            
             context.proceed();
         }
 
@@ -131,7 +137,11 @@ public class BookApplication extends Application {
                 || uri.contains("/application6")) {
                 context.getHeaders().put("BOOK", Arrays.asList("1", "2"));
             }
-
+            
+            final String value = context.getUriInfo().getQueryParameters().getFirst("property");
+            if (value != null) {
+                context.setProperty("property", value);
+            }
         }
 
     }
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java
index c3ff4dc..6192000 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java
@@ -20,8 +20,10 @@
 package org.apache.cxf.systest.jaxrs;
 
 import java.io.InputStream;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.WebApplicationException;
@@ -186,6 +188,15 @@ public class JAXRSClientServerNonSpringBookTest extends AbstractBusClientServerT
             doTestPerRequest("http://localhost:" + PORT + "/application11/thebooks/bookstore2/bookheaders");
         assertEquals("TheBook", r.getHeaderString("BookWriter"));
     }
+    
+    @Test
+    public void testGetBook123PropagatingContextPropertyToWriterInterceptor() throws Exception {
+        Response r = 
+            doTestPerRequest("http://localhost:" + PORT + "/application6/thebooks/bookstore2/bookheaders",
+                new SimpleEntry<>("property", "PropValue"));
+        assertEquals("PropValue", r.getHeaderString("X-Property-WriterInterceptor"));
+    }
+
 
     @Test
     public void testGetBook123TwoApplications() throws Exception {
@@ -193,10 +204,16 @@ public class JAXRSClientServerNonSpringBookTest extends AbstractBusClientServerT
         doTestPerRequest("http://localhost:" + PORT + "/application6/the%20books2/bookstore2/book%20headers");
     }
 
-    private Response doTestPerRequest(String address) throws Exception {
+    @SafeVarargs
+    private final Response doTestPerRequest(String address, Map.Entry<String, String> ... params) throws Exception {
         WebClient wc = WebClient.create(address);
         WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(100000000L);
         wc.accept("application/xml");
+        
+        for (Map.Entry<String, String> param: params) {
+            wc.query(param.getKey(), param.getValue());
+        }
+        
         Response r = wc.get();
         Book book = r.readEntity(Book.class);
         assertEquals("CXF in Action", book.getName());