package net.sf.openrocket.logging; import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; import java.util.List; /** * A logger that buffers a specific number of log lines from every log * level. This prevents a multitude of lower-level lines from purging * away important higher-level messages. The method {@link #getLogs()} * combines these logs into their original (natural) order. A log line * is also inserted stating the number of log lines of the particular * level that have been purged from the buffer. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class LogLevelBufferLogger extends LogHelper { private final EnumMap<LogLevel, BufferLogger> loggers = new EnumMap<LogLevel, BufferLogger>(LogLevel.class); /** * Sole constructor. * @param count the number of log lines from each level to buffer. */ public LogLevelBufferLogger(int count) { for (LogLevel level : LogLevel.values()) { loggers.put(level, new BufferLogger(count)); } } @Override public void log(LogLine line) { // Delegate to the buffered logger of this level loggers.get(line.getLevel()).log(line); } /** * Retrieve all buffered log lines in order. A log line is also added to indicate the number of * log lines that have been purged for that log level. * * @return a list of log lines in order. */ public List<LogLine> getLogs() { List<LogLine> result = new ArrayList<LogLine>(); for (LogLevel level : LogLevel.values()) { BufferLogger logger = loggers.get(level); List<LogLine> logs = logger.getLogs(); int misses = logger.getOverwriteCount(); if (misses > 0) { if (logs.isEmpty()) { result.add(new LogLine(level, 0, 0, null, "===== " + misses + " " + level + " lines removed but log is empty! =====", null)); } else { result.add(new LogLine(level, logs.get(0).getLogCount(), 0, null, "===== " + misses + " " + level + " lines removed =====", null)); } } result.addAll(logs); } Collections.sort(result); return result; } }