From 24c9674eccdf9138ab91ff8273b28fd880d2fbf7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 8 Aug 2018 11:20:06 +0200 Subject: [PATCH] SONAR-10209 api/navigation/component returns QP deleted flag --- .../sonar/server/ui/ws/ComponentAction.java | 26 +++++++++++++------ .../server/ui/ws/ComponentActionTest.java | 22 +++++++++++++--- .../return_deleted_quality_profiles.json | 16 ++++++++++++ .../return_quality_profiles.json | 6 +++-- 4 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_deleted_quality_profiles.json diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java index 32a79ea029a..4fb3bf2f420 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java @@ -23,10 +23,11 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Collectors; import javax.annotation.Nullable; import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.ResourceType; @@ -51,6 +52,7 @@ import org.sonar.db.permission.OrganizationPermission; import org.sonar.db.property.PropertyDto; import org.sonar.db.property.PropertyQuery; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.BillingValidations; @@ -63,10 +65,12 @@ import org.sonar.server.ui.PageRepository; import org.sonar.server.user.UserSession; import static java.lang.String.format; +import static java.util.Collections.emptySortedSet; import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.api.web.UserRole.ADMIN; import static org.sonar.api.web.UserRole.USER; +import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES; import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException; @@ -77,8 +81,8 @@ import static org.sonar.server.ws.KeyExamples.KEY_PULL_REQUEST_EXAMPLE_001; public class ComponentAction implements NavigationWsAction { static final String PARAM_COMPONENT = "component"; - static final String PARAM_BRANCH = "branch"; - static final String PARAM_PULL_REQUEST = "pullRequest"; + private static final String PARAM_BRANCH = "branch"; + private static final String PARAM_PULL_REQUEST = "pullRequest"; private static final String PROPERTY_CONFIGURABLE = "configurable"; private static final String PROPERTY_HAS_ROLE_POLICY = "hasRolePolicy"; @@ -193,11 +197,12 @@ public class ComponentAction implements NavigationWsAction { }); } - private static Consumer writeToJson(JsonWriter json) { - return profile -> json.beginObject() + private static void writeToJson(JsonWriter json, QualityProfile profile, boolean deleted) { + json.beginObject() .prop("key", profile.getQpKey()) .prop("name", profile.getQpName()) .prop("language", profile.getLanguageKey()) + .prop("deleted", deleted) .endObject(); } @@ -241,10 +246,15 @@ public class ComponentAction implements NavigationWsAction { } private void writeProfiles(JsonWriter json, DbSession dbSession, ComponentDto component) { - json.name("qualityProfiles").beginArray(); - dbClient.liveMeasureDao().selectMeasure(dbSession, component.projectUuid(), QUALITY_PROFILES_KEY) + Set qualityProfiles = dbClient.liveMeasureDao().selectMeasure(dbSession, component.projectUuid(), QUALITY_PROFILES_KEY) .map(LiveMeasureDto::getDataAsString) - .ifPresent(data -> QPMeasureData.fromJson(data).getProfiles().forEach(writeToJson(json))); + .map(data -> QPMeasureData.fromJson(data).getProfiles()) + .orElse(emptySortedSet()); + Map dtoByQPKey = dbClient.qualityProfileDao().selectByUuids(dbSession, qualityProfiles.stream().map(QualityProfile::getQpKey).collect(Collectors.toList())) + .stream() + .collect(uniqueIndex(QProfileDto::getKee)); + json.name("qualityProfiles").beginArray(); + qualityProfiles.forEach(qp -> writeToJson(json, qp, !dtoByQPKey.containsKey(qp.getQpKey()))); json.endArray(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java index 6c190302f17..9edc7b47337 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.ui.ws; +import com.google.common.collect.ImmutableSet; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -52,6 +53,7 @@ import org.sonar.db.permission.OrganizationPermission; import org.sonar.db.property.PropertyDbTester; import org.sonar.db.property.PropertyDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.ForbiddenException; @@ -224,15 +226,23 @@ public class ComponentActionTest { } @Test - public void return_quality_profiles() { - ComponentDto project = insertOrganizationAndProject(); + public void return_quality_profiles_and_supports_deleted_ones() { + OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); + ComponentDto project = insertProject(organization); + QProfileDto qp1 = db.qualityProfiles().insert(organization, t -> t.setKee("qp1").setName("Sonar Way Java").setLanguage("java")); + QProfileDto qp2 = db.qualityProfiles().insert(organization, t -> t.setKee("qp2").setName("Sonar Way Xoo").setLanguage("xoo")); addQualityProfiles(project, - createQProfile("qp1", "Sonar Way Java", "java"), - createQProfile("qp2", "Sonar Way Xoo", "xoo")); + new QualityProfile(qp1.getKee(), qp1.getName(), qp1.getLanguage(), new Date()), + new QualityProfile(qp2.getKee(), qp2.getName(), qp2.getLanguage(), new Date())); userSession.addProjectPermission(UserRole.USER, project); init(); executeAndVerify(project.getDbKey(), "return_quality_profiles.json"); + + db.getDbClient().qualityProfileDao().deleteOrgQProfilesByUuids(db.getSession(), ImmutableSet.of(qp1.getKee(), qp2.getKee())); + db.commit(); + + executeAndVerify(project.getDbKey(), "return_deleted_quality_profiles.json"); } @Test @@ -629,6 +639,10 @@ public class ComponentActionTest { private ComponentDto insertOrganizationAndProject() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); + return insertProject(organization); + } + + private ComponentDto insertProject(OrganizationDto organization) { db.qualityGates().createDefaultQualityGate(organization); return db.components().insertPrivateProject(organization, "abcd", p -> p.setDbKey("polop").setName("Polop").setDescription("test project")); } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_deleted_quality_profiles.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_deleted_quality_profiles.json new file mode 100644 index 00000000000..70c873a7e13 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_deleted_quality_profiles.json @@ -0,0 +1,16 @@ +{ + "qualityProfiles": [ + { + "key": "qp1", + "name": "Sonar Way Java", + "language": "java", + "deleted": true + }, + { + "key": "qp2", + "name": "Sonar Way Xoo", + "language": "xoo", + "deleted": true + } + ] +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_quality_profiles.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_quality_profiles.json index 10865b08326..148e21a0bbf 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_quality_profiles.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_quality_profiles.json @@ -3,12 +3,14 @@ { "key": "qp1", "name": "Sonar Way Java", - "language": "java" + "language": "java", + "deleted": false }, { "key": "qp2", "name": "Sonar Way Xoo", - "language": "xoo" + "language": "xoo", + "deleted": false } ] } -- 2.39.5