Browse Source

SONAR-8857 use organization DTO instead of UUID for type-safety

tags/6.4-RC1
Daniel Schwarz 7 years ago
parent
commit
b9e93343c3

+ 5
- 4
server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java View File

@@ -34,6 +34,7 @@ import org.sonar.db.Dao;
import org.sonar.db.DbSession;
import org.sonar.db.RowNotFoundException;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;

import static org.sonar.db.DatabaseUtils.executeLargeInputs;

@@ -159,8 +160,8 @@ public class QualityProfileDao implements Dao {
}

@CheckForNull
public QualityProfileDto selectByNameAndLanguage(String organizationUuid, String name, String language, DbSession session) {
return mapper(session).selectByNameAndLanguage(organizationUuid, name, language);
public QualityProfileDto selectByNameAndLanguage(OrganizationDto organization, String name, String language, DbSession session) {
return mapper(session).selectByNameAndLanguage(organization.getUuid(), name, language);
}

/**
@@ -171,8 +172,8 @@ public class QualityProfileDao implements Dao {
return executeLargeInputs(languageKeys, input -> mapper(session).selectByNameAndLanguages(name, input));
}

public List<QualityProfileDto> selectByNameAndLanguages(String organizationUuid, String name, Collection<String> languageKeys, DbSession session) {
return executeLargeInputs(languageKeys, input -> mapper(session).selectByNameAndLanguages(organizationUuid, name, input));
public List<QualityProfileDto> selectByNameAndLanguages(OrganizationDto organization, String name, Collection<String> languageKeys, DbSession session) {
return executeLargeInputs(languageKeys, input -> mapper(session).selectByNameAndLanguages(organization.getUuid(), name, input));
}

public List<ComponentDto> selectProjects(String profileName, String language, DbSession session) {

+ 5
- 5
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileCopier.java View File

@@ -34,7 +34,7 @@ import org.sonar.api.utils.TempFolder;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.qualityprofile.ws.QProfileWsSupport;

@ServerSide
public class QProfileCopier {
@@ -43,14 +43,14 @@ public class QProfileCopier {
private final QProfileFactory factory;
private final QProfileBackuper backuper;
private final TempFolder temp;
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final QProfileWsSupport qProfileWsSupport;

public QProfileCopier(DbClient db, QProfileFactory factory, QProfileBackuper backuper, TempFolder temp, DefaultOrganizationProvider defaultOrganizationProvider) {
public QProfileCopier(DbClient db, QProfileFactory factory, QProfileBackuper backuper, TempFolder temp, QProfileWsSupport qProfileWsSupport) {
this.db = db;
this.factory = factory;
this.backuper = backuper;
this.temp = temp;
this.defaultOrganizationProvider = defaultOrganizationProvider;
this.qProfileWsSupport = qProfileWsSupport;
}

public QualityProfileDto copyToName(String fromProfileKey, String toName) {
@@ -75,7 +75,7 @@ public class QProfileCopier {
if (toProfile == null) {
// Do not delegate creation to QProfileBackuper because we need to keep
// the parent-child association, if exists.
toProfile = factory.create(dbSession, defaultOrganizationProvider.get().getUuid(), toProfileName);
toProfile = factory.create(dbSession, qProfileWsSupport.getDefaultOrganization(dbSession), toProfileName);
toProfile.setParentKee(fromProfile.getParentKee());
db.qualityProfileDao().update(dbSession, toProfile);
dbSession.commit();

+ 12
- 11
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileFactory.java View File

@@ -19,12 +19,12 @@
*/
package org.sonar.server.qualityprofile;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.annotation.CheckForNull;
import org.apache.commons.lang.RandomStringUtils;
@@ -32,6 +32,7 @@ import org.apache.commons.lang.StringUtils;
import org.sonar.core.util.Slug;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.qualityprofile.ActiveRuleDto;
import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.server.exceptions.BadRequestException;
@@ -54,23 +55,23 @@ public class QProfileFactory {

// ------------- CREATION

QualityProfileDto getOrCreate(DbSession dbSession, String organizationUuid, QProfileName name) {
Preconditions.checkArgument(StringUtils.isNotEmpty(organizationUuid), "Organization is required, when creating a quality profile.");
QualityProfileDto profile = db.qualityProfileDao().selectByNameAndLanguage(organizationUuid, name.getName(), name.getLanguage(), dbSession);
QualityProfileDto getOrCreate(DbSession dbSession, OrganizationDto organization, QProfileName name) {
Objects.requireNonNull(organization, "Organization is required, when creating a quality profile.");
QualityProfileDto profile = db.qualityProfileDao().selectByNameAndLanguage(organization, name.getName(), name.getLanguage(), dbSession);
if (profile == null) {
profile = doCreate(dbSession, organizationUuid, name);
profile = doCreate(dbSession, organization, name);
}
return profile;
}

public QualityProfileDto create(DbSession dbSession, String organizationUuid, QProfileName name) {
Preconditions.checkArgument(StringUtils.isNotEmpty(organizationUuid), "Organization is required, when creating a quality profile.");
QualityProfileDto dto = db.qualityProfileDao().selectByNameAndLanguage(organizationUuid, name.getName(), name.getLanguage(), dbSession);
public QualityProfileDto create(DbSession dbSession, OrganizationDto organization, QProfileName name) {
Objects.requireNonNull(organization, "Organization is required, when creating a quality profile.");
QualityProfileDto dto = db.qualityProfileDao().selectByNameAndLanguage(organization, name.getName(), name.getLanguage(), dbSession);
checkRequest(dto == null, "Quality profile already exists: %s", name);
return doCreate(dbSession, organizationUuid, name);
return doCreate(dbSession, organization, name);
}

private QualityProfileDto doCreate(DbSession dbSession, String organizationUuid, QProfileName name) {
private QualityProfileDto doCreate(DbSession dbSession, OrganizationDto organization, QProfileName name) {
if (StringUtils.isEmpty(name.getName())) {
throw BadRequestException.create("quality_profiles.profile_name_cant_be_blank");
}
@@ -79,7 +80,7 @@ public class QProfileFactory {
String key = Slug.slugify(String.format("%s %s %s", name.getLanguage(), name.getName(), RandomStringUtils.randomNumeric(5)));
QualityProfileDto dto = QualityProfileDto.createFor(key)
.setName(name.getName())
.setOrganizationUuid(organizationUuid)
.setOrganizationUuid(organization.getUuid())
.setLanguage(name.getLanguage())
.setRulesUpdatedAtAsDate(now);
if (db.qualityProfileDao().selectByKey(dbSession, dto.getKey()) == null) {

+ 8
- 8
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileReset.java View File

@@ -43,8 +43,8 @@ import org.sonar.db.qualityprofile.ActiveRuleKey;
import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.db.rule.RuleParamDto;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
import org.sonar.server.qualityprofile.ws.QProfileWsSupport;

import static org.sonar.server.ws.WsUtils.checkRequest;

@@ -55,22 +55,22 @@ public class QProfileReset {
private final QProfileFactory factory;
private final RuleActivator activator;
private final ActiveRuleIndexer activeRuleIndexer;
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final QProfileWsSupport qProfileWsSupport;
private final ProfileDefinition[] definitions;

public QProfileReset(DbClient db, RuleActivator activator, ActiveRuleIndexer activeRuleIndexer, QProfileFactory factory, DefaultOrganizationProvider defaultOrganizationProvider,
public QProfileReset(DbClient db, RuleActivator activator, ActiveRuleIndexer activeRuleIndexer, QProfileFactory factory, QProfileWsSupport qProfileWsSupport,
ProfileDefinition... definitions) {
this.db = db;
this.activator = activator;
this.activeRuleIndexer = activeRuleIndexer;
this.factory = factory;
this.defaultOrganizationProvider = defaultOrganizationProvider;
this.qProfileWsSupport = qProfileWsSupport;
this.definitions = definitions;
}

public QProfileReset(DbClient db, RuleActivator activator, ActiveRuleIndexer activeRuleIndexer, QProfileFactory factory,
DefaultOrganizationProvider defaultOrganizationProvider) {
this(db, activator, activeRuleIndexer, factory, defaultOrganizationProvider, new ProfileDefinition[0]);
QProfileWsSupport qProfileWsSupport) {
this(db, activator, activeRuleIndexer, factory, qProfileWsSupport, new ProfileDefinition[0]);
}

/**
@@ -83,7 +83,7 @@ public class QProfileReset {
ListMultimap<QProfileName, RulesProfile> profilesByName = loadDefinitionsGroupedByName(language);
for (Map.Entry<QProfileName, Collection<RulesProfile>> entry : profilesByName.asMap().entrySet()) {
QProfileName profileName = entry.getKey();
QualityProfileDto profile = factory.getOrCreate(dbSession, defaultOrganizationProvider.get().getUuid(), profileName);
QualityProfileDto profile = factory.getOrCreate(dbSession, qProfileWsSupport.getDefaultOrganization(dbSession), profileName);
List<RuleActivation> activations = Lists.newArrayList();
for (RulesProfile def : entry.getValue()) {
for (ActiveRule activeRule : def.getActiveRules()) {
@@ -114,7 +114,7 @@ public class QProfileReset {
BulkChangeResult reset(QProfileName profileName, Collection<RuleActivation> activations) {
DbSession dbSession = db.openSession(false);
try {
QualityProfileDto profile = factory.getOrCreate(dbSession, defaultOrganizationProvider.get().getUuid(), profileName);
QualityProfileDto profile = factory.getOrCreate(dbSession, qProfileWsSupport.getDefaultOrganization(dbSession), profileName);
return doReset(dbSession, profile, activations);
} finally {
dbSession.close();

+ 7
- 7
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java View File

@@ -46,8 +46,8 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.loadedtemplate.LoadedTemplateDto;
import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
import org.sonar.server.qualityprofile.ws.QProfileWsSupport;

/**
* Synchronize Quality profiles during server startup
@@ -64,27 +64,27 @@ public class RegisterQualityProfiles {
private final RuleActivator ruleActivator;
private final Languages languages;
private final ActiveRuleIndexer activeRuleIndexer;
private final DefaultOrganizationProvider defaultOrganizationProvider;
private final QProfileWsSupport qProfileWsSupport;

/**
* To be kept when no ProfileDefinition are injected
*/
public RegisterQualityProfiles(DbClient dbClient,
QProfileFactory profileFactory, RuleActivator ruleActivator, Languages languages, ActiveRuleIndexer activeRuleIndexer,
DefaultOrganizationProvider defaultOrganizationProvider) {
this(dbClient, profileFactory, ruleActivator, Collections.emptyList(), languages, activeRuleIndexer, defaultOrganizationProvider);
QProfileWsSupport qProfileWsSupport) {
this(dbClient, profileFactory, ruleActivator, Collections.emptyList(), languages, activeRuleIndexer, qProfileWsSupport);
}

public RegisterQualityProfiles(DbClient dbClient,
QProfileFactory profileFactory, RuleActivator ruleActivator,
List<ProfileDefinition> definitions, Languages languages, ActiveRuleIndexer activeRuleIndexer, DefaultOrganizationProvider defaultOrganizationProvider) {
List<ProfileDefinition> definitions, Languages languages, ActiveRuleIndexer activeRuleIndexer, QProfileWsSupport qProfileWsSupport) {
this.dbClient = dbClient;
this.profileFactory = profileFactory;
this.ruleActivator = ruleActivator;
this.definitions = definitions;
this.languages = languages;
this.activeRuleIndexer = activeRuleIndexer;
this.defaultOrganizationProvider = defaultOrganizationProvider;
this.qProfileWsSupport = qProfileWsSupport;
}

public void start() {
@@ -145,7 +145,7 @@ public class RegisterQualityProfiles {
if (profileDto != null) {
changes.addAll(profileFactory.delete(session, profileDto.getKey(), true));
}
profileFactory.create(session, defaultOrganizationProvider.get().getUuid(), name);
profileFactory.create(session, qProfileWsSupport.getDefaultOrganization(session), name);
for (RulesProfile profile : profiles) {
for (org.sonar.api.rules.ActiveRule activeRule : profile.getActiveRules()) {
RuleKey ruleKey = RuleKey.of(activeRule.getRepositoryKey(), activeRule.getRuleKey());

+ 5
- 4
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/CreateAction.java View File

@@ -117,7 +117,7 @@ public class CreateAction implements QProfileWsAction {

private CreateWsResponse doHandle(DbSession dbSession, CreateRequest createRequest, Request request) {
QProfileResult result = new QProfileResult();
QualityProfileDto profile = profileFactory.create(dbSession, qProfileWsSupport.getOrganizationUuidByKey(createRequest.getOrganizationKey()),
QualityProfileDto profile = profileFactory.create(dbSession, qProfileWsSupport.getOrganizationByKey(dbSession, createRequest.getOrganizationKey()),
QProfileName.createFor(createRequest.getLanguage(), createRequest.getProfileName()));
result.setProfile(profile);
for (ProfileImporter importer : importers) {
@@ -127,9 +127,10 @@ public class CreateAction implements QProfileWsAction {
result.add(exporters.importXml(profile, importerKey, contentToImport, dbSession));
}
}
String organizationKey = qProfileWsSupport.getOrganizationKey(result.profile(), dbSession);
dbSession.commit();
activeRuleIndexer.index(result.getChanges());
return buildResponse(result);
return buildResponse(result, organizationKey);
}

private static CreateRequest toRequest(Request request) {
@@ -140,10 +141,10 @@ public class CreateAction implements QProfileWsAction {
return builder.build();
}

private CreateWsResponse buildResponse(QProfileResult result) {
private CreateWsResponse buildResponse(QProfileResult result, String organizationKey) {
String language = result.profile().getLanguage();
CreateWsResponse.QualityProfile.Builder builder = CreateWsResponse.QualityProfile.newBuilder()
.setOrganization(qProfileWsSupport.getOrganizationKey(result.profile()))
.setOrganization(organizationKey)
.setKey(result.profile().getKey())
.setName(result.profile().getName())
.setLanguage(language)

+ 14
- 22
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileWsSupport.java View File

@@ -48,15 +48,11 @@ public class QProfileWsSupport {
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

public String getOrganizationKey(QualityProfileDto profile) {
return getOrganizationKeyByUuid(profile.getOrganizationUuid());
}

public String getOrganizationUuidByKey(String organizationKey) {
try (DbSession dbSession = dbClient.openSession(false)) {
return getOrganizationByKey(dbSession, organizationKey)
.getUuid();
}
public String getOrganizationKey(QualityProfileDto profile, DbSession dbSession) {
String organizationUuid = profile.getOrganizationUuid();
return dbClient.organizationDao().selectByUuid(dbSession, organizationUuid)
.orElseThrow(() -> new IllegalStateException("Cannot load organization with uuid=" + organizationUuid))
.getKey();
}

public OrganizationDto getOrganizationByKey(DbSession dbSession, @Nullable String organizationKey) {
@@ -67,19 +63,6 @@ public class QProfileWsSupport {
"No organizationDto with key '%s'", organizationOrDefaultKey);
}

public String getOrganizationKeyByUuid(String organizationUuid) {
return getOrganizationByUuid(organizationUuid)
.orElseThrow(() -> new IllegalStateException(String.format("Requested the key for non-existing organization uuid '%s'.", organizationUuid)))
.getKey();
}

private Optional<OrganizationDto> getOrganizationByUuid(String organizationUuid) {
try (DbSession dbSession = dbClient.openSession(false)) {
return dbClient.organizationDao()
.selectByUuid(dbSession, organizationUuid);
}
}

public void checkQProfileAdminPermission() {
userSession
.checkLoggedIn()
@@ -94,4 +77,13 @@ public class QProfileWsSupport {
.setInternal(true)
.setExampleValue("my-org");
}

/**
* @deprecated should not be required anymore, once all quality profile webservices are migrated to use organizations.
*/
@Deprecated
public OrganizationDto getDefaultOrganization(DbSession dbSession) {
return dbClient.organizationDao().selectByKey(dbSession, defaultOrganizationProvider.get().getKey())
.orElseThrow(() -> new IllegalStateException("Could not find default organization"));
}
}

+ 10
- 11
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryMediumTest.java View File

@@ -86,7 +86,7 @@ public class QProfileFactoryMediumTest {
public void create() {
String uuid = organization.getUuid();

QualityProfileDto writtenDto = factory.create(dbSession, uuid, new QProfileName("xoo", "P1"));
QualityProfileDto writtenDto = factory.create(dbSession, organization, new QProfileName("xoo", "P1"));
dbSession.commit();
dbSession.clearCache();
assertThat(writtenDto.getOrganizationUuid()).isEqualTo(uuid);
@@ -110,11 +110,10 @@ public class QProfileFactoryMediumTest {
@Test
public void fail_to_create_if_name_null() {
QProfileName name = new QProfileName("xoo", null);
String organizationUuid = organization.getUuid();

expectBadRequestException("quality_profiles.profile_name_cant_be_blank");

factory.create(dbSession, organizationUuid, name);
factory.create(dbSession, organization, name);
}

@Test
@@ -123,24 +122,24 @@ public class QProfileFactoryMediumTest {

expectBadRequestException("quality_profiles.profile_name_cant_be_blank");

factory.create(dbSession, organization.getUuid(), name);
factory.create(dbSession, organization, name);
}

@Test
public void fail_to_create_if_already_exists() {
QProfileName name = new QProfileName("xoo", "P1");
factory.create(dbSession, organization.getUuid(), name);
factory.create(dbSession, organization, name);
dbSession.commit();
dbSession.clearCache();

expectBadRequestException("Quality profile already exists: {lang=xoo, name=P1}");

factory.create(dbSession, organization.getUuid(), name);
factory.create(dbSession, organization, name);
}

@Test
public void rename() {
QualityProfileDto dto = factory.create(dbSession, organization.getUuid(), new QProfileName("xoo", "P1"));
QualityProfileDto dto = factory.create(dbSession, organization, new QProfileName("xoo", "P1"));
dbSession.commit();
dbSession.clearCache();
String key = dto.getKey();
@@ -156,7 +155,7 @@ public class QProfileFactoryMediumTest {

@Test
public void ignore_renaming_if_same_name() {
QualityProfileDto dto = factory.create(dbSession, organization.getUuid(), new QProfileName("xoo", "P1"));
QualityProfileDto dto = factory.create(dbSession, organization, new QProfileName("xoo", "P1"));
dbSession.commit();
dbSession.clearCache();
String key = dto.getKey();
@@ -172,7 +171,7 @@ public class QProfileFactoryMediumTest {

@Test
public void fail_if_blank_renaming() {
QualityProfileDto dto = factory.create(dbSession, organization.getUuid(), new QProfileName("xoo", "P1"));
QualityProfileDto dto = factory.create(dbSession, organization, new QProfileName("xoo", "P1"));
dbSession.commit();
dbSession.clearCache();
String key = dto.getKey();
@@ -192,8 +191,8 @@ public class QProfileFactoryMediumTest {

@Test
public void fail_renaming_if_name_already_exists() {
QualityProfileDto p1 = factory.create(dbSession, organization.getUuid(), new QProfileName("xoo", "P1"));
QualityProfileDto p2 = factory.create(dbSession, organization.getUuid(), new QProfileName("xoo", "P2"));
QualityProfileDto p1 = factory.create(dbSession, organization, new QProfileName("xoo", "P1"));
QualityProfileDto p2 = factory.create(dbSession, organization, new QProfileName("xoo", "P2"));
dbSession.commit();
dbSession.clearCache();


Loading…
Cancel
Save