blob: 79c8dac71b5f91cc27b44ca15309c2d211cad55e [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.web.bindery.event.shared;
import com.google.web.bindery.event.shared.Event.Type;
/**
* Dispatches {@link Event}s to interested parties. Eases decoupling by allowing
* objects to interact without having direct dependencies upon one another, and
* without requiring event sources to deal with maintaining handler lists. There
* will typically be one EventBus per application, broadcasting events that may
* be of general interest.
*
* @see SimpleEventBus
* @see ResettableEventBus
* @see com.google.web.bindery.event.shared.testing.CountingEventBus
*/
public abstract class EventBus {
/**
* Invokes {@code event.dispatch} with {@code handler}.
* <p>
* Protected to allow EventBus implementations in different packages to
* dispatch events even though the {@code event.dispatch} method is protected.
*/
protected static <H> void dispatchEvent(Event<H> event, H handler) {
event.dispatch(handler);
}
/**
* Sets {@code source} as the source of {@code event}.
* <p>
* Protected to allow EventBus implementations in different packages to set an
* event source even though the {@code event.setSource} method is protected.
*/
protected static void setSourceOfEvent(Event<?> event, Object source) {
event.setSource(source);
}
/**
* Adds an unfiltered handler to receive events of this type from all sources.
* <p>
* It is rare to call this method directly. More typically an {@link Event}
* subclass will provide a static <code>register</code> method, or a widget
* will accept handlers directly.
*
* @param <H> The type of handler
* @param type the event type associated with this handler
* @param handler the handler
* @return the handler registration, can be stored in order to remove the
* handler later
*/
public abstract <H> HandlerRegistration addHandler(Type<H> type, H handler);
/**
* Adds a handler to receive events of this type from the given source.
* <p>
* It is rare to call this method directly. More typically a {@link Event}
* subclass will provide a static <code>register</code> method, or a widget
* will accept handlers directly.
*
* @param <H> The type of handler
* @param type the event type associated with this handler
* @param source the source associated with this handler
* @param handler the handler
* @return the handler registration, can be stored in order to remove the
* handler later
*/
public abstract <H> HandlerRegistration addHandlerToSource(Type<H> type, Object source, H handler);
/**
* Fires the event from no source. Only unfiltered handlers will receive it.
* <p>
* Any exceptions thrown by handlers will be bundled into a
* {@link UmbrellaException} and then re-thrown after all handlers have
* completed. An exception thrown by a handler will not prevent other handlers
* from executing.
*
* @throws UmbrellaException wrapping exceptions thrown by handlers
*
* @param event the event to fire
*/
public abstract void fireEvent(Event<?> event);
/**
* Fires the given event to the handlers listening to the event's type.
* <p>
* Any exceptions thrown by handlers will be bundled into a
* {@link UmbrellaException} and then re-thrown after all handlers have
* completed. An exception thrown by a handler will not prevent other handlers
* from executing.
*
* @throws UmbrellaException wrapping exceptions thrown by handlers
*
* @param event the event to fire
*/
public abstract void fireEventFromSource(Event<?> event, Object source);
}