restgwtcallbackresty-gwt

Resty-GWT custom callback on async start and end


I use resty gwt for all server communication. I would like some indicator that would show the operation is in progress.

I consider 2 aproaches:

I've assumed that I need to add custom filter with callback. I would like to fire events like: RestyGwtComunicationStart and RestyGwtComunicationEnd, or callback to fire onComunicationStarted and onComunicationEnded. I would like to have this declared in one place, RestyGWT Dispatcher configuration. Also if there was an error I would like to fetch the error.

But I don't know where to start. There is no word about it in documentations.

Can I ask You for help? How can I do this?


Solution

  • Unfortunately I did not get adequate answer, So I developed my own solution.

    At first I've added Resty configuration RestyGwtConfig to my Module configuration

    public class ClientModule extends AbstractPresenterModule {
        @Override
        protected void configure() {
            bind(RestyGwtConfig.class).asEagerSingleton();
            install(new DefaultModule.Builder()
            .defaultPlace(Routing.HOME.url)
            .errorPlace(Routing.ERROR.url)
            .unauthorizedPlace(Routing.LOGIN.url)
            .tokenFormatter(RouteTokenFormatter.class).build());
            install(new AppModule());
            install(new GinFactoryModuleBuilder().build(AssistedInjectionFactory.class));
            bind(ResourceLoader.class).asEagerSingleton();
        }
    }
    

    then I've set Custom distpatcher for all my comunication requests of resty gwt.

    import org.fusesource.restygwt.client.Defaults;
    import org.fusesource.restygwt.client.Resource;
    import pl.korbeldaniel.cms.shared.ServiceRouting;
    import com.google.gwt.core.client.GWT;
    import com.google.inject.Inject;
    
    public class RestyGwtConfig {
        @Inject
        public RestyGwtConfig(RestyDispatcher dispatcher) {
            Defaults.setDispatcher(dispatcher);
        }
    }
    

    Then I've added custom filter (ProgressIndicatorFilter) to handle communication's start and end callbacks:

    import org.fusesource.restygwt.client.Method;
    import org.fusesource.restygwt.client.dispatcher.DefaultFilterawareDispatcher;
    import com.google.gwt.http.client.Request;
    import com.google.gwt.http.client.RequestBuilder;
    import com.google.gwt.http.client.RequestException;
    import com.google.inject.Inject;
    
    public class RestyDispatcher extends DefaultFilterawareDispatcher {
        @Inject
        public RestyDispatcher(ProgressIndicatorFilter progressIndicatorFilter) {
            addFilter(progressIndicatorFilter);
        }
    }
    

    in filter class method overriden filter I've added an event trigger (eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication started"));) and registered callback, here is whole code:

    import org.fusesource.restygwt.client.Method;
    import org.fusesource.restygwt.client.dispatcher.DispatcherFilter;
    import pl.korbeldaniel.cms.client.template.progressIndicator.IndicatorEvent;
    import com.google.gwt.http.client.RequestBuilder;
    import com.google.inject.Inject;
    import com.google.web.bindery.event.shared.EventBus;
    
    class ProgressIndicatorFilter implements DispatcherFilter {
        private AssistedInjectionFactory factory;
        private EventBus eventBus;
    
        @Inject
        public ProgressIndicatorFilter(AssistedInjectionFactory factory, EventBus eventBus) {
            this.factory = factory;
            this.eventBus = eventBus;
        }
        @Override
        public boolean filter(Method method, RequestBuilder builder) {
            builder.setCallback(factory.createProgressIndicatorCallback(method));
            eventBus.fireEvent(new IndicatorEvent("Resty-Gwt Comunication started"));
            return true;
        }
    }
    

    Registering a callback couldn't be done straight forward, like

    new ProgressIndicatorDispatcherCallback()

    cause I use dependency injection. So I've created a factory to assist injection as follow:

    public interface AssistedInjectionFactory {
        ProgressIndicatorDispatcherCallback createProgressIndicatorCallback(Method method);
    }
    

    Here and here You can find more Assisted Injection info.

    Here is the callback code:

    class ProgressIndicatorDispatcherCallback implements RequestCallback {
        private RequestCallback requestCallback;
        private EventBus eventBus;
    
        @Inject
        public ProgressIndicatorDispatcherCallback(@Assisted Method method, EventBus eventBus) {
            this.requestCallback = method.builder.getCallback();
            this.eventBus = eventBus;
        }
        @Override
        public void onResponseReceived(Request request, Response response) {
            endComunicationFireIvent();
            requestCallback.onResponseReceived(request, response);
        }
        @Override
        public void onError(Request request, Throwable exception) {
            endComunicationFireIvent();
            requestCallback.onError(request, exception);
        }
        private void endComunicationFireIvent() {
            eventBus.fireEvent(new IndicatorEvent("Rest-Gwt Comunication ended"));
        }
    }