]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6416 add field "id" to response of api/tests/covered_files
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 19 Oct 2015 14:17:12 +0000 (16:17 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Wed, 21 Oct 2015 12:07:34 +0000 (14:07 +0200)
Refactoring: use protobuf to generate response

server/sonar-server/src/main/java/org/sonar/server/test/ws/CoveredFilesAction.java
server/sonar-server/src/test/java/org/sonar/server/test/ws/CoveredFilesActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/test/ws/CoveredFilesActionTest/tests-covered-files.json
sonar-ws/src/main/protobuf/ws-tests.proto

index 048228ad8c1b2593098a53e2ae8919320e64ae4f..bfa087156a66cb431b12cf218170bffb132193d7 100644 (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();
+
+    WsTests.CoveredFilesResponse.Builder responseBuilder = WsTests.CoveredFilesResponse.newBuilder();
     if (!coveredFiles.isEmpty()) {
-      writeTests(coveredFiles, componentsByUuid, json);
-    }
-    json.endObject().close();
-  }
+      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());
+        }
 
-  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();
+        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();
     }
   }
index fad62bab37483210bc6244cb87877189e90ec8ab..fbfe377f5f5edd503f5292c70dc8d08f9e3ffe46 100644 (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");
 
index 7b37f47bd5df50c460512adf25385a15c15d4388..9a0dbd4cc0e628db29ccfc010ca0b035a511fa92 100644 (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
index 037e61aaadd82eda703eed2a2f2751f939cecd73..c3d52e2007ba0212f26ab21c75f29ac97a540993 100644 (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;