AbstractEventController.java

package org.microcol.gui.event;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Preconditions;

/**
 * Simple event controller. Class should not be extended.
 * 
 * @param <E>
 *            event object type
 */
public abstract class AbstractEventController<E> {

	private final Logger logger = LoggerFactory.getLogger(AbstractEventController.class);

	/**
	 * Holds all registered listeners.
	 */
	private final List<Listener<E>> listeners = new ArrayList<>();

	/**
	 * Method add listener.
	 * 
	 * @param listener
	 *            required listener
	 */
	public void addListener(final Listener<E> listener) {
		Preconditions.checkNotNull(listener);
		if (listeners.contains(listener)) {
			logger.debug("Attempt to register one listener '" + listener + "'more that one time.");
		} else {
			listeners.add(listener);
		}
	}

	/**
	 * Remove listener from controller.
	 * 
	 * @param listener
	 *            required listener instance
	 */
	public void removeListener(final Listener<E> listener) {
		Preconditions.checkNotNull(listener);
		listeners.remove(listener);
	}

	/**
	 * Synchronously invoke event on all listeners. Listeners are called in
	 * random order.
	 * 
	 * @param event
	 *            required event object
	 */
	public void fireEvent(final E event) {
		Preconditions.checkNotNull(event);
		logger.debug("Event " + event + " was triggered.");
		listeners.stream().forEach(listener -> listener.onEvent(event));
	}

}