Hi Thierry,

Thank you for the sample codes.
I modifed the codes so they can show this problem.

You can see that Filter#afterHandle is called before
WriterRepresentation#write in the console.

Regards,
Kenji Tayama

2008/9/11 Thierry Boileau <[EMAIL PROTECTED]>:
> Mail sent on the 09/10 and apparently lost.
> ---
>
> Hello Kenji,
>
> I'm a little surprised by the fact that the Filter#afterHandle method does
> not work as expected. What kind of filter are you suspecting to fail?
> Anyway, I send you a sample code containing 3 classes: an application, a
> resource and a filter.
> The application puts the filter as its own root restlet, thus the
> afterHandle method of the filter is called after all methods.
>
> Please feel free to detail your need, I may have missed something.
>
> Best regards,
> Thierry Boileau
> --
> Restlet ~ Core developer ~ http://www.restlet.org
> Noelios Technologies ~ Co-founder ~ http://www.noelios.com
>
> Hi,
>
> I'm trying to hook the end of POST calls, and I've tried these :
>
> Filter#afterHandle
> Handler#handleXxx
> Application#handle
>
> Works fine for GET requests, but for POST requests, these get called before
> response data is sent to the browser.
>
> Is there any way to hook the point when response data is sent?
>
> Thanks,
> Kenji Tayama
>
>
package testPost;

import org.restlet.Application;
import org.restlet.Client;
import org.restlet.Component;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.Router;
import org.restlet.data.Protocol;
import org.restlet.resource.StringRepresentation;

public class TestApplication extends Application {
        public static void main(String[] args) throws Exception {
                Component component = new Component();
                component.getServers().add(Protocol.HTTP, 8182);
                component.getDefaultHost()
                                .attachDefault(
                                                new 
TestApplication(component.getContext()
                                                                
.createChildContext()));

                component.start();

                Client client = new Client(Protocol.HTTP);
                client.post("http://localhost:8182/";, new 
StringRepresentation("test"));

                component.stop();
        }

        public TestApplication(Context context) {
                super(context);
        }

        @Override
        public Restlet createRoot() {
                Router router = new Router(getContext());
                router.attachDefault(TestResource.class);

                // Filter all requests handled by the application.
                return new TestFilter(getContext(), router);
        }

}
package testPost;

import org.restlet.Context;
import org.restlet.Filter;
import org.restlet.Restlet;
import org.restlet.data.Request;
import org.restlet.data.Response;

public class TestFilter extends Filter {

        public TestFilter(Context context, Restlet next) {
                super(context, next);
        }

        @Override
        protected void afterHandle(Request request, Response response) {
                System.out.println("start afterHandle");
                super.afterHandle(request, response);
                System.out.println("end afterHandle");
        }

        @Override
        protected int beforeHandle(Request request, Response response) {
                System.out.println("start beforeHandle");
                return super.beforeHandle(request, response);
        }

        @Override
        protected int doHandle(Request request, Response response) {
                System.out.println("start doHandle");
                return super.doHandle(request, response);
        }

}
package testPost;

import java.io.IOException;
import java.io.Writer;

import org.restlet.Context;
import org.restlet.data.CharacterSet;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.ResourceException;
import org.restlet.resource.WriterRepresentation;

public class TestResource extends Resource {

        /**
         * Handle post calls
         */
        @Override
        public void acceptRepresentation(Representation entity)
                        throws ResourceException {
                System.out.println("before setEntity");

                WriterRepresentation rep = new 
TestWriterRepresentation(entity.getMediaType());
                rep.setCharacterSet(CharacterSet.UTF_8);
                getResponse().setStatus(Status.SUCCESS_OK);
                getResponse().setEntity(rep);

                System.out.println("after setEntity");
        }

        public TestResource(Context context, Request request, Response 
response) {
                super(context, request, response);
                setModifiable(true);
        }
        
        public class TestWriterRepresentation extends WriterRepresentation {

                public TestWriterRepresentation(MediaType mediaType) {
                        super(mediaType);
                }

                @Override
                public void write(Writer writer) throws IOException {
                        System.out.println("start 
TestWriterRepresentation#write");
                        long start = System.currentTimeMillis();
                        while (System.currentTimeMillis() - start < 3000) {
                                // wait for 3 seconds
                        }
                        
                        writer.write("ok");
                        System.out.println("end 
TestWriterRepresentation#write");
                }
                
        }

}

Reply via email to