From a5379fb4fd1a2498d12157e626f7adc5e7290f9e Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Wed, 8 Apr 2015 13:44:37 +0200 Subject: [PATCH] SONAR-6304 SONAR-6305 Apply feedback from PR --- .../ws/QProfileBackupAction.java | 53 +++++++++++++------ .../ws/QProfileRestoreAction.java | 27 ++++++---- .../ws/QProfileBackupActionTest.java | 14 ++++- .../qualityprofile/ws/QProfilesWsTest.java | 4 +- 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileBackupAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileBackupAction.java index 8664ea2a76e..c7010b4f3e5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileBackupAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileBackupAction.java @@ -20,38 +20,61 @@ package org.sonar.server.qualityprofile.ws; import com.google.common.base.Charsets; -import org.sonar.api.server.ws.Request; -import org.sonar.api.server.ws.Response; +import org.apache.commons.io.IOUtils; +import org.sonar.api.resources.Languages; +import org.sonar.api.server.ws.*; 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.persistence.DbSession; +import org.sonar.server.db.DbClient; import org.sonar.server.qualityprofile.QProfileBackuper; +import org.sonar.server.qualityprofile.QProfileFactory; import java.io.OutputStreamWriter; public class QProfileBackupAction implements BaseQProfileWsAction { private static final String PARAM_KEY = "key"; + private final QProfileBackuper backuper; - public QProfileBackupAction(QProfileBackuper backuper) { + private final DbClient dbClient; + + private QProfileFactory profileFactory; + + private final Languages languages; + + public QProfileBackupAction(QProfileBackuper backuper, DbClient dbClient, QProfileFactory profileFactory, Languages languages) { this.backuper = backuper; + this.dbClient = dbClient; + this.profileFactory = profileFactory; + this.languages = languages; } @Override - public void handle(Request request, Response response) throws Exception { - Stream stream = response.stream(); - stream.setMediaType("text/xml"); - backuper.backup(request.mandatoryParam(PARAM_KEY), new OutputStreamWriter(stream.output(), Charsets.UTF_8)); + public void define(WebService.NewController controller) { + NewAction backup = controller.createAction("backup") + .setSince("5.2") + .setDescription("Backup a quality profile in XML form. The exported profile can be restored through api/qualityprofiles/restore.") + .setHandler(this); + + QProfileIdentificationParamUtils.defineProfileParams(backup, languages); } + @Override - public void define(WebService.NewController controller) { - controller.createAction("backup") - .setSince("5.2") - .setDescription("Backup a quality profile in XML form.") - .setHandler(this) - .createParam(PARAM_KEY) - .setDescription("Key of the profile to backup."); + public void handle(Request request, Response response) throws Exception { + Stream stream = response.stream(); + stream.setMediaType("text/xml"); + OutputStreamWriter writer = new OutputStreamWriter(stream.output(), Charsets.UTF_8); + DbSession session = dbClient.openSession(false); + try { + String profileKey = QProfileIdentificationParamUtils.getProfileKeyFromParameters(request, profileFactory, session); + backuper.backup(profileKey, writer); + } finally { + session.close(); + IOUtils.closeQuietly(writer); + } } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java index 258508c11b0..da33e1eeac6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java @@ -21,6 +21,7 @@ package org.sonar.server.qualityprofile.ws; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; +import org.apache.commons.io.IOUtils; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -40,21 +41,12 @@ public class QProfileRestoreAction implements BaseQProfileWsAction { this.backuper = backuper; } - @Override - public void handle(Request request, Response response) throws Exception { - UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN); - InputStream backup = request.paramAsInputStream(PARAM_BACKUP); - Preconditions.checkArgument(backup != null, "A backup file must be provided"); - - backuper.restore(new InputStreamReader(backup, Charsets.UTF_8), null); - response.noContent(); - } - @Override public void define(WebService.NewController controller) { controller.createAction("restore") .setSince("5.2") - .setDescription("Restore a quality profile using an XML file.") + .setDescription("Restore a quality profile using an XML file. The restored profile name is taken from the backup file, " + + "so if a profile with the same name and language already exists, it will be overwritten.") .setPost(true) .setHandler(this) .createParam(PARAM_BACKUP) @@ -62,4 +54,17 @@ public class QProfileRestoreAction implements BaseQProfileWsAction { "or the former api/profiles/backup."); } + @Override + public void handle(Request request, Response response) throws Exception { + UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN); + InputStream backup = request.paramAsInputStream(PARAM_BACKUP); + try { + Preconditions.checkArgument(backup != null, "A backup file must be provided"); + + backuper.restore(new InputStreamReader(backup, Charsets.UTF_8), null); + response.noContent(); + } finally { + IOUtils.closeQuietly(backup); + } + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileBackupActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileBackupActionTest.java index 311ef591bed..e3be04b57f3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileBackupActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileBackupActionTest.java @@ -20,13 +20,18 @@ package org.sonar.server.qualityprofile.ws; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import org.sonar.core.persistence.DbTester; +import org.sonar.server.db.DbClient; +import org.sonar.server.language.LanguageTesting; import org.sonar.server.qualityprofile.QProfileBackuper; +import org.sonar.server.qualityprofile.QProfileFactory; import org.sonar.server.ws.WsTester; import org.sonar.server.ws.WsTester.Result; @@ -42,6 +47,9 @@ import static org.mockito.Mockito.mock; @RunWith(MockitoJUnitRunner.class) public class QProfileBackupActionTest { + @ClassRule + public static final DbTester db = new DbTester(); + // TODO Replace with proper DbTester + EsTester medium test once DaoV2 is removed @Mock private QProfileBackuper backuper; @@ -50,11 +58,13 @@ public class QProfileBackupActionTest { @Before public void setUp() throws Exception { + DbClient dbClient = new DbClient(db.database(), db.myBatis()); + tester = new WsTester(new QProfilesWs( mock(RuleActivationActions.class), mock(BulkRuleActivationActions.class), mock(ProjectAssociationActions.class), - new QProfileBackupAction(backuper))); + new QProfileBackupAction(backuper, dbClient, new QProfileFactory(dbClient), LanguageTesting.newLanguages("xoo")))); } @Test @@ -72,7 +82,7 @@ public class QProfileBackupActionTest { } }).when(backuper).backup(eq(profileKey), any(Writer.class)); - Result result = tester.newGetRequest("api/qualityprofiles", "backup").setParam("key", profileKey).execute(); + Result result = tester.newGetRequest("api/qualityprofiles", "backup").setParam("profileKey", profileKey).execute(); assertThat(result.outputAsString()).isEqualTo(response); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java index e7885696f70..5ed7b38ccc2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java @@ -55,7 +55,7 @@ public class QProfilesWsTest { new QProfileSearchAction(languages, null, null), new QProfileSetDefaultAction(languages, null, null), new QProfileProjectsAction(null), - new QProfileBackupAction(null), + new QProfileBackupAction(null, null, null, languages), new QProfileRestoreAction(null) )).controller(QProfilesWs.API_ENDPOINT); } @@ -141,7 +141,7 @@ public class QProfilesWsTest { WebService.Action backup = controller.action("backup"); assertThat(backup).isNotNull(); assertThat(backup.isPost()).isFalse(); - assertThat(backup.params()).hasSize(1); + assertThat(backup.params()).hasSize(3); } @Test -- 2.39.5