release 0.9.6
[debian/openrocket] / 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         public LogLevelBufferLogger(int count) {
25                 for (LogLevel level: LogLevel.values()) {
26                         loggers.put(level, new BufferLogger(count));
27                 }
28         }
29         
30         @Override
31         public void log(LogLine line) {
32                 // Delegate to the buffered logger of this level
33                 loggers.get(line.getLevel()).log(line);
34         }
35         
36         
37         public List<LogLine> getLogs() {
38                 List<LogLine> result = new ArrayList<LogLine>();
39                 
40                 for (LogLevel level: LogLevel.values()) {
41                         BufferLogger logger = loggers.get(level);
42                         List<LogLine> logs = logger.getLogs();
43                         int misses = logger.getOverwriteCount();
44                         
45                         if (misses > 0) {
46                                 if (logs.isEmpty()) {
47                                         result.add(new LogLine(level, 0, new TraceException(),
48                                                         "--- "+misses+" " + level + " lines removed but log is empty! ---",
49                                                         null));
50                                 } else {
51                                         result.add(new LogLine(level, logs.get(0).getLogCount(), new TraceException(),
52                                                         "--- "+misses+" " + level + " lines removed ---", null));
53                                 }
54                         }
55                         result.addAll(logs);
56                 }
57                 
58                 Collections.sort(result);
59                 return result;
60         }
61         
62
63 }