From: Julien Lancelot Date: Tue, 3 Jun 2014 15:33:54 +0000 (+0200) Subject: Add format parameter and allow only json format in /api/issues/search WS X-Git-Tag: 4.4-RC1~674 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=672e27f5f704553ef521a39aaacbf9776e984643;p=sonarqube.git Add format parameter and allow only json format in /api/issues/search WS --- diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java index dc6aa1ac7a4..1f9a5dea745 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java @@ -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() diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java index 2c989d64533..b2d9a938da7 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java @@ -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() { diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java index c425e7328eb..ff2fb0fea5a 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java @@ -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