From ffe3afb5e797c8ac7a06f5a0b95d398975ce8a73 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 11 Aug 2017 18:25:05 +0200 Subject: [PATCH] SONAR-9616 Add quality gate status in api/projectbranches/list --- .../server/projectbranch/ws/ListAction.java | 26 +++++++++++++++++-- .../projectbranch/ws/ListActionTest.java | 21 +++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/projectbranch/ws/ListAction.java b/server/sonar-server/src/main/java/org/sonar/server/projectbranch/ws/ListAction.java index 39c8d188bc6..fd34266be0a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/projectbranch/ws/ListAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/projectbranch/ws/ListAction.java @@ -19,8 +19,10 @@ */ package org.sonar.server.projectbranch.ws; +import com.google.common.collect.Multimap; import com.google.common.io.Resources; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import org.sonar.api.resources.Qualifiers; @@ -33,12 +35,20 @@ import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchKeyType; import org.sonar.db.component.ComponentDto; +import org.sonar.db.measure.MeasureDto; +import org.sonar.db.metric.MetricDto; import org.sonar.server.user.UserSession; import org.sonar.server.ws.WsUtils; import org.sonarqube.ws.WsBranches; import static com.google.common.base.Preconditions.checkState; +import static java.util.Arrays.asList; +import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY; +import static org.sonar.api.measures.CoreMetrics.BUGS_KEY; +import static org.sonar.api.measures.CoreMetrics.CODE_SMELLS_KEY; +import static org.sonar.api.measures.CoreMetrics.VULNERABILITIES_KEY; import static org.sonar.core.util.Protobuf.setNullable; +import static org.sonar.core.util.stream.MoreCollectors.index; import static org.sonar.core.util.stream.MoreCollectors.toList; import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; @@ -84,20 +94,28 @@ public class ListAction implements BranchWsAction { throw new IllegalArgumentException("Invalid project key"); } + List metrics = dbClient.metricDao().selectByKeys(dbSession, asList(ALERT_STATUS_KEY)); + Map metricsById = metrics.stream().collect(uniqueIndex(MetricDto::getId)); + Map metricIdsByKey = metrics.stream().collect(uniqueIndex(MetricDto::getKey, MetricDto::getId)); + Collection branches = dbClient.branchDao().selectByComponent(dbSession, project); Map mergeBranchesByUuid = dbClient.branchDao() .selectByUuids(dbSession, branches.stream().map(BranchDto::getMergeBranchUuid).filter(Objects::nonNull).collect(toList())) .stream().collect(uniqueIndex(BranchDto::getUuid)); + Multimap measuresByComponentUuids = dbClient.measureDao() + .selectByComponentsAndMetrics(dbSession, branches.stream().map(BranchDto::getUuid).collect(toList()), metricsById.keySet()) + .stream().collect(index(MeasureDto::getComponentUuid)); WsBranches.ListWsResponse.Builder protobufResponse = WsBranches.ListWsResponse.newBuilder(); branches.stream() .filter(b -> b.getKeeType().equals(BranchKeyType.BRANCH)) - .forEach(b -> addToProtobuf(protobufResponse, b, mergeBranchesByUuid)); + .forEach(b -> addToProtobuf(protobufResponse, b, mergeBranchesByUuid, metricIdsByKey, measuresByComponentUuids)); WsUtils.writeProtobuf(protobufResponse.build(), request, response); } } - private static void addToProtobuf(WsBranches.ListWsResponse.Builder response, BranchDto branch, Map mergeBranchesByUuid) { + private static void addToProtobuf(WsBranches.ListWsResponse.Builder response, BranchDto branch, Map mergeBranchesByUuid, + Map metricIdsByKey, Multimap measuresByComponentUuids) { WsBranches.Branch.Builder builder = response.addBranchesBuilder(); setNullable(branch.getKey(), builder::setName); builder.setIsMain(branch.isMain()); @@ -108,6 +126,10 @@ public class ListAction implements BranchWsAction { checkState(mergeBranch != null, "Component uuid '%s' cannot be found", mergeBranch); setNullable(mergeBranch.getKey(), builder::setMergeBranch); } + + int qualityGateStatusMetricId = metricIdsByKey.get(ALERT_STATUS_KEY); + measuresByComponentUuids.get(branch.getUuid()).stream().filter(m -> m.getMetricId() == qualityGateStatusMetricId).findAny() + .ifPresent(measure -> builder.setStatus(WsBranches.Branch.Status.newBuilder().setQualityGateStatus(measure.getData()))); builder.build(); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/projectbranch/ws/ListActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/projectbranch/ws/ListActionTest.java index c7da0c38be6..17fb1a8c086 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/projectbranch/ws/ListActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/projectbranch/ws/ListActionTest.java @@ -29,6 +29,8 @@ import org.sonar.db.DbTester; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; +import org.sonar.db.component.SnapshotDto; +import org.sonar.db.metric.MetricDto; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsActionTester; @@ -38,6 +40,7 @@ import org.sonarqube.ws.WsBranches.ListWsResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY; import static org.sonar.test.JsonAssert.assertJson; public class ListActionTest { @@ -164,6 +167,24 @@ public class ListActionTest { tuple(shortLivingBranchOnMaster.getBranch(), Branch.BranchType.SHORT, "")); } + @Test + public void quality_gate_status_on_long_living_branch() { + ComponentDto project = db.components().insertMainBranch(); + userSession.logIn().addProjectPermission(UserRole.USER, project); + ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG)); + SnapshotDto branchAnalysis = db.components().insertSnapshot(branch); + MetricDto qualityGateStatus = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY)); + db.measures().insertMeasure(branch, branchAnalysis, qualityGateStatus, m -> m.setData("OK")); + + ListWsResponse response = tester.newRequest() + .setParam("project", project.getKey()) + .executeProtobuf(ListWsResponse.class); + + assertThat(response.getBranchesList()) + .extracting(b -> b.getStatus().hasQualityGateStatus(), b -> b.getStatus().getQualityGateStatus()) + .containsExactlyInAnyOrder(tuple(false, ""), tuple(true, "OK")); + } + @Test public void test_example() { ComponentDto project = db.components().insertPrivateProject(); -- 2.39.5