Hi Sergey, 

Thanks, second option works:

OperationResourceInfo ori =
message.getExchange().getContent(OperationResourceInfo.class);
URITemplate t1 = ori.getClassResourceInfo().getURITemplate();;
URITemplate t2 = ori.getURITemplate();

MultivaluedMap<String, String> map = new MetadataMap<String, String>();

t1.match(uriInfo.getPath(), map);
t2.match(map.get(URITemplate.FINAL_MATCH_GROUP), map);

Regards,
Kynan


Sergey Beryozkin wrote:
> 
> Hi Kynan
> 
> You can probably do 
> 
> OperationResourceInfo ori =
> message.getExchange().getContent(OperationResourceInfo.class);
> URITemplate t1 = ori.getClassResourceInfo().getURITemplate();;
> URITemplate t2 = ori.getURITemplate();
> 
> MultivaluedMap<String, String> map = new MetadataMap<String, String>();
> 
> URITemplate.createTemplate(t1.getValue() +
> t2.getValue()).match(uriInfo.getPath(), map);
> 
> or
> 
> t1.match(uriInfo.getPath(), map);
> t2.match(map.get(URITemplate.FINAL_MATCH_GROUP), map);
> 
> hope you won't have to do it starting from 2.2.4 :-)
> 
> cheers, Sergey
> 
> 
> Kynan Fraser wrote:
>> 
>> Hi Sergey,
>> 
>> Just found an issue with this matching - if a class level resource has a
>> path parameter in it then the operation resource info won't
>> return/contain that.
>> 
>> ie.
>> @Path("/something/{id}/more")
>> public class classA{
>> 
>>    @Path("/details/{idx}/")
>>    public void methodB(){
>>   }
>> }
>> 
>> Then this:
>> 
>> UriInfo uriInfo = new UriInfoImpl(message, null);
>> OperationResourceInfo ori =
>> message.getExchange().getContent(OperationResourceInfo.class);
>> MultivaluedMap<String, String> map = new MetadataMap<String, String>();
>> ori.getURITemplate().match(uriInfo.getPath(), map);
>> 
>> will not contain the first {id} param because its an operation level
>> object not class level. Alternatively if i use the ClassResourceInfo for
>> matching, I won't get method level PathParam's.
>> 
>> Is there a way in a request handler to match against the entire path or
>> is this not possible?
>> 
>> Regards,
>> Kynan
>> 
>> 
>> Sergey Beryozkin-2 wrote:
>>> 
>>> Hi Kynan
>>> 
>>> Yes, an initial attempt to match an operation is done before request
>>> handlers are called. It's unfortunate the matched parameters 
>>> are stored in the exchange later on - it's been assumed before that
>>> RequestHandlers would not need to deal with actual parameter 
>>> values (or indeed with operations), rather they may want to affect the
>>> selection of operations by updating say the Accept value.... 
>>> But the moment users can get to the selected operation in filters but
>>> not to the actual values. I've fixed locally this issue by 
>>> making sure matched parameters info is available - thus actually making
>>> it possible for the runtime to properly implement the 
>>> injection of contexts like UriInfo into filtrers.
>>> 
>>> Starting from 2.2.2, there's another option availbale - custom invokers
>>> - it will help you if you can move to 2.2.2 or 2.2.3 :
>>> http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Custominvokers
>>> 
>>> If you have to stay with 2.2.1 then you can do an another templates
>>> match (as you suggested), should not be really expensive:
>>> 
>>> UriInfo uriInfo = new UriInfoImpl(message, null);
>>> OperationResourceInfo ori =
>>> message.getExchange().getContent(OperationResourceInfo.class);
>>> MultivaluedMap<String, String> map = new MetadataMap<String, String>();
>>> ori.getURITemplate().match(uriInfo.getPath(), map);
>>> 
>>> In 2.2.4 you'll be able to do just this in the request handler :
>>> 
>>> UriInfo uriInfo = new UriInfoImpl(message);
>>> uriInfo.getPathParameters();
>>> 
>>> it's a new constructor which will extract the template values itself.
>>> 
>>> Request and Response handlers will also have the injection working
>>> eventually for them like all other JAXRS providers.
>>> 
>>> cheers, Sergey
>>> 
>>> ----- Original Message ----- 
>>> From: "Kynan Fraser" <kynan.fra...@customware.net>
>>> To: <users@cxf.apache.org>
>>> Sent: Friday, September 04, 2009 6:10 AM
>>> Subject: Re: JAXRS - Best way to retrieve path parameters in request
>>> handler
>>> 
>>> 
>>>>
>>>> Hi Gabo,
>>>>
>>>> Thanks for the reply. Yes I had seen all these values but none quite
>>>> fits
>>>> what i'm after.
>>>>
>>>> There's another set of info which is set after request handlers in the
>>>> JAXRSInInterceptor which is
>>>> message.get(URI_TEMPLATE.TEMPLATE_PARAMETERS), which contains the path
>>>> parameters in key/value pair.
>>>>
>>>> This info is built during the JAXRSUtil.findTargetMethod() call using
>>>> some
>>>> uriTemplate.match() calls etc.
>>>>
>>>> I'm really looking for the easiest way to either a) get than info in
>>>> the
>>>> request handler f there's some nifty way of getting it or b)
>>>> implementing
>>>> shortest way of getting it perhaps replicating the uriTemplate matching
>>>> ..
>>>>
>>>> Regards,
>>>> Kynan
>>>>
>>>>
>>>> Gabo Manuel wrote:
>>>>>
>>>>> Hi Kynan,
>>>>>
>>>>> I am not sure if this answers your question, I'll try:
>>>>>
>>>>> These are what I use for an inbound handler extending
>>>>> AbstractPhaseInterceptor<Message> at phase Phase.RECEIVE
>>>>>
>>>>> 1. message.get(Message.BASE_PATH) would give you the path
>>>>>
>>>>> 2. message.get(Message.QUERY_STRING) should give you everything on the
>>>>> right hand side of '?'. Since this would be a key-value pair, getting
>>>>> the name and value should be easy.
>>>>>
>>>>> 3. message.get(Message.REQUEST_URI) should give you the actual URI
>>>>> used.
>>>>> This would allow you to manually retrieve your path parameters. I am
>>>>> not
>>>>> sure how to retrieve the name assigned to that though.
>>>>>
>>>>> 4. message.get(Message.PROTOCOL_HEADERS) would give you all the Http
>>>>> headers, quite useful for authentication.
>>>>>
>>>>> Also, if everything you need is done by a specific interceptor, then
>>>>> maybe calling getAfter().add() at the constructor should cover it. :)
>>>>>
>>>>> Hth
>>>>>
>>>>> Gabo
>>>>>
>>>>> Kynan Fraser wrote:
>>>>>> Hi All,
>>>>>>
>>>>>> I'm writing a request handler which deals with the method going to be
>>>>>> invoked and the parameters provided (both query and path, both name
>>>>>> and
>>>>>> value of each parameter). However i'm having some problem getting at
>>>>>> the
>>>>>> path paramter names and values - well I can ge the names but i need
>>>>>> the
>>>>>> values too.
>>>>>>
>>>>>> It seems like the easiest way to get path paramters is to use
>>>>>> UriInfo(message) then getPathParameters(). But this requires the
>>>>>> URI_TEMPLATE.TEMPLATE_PARAMETERS to be set on the message to be used
>>>>>> in
>>>>>> the
>>>>>> UriInfo constructor. This doesn't seem to be getting done until after
>>>>>> the
>>>>>> request handlers are called in the JAXRSInInterceptor.
>>>>>>
>>>>>> In CXF 2.2.1 - Request handlers are called on line 158 but the values
>>>>>> for
>>>>>> the URI_TEMPLATE.TEMPLATE_PARAMETERS are not set on the message until
>>>>>> line
>>>>>> 191.
>>>>>>
>>>>>> I figure I can always rerun findTargetMethod() or match the uri
>>>>>> template
>>>>>> and
>>>>>> populate it myself but thought there might be a way of getting this
>>>>>> which
>>>>>> is
>>>>>> better.
>>>>>>
>>>>>> Any tips?
>>>>>>
>>>>>> Thanks.
>>>>>> Kynan
>>>>>>
>>>>>> ------------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>>> No virus found in this incoming message.
>>>>>> Checked by AVG - www.avg.com
>>>>>> Version: 8.5.409 / Virus Database: 270.13.76/2343 - Release Date:
>>>>>> 09/03/09 05:50:00
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>> -- 
>>>> View this message in context: 
>>>> http://www.nabble.com/JAXRS---Best-way-to-retrieve-path-parameters-in-request-handler-tp25287837p25288412.html
>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/JAXRS---Best-way-to-retrieve-path-parameters-in-request-handler-tp25287837p25463934.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to