From c011a68ba15c350f6389ccd5246e36b16ef6d850 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Tue, 14 Apr 2015 13:16:33 +0200 Subject: [PATCH] SONAR-6305 Serialize restoration result in response --- .../qualityprofile/BulkChangeResult.java | 18 +++++++++++ .../server/qualityprofile/QProfileReset.java | 2 +- .../ws/QProfileRestoreAction.java | 30 +++++++++++++++++-- .../ws/QProfileRestoreActionTest.java | 14 +++++++-- .../qualityprofile/ws/QProfilesWsTest.java | 2 +- .../restore_profile.json | 11 +++++++ 6 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest/restore_profile.json diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/BulkChangeResult.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/BulkChangeResult.java index b3f5f3684fd..5a633b6b4fe 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/BulkChangeResult.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/BulkChangeResult.java @@ -20,17 +20,35 @@ package org.sonar.server.qualityprofile; import com.google.common.collect.Lists; +import org.sonar.core.qualityprofile.db.QualityProfileDto; import org.sonar.server.exceptions.Errors; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; + import java.util.Collection; import java.util.List; public class BulkChangeResult { + private final QualityProfileDto profile; private final Errors errors = new Errors(); private int succeeded = 0, failed = 0; private final List changes = Lists.newArrayList(); + public BulkChangeResult() { + this(null); + } + + public BulkChangeResult(@Nullable QualityProfileDto profile) { + this.profile = profile; + } + + @CheckForNull + public QualityProfileDto profile() { + return profile; + } + public Errors getErrors() { return errors; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileReset.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileReset.java index 526296c946d..83ae4917bd1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileReset.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileReset.java @@ -125,7 +125,7 @@ public class QProfileReset implements ServerComponent { */ private BulkChangeResult doReset(DbSession dbSession, QualityProfileDto profile, Collection activations) { Preconditions.checkNotNull(profile.getId(), "Quality profile must be persisted"); - BulkChangeResult result = new BulkChangeResult(); + BulkChangeResult result = new BulkChangeResult(profile); Set ruleToBeDeactivated = Sets.newHashSet(); // Keep reference to all the activated rules before backup restore for (ActiveRuleDto activeRuleDto : db.activeRuleDao().findByProfileKey(dbSession, profile.getKee())) { 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 8b4634b4ee0..02a6556a4dc 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 @@ -22,10 +22,14 @@ 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.resources.Languages; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.text.JsonWriter; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.qualityprofile.db.QualityProfileDto; +import org.sonar.server.qualityprofile.BulkChangeResult; import org.sonar.server.qualityprofile.QProfileBackuper; import org.sonar.server.user.UserSession; @@ -36,9 +40,11 @@ public class QProfileRestoreAction implements BaseQProfileWsAction { private static final String PARAM_BACKUP = "backup"; private final QProfileBackuper backuper; + private final Languages languages; - public QProfileRestoreAction(QProfileBackuper backuper) { + public QProfileRestoreAction(QProfileBackuper backuper, Languages languages) { this.backuper = backuper; + this.languages = languages; } @Override @@ -64,11 +70,29 @@ public class QProfileRestoreAction implements BaseQProfileWsAction { try { Preconditions.checkArgument(backup != null, "A backup file must be provided"); reader = new InputStreamReader(backup, Charsets.UTF_8); - backuper.restore(reader, null); - response.noContent(); + BulkChangeResult result = backuper.restore(reader, null); + writeResponse(response.newJsonWriter(), result); } finally { IOUtils.closeQuietly(reader); IOUtils.closeQuietly(backup); } } + + private void writeResponse(JsonWriter json, BulkChangeResult result) { + QualityProfileDto profile = result.profile(); + if (profile != null) { + String language = profile.getLanguage(); + json.beginObject().name("profile").beginObject() + .prop("key", profile.getKey()) + .prop("name", profile.getName()) + .prop("language", language) + .prop("languageName", languages.get(profile.getLanguage()).getName()) + .prop("isDefault", false) + .prop("isInherited", false) + .endObject(); + } + json.prop("ruleSuccesses", result.countSucceeded()); + json.prop("ruleFailures", result.countFailed()); + json.endObject().close(); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest.java index 07106e359ca..d5de479749d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest.java @@ -25,7 +25,10 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.qualityprofile.db.QualityProfileDto; import org.sonar.server.exceptions.ForbiddenException; +import org.sonar.server.language.LanguageTesting; +import org.sonar.server.qualityprofile.BulkChangeResult; import org.sonar.server.qualityprofile.QProfileBackuper; import org.sonar.server.qualityprofile.QProfileName; import org.sonar.server.user.MockUserSession; @@ -37,6 +40,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class QProfileRestoreActionTest { @@ -53,14 +57,20 @@ public class QProfileRestoreActionTest { mock(RuleActivationActions.class), mock(BulkRuleActivationActions.class), mock(ProjectAssociationActions.class), - new QProfileRestoreAction(backuper))); + new QProfileRestoreAction(backuper, LanguageTesting.newLanguages("xoo")))); } @Test public void restore_profile() throws Exception { MockUserSession.set().setLogin("obiwan").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN); - tester.newPostRequest("api/qualityprofiles", "restore").setParam("backup", "").execute(); + QualityProfileDto profile = QualityProfileDto.createFor("xoo-sonar-way-12345") + .setDefault(false).setLanguage("xoo").setName("Sonar way"); + BulkChangeResult restoreResult = new BulkChangeResult(profile); + when(backuper.restore(any(Reader.class), (QProfileName) eq(null))).thenReturn(restoreResult); + + tester.newPostRequest("api/qualityprofiles", "restore").setParam("backup", "").execute() + .assertJson(getClass(), "restore_profile.json"); verify(backuper).restore(any(Reader.class), (QProfileName) eq(null)); } 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 7aaea756dec..254793b6639 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 @@ -66,7 +66,7 @@ public class QProfilesWsTest { new QProfileSetDefaultAction(languages, null, null), new QProfileProjectsAction(null), new QProfileBackupAction(null, null, null, languages), - new QProfileRestoreAction(null) + new QProfileRestoreAction(null, languages) )).controller(QProfilesWs.API_ENDPOINT); } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest/restore_profile.json b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest/restore_profile.json new file mode 100644 index 00000000000..9375056bade --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/qualityprofile/ws/QProfileRestoreActionTest/restore_profile.json @@ -0,0 +1,11 @@ +{ + "profile": { + "name": "Sonar way", + "language": "xoo", + "languageName": "Xoo", + "isDefault": false, + "isInherited": false + }, + "ruleSuccesses": 0, + "ruleFailures": 0 +} -- 2.39.5