package org.oddjob.beanbus; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; /** * Base class for {@link BusConductor}s. Provides methods for firing * events. * * @author rob * */ abstract public class AbstractBusConductor implements BusConductor { private static final Logger logger = Logger.getLogger(AbstractBusConductor.class); private final List<BusListener> busListeners = new ArrayList<BusListener>(); @Override public void addBusListener(BusListener listener) { busListeners.add(listener); } @Override public void removeBusListener(BusListener listener) { busListeners.remove(listener); } protected void fireBusStarting() throws BusCrashException { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, BusPhase.BUS_STARTING); for (BusListener listener : copy) { listener.busStarting(event); } } protected void fireTripBeginning() throws BusCrashException { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, BusPhase.TRIP_BEGINNING); for (BusListener listener : copy) { listener.tripBeginning(event); } } protected void fireTripEnding() throws BusCrashException { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, BusPhase.TRIP_ENDING); for (BusListener listener : copy) { listener.tripEnding(event); } } protected void fireBusStopRequested(boolean started) { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, started ? BusPhase.BUS_RUNNING : BusPhase.BUS_STOPPED); for (BusListener listener : copy) { listener.busStopRequested(event); } } protected void fireBusStopping() throws BusCrashException { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, BusPhase.BUS_STOPPING); BusCrashException busCrashException = null; for (BusListener listener : copy) { try { listener.busStopping(event); } catch (BusCrashException e) { busCrashException = e; } } if (busCrashException != null) { throw busCrashException; } } protected void fireBusTerminated() { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, BusPhase.BUS_STOPPED); for (BusListener listener : copy) { try { listener.busTerminated(event); } catch (Throwable t) { logger.info("Exception from Listener [" + listener + "]", t); } } } protected void fireBusCrashed(BusPhase phase, Exception e) { List<BusListener> copy = new ArrayList<BusListener>(busListeners); BusEvent event = new BusEvent(this, phase, e); for (BusListener listener : copy) { try { listener.busCrashed(event); } catch (Throwable t) { logger.info("Exception from Listener [" + listener + "]", t); } } } @Override abstract public String toString(); }