diff options
Diffstat (limited to 'plugins/tasks/tasks-core/jira/src/com/intellij/tasks')
-rw-r--r-- | plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRemoteApi.java | 8 | ||||
-rw-r--r-- | plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepository.java | 57 | ||||
-rw-r--r-- | plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepositoryEditor.java | 16 | ||||
-rw-r--r-- | plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java (renamed from plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraSoapApi.java) | 10 |
4 files changed, 71 insertions, 20 deletions
diff --git a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRemoteApi.java b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRemoteApi.java index 22e93a9d26ee..8ee9c97512a1 100644 --- a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRemoteApi.java +++ b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRemoteApi.java @@ -5,7 +5,7 @@ import com.intellij.tasks.Task; import com.intellij.tasks.TaskState; import com.intellij.tasks.jira.rest.api2.JiraRestApi2; import com.intellij.tasks.jira.rest.api20alpha1.JiraRestApi20Alpha1; -import com.intellij.tasks.jira.soap.JiraSoapApi; +import com.intellij.tasks.jira.soap.JiraLegacyApi; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,11 +47,11 @@ public abstract class JiraRemoteApi { public abstract ApiType getType(); public enum ApiType { - SOAP("SOAP") { + LEGACY("XML-RPC + RSS") { @NotNull @Override - public JiraSoapApi createApi(@NotNull JiraRepository repository) { - return new JiraSoapApi(repository); + public JiraLegacyApi createApi(@NotNull JiraRepository repository) { + return new JiraLegacyApi(repository); } }, REST_2_0("REST 2.0") { diff --git a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepository.java b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepository.java index c5a469a40c33..b8004ca70023 100644 --- a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepository.java +++ b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepository.java @@ -15,23 +15,31 @@ import com.intellij.tasks.impl.BaseRepositoryImpl; import com.intellij.tasks.impl.TaskUtil; import com.intellij.tasks.impl.gson.GsonUtil; import com.intellij.tasks.jira.rest.JiraRestApi; -import com.intellij.tasks.jira.soap.JiraSoapApi; +import com.intellij.tasks.jira.soap.JiraLegacyApi; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.annotations.Tag; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.xmlrpc.CommonsXmlRpcTransport; +import org.apache.xmlrpc.XmlRpcClient; +import org.apache.xmlrpc.XmlRpcRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.InputStream; +import java.net.URL; +import java.util.Collections; +import java.util.Hashtable; import java.util.List; +import java.util.Vector; import java.util.regex.Pattern; /** * @author Dmitry Avdeev */ +@SuppressWarnings("UseOfObsoleteCollectionType") @Tag("JIRA") public class JiraRepository extends BaseRepositoryImpl { @@ -51,6 +59,7 @@ public class JiraRepository extends BaseRepositoryImpl { private String mySearchQuery = TaskBundle.message("jira.default.query"); private JiraRemoteApi myApiVersion; + private String myJiraVersion; /** * Serialization constructor @@ -69,6 +78,7 @@ public class JiraRepository extends BaseRepositoryImpl { private JiraRepository(JiraRepository other) { super(other); mySearchQuery = other.mySearchQuery; + myJiraVersion = other.myJiraVersion; if (other.myApiVersion != null) { myApiVersion = other.myApiVersion.getType().createApi(this); } @@ -77,8 +87,13 @@ public class JiraRepository extends BaseRepositoryImpl { @Override public boolean equals(Object o) { if (!super.equals(o)) return false; - if (o.getClass() != getClass()) return false; - return Comparing.equal(mySearchQuery, ((JiraRepository)o).mySearchQuery); + if (!(o instanceof JiraRepository)) return false; + + JiraRepository repository = (JiraRepository)o; + + if (!Comparing.equal(mySearchQuery, repository.getSearchQuery())) return false; + if (!Comparing.equal(myJiraVersion, repository.getJiraVersion())) return false; + return true; } @@ -149,7 +164,7 @@ public class JiraRepository extends BaseRepositoryImpl { public JiraRemoteApi discoverApiVersion() throws Exception { if (LEGACY_API_ONLY) { LOG.info("Intentionally using only legacy JIRA API"); - return new JiraSoapApi(this); + return createLegacyApi(); } String responseBody; @@ -164,7 +179,7 @@ public class JiraRepository extends BaseRepositoryImpl { // not the way to check it safely. StatusLine status = method.getStatusLine(); if (status != null && status.getStatusCode() == HttpStatus.SC_NOT_FOUND) { - return new JiraSoapApi(this); + return createLegacyApi(); } else { throw e; @@ -173,13 +188,31 @@ public class JiraRepository extends BaseRepositoryImpl { JsonObject object = GSON.fromJson(responseBody, JsonObject.class); // when JIRA 4.x support will be dropped 'versionNumber' array in response // may be used instead version string parsing - JiraRestApi restApi = JiraRestApi.fromJiraVersion(object.get("version").getAsString(), this); + myJiraVersion = object.get("version").getAsString(); + JiraRestApi restApi = JiraRestApi.fromJiraVersion(myJiraVersion, this); if (restApi == null) { throw new Exception(TaskBundle.message("jira.failure.no.REST")); } return restApi; } + private JiraLegacyApi createLegacyApi() { + try { + XmlRpcClient client = new XmlRpcClient(getUrl()); + Vector<String> parameters = new Vector<String>(Collections.singletonList("")); + XmlRpcRequest request = new XmlRpcRequest("jira1.getServerInfo", parameters); + @SuppressWarnings("unchecked") Hashtable<String, Object> response = + (Hashtable<String, Object>)client.execute(request, new CommonsXmlRpcTransport(new URL(getUrl()), getHttpClient())); + if (response != null) { + myJiraVersion = (String)response.get("version"); + } + } + catch (Exception e) { + LOG.error("Cannot find out JIRA version via XML-RPC", e); + } + return new JiraLegacyApi(this); + } + private void ensureApiVersionDiscovered() throws Exception { if (myApiVersion == null || LEGACY_API_ONLY || REDISCOVER_API) { myApiVersion = discoverApiVersion(); @@ -275,7 +308,7 @@ public class JiraRepository extends BaseRepositoryImpl { } private boolean isRestApiSupported() { - return myApiVersion != null && myApiVersion.getType() != JiraRemoteApi.ApiType.SOAP; + return myApiVersion != null && myApiVersion.getType() != JiraRemoteApi.ApiType.LEGACY; } public boolean isJqlSupported() { @@ -322,6 +355,16 @@ public class JiraRepository extends BaseRepositoryImpl { } } + @Nullable + public String getJiraVersion() { + return myJiraVersion; + } + + @SuppressWarnings("UnusedDeclaration") + public void setJiraVersion(@Nullable String jiraVersion) { + myJiraVersion = jiraVersion; + } + public String getRestUrl(String... parts) { return getUrl() + REST_API_PATH + "/" + StringUtil.join(parts, "/"); } diff --git a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepositoryEditor.java b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepositoryEditor.java index 3299ac427432..a8ed1f880bf7 100644 --- a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepositoryEditor.java +++ b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/JiraRepositoryEditor.java @@ -16,7 +16,7 @@ package com.intellij.tasks.jira; import com.intellij.openapi.project.Project; -import com.intellij.tasks.TaskBundle; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.tasks.config.BaseRepositoryEditor; import com.intellij.tasks.jira.jql.JqlLanguage; import com.intellij.ui.EditorTextField; @@ -35,6 +35,7 @@ import javax.swing.*; public class JiraRepositoryEditor extends BaseRepositoryEditor<JiraRepository> { private EditorTextField mySearchQueryField; private JBLabel mySearchLabel; + private JBLabel myNoteLabel; public JiraRepositoryEditor(Project project, JiraRepository repository, Consumer<JiraRepository> changeListener) { super(project, repository, changeListener); @@ -53,6 +54,7 @@ public class JiraRepositoryEditor extends BaseRepositoryEditor<JiraRepository> { if (connectionSuccessful) { enableJqlSearchIfSupported(); } + updateNote(); } @Nullable @@ -62,14 +64,20 @@ public class JiraRepositoryEditor extends BaseRepositoryEditor<JiraRepository> { enableJqlSearchIfSupported(); installListener(mySearchQueryField); mySearchLabel = new JBLabel("Search:", SwingConstants.RIGHT); - JBLabel note = new JBLabel(TaskBundle.message("jira.failure.no.JQL")); - note.setComponentStyle(UIUtil.ComponentStyle.SMALL); + myNoteLabel = new JBLabel(); + myNoteLabel.setComponentStyle(UIUtil.ComponentStyle.SMALL); + updateNote(); return FormBuilder.createFormBuilder() .addLabeledComponent(mySearchLabel, mySearchQueryField) - .addComponentToRightColumn(note) + .addComponentToRightColumn(myNoteLabel) .getPanel(); } + private void updateNote() { + myNoteLabel.setText("JQL search cannot be used in JIRA versions prior 4.2. " + + String.format("Your version: %s.", StringUtil.notNullize(myRepository.getJiraVersion(), "unknown"))); + } + @Override public void setAnchor(@Nullable final JComponent anchor) { super.setAnchor(anchor); diff --git a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraSoapApi.java b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java index 148432902a86..e8cbee842cda 100644 --- a/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraSoapApi.java +++ b/plugins/tasks/tasks-core/jira/src/com/intellij/tasks/jira/soap/JiraLegacyApi.java @@ -22,18 +22,18 @@ import org.jetbrains.annotations.Nullable; import java.util.List; /** - * Legacy SOAP connector restored due to IDEA-120595. + * Legacy integration restored due to IDEA-120595. * * @author Mikhail Golubev */ -public class JiraSoapApi extends JiraRemoteApi { +public class JiraLegacyApi extends JiraRemoteApi { - private static final Logger LOG = Logger.getInstance(JiraSoapApi.class); + 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 JiraSoapApi(@NotNull JiraRepository repository) { + public JiraLegacyApi(@NotNull JiraRepository repository) { super(repository); } @@ -99,7 +99,7 @@ public class JiraSoapApi extends JiraRemoteApi { @NotNull @Override public final ApiType getType() { - return ApiType.SOAP; + return ApiType.LEGACY; } @Override |