/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Flemming N. Larsen & Pavel Savara * - Initial implementation *******************************************************************************/ package net.sf.robocode.battle.events; import static net.sf.robocode.io.Logger.logError; import net.sf.robocode.io.Logger; import robocode.control.events.*; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * @author Flemming N. Larsen (original) * @author Pavel Savara (original) * @since 1.6.1 */ public class BattleEventDispatcher implements IBattleListener { // This list is guaranteed to be thread-safe, which is necessary as it will be accessed // by both the battle thread and battle manager thread. If this list is not thread-safe // then ConcurentModificationExceptions will occur from time to time. private final List<IBattleListener> listeners = new CopyOnWriteArrayList<IBattleListener>(); public BattleEventDispatcher() {} public void addListener(IBattleListener listener) { assert (listener != null); listeners.add(listener); } public void removeListener(IBattleListener listener) { assert (listener != null); listeners.remove(listener); } public void onBattleStarted(BattleStartedEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleStarted(event); } catch (Throwable ex) { logError("onBattleStarted " + listener.getClass(), ex); } } } public void onBattleCompleted(BattleCompletedEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleCompleted(event); } catch (Throwable ex) { logError("onBattleCompleted " + listener.getClass(), ex); } } } public void onBattleFinished(BattleFinishedEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleFinished(event); } catch (Throwable ex) { logError("onBattleFinished " + listener.getClass(), ex); } } } public void onBattlePaused(BattlePausedEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattlePaused(event); } catch (Throwable ex) { logError("onBattlePaused " + listener.getClass(), ex); } } } public void onBattleResumed(BattleResumedEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleResumed(event); } catch (Throwable ex) { logError("onBattleResumed " + listener.getClass(), ex); } } } public void onRoundStarted(RoundStartedEvent event) { for (IBattleListener listener : listeners) { try { listener.onRoundStarted(event); } catch (Throwable ex) { logError("onRoundStarted " + listener.getClass(), ex); } } } public void onRoundEnded(RoundEndedEvent event) { for (IBattleListener listener : listeners) { try { listener.onRoundEnded(event); } catch (Throwable ex) { logError("onRoundEnded " + listener.getClass(), ex); } } } public void onTurnStarted(TurnStartedEvent event) { for (IBattleListener listener : listeners) { try { listener.onTurnStarted(event); } catch (Throwable ex) { logError("onTurnStarted " + listener.getClass(), ex); } } } public void onTurnEnded(TurnEndedEvent event) { for (IBattleListener listener : listeners) { try { listener.onTurnEnded(event); } catch (Throwable ex) { logError("onTurnEnded " + listener.getClass(), ex); } } } public void onBattleMessage(BattleMessageEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleMessage(event); } catch (Throwable ex) { logError("onBattleMessage " + listener.getClass(), ex); } } } public void onBattleError(BattleErrorEvent event) { for (IBattleListener listener : listeners) { try { listener.onBattleError(event); } catch (Throwable ex) { Logger.realErr.println(listener.getClass() + " " + ex.getMessage()); } } } }