package ru.yandex.qatools.embed.postgresql.ext;
import de.flapdoodle.embed.process.io.IStreamProcessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Set;
import static org.apache.commons.lang3.StringUtils.isEmpty;
/**
* @author Ilya Sadykov
*/
public class LogWatchStreamProcessor extends de.flapdoodle.embed.process.io.LogWatchStreamProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(LogWatchStreamProcessor.class);
private final StringBuilder output = new StringBuilder();
private final Object mutex = new Object();
private final String success;
private final Set<String> failures;
private volatile boolean found = false;
public LogWatchStreamProcessor(String success, Set<String> failures, IStreamProcessor destination) {
super(success, failures, destination);
this.success = success;
this.failures = failures;
}
@Override
public void process(String block) {
LOGGER.debug(block);
output.append(block).append("\n");
if (containsSuccess(block) || containsFailure(block)) {
synchronized (mutex) {
found = true;
mutex.notifyAll();
}
} else {
super.process(block);
}
}
private boolean containsSuccess(String block) {
return block.contains(success);
}
private boolean containsFailure(String block) {
for (String failure : failures) {
if (block.contains(failure)) {
return true;
}
}
return false;
}
public void waitForResult(long timeout) {
synchronized (mutex) {
try {
if (!found) {
mutex.wait(timeout);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public String getOutput() {
String res = output.toString();
return isEmpty(res) ? null : res;
}
}