jsr339-experts@jax-rs-spec.java.net

[jsr339-experts] Re: Matching algorithm doesn't recurse back on Locators

From: Sergey Beryozkin <sberyozkin_at_talend.com>
Date: Fri, 17 May 2013 14:35:50 +0100

On 17/05/13 13:59, Bill Burke wrote:
>
>
> On 5/17/2013 4:35 AM, Sergey Beryozkin wrote:
>> Hi Bill
>> On 17/05/13 04:41, Bill Burke wrote:
>>> Let me give you an example:
>>>
>>> Given this request:
>>>
>>> OPTIONS /sub
>>>
>>> This will match:
>>>
>>> @Path("/")
>>> class Resource {
>>>
>>> @Path("{id}")
>>> public Locator locator() { return new Locator();}
>>>
>>> }
>>>
>>> class Locator {
>>>
>>> @OPTIONS
>>> public String options() { return "OK"; }
>>> }
>>>
>>> But this won't match:
>>>
>>> @Path("/")
>>> class Resource {
>>>
>>> @GET
>>> @Path("sub")
>>> public String get() { return "OK"; }
>>>
>>> @Path("{id}")
>>> public Locator locator() { return new Locator();}
>>>
>>> }
>>>
>> Seems to me it will too. @GET method is selected only if no @OPTIONS is
>> available and in this case it is available.
>>
>
> Check out the spec. It won't match because "sub" is matched in 2(h).
> 2(h) says that if there are any non-locator matches, then go to 3, then
> 3(a) will abort the request.
But get() does not match OPTIONS, it will only match

GET /sub

and it will only match OPTIONS if no OPTIONS handler is available, but
OPTIONS handler is available.

Now we go to Locator and then we match OPTIONS. The only issue is that
what happens if Locator has no OPTIONS too, I guess we have missed then
the opportunity to match Resource.get because GET can be used to match
OPTIONS if no OPTIONS exist. To be honest I do not see it as a big issue,

I believe the spec says that if no OPTIONS handler is available then
check GET, we have no GET on Locator so we should report all the verbs
supported by it and its root Resource which is "GET", and it is cheaper
than calling @GET method as a last resort as doing it may be expensive


Cheers, Sergey

>
> I ran into this very problem when testing against the TCK. The TCK
> assumes there is no loopback to Locators and one of the tests fails. I'm
> able to fix this problem quite easily, but, I have some users that
> reported this as a "bug". They will now "regress".
>
>


-- 
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com