Hi
I'm looking into an issue where appending a path to file:// URI with
UriBuilder doesn't work - this has been flagged up in TomEE 8.0.1 which is
using CXF 3.3.4, but works ok with TomEE 7.1.1 (which uses CXF 3.1.18).
In essence, this fails:
UriBuilder.fromUri("file:///~/calendar").path("extra").build().toString() -
the result is file:///~/calendar. without the "/extra" on the end. This is
because the schemeSpecificPart field is set in this if block:
https://github.com/apache/cxf/blob/e6ec5b785e67bbd2464796119a9cdcacf59598c8/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java#L642-L645
and
is used when building the URI, so the appended path is lost.
I've attempted to patch this, by adding a check for a path as well as a
query in this if block:
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 8de34fbb0d..26e7ca357d 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
@@ -651,8 +651,9 @@ public class UriBuilderImpl extends UriBuilder
implements Cloneable {
} else {
schemeSpecificPart = uri.getSchemeSpecificPart();
}
- if (scheme != null && host == null && (query == null ||
query.isEmpty()) && userInfo == null
- && uri.getSchemeSpecificPart() != null) {
+ if (scheme != null && host == null
+ && queryEmpty() && pathEmpty() && userInfo == null
+ && uri.getSchemeSpecificPart() != null) {
schemeSpecificPart = uri.getSchemeSpecificPart();
}
String theFragment = uri.getFragment();
@@ -661,6 +662,14 @@ public class UriBuilderImpl extends UriBuilder
implements Cloneable {
}
}
+ private boolean queryEmpty() {
+ return query == null || query.isEmpty();
+ }
+
+ private boolean pathEmpty() {
+ return paths == null || paths.isEmpty();
+ }
+
This fixes the issue with the file URI above, but causes this test failure:
[ERROR] UriBuilderImplTest.testURItoStringMatchesOriginalURI:1631
expected:<myscheme://[not.really.a.host:fakePort]/> but was:<myscheme://[]/>
I note that this check was added in this commit:
https://github.com/apache/cxf/commit/e6ec5b785e67bbd2464796119a9cdcacf59598c8,
and that references some TCK tests. Is the fakePort scenario necessary to
pass the TCK, or is there other rationale for that case?
I'm very happy to work on a PR to fix along with tests, but would
appreciate a little guidance if there's a specific approach to take. I'll
keep looking to find a way to handle the failing assert I mention above,
but if I've missed something blindingly obvious, please do let me know!
Many thanks
Jon