aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2017-01-30 18:09:12 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2017-02-01 14:13:02 +0100
commite34eaf8f733e5adad1a7dd286515ff4e7069153b (patch)
treefe717a649e39a4f5068b001af9d12623606b5a81
parenteae95b7c88af8635f61332bad2288d868a81ade8 (diff)
downloadsonarqube-e34eaf8f733e5adad1a7dd286515ff4e7069153b.tar.gz
sonarqube-e34eaf8f733e5adad1a7dd286515ff4e7069153b.zip
SONAR-7946 Remove usage of QProfileFactory
Also replace WsTester by WsActionTester in UT
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java29
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ExportAction.java76
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java122
-rw-r--r--sonar-db/src/test/java/org/sonar/db/DbTester.java7
-rw-r--r--sonar-db/src/test/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java3
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();
}