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/06/10 12:33:29 UTC

[cxf] branch 3.2.x-fixes updated (78d8f9c -> 88fda95)

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

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


    from 78d8f9c  CXF-8300 - Swagger2Feature displays cached API when service is redeployed
     new cb3d556  CXF-8296: Custom Boolean ParamConverter wrong behaviour (#677)
     new 88fda95  Recording .gitmergeinfo Changes

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitmergeinfo                                      |  2 +
 .../org/apache/cxf/jaxrs/utils/InjectionUtils.java | 37 +++++++++----
 .../test/java/org/apache/cxf/jaxrs/Customer.java   | 12 +++-
 .../org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java | 64 ++++++++++++++++++++++
 4 files changed, 104 insertions(+), 11 deletions(-)


[cxf] 02/02: Recording .gitmergeinfo Changes

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 88fda95840f203755aa40113d79429ccf13c14b5
Author: reta <dr...@gmail.com>
AuthorDate: Tue Jun 9 23:01:32 2020 -0400

    Recording .gitmergeinfo Changes
---
 .gitmergeinfo | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitmergeinfo b/.gitmergeinfo
index 510b46b..d91acb9 100644
--- a/.gitmergeinfo
+++ b/.gitmergeinfo
@@ -874,6 +874,7 @@ B eb8006be87943ce5b014e1bc3edc3db15eb3130e
 B ebdf7da7765376d159fe41bda94188ccb6b0be1e
 B ec1f1bbca53a5831856fd922af83e763ed8f4d5d
 B ec4d50bd3c69617b0d7db23f1e059ad3a4c88fb1
+B ec7007bda3bc42259a99277f8fd221c36a76ce80
 B ec8e5fd6e4ec0093cc788196f85630d1b2160a89
 B ecb15d9ed53a1b4dd462399a33a9c4eb8a93e195
 B eccb71ea477a36747914d7f17908cc6d591d390b
@@ -1044,6 +1045,7 @@ M 77b0819893e6c18806c8c6b7c07313d29e75e7eb
 M 7808ae48865df413346f523ca6e8df7bcedb2091
 M 78d29a1ab8817109b644b9679202b4ca0a00b954
 M 79db1058267302fe7febc5aaa4e0b42bf724ba90
+M 7a53829673420f8d6f3bc14da7fe8d99bf9cf9d0
 M 7ca5e8c433432a9ba73382bc26eec6d22026ccf1
 M 7cb48e03d9a2875bb590dc74330e3817d530d9bf
 M 7cd4288b0876f0ab5303aee87adba6ece0cc3a45


[cxf] 01/02: CXF-8296: Custom Boolean ParamConverter wrong behaviour (#677)

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit cb3d556c2c96dbc7048216e3b4ce3b58fa139d89
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Tue Jun 9 16:44:40 2020 -0400

    CXF-8296: Custom Boolean ParamConverter wrong behaviour (#677)
    
    (cherry picked from commit e68022f3d92725f4379391559cf843bd56335673)
    (cherry picked from commit 7a53829673420f8d6f3bc14da7fe8d99bf9cf9d0)
    
    # Conflicts:
    #	rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
---
 .../org/apache/cxf/jaxrs/utils/InjectionUtils.java | 37 +++++++++----
 .../test/java/org/apache/cxf/jaxrs/Customer.java   | 12 +++-
 .../org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java | 64 ++++++++++++++++++++++
 3 files changed, 102 insertions(+), 11 deletions(-)

diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
index cee4a59..aaed8f2 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
@@ -45,6 +45,7 @@ import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.SortedSet;
@@ -418,9 +419,12 @@ public final class InjectionUtils {
 
         value = decodeValue(value, decoded, pType);
 
+        final Optional<ParamConverter<T>> converter = getParamConverter(pClass, genericType, paramAnns, message);
         Object result = null;
         try {
-            result = createFromParameterHandler(value, pClass, genericType, paramAnns, message);
+            if (converter.isPresent()) {
+                result = converter.get().fromString(value);
+            }
         } catch (IllegalArgumentException nfe) {
             throw createParamConversionException(pType, nfe);
         }
@@ -432,6 +436,10 @@ public final class InjectionUtils {
                 theResult = pClass.cast(result);
             }
             return theResult;
+        } else if (converter.isPresent() && !pClass.isPrimitive()) {
+            // The converter was applied and returned null value, acceptable
+            // outcome for non-primitive type.
+            return pClass.cast(result);
         }
 
         if (Number.class.isAssignableFrom(pClass) && "".equals(value)) {
@@ -520,21 +528,30 @@ public final class InjectionUtils {
         }
         return ExceptionUtils.toBadRequestException(ex, null);
     }
+    
+    public static <T> Optional<ParamConverter<T>> getParamConverter(Class<T> pClass,
+            Type genericType, Annotation[] anns, Message message) {
+        
+        if (message != null) {
+            ServerProviderFactory pf = ServerProviderFactory.getInstance(message);
+            ParamConverter<T> pm = pf.createParameterHandler(pClass, genericType, anns, message);
+            return Optional.ofNullable(pm);
+        }
+        
+        return Optional.empty();
+    }
+
     public static <T> T createFromParameterHandler(String value,
                                                     Class<T> pClass,
                                                     Type genericType,
                                                     Annotation[] anns,
                                                     Message message) {
-        T result = null;
-        if (message != null) {
-            ServerProviderFactory pf = ServerProviderFactory.getInstance(message);
-            ParamConverter<T> pm = pf.createParameterHandler(pClass, genericType, anns, message);
-            if (pm != null) {
-                result = pm.fromString(value);
-            }
-        }
-        return result;
+        return getParamConverter(pClass, genericType, anns, message)
+            .map(pm -> pm.fromString(value))
+            .orElse(null);
     }
+    
+    
 
     public static void reportServerError(String messageName, String parameter) {
         reportServerError(messageName, parameter, true);
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
index 1f169ac..5263ee9 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
@@ -33,6 +33,7 @@ import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.BeanParam;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.CookieParam;
 import javax.ws.rs.DefaultValue;
@@ -85,6 +86,8 @@ public class Customer extends AbstractCustomer implements CustomerInfo {
         //CHECKSTYLE:OFF
         public List<CustomerBean> e;
         //CHECKSTYLE:ON
+        @FormParam("value")
+        private Boolean bool;
 
         public void setA(String aString) {
             this.a = aString;
@@ -122,7 +125,12 @@ public class Customer extends AbstractCustomer implements CustomerInfo {
         public void setCb(boolean cb) {
             this.cb = cb;
         }
-
+        public void setBool(Boolean bool) {
+            this.bool = bool;
+        }
+        public Boolean getBool() {
+            return bool;
+        }
     }
 
     @Context private ContextResolver<JAXBContext> cr;
@@ -251,7 +259,9 @@ public class Customer extends AbstractCustomer implements CustomerInfo {
     public void testMatrixBean(@MatrixParam("") CustomerBean cb) {
 
     }
+    public void testBeanParam(@BeanParam CustomerBean cb) {
 
+    }
     public Application getApplication1() {
         return application1;
     }
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
index 6744615..9cff218 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
@@ -2090,6 +2090,42 @@ public class JAXRSUtilsTest extends Assert {
         SimpleFactory sf = (SimpleFactory)params.get(1);
         assertEquals(2, sf.getId());
     }
+    
+    @Test
+    public void testBeanParamsWithBooleanConverter() throws Exception {
+        Class<?>[] argType = {Customer.CustomerBean.class};
+        Method m = Customer.class.getMethod("testBeanParam", argType);
+        Message messageImpl = createMessage();
+        messageImpl.put(Message.REQUEST_URI, "/bar");
+        
+        // The converter converts any Boolean to null
+        ProviderFactory.getInstance(messageImpl)
+            .registerUserProvider(new MyBoolParamConverterProvider());
+        
+        MultivaluedMap<String, String> headers = new MetadataMap<>();
+        headers.putSingle("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
+        messageImpl.put(Message.PROTOCOL_HEADERS, headers);
+        String body = "value=true";
+        messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes()));
+
+        final ClassResourceInfo cri = new ClassResourceInfo(Customer.class);
+        final MethodDispatcher md = new MethodDispatcher();
+        
+        final OperationResourceInfo ori = new OperationResourceInfo(m, cri);
+        md.bind(ori, m);
+        
+        cri.setMethodDispatcher(md);
+        cri.initBeanParamInfo(ServerProviderFactory.getInstance(messageImpl));
+
+        List<Object> params = JAXRSUtils.processParameters(ori,
+                                                           null,
+                                                           messageImpl);
+        assertEquals("Bean should be created", 1, params.size());
+        Customer.CustomerBean cb = (Customer.CustomerBean)params.get(0);
+        assertNotNull(cb);
+
+        assertNull(cb.getBool());
+    }
 
     private static OperationResourceInfo findTargetResourceClass(List<ClassResourceInfo> resources,
                                                                 Message message,
@@ -2135,6 +2171,33 @@ public class JAXRSUtilsTest extends Assert {
         e.put(Endpoint.class, endpoint);
         return m;
     }
+
+    @SuppressWarnings("unchecked")
+    static class MyBoolParamConverterProvider implements ParamConverterProvider {
+        @Override
+        public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
+            if (rawType.isAssignableFrom(Boolean.TYPE) || rawType.isAssignableFrom(Boolean.class)) {
+                return (ParamConverter<T>) new ParamConverter<Boolean>() {
+                    @Override
+                    public Boolean fromString(String value) {
+                        if (rawType.isAssignableFrom(Boolean.TYPE)) {
+                            return true;
+                        }
+                        return null;
+                    }
+        
+                    @Override
+                    public String toString(Boolean value) {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+            
+            return null;
+        }
+    }
+    
+    
     static class MyTypeParamConverterProvider
         implements ParamConverterProvider, ParamConverter<MyType<Integer>> {
 
@@ -2163,6 +2226,7 @@ public class JAXRSUtilsTest extends Assert {
         }
 
     }
+
     private static class LocaleParameterHandler implements ParamConverterProvider, ParamConverter<Locale> {
 
         @SuppressWarnings("unchecked")