aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-09-25 12:24:46 +0200
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>2017-10-17 15:13:58 +0200
commit020273df819300ced5bf0f74436f8c57f4b07950 (patch)
tree24da50b1d5af0f542b7a484361977ad9b5f96e60
parent71ef1938601a0da3c192f1fbad4062052c970b92 (diff)
downloadsonarqube-020273df819300ced5bf0f74436f8c57f4b07950.tar.gz
sonarqube-020273df819300ced5bf0f74436f8c57f4b07950.zip
SONAR-9869 add project.url and branch.url to webhook payload
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImpl.java34
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPayloadFactoryImplTest.java64
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,