| package com.intellij.tasks.jira.rest.api2; |
| |
| import com.google.gson.reflect.TypeToken; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.tasks.LocalTask; |
| import com.intellij.tasks.TaskState; |
| import com.intellij.tasks.jira.JiraRepository; |
| import com.intellij.tasks.jira.rest.JiraRestApi; |
| import com.intellij.tasks.jira.rest.api2.model.JiraIssueApi2; |
| import com.intellij.tasks.jira.rest.model.JiraIssue; |
| import com.intellij.tasks.jira.rest.model.JiraResponseWrapper; |
| import org.apache.commons.httpclient.methods.GetMethod; |
| import org.apache.commons.httpclient.methods.PostMethod; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.lang.reflect.Type; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * This REST API version is used in JIRA 5.1.8 and above (including JIRA 6.x.x). |
| * |
| * @author Mikhail Golubev |
| */ |
| public class JiraRestApi2 extends JiraRestApi { |
| private static final Logger LOG = Logger.getInstance(JiraIssueApi2.class); |
| private static final Type ISSUES_WRAPPER_TYPE = new TypeToken<JiraResponseWrapper.Issues<JiraIssueApi2>>() { /* empty */ |
| }.getType(); |
| |
| public JiraRestApi2(JiraRepository repository) { |
| super(repository); |
| } |
| |
| @NotNull |
| @Override |
| protected GetMethod getMultipleIssuesSearchMethod(String jql, int max) { |
| GetMethod method = super.getMultipleIssuesSearchMethod(jql, max); |
| method.setQueryString(method.getQueryString() + "&fields=" + JiraIssueApi2.REQUIRED_RESPONSE_FIELDS); |
| return method; |
| } |
| |
| @NotNull |
| @Override |
| protected List<JiraIssue> parseIssues(String response) { |
| JiraResponseWrapper.Issues<JiraIssueApi2> wrapper = JiraRepository.GSON.fromJson(response, ISSUES_WRAPPER_TYPE); |
| return new ArrayList<JiraIssue>(wrapper.getIssues()); |
| } |
| |
| @NotNull |
| @Override |
| protected GetMethod getSingleIssueSearchMethod(String key) { |
| final GetMethod method = super.getSingleIssueSearchMethod(key); |
| final String oldParams = method.getQueryString() == null ? "" : method.getQueryString(); |
| method.setQueryString(oldParams + "&fields=" + JiraIssueApi2.REQUIRED_RESPONSE_FIELDS); |
| return method; |
| } |
| |
| @Nullable |
| @Override |
| protected JiraIssue parseIssue(String response) { |
| return JiraRepository.GSON.fromJson(response, JiraIssueApi2.class); |
| } |
| |
| @Nullable |
| @Override |
| protected String getRequestForStateTransition(@NotNull TaskState state) { |
| // REST API 2.0 require double quotes both around field names and values (even numbers) |
| switch (state) { |
| case IN_PROGRESS: |
| return "{\"transition\": {\"id\": \"4\"}}"; |
| case RESOLVED: |
| // 5 for "Resolved", 2 for "Closed" |
| return "{\"transition\": {\"id\": \"5\"}, \"fields\": {\"resolution\": {\"name\": \"Fixed\"}}}"; |
| case REOPENED: |
| return "{\"transition\": {\"id\": \"3\"}}"; |
| default: |
| return null; |
| } |
| } |
| |
| @Override |
| public void updateTimeSpend(@NotNull LocalTask task, @NotNull String timeSpent, String comment) throws Exception { |
| LOG.debug(String.format("Time spend: %s, comment: %s", timeSpent, comment)); |
| PostMethod method = new PostMethod(myRepository.getRestUrl("issue", task.getId(), "worklog")); |
| String request; |
| if (StringUtil.isEmpty(comment)) { |
| request = String.format("{\"timeSpent\" : \"" + timeSpent + "\"}", timeSpent); |
| } else { |
| request = String.format("{\"timeSpent\": \"%s\", \"comment\": \"%s\"}", timeSpent, StringUtil.escapeQuotes(comment)); |
| } |
| method.setRequestEntity(createJsonEntity(request)); |
| myRepository.executeMethod(method); |
| } |
| |
| @NotNull |
| @Override |
| public ApiType getType() { |
| return ApiType.REST_2_0; |
| } |
| } |