Hi Vincent,

You encountered the bug with filter that was just fixed in the latest
snapshot. Please try it.
Also, I'll modify the default StatusFilter to also catch Throwable and think
about a way to let you plug a custom StatusFilter.

Best regards,
Jerome  

> -----Message d'origine-----
> De : news [mailto:[EMAIL PROTECTED] De la part de Vincent
> Envoyé : vendredi 27 octobre 2006 20:03
> À : discuss@restlet.tigris.org
> Objet : Filter questions
> 
> Hi everybody, 
> 
> The (rather long) discussion I had on htis forum with some of 
> you convinced me 
> to give restlet a try and see if it'd be a good fit for our 
> next project. 
> I've been playing with the framework for a few days now and I 
> hit my first snag. 
> 
> Here it goes: 
> 
> My initial configuration is: 
> 
> (filter1) ------- <router> ----- [handler1] 
>                      | 
>                      |---------- [handler2] 
> 
> 
> Now, when a handler throws an Error, it is not caught because 
> StatusFilter.doHandle only catches Exceptions. 
> The second problem is that the call to the error-throwing 
> handler never returns. 
> 
> 
> So I decided to add a second filter, that has pretty much the 
> same behavior as 
> Status Filter, except that it catches Throwable. 
> Here is the new configuration (see below for the code): 
> 
> 
> (filter1) ------- (filter2) ------- <router> ----- [handler1] 
>                                        | 
>                                        |---------- [handler2] 
> 
> But much to my surprise, filter2.doHandle is never executed (although 
> filter2.beforeHandle gets executed). 
> 
> 
> So, here are my questions: 
> 
> 1- how come filter2.doHandle is not executed? 
>    Does it have something to do with scorers and the fact 
> that filter2 does not 
> score high enough? 
>    I must admit I don't get this scoring thing. If somebody 
> could shed some 
> light, that'd be great. 
> 
> 2- How do I subclass StatusFilter to change its behaviour? 
> I.e how do I make 
> ApplicationHelper.start instanciate my StatusHelper class? 
> 
> 
> Thanks, 
> 
> -Vincent. 
> 
> PS: I'm testing with the Simple web server. 
> 
>  
> --------------------------------------------------------------
> -------------------------------- 
> import org.restlet.*; 
> import org.restlet.data.*; 
> 
> public class Test { 
>   public static void main(String[] args) 
>   { 
>     Container container = new Container(); 
>     container.getServers().add(Protocol.HTTP, 8182); 
> 
>     Application application = new Application(container) 
>     { 
>       public Restlet createRoot() 
>       { 
>         // first filter 
>         Filter filter1 = new Filter(getContext()){ 
>           public void beforeHandle(Request request, Response 
> response){ 
>             System.out.println("In filter1.beforeHandle"); 
>           } 
>         }; 
> 
>         // second filter - chain it to the first filter 
>         Filter filter2  = new Filter(getContext()){ 
>           public void beforeHandle(Request request, Response 
> response){ 
>             System.out.println("In filter2.beforeHandle");// 
> This method gets 
> executed 
>           } 
>           public void dohandle(Request request, Response response){ 
>             try{ 
>               System.out.println("in filter2.doHandle"); // 
> How come we never 
> execute this? 
>               super.doHandle(request, response); 
>             } catch(Throwable t){ 
>               t.printStackTrace(); 
>               response.setStatus(Status.SERVER_ERROR_INTERNAL); 
>             } 
>           } 
>         }; 
>         filter1.setNext(filter2); 
> 
>         // A router with 2 handlers - chain it to the second filter 
>         Router router = new Router(getContext()); 
> 
>         router.attach("/foo$",new Handler(){ 
>           public void handle(Request request, Response response){ 
>             response.setEntity("handler foo", MediaType.TEXT_PLAIN); 
>           } 
>         }); 
> 
>         router.attach("/bar$",new Handler(){ 
>           public void handle(Request request, Response response){ 
>             throw new Error("boo!"); 
>             //throw new NullPointerException("boo!"); 
>           } 
>         }); 
>         filter2.setNext(router); 
> 
>         return filter1; 
>       } 
>   }; 
>     container.getDefaultHost().attach("", application); 
>     try { 
>       container.start(); 
>     } 
>     catch(Exception e){ 
>       e.printStackTrace(); 
>     } 
>   } 
> } 
> 
> 
> 

Reply via email to