package net.sf.openrocket.logging; import java.util.List; import net.sf.openrocket.util.ArrayList; /** * A logger implementation that delegates logging to other logger implementations. * Multiple loggers can be added to the delegator, all of which will receive * all of the log lines. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class DelegatorLogger extends LogHelper { /** * List of loggers. This list must not be modified, instead it should be * replaced every time the list is changed. */ private volatile ArrayList<LogHelper> loggers = new ArrayList<LogHelper>(); @Override public void log(LogLine line) { // Must create local reference for thread safety List<LogHelper> list = loggers; for (LogHelper l : list) { l.log(line); } } /** * Add a logger from the delegation list. * @param logger the logger to add. */ public synchronized void addLogger(LogHelper logger) { ArrayList<LogHelper> newList = loggers.clone(); newList.add(logger); this.loggers = newList; } /** * Remove a logger from the delegation list. * @param logger the logger to be removed. */ public synchronized void removeLogger(LogHelper logger) { ArrayList<LogHelper> newList = loggers.clone(); newList.remove(logger); this.loggers = newList; } }