Merge "Allow Jira REST API to be located outside of the server root"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
index ba18017..9d7589d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApi.java
@@ -19,6 +19,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
 import java.net.Proxy;
 import java.net.ProxySelector;
 import java.net.URL;
@@ -28,13 +29,12 @@
 
 /** Jira Rest Client. */
 public class JiraRestApi<T> {
-  private static final String BASE_PREFIX = "/rest/api/2";
+  private static final String BASE_PREFIX = "rest/api/2";
   private final URL baseUrl;
   private final String auth;
   private final Gson gson;
 
   private final Class<T> classOfT;
-  private final String classPrefix;
   private T data;
   private int responseCode;
 
@@ -45,12 +45,12 @@
    * @param user username of the jira user
    * @param pass password of the jira user
    */
-  JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix) {
+  JiraRestApi(URL url, String user, String pass, Class<T> classOfT, String classPrefix)
+      throws MalformedURLException {
     this.auth = Base64.getEncoder().encodeToString((user + ":" + pass).getBytes());
-    this.baseUrl = url;
+    this.baseUrl = new URL(url, BASE_PREFIX + classPrefix);
     this.gson = new Gson();
     this.classOfT = classOfT;
-    this.classPrefix = classPrefix;
   }
 
   public int getResponseCode() {
@@ -80,6 +80,10 @@
     return doGet(spec, passCode, null);
   }
 
+  URL getBaseUrl() {
+    return baseUrl;
+  }
+
   /** Do a simple POST request. */
   public boolean doPost(String spec, String jsonInput, int passCode) throws IOException {
     HttpURLConnection conn = prepHttpConnection(spec, true);
@@ -93,7 +97,7 @@
 
   private HttpURLConnection prepHttpConnection(String spec, boolean isPostRequest)
       throws IOException {
-    URL url = new URL(baseUrl, BASE_PREFIX + classPrefix + spec);
+    URL url = new URL(baseUrl, spec);
     ProxySelector proxySelector = ProxySelector.getDefault();
     Proxy proxy = HttpSupport.proxyFor(proxySelector, url);
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
index 3bcf230..3c4da25 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiProvider.java
@@ -9,24 +9,25 @@
   private final String pass;
 
   public JiraRestApiProvider(String url, String user, String pass) throws MalformedURLException {
-    this.url = new URL(url);
+    this.url = new URL(url + (url.endsWith("/") ? "" : "/"));
     this.user = user;
     this.pass = pass;
   }
 
-  public <T> JiraRestApi<T> get(Class<T> classOfT, String classPrefix) {
+  public <T> JiraRestApi<T> get(Class<T> classOfT, String classPrefix)
+      throws MalformedURLException {
     return new JiraRestApi<>(url, user, pass, classOfT, classPrefix);
   }
 
-  public JiraRestApi<JiraIssue> getIssue() {
+  public JiraRestApi<JiraIssue> getIssue() throws MalformedURLException {
     return get(JiraIssue.class, "/issue");
   }
 
-  public JiraRestApi<JiraServerInfo> getServerInfo() {
+  public JiraRestApi<JiraServerInfo> getServerInfo() throws MalformedURLException {
     return get(JiraServerInfo.class, "/serverInfo");
   }
 
-  public JiraRestApi<JiraProject[]> getProjects() {
+  public JiraRestApi<JiraProject[]> getProjects() throws MalformedURLException {
     return get(JiraProject[].class, "/project");
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
new file mode 100644
index 0000000..77fb4bf
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/jira/restapi/JiraRestApiTest.java
@@ -0,0 +1,38 @@
+package com.googlesource.gerrit.plugins.its.jira.restapi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class JiraRestApiTest {
+
+  @Test
+  public void testJiraServerInfoForNonRootJiraUrl() throws Exception {
+    String nonRootJiraUrl = "http://jira.mycompany.com/myroot/";
+    JiraRestApi<JiraServerInfo> serverInfo =
+        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
+
+    String jiraApiUrl = serverInfo.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl);
+  }
+
+  @Test
+  public void testJiraServerInfoForNonRootJiraUrlNotEndingWithSlash() throws Exception {
+    String nonRootJiraUrl = "http://jira.mycompany.com/myroot";
+    JiraRestApi<JiraServerInfo> serverInfo =
+        new JiraRestApiProvider(nonRootJiraUrl, "", "").getServerInfo();
+
+    String jiraApiUrl = serverInfo.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(nonRootJiraUrl);
+  }
+
+  @Test
+  public void testJiraServerInfoForRootJiraUrl() throws Exception {
+    String rootJiraUrl = "http://jira.mycompany.com";
+    JiraRestApi<JiraServerInfo> serverInfo =
+        new JiraRestApiProvider(rootJiraUrl, "", "").getServerInfo();
+
+    String jiraApiUrl = serverInfo.getBaseUrl().toString();
+    assertThat(jiraApiUrl).startsWith(rootJiraUrl);
+  }
+}