SONAR-6416 add field "id" to response of api/tests/covered_files

Refactoring: use protobuf to generate response
This commit is contained in:
Simon Brandhof 2015-10-19 16:17:12 +02:00
parent 64857ae7f4
commit 24c4856b33
4 changed files with 39 additions and 22 deletions

View File

@ -26,10 +26,10 @@ import com.google.common.collect.Maps;
import com.google.common.io.Resources;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.web.UserRole;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@ -39,6 +39,8 @@ import org.sonar.db.component.ComponentDtoFunctions;
import org.sonar.server.test.index.CoveredFileDoc;
import org.sonar.server.test.index.TestIndex;
import org.sonar.server.user.UserSession;
import org.sonar.server.ws.WsUtils;
import org.sonarqube.ws.WsTests;
public class CoveredFilesAction implements TestsWsAction {
@ -71,29 +73,29 @@ public class CoveredFilesAction implements TestsWsAction {
}
@Override
public void handle(Request request, Response response) {
public void handle(Request request, Response response) throws Exception {
String testUuid = request.mandatoryParam(TEST_UUID);
userSession.checkComponentUuidPermission(UserRole.CODEVIEWER, index.searchByTestUuid(testUuid).fileUuid());
List<CoveredFileDoc> coveredFiles = index.coveredFiles(testUuid);
Map<String, ComponentDto> componentsByUuid = buildComponentsByUuid(coveredFiles);
JsonWriter json = response.newJsonWriter().beginObject();
if (!coveredFiles.isEmpty()) {
writeTests(coveredFiles, componentsByUuid, json);
}
json.endObject().close();
}
private static void writeTests(List<CoveredFileDoc> coveredFiles, Map<String, ComponentDto> componentsByUuid, JsonWriter json) {
json.name("files").beginArray();
for (CoveredFileDoc coveredFile : coveredFiles) {
json.beginObject();
json.prop("key", componentsByUuid.get(coveredFile.fileUuid()).key());
json.prop("longName", componentsByUuid.get(coveredFile.fileUuid()).longName());
json.prop("coveredLines", coveredFile.coveredLines().size());
json.endObject();
WsTests.CoveredFilesResponse.Builder responseBuilder = WsTests.CoveredFilesResponse.newBuilder();
if (!coveredFiles.isEmpty()) {
for (CoveredFileDoc doc : coveredFiles) {
WsTests.CoveredFilesResponse.CoveredFile.Builder fileBuilder = WsTests.CoveredFilesResponse.CoveredFile.newBuilder();
fileBuilder.setId(doc.fileUuid());
fileBuilder.setCoveredLines(doc.coveredLines().size());
ComponentDto component = componentsByUuid.get(doc.fileUuid());
if (component != null) {
fileBuilder.setKey(component.key());
fileBuilder.setLongName(component.longName());
}
responseBuilder.addFiles(fileBuilder);
}
}
json.endArray();
WsUtils.writeProtobuf(responseBuilder.build(), request, response);
}
private Map<String, ComponentDto> buildComponentsByUuid(List<CoveredFileDoc> coveredFiles) {
@ -110,7 +112,7 @@ public class CoveredFilesAction implements TestsWsAction {
private static class CoveredFileToFileUuidFunction implements Function<CoveredFileDoc, String> {
@Override
public String apply(CoveredFileDoc coveredFile) {
public String apply(@Nonnull CoveredFileDoc coveredFile) {
return coveredFile.fileUuid();
}
}

View File

@ -63,13 +63,13 @@ public class CoveredFilesActionTest {
when(testIndex.searchByTestUuid(anyString()).fileUuid()).thenReturn("test-file-uuid");
when(testIndex.coveredFiles("test-uuid")).thenReturn(Arrays.asList(
new CoveredFileDoc().setFileUuid("bar-uuid").setCoveredLines(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
new CoveredFileDoc().setFileUuid("file-uuid").setCoveredLines(Arrays.asList(1, 2, 3))
new CoveredFileDoc().setFileUuid("FILE1").setCoveredLines(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
new CoveredFileDoc().setFileUuid("FILE2").setCoveredLines(Arrays.asList(1, 2, 3))
));
when(dbClient.componentDao().selectByUuids(any(DbSession.class), anyList())).thenReturn(
Arrays.asList(
newFileDto(newProjectDto(), "bar-uuid").setKey("org.foo.Bar.java").setLongName("src/main/java/org/foo/Bar.java"),
newFileDto(newProjectDto(), "file-uuid").setKey("org.foo.File.java").setLongName("src/main/java/org/foo/File.java")));
newFileDto(newProjectDto(), "FILE1").setKey("org.foo.Bar.java").setLongName("src/main/java/org/foo/Bar.java"),
newFileDto(newProjectDto(), "FILE2").setKey("org.foo.File.java").setLongName("src/main/java/org/foo/File.java")));
WsTester.TestRequest request = ws.newGetRequest("api/tests", "covered_files").setParam(TEST_UUID, "test-uuid");

View File

@ -1,11 +1,13 @@
{
"files": [
{
"id": "FILE1",
"key": "org.foo.Bar.java",
"longName": "src/main/java/org/foo/Bar.java",
"coveredLines": 10
},
{
"id": "FILE2",
"key": "org.foo.File.java",
"longName": "src/main/java/org/foo/File.java",
"coveredLines": 3

View File

@ -32,6 +32,19 @@ message ListResponse {
repeated Test tests = 2;
}
// WS api/tests/covered_files
message CoveredFilesResponse {
repeated CoveredFile files = 1;
message CoveredFile {
optional string id = 1;
optional string key = 2;
optional string longName = 3;
optional int32 coveredLines = 4;
}
}
message Test {
optional string id = 1;
optional string name = 2;