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);
+ }
}
}
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;
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)
"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);
+ }
+ }
}
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;
@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;
@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
}
}).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);
}
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);
}
WebService.Action backup = controller.action("backup");
assertThat(backup).isNotNull();
assertThat(backup.isPost()).isFalse();
- assertThat(backup.params()).hasSize(1);
+ assertThat(backup.params()).hasSize(3);
}
@Test