summaryrefslogtreecommitdiff
path: root/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java')
-rw-r--r--plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java
new file mode 100644
index 000000000000..e8cbee842cda
--- /dev/null
+++ b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java
@@ -0,0 +1,114 @@
+package com.intellij.tasks.jira.soap;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.tasks.LocalTask;
+import com.intellij.tasks.Task;
+import com.intellij.tasks.TaskBundle;
+import com.intellij.tasks.TaskState;
+import com.intellij.tasks.impl.TaskUtil;
+import com.intellij.tasks.jira.JiraRemoteApi;
+import com.intellij.tasks.jira.JiraRepository;
+import com.intellij.util.Function;
+import com.intellij.util.containers.ContainerUtil;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.jdom.Element;
+import org.jdom.input.SAXBuilder;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Legacy integration restored due to IDEA-120595.
+ *
+ * @author Mikhail Golubev
+ */
+public class JiraLegacyApi extends JiraRemoteApi {
+
+ private static final Logger LOG = Logger.getInstance(JiraLegacyApi.class);
+
+ @NonNls private static final String RSS_SEARCH_PATH = "/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml";
+ public static final String RSS_ISSUE_PATH = "/si/jira.issueviews:issue-xml/";
+
+ public JiraLegacyApi(@NotNull JiraRepository repository) {
+ super(repository);
+ }
+
+ @NotNull
+ @Override
+ public List<Task> findTasks(@NotNull String query, int max) throws Exception {
+
+ // Unfortunately, both SOAP and XML-RPC interfaces of JIRA don't allow fetching *all* tasks from server, but
+ // only filtered by some search term (see http://stackoverflow.com/questions/764282/how-can-jira-soap-api-not-have-this-method).
+ // JQL was added in SOAP only since JIRA 4.0 (see method JiraSoapService#getIssuesFromJqlSearch() at
+ // https://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/index.html?com/atlassian/jira/rpc/soap/JiraSoapService.html)
+ // So due to this limitation and the need to support these old versions of bug tracker (3.0, 4.2) we need the following ugly and hacky
+ // solution with extracting issues from RSS feed.
+
+ GetMethod method = new GetMethod(myRepository.getUrl() + RSS_SEARCH_PATH);
+ method.setQueryString(new NameValuePair[] {
+ new NameValuePair("tempMax", String.valueOf(max)),
+ new NameValuePair("assignee", TaskUtil.encodeUrl(myRepository.getUsername())),
+ new NameValuePair("reset", "true"),
+ new NameValuePair("sorter/field", "updated"),
+ new NameValuePair("sorter/order", "DESC"),
+ new NameValuePair("pager/start", "0")
+ });
+ return processRSS(method);
+ }
+
+ private List<Task> processRSS(@NotNull GetMethod method) throws Exception {
+ // Basic authorization should be enough
+ int code = myRepository.getHttpClient().executeMethod(method);
+ if (code != HttpStatus.SC_OK) {
+ throw new Exception(TaskBundle.message("failure.http.error", code, method.getStatusText()));
+ }
+ Element root = new SAXBuilder(false).build(method.getResponseBodyAsStream()).getRootElement();
+ Element channel = root.getChild("channel");
+ if (channel != null) {
+ List<Element> children = channel.getChildren("item");
+ LOG.debug("Total issues in JIRA RSS feed: " + children.size());
+ return ContainerUtil.map(children, new Function<Element, Task>() {
+ public Task fun(Element element) {
+ return new JiraSoapTask(element, myRepository);
+ }
+ });
+ }
+ else {
+ LOG.warn("JIRA channel not found");
+ }
+ return ContainerUtil.emptyList();
+ }
+
+ @Nullable
+ @Override
+ public Task findTask(@NotNull String key) throws Exception {
+ try {
+ List<Task> tasks = processRSS(new GetMethod(myRepository.getUrl() + RSS_ISSUE_PATH + key + '/' + key + ".xml"));
+ return tasks.isEmpty() ? null : tasks.get(0);
+ }
+ catch (Exception e) {
+ LOG.warn("Cannot get issue " + key + ": " + e.getMessage());
+ return null;
+ }
+ }
+
+ @NotNull
+ @Override
+ public final ApiType getType() {
+ return ApiType.LEGACY;
+ }
+
+ @Override
+ public void setTaskState(@NotNull Task task, @NotNull TaskState state) throws Exception {
+ throw new Exception(TaskBundle.message("jira.failure.no.state.update"));
+ }
+
+ @Override
+ public void updateTimeSpend(@NotNull LocalTask task, @NotNull String timeSpent, String comment) throws Exception {
+ throw new Exception(TaskBundle.message("jira.failure.no.time.spent"));
+ }
+}