/* * Quasar: lightweight threads and actors for the JVM. * Copyright (c) 2013-2014, Parallel Universe Software Co. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 3.0 * as published by the Free Software Foundation. */ package co.paralleluniverse.actors.behaviors; import co.paralleluniverse.actors.ActorRef; import static co.paralleluniverse.actors.behaviors.RequestReplyHelper.call; import co.paralleluniverse.fibers.SuspendExecution; /** * An interface to an {@link EventSourceActor}. * * @author pron */ public class EventSource<Event> extends Behavior { /** * If {@code actor} is known to be a {@link EventSourceActor}, creates a new {@link EventSource} interface to it. * Normally, you don't use this constructor, but the {@code EventSource} instance returned by {@link EventSourceActor#spawn() }. * * @param actor an {@link EventSourceActor} */ EventSource(ActorRef<Object> actor) { super(actor); } /** * Adds an {@link EventHandler} that will be notified of every event sent to this actor. * * @param handler the handler * @return {@code true} if the handler has been successfully added to the actor, or {@code false} if the handler was already registered. */ public boolean addHandler(EventHandler<Event> handler) throws SuspendExecution, InterruptedException { if (isInActor()) return EventSourceActor.<Event>currentEventSourceActor().addHandler(handler); return (Boolean) call(this, new EventSourceActor.HandlerMessage(RequestReplyHelper.from(), null, handler, true)); } /** * Removes an {@link EventHandler} from the actor * * @param handler * @return {@code true} if the handler was registered and successfully removed, or {@code false} if the handler was not registered. */ public boolean removeHandler(EventHandler<Event> handler) throws SuspendExecution, InterruptedException { if (isInActor()) return EventSourceActor.<Event>currentEventSourceActor().removeHandler(handler); return (Boolean) call(this, new EventSourceActor.HandlerMessage(RequestReplyHelper.from(), null, handler, false)); } /** * Sends an event to the actor, which will be delivered to all registered event handlers. * * @param event the event */ public void notify(Event event) throws SuspendExecution { send(event); } @Override public String toString() { return "EventSource{" + super.toString() + "}"; } }