import org.sonar.wsclient.internal.HttpRequestFactory;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
/**
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());
+ }
+ }
+ }
}
*/
package org.sonar.wsclient.issue;
+import java.util.List;
+
/**
* @since 3.6
*/
void create(NewIssue issue);
+ void transition(String issueKey, IssueTransition transition);
+
+ List<String> transitions(String issueKey);
+
/**
* Shortcut for {@code #change(issueKey, IssueChange.create().comment(comment)}
*/
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);
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;
+ }
}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
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;
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");
+ }
}
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");
+ }
+
}
--- /dev/null
+{
+ "transitions": [
+ "close",
+ "resolve",
+ "falsepositive"
+ ]
+}
\ No newline at end of file