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();
> > > > }
> > > > }
> > > > }
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>
>