@@ -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) { |
@@ -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(); |
@@ -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) { |
@@ -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(); |
@@ -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()); |
@@ -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) |
@@ -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")); | |||
} | |||
} |
@@ -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(); | |||