Merge branch 'mikhail.golubev/configurable-issues-states'
[idea/community.git] / plugins / tasks / tasks-core / jira / src / com / intellij / tasks / jira / rest / api20alpha1 / JiraRestApi20Alpha1.java
1 package com.intellij.tasks.jira.rest.api20alpha1;
2
3 import com.google.gson.reflect.TypeToken;
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.tasks.CustomTaskState;
6 import com.intellij.tasks.LocalTask;
7 import com.intellij.tasks.Task;
8 import com.intellij.tasks.TaskBundle;
9 import com.intellij.tasks.jira.JiraRepository;
10 import com.intellij.tasks.jira.rest.JiraRestApi;
11 import com.intellij.tasks.jira.rest.JiraRestTask;
12 import com.intellij.tasks.jira.rest.api20alpha1.model.JiraIssueApi20Alpha1;
13 import com.intellij.tasks.jira.rest.model.JiraIssue;
14 import com.intellij.tasks.jira.rest.model.JiraResponseWrapper;
15 import org.jetbrains.annotations.NotNull;
16 import org.jetbrains.annotations.Nullable;
17
18 import java.lang.reflect.Type;
19 import java.util.ArrayList;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Set;
23
24 /**
25  * This REST API is used in JIRA versions from 4.2 to 4.4.
26  *
27  * @author Mikhail Golubev
28  */
29 public class JiraRestApi20Alpha1 extends JiraRestApi {
30   private static final Logger LOG = Logger.getInstance(JiraRestApi20Alpha1.class);
31   private static final Type ISSUES_WRAPPER_TYPE = new TypeToken<JiraResponseWrapper.Issues<JiraIssueApi20Alpha1>>() {/* empty */}.getType();
32
33   public JiraRestApi20Alpha1(JiraRepository repository) {
34     super(repository);
35   }
36
37   @NotNull
38   @Override
39   public Set<CustomTaskState> getAvailableTaskStates(@NotNull Task task) throws Exception {
40     // REST API of JIRA 4.x for retrieving possible transitions is very limited: we can't fetch possible resolutions and
41     // names of transition destinations. So we have no other options than to hardcode them.
42     final HashSet<CustomTaskState> result = new HashSet<CustomTaskState>();
43     result.add(new CustomTaskState("4", "In Progress"));
44     result.add(new CustomTaskState("5", "Resolved (Fixed)"));
45     result.add(new CustomTaskState("3", "Reopened"));
46     return result;
47   }
48
49   @Override
50   protected JiraIssue parseIssue(String response) {
51     return JiraRepository.GSON.fromJson(response, JiraIssueApi20Alpha1.class);
52   }
53
54   @NotNull
55   @Override
56   protected List<JiraIssue> parseIssues(String response) {
57     JiraResponseWrapper.Issues<JiraIssueApi20Alpha1> wrapper = JiraRepository.GSON.fromJson(response, ISSUES_WRAPPER_TYPE);
58     List<JiraIssueApi20Alpha1> incompleteIssues = wrapper.getIssues();
59     List<JiraIssue> updatedIssues = new ArrayList<JiraIssue>();
60     for (JiraIssueApi20Alpha1 issue : incompleteIssues) {
61       try {
62         JiraRestTask task = findTask(issue.getKey());
63         if (task != null) {
64           updatedIssues.add(task.getJiraIssue());
65         }
66       }
67       catch (Exception e) {
68         LOG.warn("Can't fetch detailed info about issue: " + issue.getKey());
69       }
70     }
71     return updatedIssues;
72   }
73
74   @Nullable
75   @Override
76   protected String getRequestForStateTransition(@NotNull CustomTaskState state) {
77     try {
78       switch (Integer.parseInt(state.getId())) {
79         case 4: // In Progress
80           return "{\"transition\": \"4\"}";
81         case 5: // Resolved (2 for "Closed")
82           return "{\"transition\": \"5\", \"resolution\": \"Fixed\"}";
83         case 3: // Reopened
84           return "{\"transition\": \"3\"}";
85       }
86     }
87     catch (NumberFormatException ignored) {
88     }
89     LOG.error("Unknown ID of predefined issue state: " + state.getId());
90     return null;
91   }
92
93
94   @Override
95   public void updateTimeSpend(@NotNull LocalTask task, @NotNull String timeSpent, String comment) throws Exception {
96     throw new Exception(TaskBundle.message("jira.failure.no.time.spent"));
97   }
98
99   @NotNull
100   @Override
101   public ApiType getType() {
102     return ApiType.REST_2_0_ALPHA;
103   }
104 }