package net.serenitybdd.integration.jenkins.client;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import hudson.cli.CLI;
import hudson.cli.CLIConnectionFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static java.util.Arrays.asList;
public class JenkinsClientExecutor {
private final URL jenkinsUrl;
private final List<String> args;
public JenkinsClientExecutor(URL jenkinsUrl, String... args) {
this.jenkinsUrl = jenkinsUrl;
this.args = asList(args);
}
public JenkinsClientExecutor call(String... args) {
return new JenkinsClientExecutor(jenkinsUrl, args);
}
public int execute() {
return execute(System.in, System.out, System.err);
}
public int execute(InputStream input, OutputStream output, OutputStream error) {
try {
CLI connection = connectTo(jenkinsUrl);
int result = connection.execute(args, input, output, error);
connection.close();
return result;
} catch (IOException | InterruptedException e) {
throw new RuntimeException(String.format("Couldn't connect to Jenkins at '%s'", jenkinsUrl), e);
}
}
private CLI connectTo(URL jenkinsUrl) {
try {
return new CLIConnectionFactory()
.url(jenkinsUrl)
.executorService(jenkinsCLIExecutorService())
.connect();
} catch (IOException | InterruptedException e) {
throw new RuntimeException(String.format("Couldn't connect to Jenkins at '%s'", jenkinsUrl), e);
}
}
private ExecutorService jenkinsCLIExecutorService() {
return Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("jenkins-cli-%d").build());
}
}