]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9869 add project.url and branch.url to webhook payload
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 25 Sep 2017 10:24:46 +0000 (12:24 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 17 Oct 2017 13:13:58 +0000 (15:13 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java

index abde30e6469e1acee64c0763fde942a249c136f2..4e95d50026e43562b91cd5dcff96cb2b8863524f 100644 (file)
@@ -20,7 +20,9 @@
 package org.sonar.server.computation.task.projectanalysis.webhook;
 
 import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
 import java.io.Writer;
+import java.net.URLEncoder;
 import java.util.Date;
 import javax.annotation.Nullable;
 import org.sonar.api.ce.ComputeEngineSide;
@@ -34,6 +36,7 @@ import org.sonar.api.platform.Server;
 import org.sonar.api.utils.System2;
 import org.sonar.api.utils.text.JsonWriter;
 
+import static java.lang.String.format;
 import static org.sonar.core.config.WebhookProperties.ANALYSIS_PROPERTY_PREFIX;
 
 @ComputeEngineSide
@@ -56,7 +59,7 @@ public class WebhookPayloadFactoryImpl implements WebhookPayloadFactory {
       writeTask(writer, analysis.getCeTask());
       writeDates(writer, analysis, system2);
       writeProject(analysis, writer, analysis.getProject());
-      analysis.getBranch().ifPresent(b -> writeBranch(writer, b));
+      analysis.getBranch().ifPresent(b -> writeBranch(writer, analysis.getProject(), b));
       writeQualityGate(writer, analysis.getQualityGate());
       writeAnalysisProperties(writer, analysis.getScannerContext());
       writer.endObject().close();
@@ -79,6 +82,7 @@ public class WebhookPayloadFactoryImpl implements WebhookPayloadFactory {
       .beginObject()
       .prop("key", project.getKey())
       .prop("name", analysis.getProject().getName())
+      .prop("url", projectUrlOf(project))
       .endObject();
   }
 
@@ -99,16 +103,34 @@ public class WebhookPayloadFactoryImpl implements WebhookPayloadFactory {
       .prop("status", ceTask.getStatus().toString());
   }
 
-  private void writeBranch(JsonWriter writer, Branch branch) {
+  private void writeBranch(JsonWriter writer, Project project, Branch branch) {
     writer
       .name("branch")
       .beginObject()
       .prop("name", branch.getName().orElse(null))
       .prop("type", branch.getType().name())
       .prop("isMain", branch.isMain())
+      .prop("url", branchUrlOf(project, branch))
       .endObject();
   }
 
+  private String projectUrlOf(Project project) {
+    return format("%s/project/dashboard?id=%s", server.getPublicRootUrl(), encode(project.getKey()));
+  }
+
+  private String branchUrlOf(Project project, Branch branch) {
+    if (branch.getType() == Branch.Type.LONG) {
+      if (branch.isMain()) {
+        return projectUrlOf(project);
+      }
+      return format("%s/project/dashboard?branch=%s&id=%s",
+        server.getPublicRootUrl(), encode(branch.getName().orElse("")), encode(project.getKey()));
+    } else {
+      return format("%s/project/issues?branch=%s&id=%s&resolved=false",
+        server.getPublicRootUrl(), encode(branch.getName().orElse("")), encode(project.getKey()));
+    }
+  }
+
   private static void writeQualityGate(JsonWriter writer, @Nullable QualityGate gate) {
     if (gate != null) {
       writer
@@ -138,4 +160,12 @@ public class WebhookPayloadFactoryImpl implements WebhookPayloadFactory {
         .endObject();
     }
   }
+
+  private static String encode(String toEncode) {
+    try {
+      return URLEncoder.encode(toEncode, "UTF-8");
+    } catch (UnsupportedEncodingException e) {
+      throw new IllegalStateException("Encoding not supported", e);
+    }
+  }
 }
index e86609131ad99ebddb70fdac232cc4d0c863a371..9a51d6d0c84b54f64a551738dd08900d726ff3ce 100644 (file)
@@ -92,7 +92,8 @@ public class WebhookPayloadFactoryImplTest {
         "  \"changedAt\": \"2017-07-14T04:40:00+0200\"," +
         "  \"project\": {" +
         "    \"key\": \"P1\"," +
-        "    \"name\": \"Project One\"" +
+        "    \"name\": \"Project One\"," +
+        "    \"url\": \"http://foo/project/dashboard?id=P1\"" +
         "  }," +
         "  \"qualityGate\": {" +
         "    \"name\": \"Gate One\"," +
@@ -144,7 +145,8 @@ public class WebhookPayloadFactoryImplTest {
         "  \"changedAt\": \"2017-07-14T04:40:00+0200\"," +
         "  \"project\": {" +
         "    \"key\": \"P1\"," +
-        "    \"name\": \"Project One\"" +
+        "    \"name\": \"Project One\"," +
+        "    \"url\": \"http://foo/project/dashboard?id=P1\"" +
         "  }," +
         "  \"qualityGate\": {" +
         "    \"name\": \"Gate One\"," +
@@ -191,7 +193,8 @@ public class WebhookPayloadFactoryImplTest {
         "  \"changedAt\": \"2017-07-14T04:40:00+0200\"," +
         "  \"project\": {" +
         "    \"key\": \"P1\"," +
-        "    \"name\": \"Project One\"" +
+        "    \"name\": \"Project One\"," +
+        "    \"url\": \"http://foo/project/dashboard?id=P1\"" +
         "  }," +
         "  \"qualityGate\": {" +
         "    \"name\": \"Gate One\"," +
@@ -225,7 +228,8 @@ public class WebhookPayloadFactoryImplTest {
         "  \"changedAt\": \"2017-07-14T04:40:00+0200\"," +
         "  \"project\": {" +
         "    \"key\": \"P1\"," +
-        "    \"name\": \"Project One\"" +
+        "    \"name\": \"Project One\"," +
+        "    \"url\": \"http://foo/project/dashboard?id=P1\"" +
         "  }," +
         "  \"properties\": {" +
         "  }" +
@@ -256,7 +260,7 @@ public class WebhookPayloadFactoryImplTest {
   }
 
   @Test
-  public void create_payload_on_branch() {
+  public void create_payload_on_short_branch() {
     CeTask task = newCeTaskBuilder()
       .setStatus(CeTask.Status.SUCCESS)
       .setId("#1")
@@ -264,13 +268,35 @@ public class WebhookPayloadFactoryImplTest {
     PostProjectAnalysisTask.ProjectAnalysis analysis = newAnalysis(task, null, new BranchImpl(false, "feature/foo", Branch.Type.SHORT), 1_500_000_000_000L, emptyMap());
 
     WebhookPayload payload = underTest.create(analysis);
-    assertJson(payload.getJson()).isSimilarTo("{" +
-      "\"branch\": {" +
-      "  \"name\": \"feature/foo\"" +
-      "  \"type\": \"SHORT\"" +
-      "  \"isMain\": false" +
-      "}" +
-      "}");
+    assertJson(payload.getJson())
+      .isSimilarTo("{" +
+        "\"branch\": {" +
+        "  \"name\": \"feature/foo\"" +
+        "  \"type\": \"SHORT\"" +
+        "  \"isMain\": false," +
+        "  \"url\": \"http://foo/project/issues?branch=feature%2Ffoo&id=P1&resolved=false\"" +
+        "}" +
+        "}");
+  }
+
+  @Test
+  public void create_payload_on_long_branch() {
+    CeTask task = newCeTaskBuilder()
+      .setStatus(CeTask.Status.SUCCESS)
+      .setId("#1")
+      .build();
+    PostProjectAnalysisTask.ProjectAnalysis analysis = newAnalysis(task, null, new BranchImpl(false, "feature/foo", Branch.Type.LONG), 1_500_000_000_000L, emptyMap());
+
+    WebhookPayload payload = underTest.create(analysis);
+    assertJson(payload.getJson())
+      .isSimilarTo("{" +
+        "\"branch\": {" +
+        "  \"name\": \"feature/foo\"" +
+        "  \"type\": \"LONG\"" +
+        "  \"isMain\": false," +
+        "  \"url\": \"http://foo/project/dashboard?branch=feature%2Ffoo&id=P1\"" +
+        "}" +
+        "}");
   }
 
   @Test
@@ -282,12 +308,14 @@ public class WebhookPayloadFactoryImplTest {
     PostProjectAnalysisTask.ProjectAnalysis analysis = newAnalysis(task, null, new BranchImpl(true, null, Branch.Type.LONG), 1_500_000_000_000L, emptyMap());
 
     WebhookPayload payload = underTest.create(analysis);
-    assertJson(payload.getJson()).isSimilarTo("{" +
-      "\"branch\": {" +
-      "  \"type\": \"LONG\"" +
-      "  \"isMain\": true" +
-      "}" +
-      "}");
+    assertJson(payload.getJson())
+      .isSimilarTo("{" +
+        "\"branch\": {" +
+        "  \"type\": \"LONG\"" +
+        "  \"isMain\": true," +
+        "  \"url\": \"http://foo/project/dashboard?id=P1\"" +
+        "}" +
+        "}");
   }
 
   private static PostProjectAnalysisTask.ProjectAnalysis newAnalysis(CeTask task, @Nullable QualityGate gate,