浏览代码

SONAR-15488 x-total header is optional

tags/9.2.0.49834
Pierre 2 年前
父节点
当前提交
59158adb1e

+ 3
- 1
server/sonar-alm-client/src/main/java/org/sonar/alm/client/gitlab/GitlabHttpClient.java 查看文件

@@ -34,6 +34,7 @@ import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.apache.logging.log4j.util.Strings;
import org.sonar.alm.client.TimeoutConfiguration;
import org.sonar.api.server.ServerSide;
import org.sonar.api.utils.log.Logger;
@@ -312,7 +313,8 @@ public class GitlabHttpClient {
List<Project> projectList = Project.parseJsonArray(response.body().string());
int returnedPageNumber = parseAndGetIntegerHeader(headers.get("X-Page"));
int returnedPageSize = parseAndGetIntegerHeader(headers.get("X-Per-Page"));
int totalProjects = parseAndGetIntegerHeader(headers.get("X-Total"));
String xtotal = headers.get("X-Total");
Integer totalProjects = Strings.isEmpty(xtotal) ? null : parseAndGetIntegerHeader(xtotal);
return new ProjectList(projectList, returnedPageNumber, returnedPageSize, totalProjects);
} catch (JsonSyntaxException e) {
throw new IllegalArgumentException("Could not parse GitLab answer to search projects. Got a non-json payload as result.");

+ 6
- 3
server/sonar-alm-client/src/main/java/org/sonar/alm/client/gitlab/ProjectList.java 查看文件

@@ -20,15 +20,17 @@
package org.sonar.alm.client.gitlab;

import java.util.List;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;

public class ProjectList {

private final List<Project> projects;
private final int pageNumber;
private final int pageSize;
private final int total;
private final Integer total;

public ProjectList(List<Project> projects, int pageNumber, int pageSize, int total) {
public ProjectList(List<Project> projects, int pageNumber, int pageSize, @Nullable Integer total) {
this.projects = projects;
this.pageNumber = pageNumber;
this.pageSize = pageSize;
@@ -47,7 +49,8 @@ public class ProjectList {
return pageSize;
}

public int getTotal() {
@CheckForNull
public Integer getTotal() {
return total;
}
}

+ 36
- 0
server/sonar-alm-client/src/test/java/org/sonar/alm/client/gitlab/GitlabHttpClientTest.java 查看文件

@@ -243,6 +243,42 @@ public class GitlabHttpClientTest {
assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
}

@Test
public void search_projects_dont_fail_if_no_x_total() throws InterruptedException {
MockResponse projects = new MockResponse()
.setResponseCode(200)
.setBody("[\n"
+ " {\n"
+ " \"id\": 1,\n"
+ " \"name\": \"SonarQube example 1\",\n"
+ " \"name_with_namespace\": \"SonarSource / SonarQube / SonarQube example 1\",\n"
+ " \"path\": \"sonarqube-example-1\",\n"
+ " \"path_with_namespace\": \"sonarsource/sonarqube/sonarqube-example-1\",\n"
+ " \"web_url\": \"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1\"\n"
+ " }"
+ "]");
projects.addHeader("X-Page", 1);
projects.addHeader("X-Per-Page", 10);
server.enqueue(projects);

ProjectList projectList = underTest.searchProjects(gitlabUrl, "pat", "example", 1, 10);

assertThat(projectList.getPageNumber()).isEqualTo(1);
assertThat(projectList.getPageSize()).isEqualTo(10);
assertThat(projectList.getTotal()).isNull();

assertThat(projectList.getProjects()).hasSize(1);
assertThat(projectList.getProjects()).extracting(
Project::getId, Project::getName, Project::getNameWithNamespace, Project::getPath, Project::getPathWithNamespace, Project::getWebUrl).containsExactly(
tuple(1L, "SonarQube example 1", "SonarSource / SonarQube / SonarQube example 1", "sonarqube-example-1", "sonarsource/sonarqube/sonarqube-example-1",
"https://example.gitlab.com/sonarsource/sonarqube/sonarqube-example-1"));

RecordedRequest projectGitlabRequest = server.takeRequest(10, TimeUnit.SECONDS);
String gitlabUrlCall = projectGitlabRequest.getRequestUrl().toString();
assertThat(gitlabUrlCall).isEqualTo(server.url("") + "projects?archived=false&simple=true&membership=true&order_by=name&sort=asc&search=example&page=1&per_page=10");
assertThat(projectGitlabRequest.getMethod()).isEqualTo("GET");
}

@Test
public void search_projects_with_case_insensitive_pagination_headers() throws InterruptedException {
MockResponse projects1 = new MockResponse()

+ 8
- 5
server/sonar-webserver-webapi/src/main/java/org/sonar/server/almintegration/ws/gitlab/SearchGitlabReposAction.java 查看文件

@@ -123,13 +123,16 @@ public class SearchGitlabReposAction implements AlmIntegrationsWsAction {
.map(project -> toGitlabRepository(project, sqProjectsKeyByGitlabProjectId))
.collect(toList());

Paging.Builder pagingBuilder = Paging.newBuilder()
.setPageIndex(gitlabProjectList.getPageNumber())
.setPageSize(gitlabProjectList.getPageSize());
Integer gitlabProjectListTotal = gitlabProjectList.getTotal();
if (gitlabProjectListTotal != null) {
pagingBuilder.setTotal(gitlabProjectListTotal);
}
return AlmIntegrations.SearchGitlabReposWsResponse.newBuilder()
.addAllRepositories(gitlabRepositories)
.setPaging(Paging.newBuilder()
.setPageIndex(gitlabProjectList.getPageNumber())
.setPageSize(gitlabProjectList.getPageSize())
.setTotal(gitlabProjectList.getTotal())
.build())
.setPaging(pagingBuilder.build())
.build();
}
}

正在加载...
取消
保存