From 96fc66346a4f86531726387c49f2fc8f65fd779c Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Fri, 17 Apr 2015 10:29:48 +0200 Subject: [PATCH] SONAR-6376 add more properties to ws installed plugins --- .../plugins/ws/InstalledPluginsWsAction.java | 50 +++++- .../plugins/ws/example-installed_plugins.json | 56 +++++-- .../ws/InstalledPluginsWsActionTest.java | 149 +++++++++++------- .../ws/InstalledPluginsWsActionTest/some.jar | 0 4 files changed, 179 insertions(+), 76 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest/some.jar 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 7eb6051e7cd..97d6f462d65 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 @@ -34,18 +34,24 @@ import org.sonar.api.utils.text.JsonWriter; import java.util.Collection; import java.util.SortedSet; -import static com.google.common.base.Objects.firstNonNull; import static com.google.common.collect.Iterables.filter; /** * Implementation of the {@code installed} action for the Plugins WebService. */ public class InstalledPluginsWsAction implements PluginsWsAction { - private static final String DEFAULT_VERSION = "-"; private static final String PROPERTY_KEY = "key"; private static final String PROPERTY_NAME = "name"; + private static final String PROPERTY_DESCRIPTION = "description"; + private static final String PROPERTY_LICENSE = "license"; private static final String PROPERTY_VERSION = "version"; private static final String ARRAY_PLUGINS = "plugins"; + private static final String PROPERTY_ORGANIZATION_NAME = "organizationName"; + private static final String PROPERTY_ORGANIZATION_URL = "organizationUrl"; + private static final String OBJECT_URLS = "urls"; + private static final String PROPERTY_HOMEPAGE = "homepage"; + private static final String PROPERTY_ISSUE_TRACKER = "issueTracker"; + private static final String OBJECT_ARTIFACT = "artifact"; private final PluginRepository pluginRepository; @@ -71,6 +77,7 @@ public class InstalledPluginsWsAction implements PluginsWsAction { Collection pluginMetadatas = retrieveAndSortPluginMetadata(); JsonWriter jsonWriter = response.newJsonWriter(); + jsonWriter.setSerializeEmptys(false); jsonWriter.beginObject(); writeMetadataList(jsonWriter, pluginMetadatas); @@ -90,16 +97,49 @@ public class InstalledPluginsWsAction implements PluginsWsAction { jsonWriter.name(ARRAY_PLUGINS); jsonWriter.beginArray(); for (PluginMetadata pluginMetadata : pluginMetadatas) { - writeMetadata(jsonWriter, pluginMetadata); + writePluginMetadata(jsonWriter, pluginMetadata); } jsonWriter.endArray(); } - private void writeMetadata(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { + private void writePluginMetadata(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { jsonWriter.beginObject(); + + writeMetadata(jsonWriter, pluginMetadata); + + writeUrls(jsonWriter, pluginMetadata); + + writeArtifact(jsonWriter, pluginMetadata); + + jsonWriter.endObject(); + } + + private void writeMetadata(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { jsonWriter.prop(PROPERTY_KEY, pluginMetadata.getKey()); jsonWriter.prop(PROPERTY_NAME, pluginMetadata.getName()); - jsonWriter.prop(PROPERTY_VERSION, firstNonNull(pluginMetadata.getVersion(), DEFAULT_VERSION)); + jsonWriter.prop(PROPERTY_DESCRIPTION, pluginMetadata.getDescription()); + jsonWriter.prop(PROPERTY_VERSION, pluginMetadata.getVersion()); + jsonWriter.prop(PROPERTY_LICENSE, pluginMetadata.getLicense()); + jsonWriter.prop(PROPERTY_ORGANIZATION_NAME, pluginMetadata.getOrganization()); + jsonWriter.prop(PROPERTY_ORGANIZATION_URL, pluginMetadata.getOrganizationUrl()); + } + + private void writeUrls(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { + jsonWriter.name(OBJECT_URLS); + jsonWriter.beginObject(); + jsonWriter.prop(PROPERTY_HOMEPAGE, pluginMetadata.getHomepage()); + jsonWriter.prop(PROPERTY_ISSUE_TRACKER, pluginMetadata.getIssueTrackerUrl()); + jsonWriter.endObject(); + } + + private void writeArtifact(JsonWriter jsonWriter, PluginMetadata pluginMetadata) { + if (pluginMetadata.getFile() == null) { + return; + } + + jsonWriter.name(OBJECT_ARTIFACT); + jsonWriter.beginObject(); + jsonWriter.prop(PROPERTY_NAME, pluginMetadata.getFile().getName()); jsonWriter.endObject(); } 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 546ff975a24..ed3b0f74816 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,20 +1,52 @@ { - "plugins": - [ + "plugins": [ { - "key": "findbugs", - "name": "Findbugs", - "version": "2.1" + "key": "scmgit", + "name": "Git", + "description": "Git SCM Provider.", + "version": "1.0", + "license": "GNU LGPL 3", + "organizationName": "SonarSource", + "organizationUrl": "http://www.sonarsource.com", + "urls": { + "homepage": "http://redirect.sonarsource.com/plugins/scmgit.html", + "issueTracker": "http://jira.codehaus.org/browse/SONARSCGIT" + }, + "artifact": { + "name": "sonar-scm-git-plugin-1.0.jar" + } }, { - "key": "l10nfr", - "name": "French Pack", - "version": "1.10" + "key": "java", + "name": "Java", + "description": "SonarQube rule engine.", + "version": "3.0", + "license": "GNU LGPL 3", + "organizationName": "SonarSource", + "organizationUrl": "http://www.sonarsource.com", + "urls": { + "homepage": "http://redirect.sonarsource.com/plugins/java.html", + "issueTracker": "http://jira.codehaus.org/browse/SONARJAVA" + }, + "artifact": { + "name": "sonar-java-plugin-3.0.jar" + } }, { - "key": "jira", - "name": "JIRA", - "version": "1.2" + "key": "scmsvn", + "name": "SVN", + "description": "SVN SCM Provider.", + "version": "1.0", + "license": "GNU LGPL 3", + "organizationName": "SonarSource", + "organizationUrl": "http://www.sonarsource.com", + "urls": { + "homepage": "http://redirect.sonarsource.com/plugins/scmsvn.html", + "issueTracker": "http://jira.codehaus.org/browse/SONARSCSVN" + }, + "artifact": { + "name": "sonar-scm-svn-plugin-1.0.jar" + } } ] -} +} \ No newline at end of file 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 b497fa0acc5..2773a269cc9 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 @@ -19,7 +19,10 @@ */ package org.sonar.server.plugins.ws; +import org.junit.Before; import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.sonar.api.platform.PluginMetadata; import org.sonar.api.platform.PluginRepository; import org.sonar.api.server.ws.Request; @@ -27,11 +30,14 @@ import org.sonar.api.server.ws.WebService; import org.sonar.core.plugins.DefaultPluginMetadata; import org.sonar.server.ws.WsTester; +import java.io.File; + import static com.google.common.collect.ImmutableList.of; import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; import static org.sonar.test.JsonAssert.assertJson; public class InstalledPluginsWsActionTest { @@ -41,28 +47,24 @@ public class InstalledPluginsWsActionTest { " \"plugins\":" + "[]" + "}"; - private PluginRepository pluginRepository = mock(PluginRepository.class); - private InstalledPluginsWsAction underTest = new InstalledPluginsWsAction(pluginRepository); + @Mock + private PluginRepository pluginRepository; + @InjectMocks + private InstalledPluginsWsAction underTest; - private WsTester wsTester = new WsTester(); + @Mock private Request request = mock(Request.class); private WsTester.TestResponse response = new WsTester.TestResponse(); private PluginMetadata corePlugin = corePlugin("core1", 10); - private static PluginMetadata corePlugin(String key, int version) { - return DefaultPluginMetadata.create(key).setName(key).setCore(true).setVersion(valueOf(version)); - } - - private static PluginMetadata plugin(String key, String name, int version) { - return DefaultPluginMetadata.create(key).setName(name).setCore(false).setVersion(valueOf(version)); - } - - private static PluginMetadata plugin(String key, String name) { - return DefaultPluginMetadata.create(key).setName(name).setCore(false).setVersion("1.0"); + @Before + public void createMocks() throws Exception { + initMocks(this); } @Test public void action_installed_is_defined() throws Exception { + WsTester wsTester = new WsTester(); WebService.NewController newController = wsTester.context().createController(DUMMY_CONTROLLER_KEY); underTest.define(newController); @@ -93,24 +95,62 @@ public class InstalledPluginsWsActionTest { assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo(JSON_EMPTY_PLUGIN_LIST); } + @Test + public void empty_fields_are_not_serialized_to_json() throws Exception { + when(pluginRepository.getMetadata()).thenReturn( + of( + (PluginMetadata) DefaultPluginMetadata.create("").setName("").setCore(false) + ) + ); + + underTest.handle(request, response); + + assertThat(response.outputAsString()).doesNotContain("name").doesNotContain("key"); + } + @Test public void verify_properties_displayed_in_json_per_plugin() throws Exception { - when(pluginRepository.getMetadata()).thenReturn(of(plugin("plugKey", "plugName", 10))); + String jarFilename = getClass().getSimpleName() + "/" + "some.jar"; + when(pluginRepository.getMetadata()).thenReturn(of( + (PluginMetadata) DefaultPluginMetadata.create("plugKey").setName("plugName").setCore(false) + .setDescription("desc_it") + .setVersion(valueOf(10)) + .setLicense("license_hey") + .setOrganization("org_name") + .setOrganizationUrl("org_url") + .setHomepage("homepage_url") + .setIssueTrackerUrl("issueTracker_url") + .setFile(new File(getClass().getResource(jarFilename).toURI())) + ) + ); underTest.handle(request, response); assertJson(response.outputAsString()).isSimilarTo( - "{" + - " \"plugins\":" + - " [" + - " {" + - " \"key\": \"plugKey\"," + - " \"name\": \"plugName\"," + - " \"version\": \"10\"" + - " }" + - " ]" + - "}" - ); + "{" + + " \"plugins\":" + + " [" + + " {" + + " \"key\": \"plugKey\"," + + " \"name\": \"plugName\"," + + " \"description\": \"desc_it\"," + + " \"version\": \"10\"," + + " \"license\": \"license_hey\"," + + " \"organizationName\": \"org_name\"," + + " \"organizationUrl\": \"org_url\"," + + " \"urls\":" + + " {" + + " \"homepage\": \"homepage_url\"," + + " \"issueTracker\": \"issueTracker_url\"" + + " }," + + " \"artifact\":" + + " {" + + " \"name\": \"some.jar\"" + + " }" + + " }" + + " ]" + + "}" + ); } @Test @@ -127,16 +167,16 @@ public class InstalledPluginsWsActionTest { underTest.handle(request, response); assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo( - "{" + - " \"plugins\":" + - " [" + - " {\"key\": \"C\"}" + "," + - " {\"key\": \"D\"}" + "," + - " {\"key\": \"B\"}" + "," + - " {\"key\": \"A\"}" + - " ]" + - "}" - ); + "{" + + " \"plugins\":" + + " [" + + " {\"key\": \"C\"}" + "," + + " {\"key\": \"D\"}" + "," + + " {\"key\": \"B\"}" + "," + + " {\"key\": \"A\"}" + + " ]" + + "}" + ); } @Test @@ -151,34 +191,25 @@ public class InstalledPluginsWsActionTest { underTest.handle(request, response); assertJson(response.outputAsString()).setStrictArrayOrder(true).isSimilarTo( - "{" + - " \"plugins\":" + - " [" + - " {\"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) - ) - ); - - underTest.handle(request, response); + private static PluginMetadata corePlugin(String key, int version) { + return DefaultPluginMetadata.create(key).setName(key).setCore(true).setVersion(valueOf(version)); + } - assertJson(response.outputAsString()).isSimilarTo( - "{" + - " \"plugins\":" + - " [" + - " {\"version\": \"-\"}" + - " ]" + - "}" - ); + private static PluginMetadata plugin(String key, String name, int version) { + return DefaultPluginMetadata.create(key).setName(name).setCore(false).setVersion(valueOf(version)); + } + private static PluginMetadata plugin(String key, String name) { + return DefaultPluginMetadata.create(key).setName(name).setCore(false).setVersion("1.0"); } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest/some.jar b/server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest/some.jar new file mode 100644 index 00000000000..e69de29bb2d -- 2.39.5