ListenerManager.java
package org.microcol.model;
import java.util.ArrayList;
import java.util.List;
import org.microcol.model.event.DebugRequestedEvent;
import org.microcol.model.event.GameFinishedEvent;
import org.microcol.model.event.GameStartedEvent;
import org.microcol.model.event.RoundStartedEvent;
import org.microcol.model.event.ShipAttackedEvent;
import org.microcol.model.event.ShipMovedEvent;
import org.microcol.model.event.TurnStartedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
class ListenerManager {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final List<ModelListener> listeners;
ListenerManager() {
listeners = new ArrayList<>();
}
void addListener(final ModelListener listener) {
Preconditions.checkNotNull(listener);
if (!listeners.contains(listener)) {
logger.info("Added model listener {}.", listener);
listeners.add(listener);
} else {
logger.warn("Model listener {} already added.", listener);
}
}
void removeListener(final ModelListener listener) {
Preconditions.checkNotNull(listener);
logger.info("Removed model listener {}.", listener);
listeners.remove(listener);
}
void fireGameStarted(final Model model) {
final GameStartedEvent event = new GameStartedEvent(model);
logger.info("Game started {}.", event);
listeners.forEach(listener -> listener.gameStarted(event));
}
void fireRoundStarted(final Model model, final Calendar calendar) {
final RoundStartedEvent event = new RoundStartedEvent(model, calendar);
logger.info("Round started {}.", event);
listeners.forEach(listener -> listener.roundStarted(event));
}
void fireTurnStarted(final Model model, final Player player) {
final TurnStartedEvent event = new TurnStartedEvent(model, player);
logger.info("Turn started {}.", event);
listeners.forEach(listener -> listener.turnStarted(event));
}
void fireShipMoved(final Model model, final Ship ship, final Location start, final Path path) {
final ShipMovedEvent event = new ShipMovedEvent(model, ship, start, path);
logger.info("Ship moved {}.", event);
listeners.forEach(listener -> listener.shipMoved(event));
}
void fireShipAttacked(final Model model, final Ship attacker, final Ship defender, final Ship destroyed) {
final ShipAttackedEvent event = new ShipAttackedEvent(model, attacker, defender, destroyed);
logger.info("Ship attacked {}.", event);
listeners.forEach(listener -> listener.shipAttacked(event));
}
void fireGameFinished(final Model model) {
final GameFinishedEvent event = new GameFinishedEvent(model);
logger.info("Game finished {}.", event);
listeners.forEach(listener -> listener.gameFinished(event));
}
void fireDebugRequested(final Model model, final List<Location> locations) {
final DebugRequestedEvent event = new DebugRequestedEvent(model, locations);
listeners.forEach(listener -> listener.debugRequested(event));
}
}