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