package org.netmelody.cieye.spies.jenkins;
import java.util.Collection;
import org.netmelody.cieye.core.domain.Feature;
import org.netmelody.cieye.core.observation.Contact;
import org.netmelody.cieye.spies.jenkins.jsondomain.BuildDetail;
import org.netmelody.cieye.spies.jenkins.jsondomain.Job;
import org.netmelody.cieye.spies.jenkins.jsondomain.JobDetail;
import org.netmelody.cieye.spies.jenkins.jsondomain.Server;
import org.netmelody.cieye.spies.jenkins.jsondomain.View;
import org.netmelody.cieye.spies.jenkins.jsondomain.ViewDetail;
public final class JenkinsCommunicator {
private final Contact contact;
private final String endpoint;
public JenkinsCommunicator(String endpoint, Contact contact) {
this.endpoint = endpoint;
this.contact = contact;
}
public String endpoint() {
return endpoint;
}
public boolean canSpeakFor(Feature feature) {
return endpoint.equals(feature.endpoint());
}
public void doJenkinsPost(String url) {
contact.doPost(url);
}
public BuildDetail buildDetailsFor(String buildUrl) {
return makeJenkinsRestCall(buildUrl, BuildDetail.class);
}
public JobDetail jobDetailFor(String jobEndpoint) {
return makeJenkinsRestCall(jobEndpoint, JobDetail.class);
}
public String lastBadBuildFor(String jobEndpoint) {
return jobDetailFor(jobEndpoint).lastBadBuildUrl();
}
public Collection<Job> jobsFor(View viewDigest) {
return makeJenkinsRestCall(viewDigest.url, ViewDetail.class).jobs();
}
public Collection<View> views() {
return makeJenkinsRestCallWithSuffix("", Server.class).views();
}
private <T> T makeJenkinsRestCallWithSuffix(String urlSuffix, Class<T> type) {
return makeJenkinsRestCall(endpoint + ((urlSuffix.length() == 0) ? "" : ("/" + urlSuffix)), type);
}
private <T> T makeJenkinsRestCall(String url, Class<T> type) {
final String reqUrl = url + (url.endsWith("/") ? "" : "/") + "api/json";
return contact.makeJsonRestCall(reqUrl, type);
}
}