diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2017-09-25 12:24:46 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2017-10-17 15:13:58 +0200 |
commit | 020273df819300ced5bf0f74436f8c57f4b07950 (patch) | |
tree | 24da50b1d5af0f542b7a484361977ad9b5f96e60 | |
parent | 71ef1938601a0da3c192f1fbad4062052c970b92 (diff) | |
download | sonarqube-020273df819300ced5bf0f74436f8c57f4b07950.tar.gz sonarqube-020273df819300ced5bf0f74436f8c57f4b07950.zip |
SONAR-9869 add project.url and branch.url to webhook payload
2 files changed, 78 insertions, 20 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java index abde30e6469..4e95d50026e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java @@ -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); + } + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java index e86609131ad..9a51d6d0c84 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java @@ -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, |