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