Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jaxrs-dev] Spec clarification: UriBuilder

JAX-RS is not a common purpose library. It serveres exactly for the sole purpose of implementing or calling RESTful WebServices over HTTP. This includes 100% of the classes and interfaces defined by it. All other uses are out of scope of the specification. Fullstop.

 

You customer hence clearly misuses the class as apparently he is building an URI for a use outside of JAX-RS. We talk about "javax.ws.rs.core.UriBuilder" (hence a part of the JAX-RS kernel) not "java.net.UriBuilder" (hence a part of Java's common purpose networking subsystem). If your customer doesn't understand the difference, please explain to him the difference.

 

UriBuilder in particular does not contain any builder methods for any parts of non-http schemas, so its actual value is doubtful for non-http-schemas. For example, there is no "password(String)" method to build authenticated FTP URLs.

 

1. "The API" is all classes found in javax.ws.rs. This certainly contains UriBuilder. This IS obvious.

 

2. The JAX-RS spec consists of both, the spec text PLUS the JavaDocs. It is a false assumption that the JavaDocs must copy the spec. Your customer must read BOTH.

 

3. The TCK is not authoritative, only the Spec text PLUS the JavaDocs is.

 

As 2.1 is 100% unambiguous there is no need for any additional or copied clarification.

 

-Markus

 

 

Von: jaxrs-dev-bounces@xxxxxxxxxxx [mailto:jaxrs-dev-bounces@xxxxxxxxxxx] Im Auftrag von Jonathan Gallimore
Gesendet: Dienstag, 28. Januar 2020 21:48
An: jaxrs developer discussions
Betreff: Re: [jaxrs-dev] Spec clarification: UriBuilder

 

Hi

 

Thanks for all the great discussion around this, I appreciate it. I'll give my 2 cents, if I may. I do understand the point that the spec is describing REST over HTTP, and hesitation to expand on UriBuilder further for non-http schemes.

 

The reason for seeking clarification, unfortunately, isn't theoretical. The spec provides UriBuilder, and it can be used by a consumer anywhere the API and an implementation is present. I'm in a position where I have a consumer doing just that. I suspect that there was a requirement to build a File URI, and the developer found "UriBuilder" (IDE-auto complete maybe?), saw it under a javax namespace (I appreciate the package is changing in Jakarta EE 9), and thought it was good to use for this purpose.

 

There's a couple of things I'd point out:

 

1. The spec documentation does state "The specification will assume HTTP[bib4] is the underlying network protocol and will provide a clear mapping between HTTP and URI[bib5] elements and the corresponding API classes and annotations."

2. The JavaDoc doesn't specifically call out the fact that UriBuilder is only suitable for HTTP - https://github.com/eclipse-ee4j/jaxrs-api/blob/master/jaxrs-api/src/main/java/jakarta/ws/rs/core/UriBuilder.java, and references RFC 3986 which is much wider ranging than HTTP

3. The TCK specifies tests for UriBuilder for other schemes - for example: https://github.com/eclipse-ee4j/jakartaee-tck/blob/master/src/com/sun/ts/tests/jaxrs/api/rs/core/uribuilder/JAXRSClient.java#L633-L638 includes: mailto, urn, ldap, telnet and foo(!)

 

While point (1) is quite clear, it might not be obvious that it applies to UriBuilder. Even if it is, it appears to be contradictory to (2) and (3).

 

The file URI actually used to work in CXF. The change that broke it, bizarrely, is a change to pass TCK tests for other schemes (mailto, urn, ldap, telnet and foo!). Side note - I have reported this to CXF, and provided a patch. Some adjustments have been requested, but I'm hopeful that if I make the necessary changes, the fix will be merged in.

 

From a spec perspective, if the desire is for UriBuilder to be http only, then I think that should be called out in the Javadoc (and maybe more clearly in the spec doc), and the assertions for non-http schemes removed in the TCK. That would allow an implementation of UriBuilder to support nothing but http schemes and still pass the TCK. If the desire is to allow support for non-http URI schemes, then I think additional tests for UriBuilder.fromUri().path() with a range of schemes is reasonable, and shouldn't be too difficult to add. I doubt it'll have a big impact on the current implementations.  Given that Jakarta EE 9 is mostly package rename, it might not actually be until Jakarta EE 10 that the tests changes would take effect.

 

Whichever way this ends up going, I do think there's some genuine confusion, and need for clarification so the spec doc, javadoc and TCK tests are in alignment. I'm very happy to do the work and submit PRs (in fact I would love the opportunity to do that). 

 

Thank you again for all the discussion. I think it's fantastic to see more of this in the open with the move to Jakarta EE.

 

Jon

 

On Tue, Jan 28, 2020 at 7:33 PM Rob McDougall <rob.mcdougall@xxxxxxxxxx> wrote:

Hi Markus,

 

Are you arguing that the UriBuilder class should be renamed to HttpUriBuilder (since it can’t possibly support all possible URIs and since it is only really required to support http)?

 

I don’t think anyone is really arguing that UriBuilder should or can support all possible schemes, however I don’t think it’s unreasonable for it to support some small number of known (and common) schemes.

 

If I understand your point of view, you are arguing that this small number (as mandated by the JAX-RS spec) should be limited to http-related schemes.  I can understand the logic in that.

 

What is the harm in logging an enhancement request with a specific implementation to support a very slightly larger superset of the schemes mandated by the spec?  The Jersey team has already undertaken the work for their implementation and I wouldn’t imagine the work in supporting it in other implementations is particularly onerous.  I can certainly see the benefit in supporting file:// in addition to the http-related schemes.  Can’t you?

 

Regards,

Rob

 

Rob McDougall | Senior Technical Architect | 4Point | +1.613.907.6415 | www.4Point.com

Receive our news and announcements before anyone else - follow us on:

Twitter icon - small  linkedin icon  - small  Facebook icon - small

 

From: jaxrs-dev-bounces@xxxxxxxxxxx <jaxrs-dev-bounces@xxxxxxxxxxx> On Behalf Of Markus KARG
Sent: Tuesday, January 28, 2020 1:44 PM
To: 'jaxrs developer discussions' <jaxrs-dev@xxxxxxxxxxx>
Subject: Re: [jaxrs-dev] Spec clarification: UriBuilder

 

This could become complex given the fact that UriBuilder is a *Builder* but URI can have infinite schemas and each schema could have infinite syntaxes, so how shall this effectively work? And which vendor would be willing to guarantee support for ANY kind of URI in their existing product?

 

A general tool like this one should be part of Java SE's URI support, not part of JAX-RS. And again, chapter 1.2 mandates the _whole_ API's charter, independent of what a particular class's JavaDoc says.

 

-Markus

 

 

Von: jaxrs-dev-bounces@xxxxxxxxxxx [mailto:jaxrs-dev-bounces@xxxxxxxxxxx] Im Auftrag von Christian Kaltepoth
Gesendet: Dienstag, 28. Januar 2020 08:51
An: jaxrs developer discussions
Betreff: Re: [jaxrs-dev] Spec clarification: UriBuilder

 

I agree that JAX-RS of course focus on HTTP, but UriBuilder is described as "URI template-aware utility class for building URIs". And therefore I would expect that it works with all kind of URIs. I don't think that it is worth to add TCK tests for it, but IMO this could/should be reported to CXF as a bug.

 

Am Mo., 27. Jan. 2020 um 23:30 Uhr schrieb Markus KARG <markus@xxxxxxxxxxxxxxx>:

Jan,

I understand your point, but actually I doubt that any implementing product actually would support file:// URLs anywhere outside of UriBuilder. JAX-RS cleary and explicitly is solely http-centric:

1.2 Goals
The following are the goals of the API:
...
HTTP-centric The specification will assume HTTP[4] is the underlying network protocol and will provide a clear mapping between HTTP and URI[5] elements and the corresponding API classes and annotations. The API will provide high level support for common HTTP usage patterns and will be sufficiently flexible to support a variety of HTTP applications including WebDAV[6] and the Atom
Publishing Protocol[7].
...

So it wouldn't make much sense to force all implementations to support file:// URLs in UriBuilder if that is the sole place where file:// would work then.

Just My 2C
-Markus

-----Ursprüngliche Nachricht-----
Von: jaxrs-dev-bounces@xxxxxxxxxxx [mailto:jaxrs-dev-bounces@xxxxxxxxxxx] Im Auftrag von Jan Supol
Gesendet: Montag, 27. Januar 2020 11:21
An: jaxrs-dev@xxxxxxxxxxx
Betreff: Re: [jaxrs-dev] Spec clarification: UriBuilder

Markus,

UriBuilder refers to RFC 3986. I was always under the impression that
not only the HTTP scheme should be handled by UriBuilder, but other
described by the RFC, too. Am I wrong?

Thanks,

Jan

On 24.01.2020 17:52, Markus KARG wrote:
>
> Well, UriBuilder is defined by JAX-RS, and JAX-RS is an API for
> REST-/over-http/ only, so I doubt there will be a cross-product
> solution be defined by us as long as you want to use any other scheme
> than "http". ;-)
>
> -Markus
>
> *Von:*jaxrs-dev-bounces@xxxxxxxxxxx
> [mailto:jaxrs-dev-bounces@xxxxxxxxxxx] *Im Auftrag von *Jonathan Gallimore
> *Gesendet:* Freitag, 24. Januar 2020 11:53
> *An:* jaxrs-dev@xxxxxxxxxxx
> *Betreff:* [jaxrs-dev] Spec clarification: UriBuilder
>
> Hi
>
> Hopefully this isn't daft question, but I'd appreciate some help. I
> have a scenario where UriBuilder is being used to construct a file
> URI, and append a path to it:
>
> UriBuilder.fromUri("file:///~/calendar").path("extra").build().toString()
>
> I've tried this with a couple of implementations, specifically Jersey
> and CXF, with differing results - Jersey returns
> file:///~/calendar/extra, which is what I personally would expect. CXF
> on the other hand picks up "///~/calendar" as a "schemeSpecificPart"
> of the URI, and used that, and does not append the path.
>
> I'm looking at
> https://github.com/eclipse-ee4j/jakartaee-tck/blob/master/src/com/sun/ts/tests/jaxrs/api/rs/core/uribuilder/JAXRSClient.java -
> its possible I've missed something, but I can't see a case that
> specifically covers file://, or a case that specifically covers
> UriBuilder.fromUri().path() (there are others that test cases such as
> fromUri().port(), fromUri().host() and fromUri().scheme() etc).
>
> Could you clarify what behaviour you'd expect in this scenario, and /
> or point me at the relevant part of the spec document (I'm struggling
> to find a reference there too).
>
> I'd be very happy to contribute any appropriate updates to either
> documentation or TCK tests if necessary.
>
> Many thanks
>
> Jon
>
> --
>
> Jonathan Gallimore
>
> http://www.tomitribe.com <http://www.tomitribe.com/>
>
>
> _______________________________________________
> jaxrs-dev mailing list
> jaxrs-dev@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://www.eclipse.org/mailman/listinfo/jaxrs-dev
_______________________________________________
jaxrs-dev mailing list
jaxrs-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.eclipse.org/mailman/listinfo/jaxrs-dev

_______________________________________________
jaxrs-dev mailing list
jaxrs-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.eclipse.org/mailman/listinfo/jaxrs-dev


 

--

_______________________________________________
jaxrs-dev mailing list
jaxrs-dev@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.eclipse.org/mailman/listinfo/jaxrs-dev


 

--

Jonathan Gallimore


Back to the top