Hi Vincent,

Your test contains "dohandle" instead of "doHandle" as a method name, that
why it isn't called. FYI, here is the content of Filter.handle(Request
request, Response response):

                init(request, response);
                beforeHandle(request, response);
                doHandle(request, response);
                afterHandle(request, response);

Best regards,
Jerome  

> -----Message d'origine-----
> De : news [mailto:[EMAIL PROTECTED] De la part de Vincent
> Envoyé : mardi 31 octobre 2006 21:50
> À : [email protected]
> Objet : Re: Filter questions
> 
> >
> Thanks Jerome. The Status filter now catches Throwable, but I 
> still can't
> execute a filter's doHandle method. I must be doing something wrong.
> In the following code (running against 1.0-b20), I would 
> expect that the
> router's doHandle method be wrapped in the filter's doHandle 
> are the latter is
> chained to the former, but it's not happening.
> 
> -Vincent.
> 
> import org.restlet.*;
> import org.restlet.data.*;
> 
> public class Test2 {
> 
>   public static void main(String[] args)
>   {
>     Container container = new Container();
>     container.getServers().add(Protocol.HTTP, 8182);
> 
>     Application application = new Application(container)
>     {
>       public Restlet createRoot()
>       {
>         //  filter
>         Filter filter = new Filter(getContext()){
>           public void beforeHandle(Request request, Response 
> response){
>             System.out.println("In filter.beforeHandle");
>           }
>           public void dohandle(Request request, Response response){
>             System.out.println("in filter.doHandle"); // How 
> come we never
> execute this?
>             super.doHandle(request, response);
>           }
>         };
>         // A router withon handler - 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);
>           }
>         });
>         filter.setNext(router);
> 
>         return filter;
>       }
>     };
>     application.getStatusService().setEnabled(true);
>     container.getDefaultHost().attach("", application);
>     try {
>       container.start();
>     }
>     catch(Exception e){
>       e.printStackTrace();
>     }
>   }
> } 
> 
> Jerome Louvel <contact <at> noelios.com> writes:
> 
> > 
> > 
> > Hi Vincent,
> > 
> > I've just checkins the proposed changes to StatusFilter. 
> > 
> > 1) StatusFilter now catches Errors in addition to Exceptions.
> > 
> > 2) Added create*() methods on ApplicationHelper and 
> ContainerHelper to allow
> > you to provide a subclass of StatusFilter and LogFilter. 
> > 
> > Checked in SVN. New snapshot available too.
> > 
> > Best regards,
> > Jerome  
> > 
> > > -----Message d'origine-----
> > > De : Jerome Louvel [mailto:contact <at> noelios.com] 
> > > Envoyé : samedi 28 octobre 2006 12:14
> > > À : discuss <at> restlet.tigris.org
> > > Objet : RE: Filter questions
> > > 
> > > 
> > > 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:news <at> sea.gmane.org] De la part 
> de Vincent 
> > > > Envoyé : vendredi 27 octobre 2006 20:03 
> > > > À : discuss <at> 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