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;
Collection<PluginMetadata> pluginMetadatas = retrieveAndSortPluginMetadata();
JsonWriter jsonWriter = response.newJsonWriter();
+ jsonWriter.setSerializeEmptys(false);
jsonWriter.beginObject();
writeMetadataList(jsonWriter, pluginMetadatas);
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();
}
{
- "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
*/
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;
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 {
" \"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);
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
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
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");
}
}