logging and unit test updates
[debian/openrocket] / src / net / sf / openrocket / logging / DelegatorLogger.java
1 package net.sf.openrocket.logging;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 /**
7  * A logger implementation that delegates logging to other logger implementations.
8  * Multiple loggers can be added to the delegator, all of which will receive
9  * all of the log lines.
10  * 
11  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
12  */
13 public class DelegatorLogger extends LogHelper {
14
15         /**
16          * List of loggers.  This list must not be modified, instead it should be
17          * replaced every time the list is changed.
18          */
19         private volatile ArrayList<LogHelper> loggers = new ArrayList<LogHelper>();
20         
21         @Override
22         public void log(LogLine line) {
23                 // Must create local reference for thread safety
24                 List<LogHelper> list = loggers;
25                 for (LogHelper l: list) {
26                         l.log(line);
27                 }
28         }
29         
30         
31         /**
32          * Add a logger from the delegation list.
33          * @param logger        the logger to add.
34          */
35         @SuppressWarnings("unchecked")
36         public synchronized void addLogger(LogHelper logger) {
37                 ArrayList<LogHelper> newList = (ArrayList<LogHelper>) loggers.clone();
38                 newList.add(logger);
39                 this.loggers = newList;
40         }
41         
42         /**
43          * Remove a logger from the delegation list.
44          * @param logger        the logger to be removed.
45          */
46         @SuppressWarnings("unchecked")
47         public synchronized void removeLogger(LogHelper logger) {
48                 ArrayList<LogHelper> newList = (ArrayList<LogHelper>) loggers.clone();
49                 newList.remove(logger);
50                 this.loggers = newList;
51         }
52
53 }