.getInput();
assertJson(response).isSimilarTo("{\n" +
+ " \"total\": 1,\n" +
+ " \"p\": 1,\n" +
+ " \"ps\": 50,\n" +
" \"paging\": {\n" +
" \"pageIndex\": 1,\n" +
" \"pageSize\": 50,\n" +
.execute()
.getInput();
- assertJson(response).isSimilarTo("{\"paging\":{\"pageIndex\":1,\"pageSize\":50,\"total\":0},\"events\":[]}");
+ assertJson(response).isSimilarTo("{\"total\":0,\"p\":1,\"ps\":50,\"paging\":{\"pageIndex\":1,\"pageSize\":50,\"total\":0},\"events\":[]}");
}
@Test
.setChangeType(ActiveRuleChange.Type.ACTIVATED.name())
.setData(ImmutableMap.of("severity", "MAJOR", "param_format", "^[A-Z][a-zA-Z0-9]*$", "ruleUuid", rule3.getUuid())));
- String result = ws.newRequest()
+ ws.newRequest()
.setMethod("GET")
.setParam(PARAM_LANGUAGE, profile.getLanguage())
.setParam(PARAM_QUALITY_PROFILE, profile.getName())
.setParam("ps", "10")
.execute()
- .getInput();
- assertJson(result).isSimilarTo(ws.getDef().responseExampleAsString());
+ .assertJson(this.getClass(), "changelog_example.json");
}
@Test
.setParam(WebService.Param.FIELDS, "actives")
.executeProtobuf(Rules.SearchResponse.class);
+ assertThat(response.getTotal()).isZero();
+ assertThat(response.getP()).isOne();
assertThat(response.getPaging().getTotal()).isZero();
assertThat(response.getPaging().getPageIndex()).isOne();
assertThat(response.getPaging().getPageSize()).isNotZero();
SearchResponse result = ws.newRequest()
.setParam("f", "langName")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
SearchResponse result = ws.newRequest()
.setParam("f", "debtRemFn,remFnOverloaded,defaultDebtRemFn")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
SearchResponse result = ws.newRequest()
.setParam("f", "debtRemFn,remFnOverloaded,defaultDebtRemFn")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
SearchResponse result = ws.newRequest()
.setParam("f", "debtRemFn,remFnOverloaded,defaultDebtRemFn")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
.setParam("f", "isTemplate")
.setParam("is_template", "true")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
.setParam("f", "templateKey")
.setParam("template_key", templateRule.getRepositoryKey() + ":" + templateRule.getRuleKey())
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
SearchResponse result = ws.newRequest().executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isZero();
assertThat(result.getPaging().getTotal()).isZero();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isZero();
.setParam("q", rule.getName())
.setParam("activation", "true")
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
.setParam("activation", "true")
.setParam("qprofile", profile.getKee())
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
.setParam("qprofile", profile.getKee())
.executeProtobuf(SearchResponse.class);
+ assertThat(result.getTotal()).isOne();
assertThat(result.getPaging().getTotal()).isOne();
assertThat(result.getPaging().getPageIndex()).isOne();
assertThat(result.getRulesCount()).isOne();
requestPopulator.accept(request);
Rules.SearchResponse response = request.executeProtobuf(Rules.SearchResponse.class);
+ assertThat(response.getP()).isOne();
assertThat(response.getPaging().getPageIndex()).isOne();
assertThat(response.getPaging().getPageSize()).isNotZero();
RuleKey[] expectedRuleKeys = stream(expectedRules).map(RuleDto::getKey).toList().toArray(new RuleKey[0]);
assertThat(response.getRulesList())
.extracting(r -> RuleKey.parse(r.getKey()))
.containsExactlyInAnyOrder(expectedRuleKeys);
+ assertThat(response.getTotal()).isEqualTo(expectedRules.length);
assertThat(response.getPaging().getTotal()).isEqualTo(expectedRules.length);
assertThat(response.getRulesCount()).isEqualTo(expectedRules.length);
}
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isFalse();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
- tuple("10.2", "Response fields 'total', 's', 'ps' dropped"),
tuple("10.0", "Field 'managed' added to the payload."),
tuple("10.0", "Parameter 'id' is removed. Use 'name' instead."),
tuple("9.8", "response fields 'total', 's', 'ps' have been deprecated, please use 'paging' object instead."),
assertJson(result).isSimilarTo("""
{
+ "p": 1,
+ "total": 0,
"paging": {
"pageIndex": 1,
"pageSize": 25,
.execute()
.getInput()).isSimilarTo("""
{
+ "p": 1,
+ "ps": 1,
+ "total": 2,
"paging": {
"pageIndex": 1,
"pageSize": 1,
.execute()
.getInput()).isSimilarTo("""
{
+ "p": 2,
+ "ps": 1,
+ "total": 2,
"paging": {
"pageIndex": 2,
"pageSize": 1,
{
- "paging": {
- "total": 0
- },
+ "total": 0,
"issues": []
}
{
+ "total": 501,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 0,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 0,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 1,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 2,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 2,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 2,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 1,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 0,
"issues": [],
"paging": {
"pageIndex": 1,
{
+ "total": 12,
+ "p": 2,
+ "ps": 9,
"paging": {
"pageIndex": 2,
"pageSize": 9,
{
+ "total": 1,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
{
+ "total": 3,
+ "p": 1,
+ "ps": 100,
"paging": {
"pageIndex": 1,
"pageSize": 100,
--- /dev/null
+{
+ "total": 3,
+ "ps": 10,
+ "p": 1,
+ "paging": {
+ "pageSize": 10,
+ "total": 3,
+ "pageIndex": 1
+ },
+ "events": [
+ {
+ "date" : "2015-02-23T17:58:39+0100",
+ "action" : "ACTIVATED",
+ "authorLogin" : "anakin.skywalker",
+ "authorName" : "Anakin Skywalker",
+ "ruleKey" : "java:S2438",
+ "ruleName" : "\"Threads\" should not be used where \"Runnables\" are expected",
+ "params" : {
+ "severity" : "CRITICAL"
+ }
+ },
+ {
+ "date" : "2015-02-23T17:58:18+0100",
+ "action" : "DEACTIVATED",
+ "authorLogin" : "padme.amidala",
+ "authorName" : "Padme Amidala",
+ "ruleKey" : "java:S2162",
+ "ruleName" : "\"equals\" methods should be symmetric and work for subclasses"
+ },
+ {
+ "action" : "ACTIVATED",
+ "authorLogin" : "obiwan.kenobi",
+ "authorName" : "Obiwan Kenobi",
+ "ruleKey" : "java:S00101",
+ "ruleName" : "Class names should comply with a naming convention",
+ "date" : "2014-09-12T15:20:46+0200",
+ "params" : {
+ "severity" : "MAJOR",
+ "format" : "^[A-Z][a-zA-Z0-9]*$"
+ }
+ }
+ ]
+}
{
+ "total": 12,
+ "p": 2,
+ "ps": 9,
"paging": {
"pageIndex": 2,
"pageSize": 9,
+ "<br/>When issue indexation is in progress returns 503 service unavailable HTTP code.")
.setSince("3.6")
.setChangelog(
- new Change("10.2", "Response fields 'total', 's', 'ps' dropped"),
new Change("10.2", format("Parameter '%s' renamed to '%s'", PARAM_COMPONENT_KEYS, PARAM_COMPONENTS)),
new Change("10.1", "Add the 'codeVariants' parameter, facet and response field"),
new Change("10.0", "Parameter 'sansTop25' is deprecated"),
SearchWsResponse formatSearch(Set<SearchAdditionalField> fields, SearchResponseData data, Paging paging, Facets facets) {
SearchWsResponse.Builder response = SearchWsResponse.newBuilder();
- response.setPaging(formatPaging(paging));
+ formatPaging(paging, response);
ofNullable(data.getEffortTotal()).ifPresent(response::setEffortTotal);
response.addAllIssues(createIssues(fields, data));
response.addAllComponents(formatComponents(data));
return response.build();
}
+ private static void formatPaging(Paging paging, SearchWsResponse.Builder response) {
+ response.setP(paging.pageIndex());
+ response.setPs(paging.pageSize());
+ response.setTotal(paging.total());
+ response.setPaging(formatPaging(paging));
+ }
+
private static Common.Paging.Builder formatPaging(Paging paging) {
return Common.Paging.newBuilder()
.setPageIndex(paging.pageIndex())
.setDescription("Get the history of changes on a quality profile: rule activation/deactivation, change in parameters/severity. " +
"Events are ordered by date in descending order (most recent first).")
.setChangelog(
- new org.sonar.api.server.ws.Change("10.2", "Response fields 'total', 's', 'ps' dropped"),
new org.sonar.api.server.ws.Change("9.8", "response fields 'total', 's', 'ps' have been deprecated, please use 'paging' object instead"),
new org.sonar.api.server.ws.Change("9.8", "The field 'paging' has been added to the response"))
.setHandler(this)
Map<String, UserDto> usersByUuid, Map<String, RuleDto> rulesByRuleUuids) {
json.beginObject();
writePaging(json, total, page, pageSize);
+ json.name("paging").beginObject()
+ .prop("pageIndex", page)
+ .prop("pageSize", pageSize)
+ .prop("total", total)
+ .endObject();
json.name("events").beginArray();
changelogs.forEach(change -> {
JsonWriter changeWriter = json.beginObject();
json.endObject();
}
+ /**
+ * @deprecated since 9.8 - replaced by 'paging' object structure.
+ */
+ @Deprecated(since = "9.8")
private static void writePaging(JsonWriter json, int total, int page, int pageSize) {
- json.name("paging").beginObject()
- .prop("pageIndex", page)
- .prop("pageSize", pageSize)
- .prop("total", total)
- .endObject();
+ json.prop("total", total);
+ json.prop(Param.PAGE, page);
+ json.prop(Param.PAGE_SIZE, pageSize);
}
/**
new Change("10.0", "The value 'debtRemFn' for the 'f' parameter has been deprecated, use 'remFn' instead"),
new Change("10.0", "The value 'defaultDebtRemFn' for the 'f' parameter has been deprecated, use 'defaultRemFn' instead"),
new Change("10.0", "The value 'sansTop25' for the parameter 'facets' has been deprecated"),
- new Change("10.0", "Parameter 'sansTop25' is deprecated"),
- new Change("10.2", "Response fields 'total', 's', 'ps' dropped")
+ new Change("10.0", "Parameter 'sansTop25' is deprecated")
);
action.createParam(FACETS)
private SearchResponse buildResponse(DbSession dbSession, SearchRequest request, SearchOptions context, SearchResult result, RuleQuery query) {
SearchResponse.Builder responseBuilder = SearchResponse.newBuilder();
- writePaging(responseBuilder, result, context);
+ writeStatistics(responseBuilder, result, context);
doContextResponse(dbSession, request, result, responseBuilder, query);
if (!context.getFacets().isEmpty()) {
writeFacets(responseBuilder, request, context, result);
return responseBuilder.build();
}
- private static void writePaging(SearchResponse.Builder response, SearchResult searchResult, SearchOptions context) {
+ private static void writeStatistics(SearchResponse.Builder response, SearchResult searchResult, SearchOptions context) {
+ response.setTotal(searchResult.total);
+ response.setP(context.getPage());
+ response.setPs(context.getLimit());
response.setPaging(formatPaging(searchResult.total, context.getPage(), context.getLimit()));
}
.addSearchQuery("freddy", "names", "logins")
.addPagingParams(25)
.setChangelog(
- new Change("10.2", "Response fields 'total', 's', 'ps' dropped"),
new Change("10.0", "Field 'managed' added to the payload."),
new Change("10.0", "Parameter 'id' is removed. Use 'name' instead."),
new Change("9.8", "response fields 'total', 's', 'ps' have been deprecated, please use 'paging' object instead."),
json.beginObject();
writeMembers(json, users, userUuidToIsManaged);
writePaging(json, paging);
+ json.name("paging").beginObject()
+ .prop("pageIndex", page)
+ .prop("pageSize", pageSize)
+ .prop("total", total)
+ .endObject();
json.endObject();
}
}
json.endArray();
}
+ /**
+ * @deprecated since 9.8 - replaced by 'paging' object structure.
+ */
+ @Deprecated(since = "9.8")
private static void writePaging(JsonWriter json, Paging paging) {
- json.name("paging").beginObject()
- .prop("pageIndex", paging.pageIndex())
- .prop("pageSize", paging.pageSize())
- .prop("total", paging.total())
- .endObject();
+ json.prop(Param.PAGE, paging.pageIndex())
+ .prop(Param.PAGE_SIZE, paging.pageSize())
+ .prop("total", paging.total());
}
private static String getMembership(String selected) {
SearchResponse response = loadFromStream(wsClient.call(getRequest).contentStream());
List<LoadedActiveRule> pageRules = readPage(response);
ruleList.addAll(pageRules);
- loaded += response.getPaging().getPageSize();
+ loaded += response.getPs();
- if (response.getPaging().getTotal() <= loaded) {
+ if (response.getTotal() <= loaded) {
break;
}
page++;
import org.sonar.scanner.WsTestUtil;
import org.sonar.scanner.bootstrap.DefaultScannerWsClient;
import org.sonar.scanner.scan.branch.BranchConfiguration;
-import org.sonarqube.ws.Common;
import org.sonarqube.ws.Rules;
import org.sonarqube.ws.Rules.Active;
import org.sonarqube.ws.Rules.ActiveList;
});
rules.setActives(actives);
- rules.setPaging(Common.Paging.newBuilder().setPageSize(numberOfRules).setTotal(total));
+ rules.setPs(numberOfRules);
+ rules.setTotal(total);
return new ByteArrayInputStream(rules.build().toByteArray());
}
});
rules.setActives(actives);
- rules.setPaging(Common.Paging.newBuilder().setPageSize(3).setTotal(3));
+ rules.setPs(3);
+ rules.setTotal(3);
return new ByteArrayInputStream(rules.build().toByteArray());
}
}
// Response of GET api/issues/search
message SearchWsResponse {
reserved 5;
- reserved 1;
- reserved 2;
- reserved 3;
+ optional int64 total = 1 [deprecated=true];
+ optional int64 p = 2 [deprecated=true];
+ optional int32 ps = 3 [deprecated=true];
optional sonarqube.ws.commons.Paging paging = 4;
// Total amount of effort, only when the facet "total" is enabled
// WS api/rules/search
message SearchResponse {
- reserved 1;
- reserved 2;
- reserved 3;
+ optional int64 total = 1 [deprecated=true];
+ optional int32 p = 2 [deprecated=true];
+ optional int64 ps = 3 [deprecated=true];
+
repeated Rule rules = 4;
optional Actives actives = 5;
optional QProfiles qProfiles = 6;