]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6304 SONAR-6305 Apply feedback from PR
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 8 Apr 2015 11:44:37 +0000 (13:44 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 9 Apr 2015 07:50:18 +0000 (09:50 +0200)
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileBackupAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/QProfileRestoreAction.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileBackupActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfilesWsTest.java

index 8664ea2a76eb6a0915e75bc011b6300c0632d1ec..c7010b4f3e57896a8320603aaae7b66ab940e537 100644 (file)
 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);
+    }
   }
 
 }
index 258508c11b0d65b3eeb44b3cb97a05ca47d602d8..da33e1eeac60793c51146d51d5a23710da3b6a58 100644 (file)
@@ -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);
+    }
+  }
 }
index 311ef591bed4ed6bd6dae75a41e6015fb1c736ca..e3be04b57f32750dce86457e4262337fa8a2574a 100644 (file)
 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);
   }
 
index e7885696f70656f277ec5fb3d27ffe104659d69e..5ed7b38ccc2026214881a62448f9a535ed34da1d 100644 (file)
@@ -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