blob: 435fcca1dc053f896348612a811b65cbf5b7e650 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.test;
import org.slf4j.Logger;
import java.io.Writer;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Implements a PrintWriter which allows to alternatively plug in a
* <code>Writer</code> or a <code>Logger</code>.
*/
public class LogPrintWriter extends PrintWriter {
/**
* Internal buffer.
*/
private StringBuffer buffer = new StringBuffer();
/**
* Logger for message output.
*/
private Logger log;
/**
* Creates a new <code>LogPrintWriter</code> which is based on a
* <code>Writer</code>.
*
* @param out the base <code>Writer</code>.
*/
public LogPrintWriter(Writer out) {
super(out);
}
/**
* Creates a new <code>LogPrintWriter</code> which is based on a
* <code>Logger</code>.
*
* @param log the base <code>Logger</code>.
*/
public LogPrintWriter(Logger log) {
super(new NullWriter());
this.log = log;
}
/**
* Sets a new output <code>Writer</code>. Calling this method will flush
* this <code>LogPrintWriter</code> before the new <code>Writer</code>
* <code>out</code> is set.
*
* @param out the <code>Writer</code> to use for output.
*/
public void setWriter(Writer out) {
flushBuffer();
this.out = out;
this.log = null;
}
/**
* Sets a new <code>Logger</code>. Calling this method will flush this
* <code>LogPrintWriter</code> before the new <code>Logger</code> is set.
*
* @param log the new <code>Logger</code> to use for output.
*/
public void setLogger(Logger log) {
flushBuffer();
out = new NullWriter();
this.log = log;
}
//------------------< overrides from PrintWriter >-------------------------
public void close() {
flushBuffer();
super.close();
}
public void flush() {
flushBuffer();
super.flush();
}
public void write(int c) {
buffer.append(c);
}
public void write(char cbuf[], int off, int len) {
buffer.append(cbuf, off, len);
}
public void write(String str, int off, int len) {
buffer.append(str.substring(off, off + len));
}
public void println() {
if (log == null) {
// only add newline when operating on a writer
buffer.append('\n');
}
flushBuffer();
}
//-----------------------< private methods >--------------------------------
private void flushBuffer() {
if (buffer.length() == 0) {
return;
}
if (log != null) {
log.debug(buffer.toString());
} else {
try {
out.write(buffer.toString());
} catch (IOException e) {
this.setError();
}
}
// reset buffer
buffer.setLength(0);
}
//------------------------< inter classes >---------------------------------
/**
* Implements a Writer that simply ignores all calls.
*/
private static class NullWriter extends Writer {
public void close() throws IOException {
// ignore
}
public void flush() throws IOException {
// ignore
}
public void write(char cbuf[], int off, int len) throws IOException {
// ignore
}
}
}