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