]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6376 add more properties to ws installed plugins
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Fri, 17 Apr 2015 08:29:48 +0000 (10:29 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Fri, 17 Apr 2015 14:46:14 +0000 (16:46 +0200)
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/InstalledPluginsWsAction.java
server/sonar-server/src/main/resources/org/sonar/server/plugins/ws/example-installed_plugins.json
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/plugins/ws/InstalledPluginsWsActionTest/some.jar [new file with mode: 0644]

index 7eb6051e7cdfcf1b5b6c8cb25a2a71954c071010..97d6f462d65da6f757cb173f443d96a4577abc66 100644 (file)
@@ -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<PluginMetadata> 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();
   }
 
index 546ff975a24a19f3c2a969d18264c470be3f8456..ed3b0f7481630f296dd1b1a47d6728d531f2aee5 100644 (file)
@@ -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
index b497fa0acc5e92cc011fda91ee173bd19f542521..2773a269cc96f646282ed53d91f6b8d214039848 100644 (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;
@@ -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 (file)
index 0000000..e69de29