From 58495187b8991249e3c203430178c21f101bb115 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Wed, 15 Apr 2015 17:07:03 +0200 Subject: [PATCH] SONAR-6376 JSON response must have a root object this leave the door open to extend the response without breaking the API --- .../plugins/ws/InstalledPluginsWsAction.java | 25 +++-- .../plugins/ws/example-installed_plugins.json | 37 ++++--- .../ws/InstalledPluginsWsActionTest.java | 104 ++++++++++-------- 3 files changed, 95 insertions(+), 71 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstalledPluginsWsAction.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstalledPluginsWsAction.java index dc5345f0191..7eb6051e7cd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstalledPluginsWsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstalledPluginsWsAction.java @@ -45,6 +45,7 @@ public class InstalledPluginsWsAction implements PluginsWsAction { private static final String PROPERTY_KEY = "key"; private static final String PROPERTY_NAME = "name"; private static final String PROPERTY_VERSION = "version"; + private static final String ARRAY_PLUGINS = "plugins"; private final PluginRepository pluginRepository; @@ -68,7 +69,14 @@ public class InstalledPluginsWsAction implements PluginsWsAction { @Override public void handle(Request request, Response response) throws Exception { Collection pluginMetadatas = retrieveAndSortPluginMetadata(); - writeMetadataList(response, pluginMetadatas); + + JsonWriter jsonWriter = response.newJsonWriter(); + jsonWriter.beginObject(); + + writeMetadataList(jsonWriter, pluginMetadatas); + + jsonWriter.endObject(); + jsonWriter.close(); } private SortedSet retrieveAndSortPluginMetadata() { @@ -78,14 +86,13 @@ public class InstalledPluginsWsAction implements PluginsWsAction { ); } - private void writeMetadataList(Response response, Collection pluginMetadatas) { - JsonWriter jsonWriter = response.newJsonWriter(); - jsonWriter.beginArray(); - for (PluginMetadata pluginMetadata : pluginMetadatas) { - writeMetadata(jsonWriter, pluginMetadata); - } - jsonWriter.endArray(); - jsonWriter.close(); + private void writeMetadataList(JsonWriter jsonWriter, Collection pluginMetadatas) { + jsonWriter.name(ARRAY_PLUGINS); + jsonWriter.beginArray(); + for (PluginMetadata pluginMetadata : pluginMetadatas) { + writeMetadata(jsonWriter, pluginMetadata); + } + jsonWriter.endArray(); } private void writeMetadata(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { diff --git a/server/sonar-server/src/main/resources/org/sonar/server/plugins/ws/example-installed_plugins.json b/server/sonar-server/src/main/resources/org/sonar/server/plugins/ws/example-installed_plugins.json index ca65c9072da..546ff975a24 100644 --- a/server/sonar-server/src/main/resources/org/sonar/server/plugins/ws/example-installed_plugins.json +++ b/server/sonar-server/src/main/resources/org/sonar/server/plugins/ws/example-installed_plugins.json @@ -1,17 +1,20 @@ -[ - { - "key": "findbugs", - "name": "Findbugs", - "version": "2.1" - }, - { - "key": "l10nfr", - "name": "French Pack", - "version": "1.10" - }, - { - "key": "jira", - "name": "JIRA", - "version": "1.2" - } -] +{ + "plugins": + [ + { + "key": "findbugs", + "name": "Findbugs", + "version": "2.1" + }, + { + "key": "l10nfr", + "name": "French Pack", + "version": "1.10" + }, + { + "key": "jira", + "name": "JIRA", + "version": "1.2" + } + ] +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest.java index 55f641c443b..b497fa0acc5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest.java @@ -36,7 +36,10 @@ import static org.sonar.test.JsonAssert.assertJson; public class InstalledPluginsWsActionTest { private static final String DUMMY_CONTROLLER_KEY = "dummy"; - private static final String JSON_EMPTY_ARRAY = "[]"; + private static final String JSON_EMPTY_PLUGIN_LIST = + "{" + + " \"plugins\":" + "[]" + + "}"; private PluginRepository pluginRepository = mock(PluginRepository.class); private InstalledPluginsWsAction underTest = new InstalledPluginsWsAction(pluginRepository); @@ -78,7 +81,7 @@ public class InstalledPluginsWsActionTest { public void empty_array_is_returned_when_there_is_not_plugin_installed() throws Exception { underTest.handle(request, response); - assertThat(response.outputAsString()).isEqualTo("[]"); + assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo(JSON_EMPTY_PLUGIN_LIST); } @Test @@ -87,7 +90,7 @@ public class InstalledPluginsWsActionTest { underTest.handle(request, response); - assertThat(response.outputAsString()).isEqualTo(JSON_EMPTY_ARRAY); + assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo(JSON_EMPTY_PLUGIN_LIST); } @Test @@ -97,74 +100,85 @@ public class InstalledPluginsWsActionTest { underTest.handle(request, response); assertJson(response.outputAsString()).isSimilarTo( - "[" + - "{" + - " \"key\": \"plugKey\"," + - " \"name\": \"plugName\"," + - " \"version\": \"10\"" + - "}" + - "]" - ); + "{" + + " \"plugins\":" + + " [" + + " {" + + " \"key\": \"plugKey\"," + + " \"name\": \"plugName\"," + + " \"version\": \"10\"" + + " }" + + " ]" + + "}" + ); } @Test public void plugins_are_sorted_by_name_then_key_and_only_one_plugin_can_have_a_specific_name() throws Exception { when(pluginRepository.getMetadata()).thenReturn( - of( - plugin("A", "name2"), - plugin("B", "name1"), - plugin("C", "name0"), - plugin("D", "name0") - ) - ); + of( + plugin("A", "name2"), + plugin("B", "name1"), + plugin("C", "name0"), + plugin("D", "name0") + ) + ); underTest.handle(request, response); assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo( - "[" + - "{\"key\": \"C\"}" + "," + - "{\"key\": \"D\"}" + "," + - "{\"key\": \"B\"}" + "," + - "{\"key\": \"A\"}" + - "]" - ); + "{" + + " \"plugins\":" + + " [" + + " {\"key\": \"C\"}" + "," + + " {\"key\": \"D\"}" + "," + + " {\"key\": \"B\"}" + "," + + " {\"key\": \"A\"}" + + " ]" + + "}" + ); } @Test public void only_one_plugin_can_have_a_specific_name_and_key() throws Exception { when(pluginRepository.getMetadata()).thenReturn( - of( - plugin("A", "name2"), - plugin("A", "name2") - ) - ); + of( + plugin("A", "name2"), + plugin("A", "name2") + ) + ); underTest.handle(request, response); assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo( - "[" + - "{\"key\": \"A\"}" + - "]" - ); + "{" + + " \"plugins\":" + + " [" + + " {\"key\": \"A\"}" + + " ]" + + "}" + ); assertThat(response.outputAsString()).containsOnlyOnce("name2"); } @Test public void dash_is_returned_when_version_is_null() throws Exception { when(pluginRepository.getMetadata()).thenReturn( - of( - (PluginMetadata) DefaultPluginMetadata.create("key").setCore(false).setVersion(null) - ) - ); + of( + (PluginMetadata) DefaultPluginMetadata.create("key").setCore(false).setVersion(null) + ) + ); underTest.handle(request, response); - assertJson(response.outputAsString()) - .isSimilarTo( - "[" + - "{\"version\": \"-\"}" + - "]" - ); + assertJson(response.outputAsString()).isSimilarTo( + "{" + + " \"plugins\":" + + " [" + + " {\"version\": \"-\"}" + + " ]" + + "}" + ); } -} \ No newline at end of file +} -- 2.39.5