create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / logging / LogLevelBufferLogger.java
1 package net.sf.openrocket.logging;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.EnumMap;
6 import java.util.List;
7
8 /**
9  * A logger that buffers a specific number of log lines from every log
10  * level.  This prevents a multitude of lower-level lines from purging
11  * away important higher-level messages.  The method {@link #getLogs()}
12  * combines these logs into their original (natural) order.  A log line 
13  * is also inserted stating the number of log lines of the particular
14  * level that have been purged from the buffer.
15  * 
16  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
17  */
18 public class LogLevelBufferLogger extends LogHelper {
19         
20         private final EnumMap<LogLevel, BufferLogger> loggers =
21                         new EnumMap<LogLevel, BufferLogger>(LogLevel.class);
22         
23         
24         /**
25          * Sole constructor.
26          * @param count         the number of log lines from each level to buffer.
27          */
28         public LogLevelBufferLogger(int count) {
29                 for (LogLevel level : LogLevel.values()) {
30                         loggers.put(level, new BufferLogger(count));
31                 }
32         }
33         
34         @Override
35         public void log(LogLine line) {
36                 // Delegate to the buffered logger of this level
37                 loggers.get(line.getLevel()).log(line);
38         }
39         
40         
41         /**
42          * Retrieve all buffered log lines in order.  A log line is also added to indicate the number of
43          * log lines that have been purged for that log level.
44          * 
45          * @return      a list of log lines in order.
46          */
47         public List<LogLine> getLogs() {
48                 List<LogLine> result = new ArrayList<LogLine>();
49                 
50                 for (LogLevel level : LogLevel.values()) {
51                         BufferLogger logger = loggers.get(level);
52                         List<LogLine> logs = logger.getLogs();
53                         int misses = logger.getOverwriteCount();
54                         
55                         if (misses > 0) {
56                                 if (logs.isEmpty()) {
57                                         result.add(new LogLine(level, 0, 0, null,
58                                                         "===== " + misses + " " + level + " lines removed but log is empty! =====",
59                                                         null));
60                                 } else {
61                                         result.add(new LogLine(level, logs.get(0).getLogCount(), 0, null,
62                                                         "===== " + misses + " " + level + " lines removed =====", null));
63                                 }
64                         }
65                         result.addAll(logs);
66                 }
67                 
68                 Collections.sort(result);
69                 return result;
70         }
71         
72
73 }