package net.serenitybdd.integration.jenkins.process;
import org.jdeferred.Promise;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.regex.Matcher;
class JenkinsLogWatcher implements AutoCloseable, Runnable {
private static final Logger Log = LoggerFactory.getLogger(JenkinsLogWatcher.class);
private final InputStream jenkinsOutput;
private final List<JenkinsLogLineWatcher> watchers = new CopyOnWriteArrayList<>();
public JenkinsLogWatcher(InputStream jenkinsOutput) {
this.jenkinsOutput = jenkinsOutput;
}
public Promise<Matcher, ?, ?> watchFor(String patternToMatchAgainstALogLine) {
JenkinsLogLineWatcher watcher = new JenkinsLogLineWatcher(patternToMatchAgainstALogLine);
watchers.add(watcher);
return watcher.promise();
}
@Override
public void close() throws Exception {
jenkinsOutput.close();
}
@Override
public void run() {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(jenkinsOutput))) {
String line;
while ((line = reader.readLine()) != null) {
Log.debug(line);
for (JenkinsLogLineWatcher watcher : watchers) {
if (watcher.matches(line)) {
watchers.remove(watcher);
}
}
}
} catch (IOException e) {
throw new RuntimeException("Jenkins output stream is already closed", e);
}
}
}