]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3755 Add client WS for issues transitions
authorJulien Lancelot <julien.lancelot@gmail.com>
Mon, 29 Apr 2013 11:48:54 +0000 (13:48 +0200)
committerJulien Lancelot <julien.lancelot@gmail.com>
Mon, 29 Apr 2013 11:48:54 +0000 (13:48 +0200)
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/DefaultIssueClient.java
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/IssueClient.java
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/IssueParser.java
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/IssueTransition.java [new file with mode: 0644]
sonar-ws-client/src/test/java/org/sonar/wsclient/issue/DefaultIssueClientTest.java
sonar-ws-client/src/test/java/org/sonar/wsclient/issue/IssueParserTest.java
sonar-ws-client/src/test/resources/org/sonar/wsclient/issue/IssueParserTest/getTransitions.json [new file with mode: 0644]

index a44cff6d0ba614d0e0614728d82b7b56bd1c3bc0..8069c07174715356f08c091547605d2668885651 100644 (file)
@@ -23,6 +23,7 @@ import com.github.kevinsawicki.http.HttpRequest;
 import org.sonar.wsclient.internal.HttpRequestFactory;
 
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -75,4 +76,27 @@ public class DefaultIssueClient implements IssueClient {
     change(issueKey, IssueChange.create().comment(comment));
   }
 
+  @Override
+  public List<String> transitions(String issueKey) {
+    Map<String, Object> queryParams = new LinkedHashMap<String, Object>();
+    queryParams.put("issue", issueKey);
+    HttpRequest request = requestFactory.get("/api/issues/transitions", queryParams);
+    if (!request.ok()) {
+      throw new IllegalStateException("Fail to return transition for issue. Bad HTTP response status: " + request.code());
+    }
+    String json = request.body("UTF-8");
+    return parser.parseTransitions(json);
+  }
+
+  @Override
+  public void transition(String issueKey, IssueTransition transition) {
+    if (!transition.urlParams().isEmpty()) {
+      Map<String, Object> queryParams = new LinkedHashMap<String, Object>(transition.urlParams());
+      queryParams.put("issue", issueKey);
+      HttpRequest request = requestFactory.post(IssueTransition.BASE_URL, queryParams);
+      if (!request.ok()) {
+        throw new IllegalStateException("Fail to execute transition on issue " + issueKey + ".Bad HTTP response status: " + request.code());
+      }
+    }
+  }
 }
index 23463f884e7285aabf6dd1c7637cbd704bf55949..04845bf5b6a5ccf2f58dbf59a30599428218067d 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.wsclient.issue;
 
+import java.util.List;
+
 /**
  * @since 3.6
  */
@@ -30,6 +32,10 @@ public interface IssueClient {
 
   void create(NewIssue issue);
 
+  void transition(String issueKey, IssueTransition transition);
+
+  List<String> transitions(String issueKey);
+
   /**
    * Shortcut for {@code #change(issueKey, IssueChange.create().comment(comment)}
    */
index ef76e3630a692246513e012820531441f3cb180e..1595aa72c73d0fe49f2143ebb7c83d7587ebe1a8 100644 (file)
@@ -22,10 +22,12 @@ package org.sonar.wsclient.issue;
 import org.json.simple.JSONValue;
 import org.sonar.wsclient.unmarshallers.JsonUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 class IssueParser {
+
   Issues parseIssues(String json) {
     Issues result = new Issues();
     Map jRoot = (Map) JSONValue.parse(json);
@@ -39,4 +41,14 @@ class IssueParser {
     result.setSecurityExclusions(JsonUtils.getBoolean(jRoot, "securityExclusions"));
     return result;
   }
+
+  List<String> parseTransitions(String json) {
+    List<String> transitions = new ArrayList<String>();
+    Map jRoot = (Map) JSONValue.parse(json);
+    List<String> jTransitions = (List) jRoot.get("transitions");
+    for (String jTransition : jTransitions) {
+      transitions.add(jTransition);
+    }
+    return transitions;
+  }
 }
diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/IssueTransition.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/issue/IssueTransition.java
new file mode 100644 (file)
index 0000000..24e7f3e
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.wsclient.issue;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @since 3.6
+ */
+public class IssueTransition {
+  static final String BASE_URL = "/api/issues/do_transition";
+  private final Map<String, Object> params = new LinkedHashMap<String, Object>();
+
+  private IssueTransition() {
+  }
+
+  public static IssueTransition create() {
+    return new IssueTransition();
+  }
+
+  Map<String, Object> urlParams() {
+    return params;
+  }
+
+  /**
+   * Ask to apply a transition
+   */
+  public IssueTransition transition(String s) {
+    params.put("transition", s);
+    return this;
+  }
+
+}
index f234952cae790b6f4169ab5bb192bf8ac0653740..2801ca83e6a4b32d2ad870416272bf8f089240c8 100644 (file)
@@ -24,6 +24,8 @@ import org.junit.Test;
 import org.sonar.wsclient.MockHttpServerInterceptor;
 import org.sonar.wsclient.internal.HttpRequestFactory;
 
+import java.util.List;
+
 import static org.fest.assertions.Assertions.assertThat;
 import static org.fest.assertions.Fail.fail;
 
@@ -88,4 +90,33 @@ public class DefaultIssueClientTest {
 
     assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/create?component=Action.java&rule=squid:AvoidCycle");
   }
+
+  @Test
+  public void should_get_transitions() {
+    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url(), null, null);
+    httpServer.doReturnBody("{\n" +
+      "  \"transitions\": [\n" +
+      "    \"close\",\n" +
+      "    \"resolve\",\n" +
+      "    \"falsepositive\"\n" +
+      "  ]\n" +
+      "}");
+
+    IssueClient client = new DefaultIssueClient(requestFactory);
+    List<String> transitions = client.transitions("ABCDE");
+
+    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/transitions?issue=ABCDE");
+    assertThat(transitions).hasSize(3);
+    assertThat(transitions).containsOnly("close", "resolve", "falsepositive");
+  }
+
+  @Test
+  public void should_apply_transition() {
+    HttpRequestFactory requestFactory = new HttpRequestFactory(httpServer.url(), null, null);
+
+    IssueClient client = new DefaultIssueClient(requestFactory);
+    client.transition("ABCDE", IssueTransition.create().transition("resolve"));
+
+    assertThat(httpServer.requestedPath()).isEqualTo("/api/issues/do_transition?transition=resolve&issue=ABCDE");
+  }
 }
index 363e08ec08fac877af0fac8bfd9bb3ab80b53f54..4e4bf533f903835308497e0966e89074d7e078f1 100644 (file)
@@ -71,4 +71,14 @@ public class IssueParserTest {
     assertThat(issues.securityExclusions()).isTrue();
   }
 
+  @Test
+  public void test_GET_transitions() throws Exception {
+    String json = IOUtils.toString(getClass().getResourceAsStream("/org/sonar/wsclient/issue/IssueParserTest/getTransitions.json"));
+    List<String> transitions = new IssueParser().parseTransitions(json);
+
+    assertThat(transitions).isNotNull();
+    assertThat(transitions).hasSize(3);
+    assertThat(transitions).containsOnly("close", "resolve", "falsepositive");
+  }
+
 }
diff --git a/sonar-ws-client/src/test/resources/org/sonar/wsclient/issue/IssueParserTest/getTransitions.json b/sonar-ws-client/src/test/resources/org/sonar/wsclient/issue/IssueParserTest/getTransitions.json
new file mode 100644 (file)
index 0000000..4c6878a
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "transitions": [
+    "close",
+    "resolve",
+    "falsepositive"
+  ]
+}
\ No newline at end of file