/*
* 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.output.io;
import org.jivesoftware.util.log.format.Formatter;
import org.jivesoftware.util.log.output.AbstractOutputTarget;
import java.io.IOException;
import java.io.OutputStream;
/**
* A basic target that writes to an OutputStream.
*
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
*/
public class StreamTarget extends AbstractOutputTarget {
///OutputStream we are writing to
private OutputStream m_outputStream;
/**
* Constructor that writes to a stream and uses a particular formatter.
*
* @param outputStream the OutputStream to send to
* @param formatter the Formatter to use
*/
public StreamTarget(final OutputStream outputStream, final Formatter formatter) {
super(formatter);
if (null != outputStream) {
setOutputStream(outputStream);
open();
}
}
/**
* Set the output stream.
* Close down old stream and send tail if appropriate.
*
* @param outputStream the new OutputStream
*/
protected synchronized void setOutputStream(final OutputStream outputStream) {
if (null == outputStream) {
throw new NullPointerException("outputStream property must not be null");
}
m_outputStream = outputStream;
}
/**
* Abstract method that will output event.
*
* @param data the data to be output
*/
protected synchronized void write(final String data) {
//Cache method local version
//so that can be replaced in another thread
final OutputStream outputStream = m_outputStream;
if (null == outputStream) {
final String message = "Attempted to send data '" + data + "' to Null OutputStream";
getErrorHandler().error(message, null, null);
return;
}
try {
//TODO: We should be able to specify encoding???
outputStream.write(data.getBytes("UTF-8"));
outputStream.flush();
}
catch (final IOException ioe) {
final String message = "Error writing data '" + data + "' to OutputStream";
getErrorHandler().error(message, ioe, null);
}
}
/**
* Shutdown target.
* Attempting to send to target after close() will cause errors to be logged.
*/
public synchronized void close() {
super.close();
shutdownStream();
}
/**
* Shutdown output stream.
*/
protected synchronized void shutdownStream() {
final OutputStream outputStream = m_outputStream;
m_outputStream = null;
try {
if (null != outputStream) {
outputStream.close();
}
}
catch (final IOException ioe) {
getErrorHandler().error("Error closing OutputStream", ioe, null);
}
}
}