package com.niklim.clicktrace.service.export.jira;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.concurrent.ExecutionException;
import com.atlassian.httpclient.api.HttpClient;
import com.atlassian.jira.rest.client.auth.BasicHttpAuthenticationHandler;
import com.atlassian.jira.rest.client.domain.BasicProject;
import com.atlassian.jira.rest.client.domain.IssueType;
import com.atlassian.jira.rest.client.domain.Priority;
import com.atlassian.jira.rest.client.internal.async.AsynchronousHttpClientFactory;
import com.atlassian.jira.rest.client.internal.async.AsynchronousMetadataRestClient;
import com.atlassian.jira.rest.client.internal.async.AsynchronousProjectRestClient;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.niklim.clicktrace.props.JiraConfig;
import com.niklim.clicktrace.props.JiraConfig.JiraUserMetadata;
/**
* Loads JIRA user available data.
*/
public class JiraMetadataService {
public JiraUserMetadata loadUserMetadata(JiraConfig jiraConfig) throws URISyntaxException, InterruptedException,
ExecutionException {
URI restApiUri = new URI(jiraConfig.getInstanceUrl() + "/rest/api/2/");
HttpClient httpClient = createHttpClient(jiraConfig, restApiUri);
AsynchronousMetadataRestClient metadataClient = createMetadataClient(httpClient, restApiUri);
Collection<JiraFieldDto> issueTypes = loadIssueTypes(jiraConfig, metadataClient);
Collection<JiraFieldDto> priorities = loadPriorities(jiraConfig, metadataClient);
AsynchronousProjectRestClient projectClient = createProjectClient(httpClient, restApiUri);
Collection<JiraFieldDto> projects = loadProjects(projectClient);
return new JiraUserMetadata(projects, issueTypes, priorities);
}
private Collection<JiraFieldDto> loadProjects(AsynchronousProjectRestClient projectClient)
throws InterruptedException, ExecutionException {
Iterable<BasicProject> projects = projectClient.getAllProjects().get();
return projectToJiraFieldDtos(projects);
}
private Collection<JiraFieldDto> projectToJiraFieldDtos(Iterable<BasicProject> projects) {
return Collections2.transform(Lists.newArrayList(projects), new Function<BasicProject, JiraFieldDto>() {
public JiraFieldDto apply(BasicProject input) {
return new JiraFieldDto(input.getKey(), input.getKey());
}
});
}
private AsynchronousProjectRestClient createProjectClient(HttpClient httpClient, URI restApiUri) {
return new AsynchronousProjectRestClient(restApiUri, httpClient);
}
private Collection<JiraFieldDto> loadPriorities(JiraConfig jiraConfig, AsynchronousMetadataRestClient client)
throws InterruptedException, ExecutionException {
Iterable<Priority> issueTypes = client.getPriorities().get();
return prioritiesToStrings(issueTypes);
}
private Collection<JiraFieldDto> prioritiesToStrings(Iterable<Priority> priorities) {
return Collections2.transform(Lists.newArrayList(priorities), new Function<Priority, JiraFieldDto>() {
public JiraFieldDto apply(Priority input) {
return new JiraFieldDto(input.getName(), input.getName());
}
});
}
private AsynchronousMetadataRestClient createMetadataClient(HttpClient httpClient, URI restApiUri)
throws URISyntaxException {
return new AsynchronousMetadataRestClient(restApiUri, httpClient);
}
private HttpClient createHttpClient(JiraConfig jiraConfig, URI restApiUri) {
BasicHttpAuthenticationHandler authenticationHandler = new BasicHttpAuthenticationHandler(
jiraConfig.getUsername(), jiraConfig.getPassword().get());
HttpClient httpClient = new AsynchronousHttpClientFactory().createClient(restApiUri, authenticationHandler);
return httpClient;
}
private Collection<JiraFieldDto> loadIssueTypes(JiraConfig jiraConfig, AsynchronousMetadataRestClient client)
throws URISyntaxException, InterruptedException, ExecutionException {
Iterable<IssueType> issueTypes = client.getIssueTypes().get();
return issueTypesToStrings(issueTypes);
}
private Collection<JiraFieldDto> issueTypesToStrings(Iterable<IssueType> issueTypes) {
return Collections2.transform(Lists.newArrayList(issueTypes), new Function<IssueType, JiraFieldDto>() {
public JiraFieldDto apply(IssueType input) {
return new JiraFieldDto(input.getName(), input.getName());
}
});
}
}