package net.sf.openrocket.logging; import java.util.EnumMap; import java.util.List; /** * A logger implementation that buffers specific levels of log lines. * The levels that are logged are set using the method * {@link #setStoreLevel(LogLevel, boolean)}. The stored LogLines can * be obtained using {@link #getLogs()}. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class BufferLogger extends LogHelper { private final CyclicBuffer<LogLine> buffer; private final EnumMap<LogLevel, Boolean> storeLevels = new EnumMap<LogLevel, Boolean>(LogLevel.class); /** * Create a buffered logger with that logs the specified number of log * lines. By default all log levels are buffered. * * @param length the length of the buffer. */ public BufferLogger(int length) { for (LogLevel l: LogLevel.values()) { storeLevels.put(l, true); } buffer = new CyclicBuffer<LogLine>(length); } @Override public void log(LogLine line) { if (storeLevels.get(line.getLevel())) { buffer.add(line); } } /** * Set whether the specified log level is buffered. * * @param level the log level. * @param store whether to store the level. */ public void setStoreLevel(LogLevel level, boolean store) { storeLevels.put(level, store); } /** * Get whether the specified log level is buffered. * * @param level the log level. * @return whether the log level is stored. */ public boolean getStoreLevel(LogLevel level) { return storeLevels.get(level); } /** * Return all the buffered log lines. * * @return a list of all buffered log lines. */ public List<LogLine> getLogs() { return buffer.asList(); } /** * Return the number of log lines that has been overwritten. * * @return the number of log lines missed. */ public int getOverwriteCount() { return buffer.getOverwriteCount(); } }