]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10209 api/navigation/component returns QP deleted flag
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Wed, 8 Aug 2018 09:20:06 +0000 (11:20 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 10 Aug 2018 18:21:32 +0000 (20:21 +0200)
server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_deleted_quality_profiles.json [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_quality_profiles.json

index 32a79ea029a92fcc4f53bca3de34ee9995bf6706..4fb3bf2f420b966297a1119e9ebc06a4da44a5a6 100644 (file)
@@ -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<QualityProfile> 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<QualityProfile> 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<String, QProfileDto> 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();
   }
 
index 6c190302f17a6714fc4897f01eeca9560ce415ad..9edc7b4733768adaeb4a31986e87038f0fe1535d 100644 (file)
@@ -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 (file)
index 0000000..70c873a
--- /dev/null
@@ -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
+    }
+  ]
+}
index 10865b0832606708930a446d3913f43b5731766f..148e21a0bbf2181d613e7586759fce61941553c9 100644 (file)
@@ -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
     }
   ]
 }