blob: 5b9fece264c75620a46e5f1f600b4410fa5943e5 [file] [log] [blame]
package com.intellij.tasks.jira.rest;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.tasks.Task;
import com.intellij.tasks.TaskState;
import com.intellij.tasks.jira.JiraRemoteApi;
import com.intellij.tasks.jira.JiraRepository;
import com.intellij.tasks.jira.JiraVersion;
import com.intellij.tasks.jira.rest.api2.JiraRestApi2;
import com.intellij.tasks.jira.rest.api20alpha1.JiraRestApi20Alpha1;
import com.intellij.tasks.jira.rest.model.JiraIssue;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.UnsupportedEncodingException;
import java.util.List;
/**
* @author Mikhail Golubev
*/
public abstract class JiraRestApi extends JiraRemoteApi {
private static final Logger LOG = Logger.getInstance(JiraRestApi.class);
public static JiraRestApi fromJiraVersion(@NotNull JiraVersion jiraVersion, @NotNull JiraRepository repository) {
LOG.info("JIRA version is " + jiraVersion);
if (jiraVersion.getMajorNumber() == 4 && jiraVersion.getMinorNumber() >= 2) {
return new JiraRestApi20Alpha1(repository);
}
else if (jiraVersion.getMajorNumber() >= 5) {
return new JiraRestApi2(repository);
}
else {
LOG.warn("JIRA below 4.2.0 doesn't support REST API (" + jiraVersion + " used)");
return null;
}
}
public static JiraRestApi fromJiraVersion(@NotNull String version, @NotNull JiraRepository repository) {
return fromJiraVersion(new JiraVersion(version), repository);
}
protected JiraRestApi(@NotNull JiraRepository repository) {
super(repository);
}
@Override
@NotNull
public final List<Task> findTasks(@NotNull String jql, int max) throws Exception {
GetMethod method = getMultipleIssuesSearchMethod(jql, max);
String response = myRepository.executeMethod(method);
List<JiraIssue> issues = parseIssues(response);
LOG.debug("Total " + issues.size() + " downloaded");
return ContainerUtil.map(issues, new Function<JiraIssue, Task>() {
@Override
public JiraRestTask fun(JiraIssue issue) {
return new JiraRestTask(issue, myRepository);
}
});
}
@Override
@Nullable
public final JiraRestTask findTask(@NotNull String key) throws Exception {
GetMethod method = getSingleIssueSearchMethod(key);
try {
return new JiraRestTask(parseIssue(myRepository.executeMethod(method)), myRepository);
}
catch (Exception ignored) {
// should be logged already
return null;
}
}
@NotNull
protected GetMethod getSingleIssueSearchMethod(String key) {
return new GetMethod(myRepository.getRestUrl("issue", key));
}
@NotNull
protected GetMethod getMultipleIssuesSearchMethod(String jql, int max) {
GetMethod method = new GetMethod(myRepository.getRestUrl("search"));
method.setQueryString(new NameValuePair[]{
new NameValuePair("jql", jql),
new NameValuePair("maxResults", String.valueOf(max))
});
return method;
}
@NotNull
protected abstract List<JiraIssue> parseIssues(String response);
@Nullable
protected abstract JiraIssue parseIssue(String response);
@Override
public void setTaskState(@NotNull Task task, @NotNull TaskState state) throws Exception {
String requestBody = getRequestForStateTransition(state);
LOG.debug(String.format("Transition: %s -> %s, request: %s", task.getState(), state, requestBody));
if (requestBody == null) {
return;
}
PostMethod method = new PostMethod(myRepository.getRestUrl("issue", task.getId(), "transitions"));
method.setRequestEntity(createJsonEntity(requestBody));
myRepository.executeMethod(method);
}
@Nullable
protected abstract String getRequestForStateTransition(@NotNull TaskState state);
protected static RequestEntity createJsonEntity(String requestBody) {
try {
return new StringRequestEntity(requestBody, "application/json", CharsetToolkit.UTF8);
}
catch (UnsupportedEncodingException e) {
throw new AssertionError("UTF-8 encoding is not supported");
}
}
}