package com.dragome.forms.bindings.client.command; import com.dragome.forms.bindings.client.channel.Channel; /** * */ public class AsyncEventSupport<R, E> { private AsyncEventsImpl<R, E> alwaysEvents= new AsyncEventsImpl<R, E>(); private AsyncEventsImpl<R, E> onNextCallEvents; public AsyncEvents<R, E> onNextCall() { if (onNextCallEvents == null) { onNextCallEvents= new AsyncEventsImpl(); } return onNextCallEvents; } public AsyncEvents<R, E> always() { return alwaysEvents; } public Trigger prepareEvents() { Trigger trigger= new Trigger(alwaysEvents, onNextCallEvents); onNextCallEvents= null; return trigger; } protected Channel<R> getResultChannel() { return alwaysEvents.getResultChannel(); } protected Channel<E> getErrorChannel() { return alwaysEvents.getErrorChannel(); } public class Trigger { AsyncEventsImpl<R, E>[] events; public Trigger(AsyncEventsImpl<R, E>... events) { this.events= events; } public void fireStart() { for (AsyncEventsImpl<R, E> event : events) { if (event != null) { event.fireStart(); } } } public void fireSuccess(R result) { for (AsyncEventsImpl<R, E> event : events) { if (event != null) { event.fireSuccess(result); } } } public void fireError(E error) { for (AsyncEventsImpl<R, E> event : events) { if (event != null) { event.fireError(error); } } } public void fireFinished() { for (AsyncEventsImpl<R, E> event : events) { if (event != null) { event.fireFinish(); } } } } }