Hi Paulo,

Thanks for the detailed bug report. I have made the Template thread safe in
both 1.0 branch and SVN trunk. 

Could you test and let me know if everything works now?

Best regards,
Jerome  

> -----Message d'origine-----
> De : Paulo Silveira [mailto:[EMAIL PROTECTED] 
> Envoyé : mercredi 20 février 2008 22:45
> À : [email protected]
> Objet : Uri pattern issue related with concurrence
> 
> Hi all,
> 
> I'm using RESTlet API in my tomcat application using ServletConverter.
> 
> Our servlet creates in his init method a router. In the 
> constructor of this router, it attaches some uri patterns to 
> others routers.
> 
> Our application can be called for many clients in the same 
> time, when we have many calls in the beginning of servlet 
> life circle we are having the following problem:
> 
> During the compilation of uri template it thinks that a 
> pattern variable was used before and it adds to the regexp 
> to: "\\" + (varIndex + 1)
> 
> I think the problem is in getRegexPattern method 
> (org.restlet.util.Template.java). In our case it can be 
> called many times for the same Template object instance. This 
> method can be interrupted by other call before it sets 
> regexPattern variable and it may case that regexVariables 
> tried to add the same pattern variable two times.
> 
> To solve this issue the method getRegexPattern should be done 
> in the constructor of Template or the method getRegexPattern 
> should be synchronized. getRegexPattern method only parses 
> this.regexPattern if it is null and in our case it is null 
> for more than one thread.
> 
> Following I will show a part of my code:
> 
> public class TestServlet extends HttpServlet {
>      private ServletConverter converter;
>      public void init() throws ServletException {
>          super.init();
>          this.converter = new ServletConverter(getServletContext());
>          Router router = new MainTestRouter(converter.getContext());
>          this.converter.setTarget(router);
>      }
> 
>      protected void service(HttpServletRequest req, 
> HttpServletResponse res)
>              throws ServletException, IOException {
>          this.converter.service(req, res);
>      }
> }
> 
> public class MainTestRouter extends Router {
> 
>       public MainTestRouter (Context context) {
>             super(context);
>             attach("/uri1/{version}", new Router1(getContext()));
>             attach("/uri2/{version}", new Router1(getContext()));
>             attach("/uri3/{version}", new Router1(getContext()));
>             attach("/uri4/{version}", new Router1(getContext()));
>             attach("/uri5/{version}", new Router1(getContext()));
>      }
> 
>       // This method can be called concurrently and it will 
> iterate in the same rotes.
>       public void handle(Request request, Response response) {
>             super.handle(request, response);
>       }
> }
> 
> Do you think it is a bug? Am I using it correctly?
> 
> Thanks in advanced,
> Paulo
> 
> 
> 

Reply via email to