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