Hi Sergey,

I'm sorry again for the delay.

Debugging it I couldn't understand why it isn't working. But here is what I
found:

With the working URL
"renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1":

1) At line 144 of URITemplate

143 Matcher m = templateRegexPattern.matcher(uri);
144        if (!m.matches()) {
145            if (uri.contains(";")) {

The value of the variables are:

uri =
/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1
m =
java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
region=0,73
lastmatch=/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1]
template =
/renderwidget2/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}
templateRegexPattern =
/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?

And m.matches() returns true, so that if is skipped and the method returns
true. After that our implementation of the service is called.

With the NOT working URL
"renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar":

At that same line 144, the variable values are:

uri =
/__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
m =
java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
region=0,109 lastmatch=]
template =
/renderwidget2/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}
templateRegexPattern =
/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?

But m.matches() returns false. So we enter in the if. We also enter in the
if of line 145 "if (uri.contains(";"))".
Then the uri is rebuilded, and at line 162:

160                uri = sb.toString();
161                m = templateRegexPattern.matcher(uri);
162                if (!m.matches()) {
163                    return false;

The value of the variables are:

uri =
/__services/bridging/widgets/renderwidget2/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
m =
java.util.regex.Matcher[pattern=/renderwidget2/id/([^/]+?)/type/([^/]+?)/size/([^/]+?)/locale/([^/]+?)/([^/]+?)(/.*)?
region=0,109 lastmatch=]

That are the same values that we had at the beginning. So again m.matches()
returns false, so we enter to that if on line 162, and the method returns
false.

I really don't know which is the problem, since as far as I can see both uri
should match the pattern. Also I don't know what that first if should do,
since we get the same uri.

I hope that this help, if you need any other test, please feel free to ping
me.

Best,

Gabriel


Sergey Beryozkin-2 wrote:
> 
> I did few more tests today (with/without CXFServlet, with PathSegments)
> and I still can't reproduce it so I will give up for a 
> moment.
> But I'm still nervous you managed to hit a problem somehow - can you
> please give me a favor and help to get to the bottom of it ?
> It should take 30 mins max of your time, download
> http://www.apache.org/dyn/closer.cgi?path=%2Fcxf%2F2.2.2%2Fapache-cxf-2.2.2-src.zip
> 
> and put a breakpoint in URITemplate.match()
> 
> A better news is that after trying to reproduce it,  I added a new method
> to WebClient  which can make it simpler for users to deal 
> with template parameters, such that they can avoid dealing with UriBuilder
> directly.
> So you can do
> WebClient client = WebClient.create("http://widgets";);
> cleint.path("("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}",
>                 idValue, widgetTypeValue, 1, "en_US",
> "properties;1=2").get(Widget.class)
> 
> cheers, Sergey
> 
> 
> ----- Original Message ----- 
> From: "Gabriel Guardincerri" <[email protected]>
> To: <[email protected]>
> Sent: Wednesday, July 01, 2009 10:35 PM
> Subject: Problem with matrix params, works with one, but not with two (or
> more) params
> 
> 
>>
>> Hello,
>>
>> I'm having a problem where matrix parameters are not recognized past the
>> first parameter.  When I have one matrix parameter, the method below is
>> invoked and the PathSegment.getMatrixParameters() returns the single
>> result.
>>
>> However, if I append a second matrix parameter (or more), the service
>> method is not invoked at all and I receive the following error message:
>>
>> "No operation matching request".
>>
>> Service interface:
>>
>> @GET
>> @Path("/renderwidget/id/{widgetID}/type/{widgetType}/size/{size}/locale/{locale}/{properties}")
>>    WSWidget renderWidget(@PathParam("widgetID") Long widgetID,
>>            @PathParam("widgetType") Integer widgetType,
>>            @PathParam("size") Long containerSize,
>>            @PathParam("locale") String locale,
>>            @PathParam("properties") PathSegment props)
>>            throws RemoteBridgeException;
>>
>> Working
>> URL:
>> /renderwidget/id/1007/type/1/size/1/locale/en_US/properties;numResults=1
>>
>> Broken:
>> URL:
>> /renderwidget/id/1007/type/1/size/1/locale/en_US/properties;numResults=1;foo=bar
>>
>> The reason I'm trying to use matrix parameters is that I have an
>> arbitrary map of name/value for a widget class.  I can't try to parse
>> them out individually using @MatrixParam, because they vary by widget
>> class and are not known at the service level.
>>
>> Thanks for your help.
>> -- 
>> View this message in context: 
>> http://www.nabble.com/Problem-with-matrix-params%2C-works-with-one%2C-but-not-with-two-%28or-more%29-params-tp24297533p24297533.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>> 
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Problem-with-matrix-params%2C-works-with-one%2C-but-not-with-two-%28or-more%29-params-tp24297533p24413449.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to