/** * This is free software licensed under the Terms of the GNU Public * license (GPL) V3 (see http://www.gnu.org/licenses/gpl-3.0.html * for details * * No warranty whatsoever is provided. Use at your own risk. * * @author Christoph */ package org.chris.portmapper.logging; import java.io.IOException; import java.io.Writer; import java.util.LinkedList; import java.util.List; import javax.swing.JTextArea; /** * The {@link LogMessageWriter} copies every written string to a * {@link LogMessageListener}. All written strings are buffered, so no string is * missed. A {@link LogMessageListener} can be registered using method * {@link #registerListener(JTextArea)}. * * @author Christoph * @version $Id: LogMessageWriter.java 61 2009-08-15 14:58:46Z christoph $ */ public class LogMessageWriter extends Writer { /** * The listener to which the strings will be forwarded. */ private LogMessageListener logListener; /** * The buffer to which the written strings are added until a listener is * registered. */ private List<String> unprocessedMessagesBuffer; /** * Creates a new {@link LogMessageWriter}. At creation time, no listener is * registered, so that all added text is stored in a buffer. */ public LogMessageWriter() { super(); unprocessedMessagesBuffer = new LinkedList<String>(); } @Override public void close() throws IOException { } @Override public void flush() throws IOException { } @Override public void write(char[] cbuf, int off, int len) { String line = new String(cbuf, off, len); addMessage(line); } /** * Append the given message to the registered {@link LogMessageListener}. If * no listener is registered, the string is written to a buffer. When a * listener is registered, the buffered text will be appended to the * listener. * * @param message * the message to append. */ public void addMessage(String message) { if (this.logListener != null) { this.logListener.addLogMessage(message); } else { unprocessedMessagesBuffer.add(message); } } /** * Registers a {@link JTextArea}, so that all strings written to this writer * are appended to the given text area. After registration, all buffered * strings are appended to the text area, so that no string is missed. * * @param textArea * the text area to wich to append the strings. */ public void registerListener(LogMessageListener textArea) { this.logListener = textArea; // append the buffered text to the text area. for (String line : unprocessedMessagesBuffer) { this.logListener.addLogMessage(line); } // we do not need the buffer any more, all text will be appended // to the text area. this.unprocessedMessagesBuffer = null; } }