/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.synth;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import org.h2.util.IOUtils;
/**
* Catches the output of another process.
*/
public class OutputCatcher extends Thread {
private InputStream in;
private LinkedList<String> list = new LinkedList<String>();
public OutputCatcher(InputStream in) {
this.in = in;
}
/**
* Read a line from the output.
*
* @param wait the maximum number of milliseconds to wait
* @return the line
*/
public String readLine(long wait) {
long start = System.currentTimeMillis();
while (true) {
synchronized (list) {
if (list.size() > 0) {
return list.removeFirst();
}
try {
list.wait(wait);
} catch (InterruptedException e) {
// ignore
}
long time = System.currentTimeMillis() - start;
if (time >= wait) {
return null;
}
}
}
}
public void run() {
StringBuilder buff = new StringBuilder();
while (true) {
try {
int x = in.read();
if (x < 0) {
break;
}
if (x < ' ') {
if (buff.length() > 0) {
String s = buff.toString();
buff.setLength(0);
synchronized (list) {
list.add(s);
list.notifyAll();
}
}
} else {
buff.append((char) x);
}
} catch (IOException e) {
break;
}
}
IOUtils.closeSilently(in);
}
}