Hi, if you let the default variable type (which is "URI_SEGMENT"), "/language/temp/12345.12345/java/" will match "/language/{var1}/{var2}/java/" and won't match "/language/{var1}/{var2}/" .
If you need to play with the variable types , things become difficult, because when creating the routes, you need to know how to update such variable for such route. A solution is to rely on a convention and to associate type and name of a variable in the URI template: for example "/language/{var1-digit}/{var2-all}/java/". By convention, you can say that "var1-digit" means variable with name "var1" and type "TYPE_DIGIT". This is not very pretty and is just an idea, but I don't see obvious and simple solution since the start point is a map of key/value. best regards, Thierry Boileau > Hi Thierry, > > Thanks for response. > At this point of time please ignore my first mail. > Currently > My use case is something like the one given below: > > I have a map object containing all the URIs to be attached in router. > Entries in this map are like: > > map.put("/language/{var1}/{var2}/java/","com.mypackage.Restlet1"); > > map.put("/language/{var1}/{var2}/","com.mypackage.Restlet2"); > > in my application class's createRoot() method > I iterate over this map and attach each entry in router. > > Now,I have a filter class and In beforeHandle() method of that class I am > trying to iterate over each template from Router list and want to find out > the exact matching template for the formatted URI string from request i.e. > /language/temp/12345.12345/java/ > To achieve this I have written the code as given in my previous mail. > > But the code in previous mail does not match with exact URI but it matches > with both the entries of map. > > So, my question is how should I modify my code to get only one entry i.e. > /language/{var1}/{var2}/java/ for request > /language/temp/12345.12345/java/ and not > /language/{var1}/{var2}/ > > Hope it clears. > > Thanks > Prashant > > >> Hi Prashant, >> >> the problem is that the type of the variable is "Variable.TYPE_URI_ALL" >> which means that it matches every characters. So >> "/language/test/12345/java/" can match "/language/{var1}/{var2}/" >> with "var1 variable valuated to "test/12345" and "var2" to "java". >> By default, a variable matches a URI segment. >> >> Could you explain a little bit more your use case? >> Coming back to your first mail, you told us that "/language/12345/java/" >> cannot match "/language/{var1}/{var2}/". But why? What are the rules >> applied to each variables? >> >> Best regards, >> Thierry Boileau >> -- >> Restlet ~ Core developer ~ http://www.restlet.org >> Noelios Technologies ~ Co-founder ~ http://www.noelios.com >> >> >>> Hi Thierry, >>> >>> Thank you very much for your response. >>> Whatever you explained its fine. But problem in my application is, I have >>> to write code to match the incoming formatted URI with a template(stored in >>> a collection). >>> >>> I am using Template.match(String) method in my code to match formatted URI >>> with a template pattern. >>> >>> Now, what this match method is doing it is returning two matches. >>> >>> E.g. >>> /language/{var1}/{var2}/ >>> /language/{var1}/{var2}/java/ >>> >>> If i send a request to my application with URI >>> /language/test/12345/java/ >>> >>> and try to match using Template.match() method, it is returning >>> >>> two results. >>> >>> Code is something like: >>> >>> Reference URI = request.getResourceRef(); >>> Router router = (Router) getNext(); >>> RouteList list = router.getRoutes(); >>> Iterator<Route> itr = list.listIterator(); >>> while(itr.hasNext()) >>> { >>> Route route = itr.next(); >>> route.getTemplate().getDefaultVariable().setType(Variable.TYPE_URI_ALL); >>> >>> route.getTemplate().setMatchingMode(Template.MODE_EQUALS); >>> >>> if(route.getTemplate().match(URI.getRemainingPart())!=-1) >>> { >>> logger.debug("Match found:"); >>> } >>> } >>> >>> The above given code logs "Match found:" two times for both the URIs. >>> >>> >>> Thanks >>> Prashant >>> >>> >>> >>>> Hello prashant, >>>> >>>> you can specify the type of a single variable as follow: >>>> Route route = router.attach("/language/{var1}/{var2}/", restlet1); >>>> route.getTemplate().getVariables().put("var1", new >>>> Variable(Variable.TYPE_ALPHA)); >>>> >>>> >>>> I also send you a sample application that illustrates this. >>>> >>>> best regards, >>>> Thierry Boileau >>>> >>>> >>>> >>>>> Hi All, >>>>> >>>>> I am new to Restlets even after working for around last 8 months on >>>>> restlets. :-) >>>>> >>>>> I am facing a problem with my application. >>>>> >>>>> Description is as follows: >>>>> >>>>> In my application class I have two REST URIs as given below: >>>>> >>>>> (1st) "/language/{var1}/{var2}/" >>>>> (2nd) "/language/{var1}/{var2}/java/" >>>>> >>>>> I have also set Default matching mode of the router to MODE_EQUALS. >>>>> >>>>> Now, if I test second URI with not providing value for one of the >>>>> varibales e.g. >>>>> /language/12345/java/ >>>>> (Note: value for var1 is missing in this URI) >>>>> >>>>> My Router is matching this URI with first URI template and executes >>>>> restlet class assgined to first URI i.e "/language/{var1}/{var2}/" >>>>> >>>>> Ideally if i have set matching mode to MODE_EQUALS for router it should >>>>> show a message "server has not found anything matching requested URI" >>>>> with response code "404". >>>>> >>>>> Please help me coming out of this problem. I have also tries with changin >>>>> type of default varibale but no luck. >>>>> >>>>> Thanks in advance. >>>>> Prashant >>>>> >>>>> ------------------------------------------------------ >>>>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=989509 >>>>> > > ------------------------------------------------------ http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=990584