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;
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;
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;
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";
});
}
- 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();
}
}
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();
}
*/
package org.sonar.server.ui.ws;
+import com.google.common.collect.ImmutableSet;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
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;
}
@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
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"));
}