]> source.dussan.org Git - sonarqube.git/commitdiff
Add format parameter and allow only json format in /api/issues/search WS
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 3 Jun 2014 15:33:54 +0000 (17:33 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 3 Jun 2014 15:34:02 +0000 (17:34 +0200)
sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java
sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java
sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java

index dc6aa1ac7a4ee02130551253b2115e35b05fc5fc..1f9a5dea7453b904988b0db8983e27a56e0d8781 100644 (file)
@@ -44,6 +44,7 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.markdown.Markdown;
+import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.issue.filter.IssueFilterParameters;
 import org.sonar.server.user.UserSession;
 
@@ -159,10 +160,13 @@ public class IssueSearchAction implements RequestHandler {
     action.createParam(IssueFilterParameters.ASC)
       .setDescription("Ascending sort")
       .setBooleanPossibleValues();
+    action.createParam("format")
+      .setDescription("Only json format is available. This parameter is kept only for backward compatibility and shouldn't be used anymore");
   }
 
   @Override
   public void handle(Request request, Response response) {
+    checkFormatParameter(request);
     IssueQueryResult queryResult = issueFinder.find(createQuery(request));
 
     JsonWriter json = response.newJsonWriter();
@@ -179,6 +183,13 @@ public class IssueSearchAction implements RequestHandler {
     json.endObject().close();
   }
 
+  private void checkFormatParameter(Request request) {
+    String format = request.param("format");
+    if (!Strings.isNullOrEmpty(format) && !format.equals("json")){
+      throw new BadRequestException("Only json format is supported.");
+    }
+  }
+
   private void writePaging(IssueQueryResult result, JsonWriter json) {
     json.prop("maxResultsReached", result.maxResultsReached());
     json.name("paging").beginObject()
index 2c989d645330224c41b1de4265e8aff0417a1ee8..b2d9a938da748dd82a9eba08ca7fbf870128bed1 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.issue.ws;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.junit.Before;
 import org.junit.Test;
@@ -47,6 +48,7 @@ import org.sonar.core.issue.DefaultActionPlan;
 import org.sonar.core.issue.DefaultIssueQueryResult;
 import org.sonar.core.issue.workflow.Transition;
 import org.sonar.core.user.DefaultUser;
+import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.issue.ActionService;
 import org.sonar.server.issue.IssueService;
 import org.sonar.server.user.MockUserSession;
@@ -58,6 +60,7 @@ import java.util.*;
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.assertions.Fail.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.*;
@@ -134,7 +137,7 @@ public class IssueSearchActionTest {
     Date updateDate = DateUtils.parseDateTime("2014-01-23T19:10:03+0100");
     Date closedDate = DateUtils.parseDateTime("2014-01-24T19:10:03+0100");
 
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .setCreationDate(creationDate)
       .setUpdateDate(updateDate)
       .setCloseDate(closedDate);
@@ -152,7 +155,7 @@ public class IssueSearchActionTest {
   @Test
   public void issues_with_debt() throws Exception {
     Duration debt = (Duration.create(7260L));
-    Issue issue = createStandardIssue().setDebt(debt);
+    Issue issue = createIssue().setDebt(debt);
     issues.add(issue);
 
     when(durations.encode(debt)).thenReturn("2h1min");
@@ -163,7 +166,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_action_plan() throws Exception {
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .setActionPlanKey("AP-ABCD");
     issues.add(issue);
 
@@ -193,7 +196,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_comments() throws Exception {
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .addComment(
         new DefaultIssueComment()
           .setKey("COMMENT-ABCD")
@@ -216,7 +219,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_attributes() throws Exception {
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .setAttribute("jira-issue-key", "SONAR-1234");
     issues.add(issue);
 
@@ -226,7 +229,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_extra_fields() throws Exception {
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .setActionPlanKey("AP-ABCD")
       .setAssignee("john");
     issues.add(issue);
@@ -246,7 +249,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_components() throws Exception {
-    issues.add(createStandardIssue());
+    issues.add(createIssue());
 
     ComponentDto component = new ComponentDto()
       .setId(10L)
@@ -275,7 +278,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_sub_project() throws Exception {
-    Issue issue = createStandardIssue().setComponentKey("sample:sample-module:src/main/xoo/sample/Sample.xoo");
+    Issue issue = createIssue().setComponentKey("sample:sample-module:src/main/xoo/sample/Sample.xoo");
     issues.add(issue);
 
     // File
@@ -317,7 +320,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_rules() throws Exception {
-    issues.add(createStandardIssue());
+    issues.add(createIssue());
 
     result.addRules(newArrayList(
       Rule.create("squid", "AvoidCycle").setName("Avoid cycle").setDescription("Avoid cycle description")
@@ -329,7 +332,7 @@ public class IssueSearchActionTest {
 
   @Test
   public void issues_with_users() throws Exception {
-    Issue issue = createStandardIssue()
+    Issue issue = createIssue()
       .setAssignee("john")
       .setReporter("steven")
       .setAuthorLogin("Henry");
@@ -399,8 +402,21 @@ public class IssueSearchActionTest {
     assertThat(query.asc()).isTrue();
   }
 
-  private DefaultIssue createStandardIssue() {
-    return createIssue();
+  @Test
+  public void verify_format_parameter() throws Exception {
+    // No error if json
+    tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "json")).execute();
+
+    // No error if empty
+    tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "")).execute();
+
+    // Error if not empty and not json
+    try {
+      tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "xml")).execute();
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(BadRequestException.class);
+    }
   }
 
   private DefaultIssue createIssue() {
index c425e7328eb22c07f2ba4b623caf0afe59faf8e8..ff2fb0fea5a06ada878987d067ccbad451e01159 100644 (file)
@@ -96,7 +96,7 @@ public class IssuesWsTest {
     assertThat(show.isInternal()).isFalse();
     assertThat(show.handler()).isSameAs(searchAction);
     assertThat(show.responseExampleAsString()).isNotEmpty();
-    assertThat(show.params()).hasSize(23);
+    assertThat(show.params()).hasSize(24);
   }
 
   @Test