amarkevich closed pull request #383: [CXF-7652] UriBuilderImpl: null-empty 
differentiation for query/matrix
URL: https://github.com/apache/cxf/pull/383
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
index 9eda94398d9..c72d263aa69 100644
--- 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
+++ 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
@@ -811,7 +811,7 @@ public UriBuilder segment(String... segments) throws 
IllegalArgumentException {
      */
     private List<String> toStringList(boolean encodeSlash, Object... values) 
throws IllegalArgumentException {
         List<String> list = new ArrayList<>();
-        if (values != null) {
+        if (values != null && values.length > 0) {
             for (int i = 0; i < values.length; i++) {
                 Object value = values[i];
                 if (value == null) {
@@ -823,9 +823,8 @@ public UriBuilder segment(String... segments) throws 
IllegalArgumentException {
                 }
                 list.add(strValue);
             }
-        }
-        if (list.isEmpty()) {
-            list.add("");
+        } else {
+            list.add(null);
         }
         return list;
     }
@@ -845,18 +844,21 @@ private String buildParams(MultivaluedMap<String, String> 
map, char separator) {
             Map.Entry<String, List<String>> entry = it.next();
             for (Iterator<String> sit = entry.getValue().iterator(); 
sit.hasNext();) {
                 String val = sit.next();
-                boolean templateValue = val.startsWith("{") && 
val.endsWith("}");
-                if (!templateValue) {
-                    val = HttpUtils.encodePartiallyEncoded(val, isQuery);
-                    if (!isQuery) {
-                        val = val.replaceAll("/", "%2F");
-                    }
-                } else {
-                    val = 
URITemplate.createExactTemplate(val).encodeLiteralCharacters(isQuery);
-                }
                 b.append(entry.getKey());
-                if (val.length() != 0) {
-                    b.append('=').append(val);
+                if (val != null) {
+                    boolean templateValue = val.startsWith("{") && 
val.endsWith("}");
+                    if (!templateValue) {
+                        val = HttpUtils.encodePartiallyEncoded(val, isQuery);
+                        if (!isQuery) {
+                            val = val.replaceAll("/", "%2F");
+                        }
+                    } else {
+                        val = 
URITemplate.createExactTemplate(val).encodeLiteralCharacters(isQuery);
+                    }
+                    b.append('=');
+                    if (!val.isEmpty()) {
+                        b.append(val);
+                    }
                 }
                 if (sit.hasNext() || it.hasNext()) {
                     b.append(separator);
diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
index a09bbff56cd..3094a3eb767 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
@@ -1241,14 +1241,12 @@ public static void 
getStructuredParams(MultivaluedMap<String, String> queries,
                                            boolean decodePlus,
                                            boolean valueIsCollection) {
         if (!StringUtils.isEmpty(query)) {
-            List<String> parts = Arrays.asList(StringUtils.split(query, sep));
-            for (String part : parts) {
+            for (String part : query.split(sep)) { // fastpath expected
                 int index = part.indexOf('=');
-                String name = null;
+                final String name;
                 String value = null;
                 if (index == -1) {
                     name = part;
-                    value = "";
                 } else {
                     name = part.substring(0, index);
                     value = index < part.length() ? part.substring(index + 1) 
: "";
@@ -1271,12 +1269,14 @@ private static void 
addStructuredPartToMap(MultivaluedMap<String, String> querie
                                                boolean decode,
                                                boolean decodePlus) {
 
-        if (decodePlus && value.contains("+")) {
-            value = value.replace('+', ' ');
-        }
-        if (decode) {
-            value = (";".equals(sep))
-                ? HttpUtils.pathDecode(value) : HttpUtils.urlDecode(value);
+        if (value != null) {
+            if (decodePlus && value.contains("+")) {
+                value = value.replace('+', ' ');
+            }
+            if (decode) {
+                value = (";".equals(sep))
+                    ? HttpUtils.pathDecode(value) : HttpUtils.urlDecode(value);
+            }
         }
 
         queries.add(HttpUtils.urlDecode(name), value);
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 bf7751ccc5b..9ead3865887 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
@@ -404,15 +404,18 @@ public void testPathSegment(@PathParam("ps") PathSegment 
ps,
     }
 
     @Produces("text/xml")
+    //CHECKSTYLE:OFF: checkstyle:parameternumber
     public void testMultipleQuery(@QueryParam("query")  String queryString,
                                   @QueryParam("query2") String queryString2,
                                   @QueryParam("query3") Long queryString3,
                                   @QueryParam("query4") boolean queryBoolean4,
                                   @QueryParam("query5") char queryChar5,
                                   @QueryParam("query6") String queryString6,
-                                  @QueryParam("query7") Boolean queryString7) {
+                                  @QueryParam("query7") Boolean queryString7,
+                                  @QueryParam("query8") String queryString8) {
         // complete
     }
+    //CHECKSTYLE:ON: checkstyle:parameternumber
 
     @Produces("text/xml")
     public void testMatrixParam(@MatrixParam("p1") String mp1,
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 e04f18114e6..8cd5d3eff2d 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
@@ -824,7 +824,7 @@ public void testQueryParameters() throws Exception {
         Method m = Customer.class.getMethod("testQuery", argType);
         Message messageImpl = createMessage();
 
-        messageImpl.put(Message.QUERY_STRING, "query=24&query2");
+        messageImpl.put(Message.QUERY_STRING, "query=24&query2=");
         List<Object> params = JAXRSUtils.processParameters(new 
OperationResourceInfo(m,
                                                                new 
ClassResourceInfo(Customer.class)),
                                                            null,
@@ -901,7 +901,7 @@ public void testQueryParamAsListWithDefaultValue() throws 
Exception {
         ProviderFactory.getInstance(messageImpl)
             .registerUserProvider(new MyTypeParamConverterProvider());
         messageImpl.put(Message.QUERY_STRING,
-                
"query2=query2Value&query2=query2Value2&query3=1&query3=2&query4");
+                
"query2=query2Value&query2=query2Value2&query3=1&query3=2&query4=");
         List<Object> params = JAXRSUtils.processParameters(new 
OperationResourceInfo(m,
                                                                new 
ClassResourceInfo(Customer.class)),
                                                            null,
@@ -1472,12 +1472,12 @@ private void verifyParametersBean(Method m,
     @Test
     public void testMultipleQueryParameters() throws Exception {
         Class<?>[] argType = {String.class, String.class, Long.class,
-                              Boolean.TYPE, char.class, String.class, 
Boolean.class};
+                              Boolean.TYPE, char.class, String.class, 
Boolean.class, String.class};
         Method m = Customer.class.getMethod("testMultipleQuery", argType);
         Message messageImpl = createMessage();
 
         messageImpl.put(Message.QUERY_STRING,
-                        
"query=first&query2=second&query3=3&query4=true&query6&query7=true");
+                        
"query=first&query2=second&query3=3&query4=true&query6=&query7=true&query8");
         List<Object> params = JAXRSUtils.processParameters(new 
OperationResourceInfo(m,
                                                                new 
ClassResourceInfo(Customer.class)),
                                                            null, messageImpl);
@@ -1486,15 +1486,17 @@ public void testMultipleQueryParameters() throws 
Exception {
         assertEquals("Second Query Parameter of multiple was not matched 
correctly",
                      "second", params.get(1));
         assertEquals("Third Query Parameter of multiple was not matched 
correctly",
-                     new Long(3), params.get(2));
+                    3L, params.get(2));
         assertSame("Fourth Query Parameter of multiple was not matched 
correctly",
                      Boolean.TRUE, params.get(3));
         assertEquals("Fifth Query Parameter of multiple was not matched 
correctly",
                      '\u0000', params.get(4));
-        assertEquals("Six Query Parameter of multiple was not matched 
correctly",
+        assertEquals("Sixth Query Parameter of multiple was not matched 
correctly",
                      "", params.get(5));
         assertSame("Seventh Query Parameter of multiple was not matched 
correctly",
                 Boolean.TRUE, params.get(6));
+        assertNull("Eighth Query Parameter of multiple was not matched 
correctly",
+                params.get(7));
     }
 
     @SuppressWarnings("unchecked")
@@ -1505,7 +1507,7 @@ public void testMatrixParameters() throws Exception {
         Method m = Customer.class.getMethod("testMatrixParam", argType);
         Message messageImpl = createMessage();
 
-        messageImpl.put(Message.REQUEST_URI, 
"/foo;p4=0;p3=3/bar;p1=1;p2/baz;p4=4;p4=5;p5");
+        messageImpl.put(Message.REQUEST_URI, 
"/foo;p4=0;p3=3/bar;p1=1;p2=/baz;p4=4;p4=5;p5");
         List<Object> params = JAXRSUtils.processParameters(new 
OperationResourceInfo(m,
                                                                new 
ClassResourceInfo(Customer.class)),
                                                            null, messageImpl);
@@ -1524,8 +1526,8 @@ public void testMatrixParameters() throws Exception {
         assertEquals("0", list.get(0));
         assertEquals("4", list.get(1));
         assertEquals("5", list.get(2));
-        assertEquals("Sixth Matrix Parameter was not matched correctly",
-                     "", params.get(5));
+        assertNull("Sixth Matrix Parameter was not matched correctly",
+                     params.get(5));
     }
 
     @Test
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
index 059aadd3aaf..418408fa23a 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
@@ -305,7 +305,7 @@ public void testPreMatchContainerFilterThrowsIOException() {
 
     @Test
     public void testPostMatchContainerFilterThrowsException() {
-        String address = "http://localhost:"; + PORT + 
"/bookstore/bookheaders/simple?throwException";
+        String address = "http://localhost:"; + PORT + 
"/bookstore/bookheaders/simple?throwException=true";
         WebClient wc = WebClient.create(address);
         Response response = wc.get();
         assertEquals(500, response.getStatus());


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to