package jetbrains.mps.testbench.util;
/*Generated by MPS */
import java.io.PrintStream;
import java.util.List;
import java.util.regex.Pattern;
import java.io.OutputStream;
import java.io.IOException;
/**
* fyodor, Aug 18, 2010
*/
public class CachingPrintStream extends PrintStream implements Output {
private static final int LS_BYTES = System.getProperty("line.separator").getBytes().length;
private List<Pattern> myIgnoredOutputPatterns = null;
private int myByteCount = 0;
private StringBuilder myBuffer = new StringBuilder();
private String myName;
private boolean myCachingFlag;
public CachingPrintStream(OutputStream out, String name) {
super(out);
myName = name;
}
public CachingPrintStream(OutputStream out, String name, List<Pattern> ignoredOutputPatterns) {
this(out, name);
myIgnoredOutputPatterns = ignoredOutputPatterns;
}
public PrintStream getOut() {
return (PrintStream) out;
}
public void startCaching() {
if (myCachingFlag) {
throw new IllegalStateException("Already caching");
}
myCachingFlag = true;
}
public void stopCaching() {
if (!(myCachingFlag)) {
throw new IllegalStateException("Not caching");
}
myCachingFlag = false;
}
public void clear() {
if (myCachingFlag) {
throw new IllegalStateException("Currently caching");
}
myBuffer.setLength(0);
myByteCount = 0;
}
@Override
public synchronized boolean isNotEmpty() {
if (myIgnoredOutputPatterns != null && myByteCount > 0) {
String bufferContents = getText();
for (Pattern nextPattern : myIgnoredOutputPatterns) {
if (nextPattern.matcher(bufferContents).matches()) {
return false;
}
}
}
return myByteCount > 0;
}
@Override
public synchronized String getDescription() {
return myByteCount + " bytes in " + myName;
}
@Override
public synchronized String getText() {
return myBuffer.toString();
}
public synchronized int getBytesCount() {
return myByteCount;
}
public synchronized String getBuffer() {
return myBuffer.toString();
}
@Override
public synchronized void flush() {
super.flush();
}
@Override
public synchronized void close() {
super.close();
}
@Override
public synchronized void write(int buf) {
if (myCachingFlag) {
myByteCount++;
myBuffer.append((char) buf);
}
super.write(buf);
}
@Override
public synchronized void write(byte[] buf) throws IOException {
if (myCachingFlag) {
myByteCount += LS_BYTES;
myBuffer.append(new String(buf));
}
super.write(buf);
}
@Override
public synchronized void write(byte[] buf, int off, int len) {
if (myCachingFlag) {
myByteCount += len;
myBuffer.append(new String(buf, off, len));
}
super.write(buf, off, len);
}
@Override
public synchronized void print(boolean b) {
if (myCachingFlag) {
myByteCount += String.valueOf(b).getBytes().length;
}
super.print(b);
}
@Override
public synchronized void print(char c) {
if (myCachingFlag) {
myByteCount += String.valueOf(c).getBytes().length;
}
super.print(c);
}
@Override
public synchronized void print(int i) {
if (myCachingFlag) {
myByteCount += String.valueOf(i).getBytes().length;
}
super.print(i);
}
@Override
public synchronized void print(long l) {
if (myCachingFlag) {
myByteCount += String.valueOf(l).getBytes().length;
}
super.print(l);
}
@Override
public synchronized void print(float f) {
if (myCachingFlag) {
myByteCount += String.valueOf(f).getBytes().length;
}
super.print(f);
}
@Override
public synchronized void print(double d) {
if (myCachingFlag) {
myByteCount += String.valueOf(d).getBytes().length;
}
super.print(d);
}
@Override
public synchronized void print(char[] s) {
if (myCachingFlag) {
myByteCount += String.copyValueOf(s).getBytes().length;
}
super.print(s);
}
@Override
public synchronized void print(String s) {
if (myCachingFlag) {
myByteCount += String.valueOf(s).getBytes().length;
}
super.print(s);
}
private void addByteCountForNewLine() {
if (myCachingFlag) {
myByteCount += LS_BYTES;
}
}
@Override
public synchronized void print(Object obj) {
addByteCountForNewLine();
super.print(obj);
}
@Override
public synchronized void println() {
addByteCountForNewLine();
super.println();
}
@Override
public synchronized void println(boolean x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(char x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(int x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(long x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(float x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(double x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(char[] x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(String x) {
addByteCountForNewLine();
super.println(x);
}
@Override
public synchronized void println(Object x) {
addByteCountForNewLine();
super.println(x);
}
}