diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-01-30 18:09:12 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-02-01 14:13:02 +0100 |
commit | e34eaf8f733e5adad1a7dd286515ff4e7069153b (patch) | |
tree | fe717a649e39a4f5068b001af9d12623606b5a81 | |
parent | eae95b7c88af8635f61332bad2288d868a81ade8 (diff) | |
download | sonarqube-e34eaf8f733e5adad1a7dd286515ff4e7069153b.tar.gz sonarqube-e34eaf8f733e5adad1a7dd286515ff4e7069153b.zip |
SONAR-7946 Remove usage of QProfileFactory
Also replace WsTester by WsActionTester in UT
5 files changed, 103 insertions, 134 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java index 73c45998976..6e497faad6e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java @@ -25,7 +25,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.io.Reader; import java.io.Writer; -import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -52,29 +51,33 @@ import org.sonar.db.qualityprofile.QualityProfileDto; @ServerSide public class QProfileBackuper { + private static final Joiner RULE_KEY_JOINER = Joiner.on(", ").skipNulls(); + private final QProfileReset reset; private final DbClient db; - private static final Joiner RULEKEY_JOINER = Joiner.on(", ").skipNulls(); - public QProfileBackuper(QProfileReset reset, DbClient db) { this.reset = reset; this.db = db; } + /** + * @deprecated use {@link #backup(DbSession, QualityProfileDto, Writer)} instead + */ + @Deprecated public void backup(String key, Writer writer) { - QualityProfileDto profile; - DbSession dbSession = db.openSession(false); - try { - profile = db.qualityProfileDao().selectOrFailByKey(dbSession, key); - List<ActiveRuleDto> activeRules = db.activeRuleDao().selectByProfileKey(dbSession, key); - Collections.sort(activeRules, BackupActiveRuleComparator.INSTANCE); - writeXml(dbSession, writer, profile, activeRules.iterator()); - } finally { - db.closeSession(dbSession); + try (DbSession dbSession = db.openSession(false)) { + QualityProfileDto profile = db.qualityProfileDao().selectOrFailByKey(dbSession, key); + backup(dbSession, profile, writer); } } + public void backup(DbSession dbSession, QualityProfileDto profileDto, Writer writer) { + List<ActiveRuleDto> activeRules = db.activeRuleDao().selectByProfileKey(dbSession, profileDto.getKey()); + activeRules.sort(BackupActiveRuleComparator.INSTANCE); + writeXml(dbSession, writer, profileDto, activeRules.iterator()); + } + private void writeXml(DbSession dbSession, Writer writer, QualityProfileDto profile, Iterator<ActiveRuleDto> activeRules) { XmlWriter xml = XmlWriter.of(writer).declaration(); xml.begin("profile"); @@ -177,7 +180,7 @@ public class QProfileBackuper { } if (!duplicatedKeys.isEmpty()) { throw new IllegalArgumentException("The quality profile cannot be restored as it contains duplicates for the following rules: " + - RULEKEY_JOINER.join(duplicatedKeys)); + RULE_KEY_JOINER.join(duplicatedKeys)); } return activations; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ExportAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ExportAction.java index 82ca2cc4ff9..1f68a2249b2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ExportAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ExportAction.java @@ -19,50 +19,48 @@ */ package org.sonar.server.qualityprofile.ws; -import com.google.common.collect.Lists; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; -import java.util.List; -import org.apache.commons.io.IOUtils; +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; +import javax.annotation.Nullable; import org.sonar.api.profiles.ProfileExporter; -import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.Response.Stream; import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.NewAction; +import org.sonar.core.util.stream.Collectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.qualityprofile.QualityProfileDto; -import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.qualityprofile.QProfileBackuper; import org.sonar.server.qualityprofile.QProfileExporters; -import org.sonar.server.qualityprofile.QProfileFactory; import org.sonar.server.util.LanguageParamUtils; import org.sonarqube.ws.MediaTypes; +import static org.sonar.server.ws.WsUtils.checkFound; + public class ExportAction implements QProfileWsAction { private static final String PARAM_PROFILE_NAME = "name"; private static final String PARAM_LANGUAGE = "language"; - public static final String PARAM_FORMAT = "exporterKey"; + private static final String PARAM_FORMAT = "exporterKey"; private final DbClient dbClient; - private final QProfileFactory profileFactory; - private final QProfileBackuper backuper; private final QProfileExporters exporters; private final Languages languages; - public ExportAction(DbClient dbClient, QProfileFactory profileFactory, QProfileBackuper backuper, QProfileExporters exporters, Languages languages) { + public ExportAction(DbClient dbClient, QProfileBackuper backuper, QProfileExporters exporters, Languages languages) { this.dbClient = dbClient; - this.profileFactory = profileFactory; this.backuper = backuper; this.exporters = exporters; this.languages = languages; @@ -86,12 +84,11 @@ public class ExportAction implements QProfileWsAction { .setPossibleValues(LanguageParamUtils.getLanguageKeys(languages)) .setRequired(true); - List<String> exporterKeys = Lists.newArrayList(); - for (Language lang : languages.all()) { - for (ProfileExporter exporter : exporters.exportersForLanguage(lang.getKey())) { - exporterKeys.add(exporter.getKey()); - } - } + Set<String> exporterKeys = Arrays.stream(languages.all()) + .map(language -> exporters.exportersForLanguage(language.getKey())) + .flatMap(Collection::stream) + .map(ProfileExporter::getKey) + .collect(Collectors.toSet()); if (!exporterKeys.isEmpty()) { action.createParam(PARAM_FORMAT) .setDescription("Output format. If left empty, the same format as api/qualityprofiles/backup is used. " + @@ -106,39 +103,26 @@ public class ExportAction implements QProfileWsAction { public void handle(Request request, Response response) throws Exception { String name = request.param(PARAM_PROFILE_NAME); String language = request.mandatoryParam(PARAM_LANGUAGE); - String format = null; - if (!exporters.exportersForLanguage(language).isEmpty()) { - format = request.param(PARAM_FORMAT); - } - - DbSession dbSession = dbClient.openSession(false); + String exporterKey = exporters.exportersForLanguage(language).isEmpty() ? null : request.param(PARAM_FORMAT); Stream stream = response.stream(); - OutputStream output = stream.output(); - Writer writer = new OutputStreamWriter(output, StandardCharsets.UTF_8); - - try { - QualityProfileDto profile; - if (name == null) { - profile = profileFactory.getDefault(dbSession, language); - } else { - profile = profileFactory.getByNameAndLanguage(dbSession, name, language); - } - if (profile == null) { - throw new NotFoundException(String.format("Could not find profile with name '%s' for language '%s'", name, language)); - } - - String profileKey = profile.getKey(); - if (format == null) { + try (DbSession dbSession = dbClient.openSession(false); + OutputStream output = stream.output(); + Writer writer = new OutputStreamWriter(output, StandardCharsets.UTF_8)) { + QualityProfileDto profile = getProfile(dbSession, name, language); + if (exporterKey == null) { stream.setMediaType(MediaTypes.XML); - backuper.backup(profileKey, writer); + backuper.backup(dbSession, profile, writer); } else { - stream.setMediaType(exporters.mimeType(format)); - exporters.export(profileKey, format, writer); + stream.setMediaType(exporters.mimeType(exporterKey)); + exporters.export(profile, exporterKey, writer); } - } finally { - IOUtils.closeQuietly(writer); - IOUtils.closeQuietly(output); - dbSession.close(); } } + + private QualityProfileDto getProfile(DbSession dbSession, @Nullable String name, String language) { + QualityProfileDto profile = name == null ? dbClient.qualityProfileDao().selectDefaultProfile(dbSession, language) + : dbClient.qualityProfileDao().selectByNameAndLanguage(name, language, dbSession); + return checkFound(profile, "Could not find profile with name '%s' for language '%s'", name, language); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java index 66e1cf82db6..07ba0ecde14 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java @@ -22,15 +22,12 @@ package org.sonar.server.qualityprofile.ws; import java.io.IOException; import java.io.Writer; import org.apache.commons.lang.StringUtils; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.mockito.Matchers; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; +import org.junit.rules.ExpectedException; import org.sonar.api.profiles.ProfileExporter; import org.sonar.api.profiles.RulesProfile; -import org.sonar.api.server.ws.WebService.Action; +import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbSession; @@ -42,120 +39,99 @@ import org.sonar.server.language.LanguageTesting; import org.sonar.server.qualityprofile.QProfileBackuper; import org.sonar.server.qualityprofile.QProfileExporters; import org.sonar.server.qualityprofile.QProfileTesting; -import org.sonar.server.ws.WsTester; -import org.sonar.server.ws.WsTester.Result; +import org.sonar.server.ws.WsActionTester; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; public class ExportActionTest { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public ExpectedException expectedException = ExpectedException.none(); - private WsTester wsTester; + @Rule + public DbTester db = DbTester.create(System2.INSTANCE); private DbClient dbClient = db.getDbClient(); - - final DbSession session = db.getSession(); - + private DbSession session = db.getSession(); private QualityProfileDao qualityProfileDao = dbClient.qualityProfileDao(); - private QProfileBackuper backuper = mock(QProfileBackuper.class); - private QProfileExporters exporters; - - @Before - public void before() { - ProfileExporter exporter1 = newExporter("polop"); - ProfileExporter exporter2 = newExporter("palap"); - - exporters = new QProfileExporters(dbClient, null, null, new ProfileExporter[] {exporter1, exporter2}, - null); - wsTester = new WsTester(new QProfilesWs(mock(RuleActivationActions.class), - mock(BulkRuleActivationActions.class), - new ExportAction(dbClient, backuper, exporters, LanguageTesting.newLanguages("xoo")))); - } - @Test public void export_without_format() throws Exception { - QualityProfileDto profile = QProfileTesting.newXooP1(); - qualityProfileDao.insert(session, profile); - session.commit(); + QualityProfileDto profile = db.qualityProfiles().insertQualityProfile(QProfileTesting.newXooP1()); - doAnswer(new Answer<Void>() { - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - invocation.getArgumentAt(1, Writer.class).write("As exported by SQ !"); - return null; - } - }).when(backuper).backup(Matchers.eq(profile.getKey()), Matchers.any(Writer.class)); + doAnswer(invocation -> { + invocation.getArgumentAt(2, Writer.class).write("As exported by SQ !"); + return null; + }).when(backuper).backup(any(DbSession.class), any(QualityProfileDto.class), any(Writer.class)); - Result result = wsTester.newGetRequest("api/qualityprofiles", "export").setParam("language", profile.getLanguage()).setParam("name", profile.getName()).execute(); + String result = newWsActionTester().newRequest().setParam("language", profile.getLanguage()).setParam("name", profile.getName()) + .execute().getInput(); - assertThat(result.outputAsString()).isEqualTo("As exported by SQ !"); + assertThat(result).isEqualTo("As exported by SQ !"); } @Test public void export_with_format() throws Exception { - QualityProfileDto profile = QProfileTesting.newXooP1(); - qualityProfileDao.insert(session, profile); - session.commit(); + QualityProfileDto profile = db.qualityProfiles().insertQualityProfile(QProfileTesting.newXooP1()); - Result result = wsTester.newGetRequest("api/qualityprofiles", "export") - .setParam("language", profile.getLanguage()).setParam("name", profile.getName()).setParam("exporterKey", "polop").execute(); + String result = newWsActionTester(newExporter("polop"), newExporter("palap")).newRequest().setParam("language", profile.getLanguage()).setParam("name", profile.getName()) + .setParam("exporterKey", "polop").execute() + .getInput(); - assertThat(result.outputAsString()).isEqualTo("Profile " + profile.getName() + " exported by polop"); + assertThat(result).isEqualTo("Profile " + profile.getName() + " exported by polop"); } @Test public void export_default_profile() throws Exception { - QualityProfileDto profile1 = QProfileTesting.newXooP1(); - QualityProfileDto profile2 = QProfileTesting.newXooP2().setDefault(true); - qualityProfileDao.insert(session, profile1, profile2); - session.commit(); + db.qualityProfiles().insertQualityProfiles(QProfileTesting.newXooP1(), QProfileTesting.newXooP2().setName("SonarWay").setDefault(true)); - Result result = wsTester.newGetRequest("api/qualityprofiles", "export") - .setParam("language", "xoo").setParam("exporterKey", "polop").execute(); + String result = newWsActionTester(newExporter("polop"), newExporter("palap")).newRequest().setParam("language", "xoo").setParam("exporterKey", "polop").execute().getInput(); - assertThat(result.outputAsString()).isEqualTo("Profile " + profile2.getName() + " exported by polop"); + assertThat(result).isEqualTo("Profile SonarWay exported by polop"); } - @Test(expected = NotFoundException.class) + @Test public void fail_on_unknown_profile() throws Exception { - wsTester.newGetRequest("api/qualityprofiles", "export") - .setParam("language", "xoo").setParam("exporterKey", "polop").execute(); + expectedException.expect(NotFoundException.class); + newWsActionTester(newExporter("polop"), newExporter("palap")).newRequest().setParam("language", "xoo").setParam("exporterKey", "polop").execute(); } - @Test(expected = IllegalArgumentException.class) + @Test public void fail_on_unknown_exporter() throws Exception { - QualityProfileDto profile = QProfileTesting.newXooP1(); - qualityProfileDao.insert(session, profile); - session.commit(); + db.qualityProfiles().insertQualityProfile(QProfileTesting.newXooP1()); - wsTester.newGetRequest("api/qualityprofiles", "export") - .setParam("language", "xoo").setParam("exporterKey", "unknown").execute(); + expectedException.expect(IllegalArgumentException.class); + newWsActionTester(newExporter("polop"), newExporter("palap")).newRequest().setParam("language", "xoo").setParam("exporterKey", "unknown").execute(); } @Test - public void do_not_fail_when_no_exporters() throws Exception { - QProfileExporters myExporters = new QProfileExporters(dbClient, null, null, new ProfileExporter[0], null); - WsTester myWsTester = new WsTester(new QProfilesWs(mock(RuleActivationActions.class), - mock(BulkRuleActivationActions.class), - new ExportAction(dbClient, backuper, myExporters, LanguageTesting.newLanguages("xoo")))); + public void does_not_fail_when_no_exporters() throws Exception { + QualityProfileDto profile = db.qualityProfiles().insertQualityProfile(QProfileTesting.newXooP1()); - Action export = myWsTester.controller("api/qualityprofiles").action("export"); - assertThat(export.params()).hasSize(2); + newWsActionTester().newRequest().setParam("language", "xoo").setParam("name", profile.getName()).execute(); + } - QualityProfileDto profile = QProfileTesting.newXooP1(); - qualityProfileDao.insert(session, profile); - session.commit(); + @Test + public void test_definition() throws Exception { + WebService.Action action = newWsActionTester(newExporter("polop"), newExporter("palap")).getDef(); + assertThat(action.isPost()).isFalse(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.params()).hasSize(3); + assertThat(action.param("exporterKey").possibleValues()).containsOnly("polop", "palap"); + } - myWsTester.newGetRequest("api/qualityprofiles", "export").setParam("language", "xoo").setParam("name", profile.getName()).execute(); + private WsActionTester newWsActionTester(ProfileExporter... profileExporters) { + QProfileExporters exporters = new QProfileExporters(dbClient, null, null, profileExporters, null); + return new WsActionTester(new ExportAction(dbClient, backuper, exporters, LanguageTesting.newLanguages("xoo"))); } - private ProfileExporter newExporter(final String key) { + private static ProfileExporter + + newExporter(final String key) { return new ProfileExporter(key, StringUtils.capitalize(key)) { @Override public String getMimeType() { diff --git a/sonar-db/src/test/java/org/sonar/db/DbTester.java b/sonar-db/src/test/java/org/sonar/db/DbTester.java index b17260ca654..82a2e05d4cd 100644 --- a/sonar-db/src/test/java/org/sonar/db/DbTester.java +++ b/sonar-db/src/test/java/org/sonar/db/DbTester.java @@ -73,6 +73,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationTesting; import org.sonar.db.permission.template.PermissionTemplateDbTester; import org.sonar.db.qualitygate.QualityGateDbTester; +import org.sonar.db.qualityprofile.QualityProfileDbTester; import org.sonar.db.rule.RuleDbTester; import org.sonar.db.user.RootFlagAssertions; import org.sonar.db.user.UserDbTester; @@ -115,6 +116,7 @@ public class DbTester extends ExternalResource { private final RuleDbTester ruleDbTester; private final NotificationDbTester notificationDbTester; private final RootFlagAssertions rootFlagAssertions; + private final QualityProfileDbTester qualityProfileDbTester; private DbTester(System2 system2, @Nullable String schemaPath) { this.system2 = system2; @@ -131,6 +133,7 @@ public class DbTester extends ExternalResource { this.ruleDbTester = new RuleDbTester(this); this.notificationDbTester = new NotificationDbTester(this); this.rootFlagAssertions = new RootFlagAssertions(this); + this.qualityProfileDbTester = new QualityProfileDbTester(this); } public static DbTester create() { @@ -240,6 +243,10 @@ public class DbTester extends ExternalResource { return notificationDbTester; } + public QualityProfileDbTester qualityProfiles() { + return qualityProfileDbTester; + } + @Override protected void after() { if (session != null) { diff --git a/sonar-db/src/test/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java b/sonar-db/src/test/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java index 33e123cd74e..d5f5460bff7 100644 --- a/sonar-db/src/test/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java +++ b/sonar-db/src/test/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java @@ -40,6 +40,7 @@ public class QualityProfileDbTester { public QualityProfileDto insertQualityProfile(QualityProfileDto qualityProfile) { dbClient.qualityProfileDao().insert(dbSession, qualityProfile); + dbSession.commit(); return qualityProfile; } @@ -48,7 +49,6 @@ public class QualityProfileDbTester { for (QualityProfileDto qualityProfile : qualityProfiles) { dbClient.qualityProfileDao().insertProjectProfileAssociation(project.uuid(), qualityProfile.getKey(), dbSession); } - dbSession.commit(); } @@ -56,7 +56,6 @@ public class QualityProfileDbTester { for (QualityProfileDto qualityProfile : qualityProfiles) { dbClient.qualityProfileDao().insertProjectProfileAssociation(project.uuid(), qualityProfile.getKey(), dbSession); } - dbSession.commit(); } |