/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.jivesoftware.util.log.util;
import org.jivesoftware.util.log.Logger;
import org.jivesoftware.util.log.Priority;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;
/**
* Redirect an output stream to a logger.
* This class is useful to redirect standard output or
* standard error to a Logger. An example use is
* <p/>
* <pre>
* final LoggerOutputStream outputStream =
* new LoggerOutputStream( logger, Priority.DEBUG );
* final PrintStream output = new PrintStream( outputStream, true );
* <p/>
* System.setOut( output );
* </pre>
*
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
*/
public class LoggerOutputStream
extends OutputStream {
///Logger that we log to
private final Logger m_logger;
///Log level we log to
private final Priority m_priority;
///The buffered output so far
private final StringBuffer m_output = new StringBuffer();
///Flag set to true once stream closed
private boolean m_closed;
/**
* Construct OutputStreamLogger to send to a particular logger at a particular priority.
*
* @param logger the logger to send to
* @param priority the priority at which to log
*/
public LoggerOutputStream(final Logger logger,
final Priority priority) {
m_logger = logger;
m_priority = priority;
}
/**
* Shutdown stream.
*/
public void close()
throws IOException {
flush();
super.close();
m_closed = true;
}
/**
* Write a single byte of data to output stream.
*
* @param data the byte of data
* @throws IOException if an error occurs
*/
public void write(final int data)
throws IOException {
checkValid();
//Should we properly convert char using locales etc??
m_output.append((char)data);
if ('\n' == data) {
flush();
}
}
/**
* Flush data to underlying logger.
*
* @throws IOException if an error occurs
*/
public synchronized void flush()
throws IOException {
checkValid();
m_logger.log(m_priority, m_output.toString());
m_output.setLength(0);
}
/**
* Make sure stream is valid.
*
* @throws IOException if an error occurs
*/
private void checkValid()
throws IOException {
if (true == m_closed) {
throw new EOFException("OutputStreamLogger closed");
}
}
}