package com.dragome.forms.bindings.client.command; import com.dragome.forms.bindings.client.binding.Disposable; import com.dragome.forms.bindings.client.channel.DefaultChannel; import com.dragome.forms.bindings.client.channel.Destination; import com.dragome.forms.bindings.client.util.SubscriptionList; import com.dragome.forms.bindings.extra.user.client.Command; /** * Created by IntelliJ IDEA. * User: andrew * Date: Apr 1, 2010 * Time: 1:38:00 PM * To change this template use File | Settings | File Templates. */ public abstract class AbstractEvents implements Events { private SubscriptionList<LifeCycleCallback> callbacks= new SubscriptionList<LifeCycleCallback>(); private DefaultChannel<Void> startChannel= new DefaultChannel<Void>(); private DefaultChannel<Void> finishedChannel= new DefaultChannel<Void>(); protected AbstractEvents() { } protected void fireStart() { startChannel.publish(null); visitSubscribers(new SubscriptionList.Visitor<LifeCycleCallback>() { public void visit(LifeCycleCallback subscriber) { subscriber.onStart(); } }); } protected void fireFinish() { finishedChannel.publish(null); visitSubscribers(new SubscriptionList.Visitor<LifeCycleCallback>() { public void visit(LifeCycleCallback subscriber) { subscriber.onFinish(); } }); } protected void visitSubscribers(SubscriptionList.Visitor<LifeCycleCallback> visitor) { if (visitor == null) { throw new NullPointerException("visitor is null"); } callbacks.visitSubscribers(visitor); } public Disposable onStartInvoke(final Command command) { if (command == null) { throw new NullPointerException("command is null"); } return startChannel.sendTo(new Destination<Void>() { public void receive(Void value) { command.execute(); } }); } public <T> SendToBuilder<T> onStartSend(final T value) { return new SendToBuilderImpl<T>(startChannel, value); } public Disposable onFinishInvoke(final Command command) { if (command == null) { throw new NullPointerException("command is null"); } return finishedChannel.sendTo(new Destination<Void>() { public void receive(Void value) { command.execute(); } }); } public Disposable sendAllEventsTo(LifeCycleCallback callback) { if (callback == null) { throw new NullPointerException("callback is null"); } return callbacks.subscribe(callback); } public <T> SendToBuilder<T> onFinishSend(final T value) { return new SendToBuilderImpl<T>(finishedChannel, value); } }