]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6377 available plugins WS should sort plugins explictly 237/head
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 20 Apr 2015 15:31:31 +0000 (17:31 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Thu, 23 Apr 2015 08:04:20 +0000 (10:04 +0200)
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/AvailablePluginsWsAction.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/PluginWSCommons.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatesPluginsWsAction.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AbstractUpdateCenterBasedPluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AvailablePluginsWsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatesPluginsWsActionTest.java

index e16955a2b07950868cd08d04cc3ed0b4265895a9..17e1eb7df4d49344313ba0a8b675f7097ac48380 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.plugins.ws;
 
+import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.io.Resources;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -27,7 +28,9 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.server.plugins.UpdateCenterMatrixFactory;
 import org.sonar.updatecenter.common.PluginUpdate;
 
-import java.util.List;
+import java.util.Collection;
+
+import static org.sonar.server.plugins.ws.PluginWSCommons.NAME_KEY_PLUGIN_UPDATE_ORDERING;
 
 public class AvailablePluginsWsAction implements PluginsWsAction {
 
@@ -73,7 +76,10 @@ public class AvailablePluginsWsAction implements PluginsWsAction {
     jsonWriter.endObject();
   }
 
-  private List<PluginUpdate> retrieveAvailablePlugins() {
-    return updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH).findAvailablePlugins();
+  private Collection<PluginUpdate> retrieveAvailablePlugins() {
+    return ImmutableSortedSet.copyOf(
+        NAME_KEY_PLUGIN_UPDATE_ORDERING,
+        updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH).findAvailablePlugins()
+    );
   }
 }
index 9bb852a5ac1b5411c312c36e790d6ef3c37ceaf7..5924784a2926cd1d5d0e9aca7c1733effc782476 100644 (file)
@@ -31,9 +31,11 @@ import org.sonar.updatecenter.common.Release;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import java.util.Comparator;
 
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
+import static java.lang.String.CASE_INSENSITIVE_ORDER;
 
 public class PluginWSCommons {
   static final String PROPERTY_KEY = "key";
@@ -58,6 +60,11 @@ public class PluginWSCommons {
   public static final Ordering<PluginMetadata> NAME_KEY_PLUGIN_METADATA_COMPARATOR = Ordering.natural()
     .onResultOf(PluginMetadataToName.INSTANCE)
     .compound(Ordering.natural().onResultOf(PluginMetadataToKey.INSTANCE));
+  public static final Comparator<PluginUpdate> NAME_KEY_PLUGIN_UPDATE_ORDERING = Ordering.from(CASE_INSENSITIVE_ORDER)
+    .onResultOf(PluginUpdateToName.INSTANCE)
+    .compound(
+      Ordering.from(CASE_INSENSITIVE_ORDER).onResultOf(PluginUpdateToKey.INSTANCE)
+    );
 
   public void writePluginMetadata(JsonWriter jsonWriter, PluginMetadata pluginMetadata) {
     jsonWriter.beginObject();
@@ -200,4 +207,28 @@ public class PluginWSCommons {
       return input.getKey();
     }
   }
+
+  private enum PluginUpdateToKey implements Function<PluginUpdate, String> {
+    INSTANCE;
+
+    @Override
+    public String apply(@Nullable PluginUpdate input) {
+      if (input == null) {
+        return null;
+      }
+      return input.getPlugin().getKey();
+    }
+  }
+
+  private enum PluginUpdateToName implements Function<PluginUpdate, String> {
+    INSTANCE;
+
+    @Override
+    public String apply(@Nullable PluginUpdate input) {
+      if (input == null) {
+        return null;
+      }
+      return input.getPlugin().getName();
+    }
+  }
 }
index 9a9362f2dafcfca1dd106e801fab66a171dbac66..22af90dc79f42c1566f16f19270ad88da672b4be 100644 (file)
@@ -19,9 +19,7 @@
  */
 package org.sonar.server.plugins.ws;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Ordering;
 import com.google.common.io.Resources;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -30,11 +28,9 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.server.plugins.UpdateCenterMatrixFactory;
 import org.sonar.updatecenter.common.PluginUpdate;
 
-import javax.annotation.Nullable;
 import java.util.Collection;
-import java.util.Comparator;
 
-import static java.lang.String.CASE_INSENSITIVE_ORDER;
+import static org.sonar.server.plugins.ws.PluginWSCommons.NAME_KEY_PLUGIN_UPDATE_ORDERING;
 
 /**
  * Implementation of the {@code updates} action for the Plugins WebService.
@@ -43,11 +39,6 @@ public class UpdatesPluginsWsAction implements PluginsWsAction {
 
   private static final boolean DO_NOT_FORCE_REFRESH = false;
   private static final String ARRAY_PLUGINS = "plugins";
-  private static final Comparator<PluginUpdate> NAME_KEY_PLUGIN_UPDATE_ORDERING = Ordering.from(CASE_INSENSITIVE_ORDER)
-    .onResultOf(PluginUpdateToName.INSTANCE)
-    .compound(
-      Ordering.from(CASE_INSENSITIVE_ORDER).onResultOf(PluginUpdateToKey.INSTANCE)
-    );
 
   private final UpdateCenterMatrixFactory updateCenterMatrixFactory;
   private final PluginWSCommons pluginWSCommons;
@@ -97,28 +88,4 @@ public class UpdatesPluginsWsAction implements PluginsWsAction {
       updateCenterMatrixFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH).findPluginUpdates()
       );
   }
-
-  private enum PluginUpdateToKey implements Function<PluginUpdate, String> {
-    INSTANCE;
-
-    @Override
-    public String apply(@Nullable PluginUpdate input) {
-      if (input == null) {
-        return null;
-      }
-      return input.getPlugin().getKey();
-    }
-  }
-
-  private enum PluginUpdateToName implements Function<PluginUpdate, String> {
-    INSTANCE;
-
-    @Override
-    public String apply(@Nullable PluginUpdate input) {
-      if (input == null) {
-        return null;
-      }
-      return input.getPlugin().getName();
-    }
-  }
 }
index 204a15c9aa26eeca1753c1a842ac20dca1972280..94042b738570eab458f6b718e67e06dbf0c5e67c 100644 (file)
@@ -28,12 +28,14 @@ import org.sonar.updatecenter.common.Plugin;
 import org.sonar.updatecenter.common.PluginUpdate;
 import org.sonar.updatecenter.common.Release;
 import org.sonar.updatecenter.common.UpdateCenter;
+import org.sonar.updatecenter.common.Version;
 
 import java.net.URL;
 
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.sonar.updatecenter.common.PluginUpdate.Status.COMPATIBLE;
 import static org.sonar.updatecenter.common.Version.create;
 
 public class AbstractUpdateCenterBasedPluginsWsActionTest {
@@ -77,6 +79,13 @@ public class AbstractUpdateCenterBasedPluginsWsActionTest {
     return clazz.getResource(clazz.getSimpleName() + "/" + s);
   }
 
+  protected static PluginUpdate pluginUpdate(String key, String name) {
+    return PluginUpdate.createWithStatus(
+        new Release(new Plugin(key).setName(name), Version.create("1.0")),
+        COMPATIBLE
+    );
+  }
+
   @Before
   public void wireMocksTogether() throws Exception {
     when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(updateCenter);
index fcf1389e1cc223036b9e476acc57d628264238a6..9cee636646151a9ce4f30d4b39afbab41a5a2f38 100644 (file)
  */
 package org.sonar.server.plugins.ws;
 
+import org.junit.Test;
+import org.sonar.api.server.ws.WebService;
+import org.sonar.server.ws.WsTester;
+import org.sonar.updatecenter.common.Plugin;
+import org.sonar.updatecenter.common.PluginUpdate;
+import org.sonar.updatecenter.common.Release;
+import org.sonar.updatecenter.common.Version;
+
 import static com.google.common.collect.ImmutableList.of;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.when;
@@ -28,11 +36,6 @@ import static org.sonar.updatecenter.common.PluginUpdate.Status.DEPENDENCIES_REQ
 import static org.sonar.updatecenter.common.PluginUpdate.Status.INCOMPATIBLE;
 import static org.sonar.updatecenter.common.PluginUpdate.Status.REQUIRE_SONAR_UPGRADE;
 
-import org.junit.Test;
-import org.sonar.api.server.ws.WebService;
-import org.sonar.server.ws.WsTester;
-import org.sonar.updatecenter.common.PluginUpdate;
-
 public class AvailablePluginsWsActionTest extends AbstractUpdateCenterBasedPluginsWsActionTest {
 
   private AvailablePluginsWsAction underTest = new AvailablePluginsWsAction(updateCenterFactory, new PluginWSCommons());
@@ -100,16 +103,26 @@ public class AvailablePluginsWsActionTest extends AbstractUpdateCenterBasedPlugi
     underTest.handle(request, response);
 
     assertJson(response.outputAsString()).isSimilarTo(
-      "{" +
-        "  \"plugins\": [" +
-        "    {" +
-        "      \"update\": {" +
-        "        \"status\": \"" + expectedValue + "\"" +
-        "      }" +
-        "    }" +
-        "  ]" +
-        "}"
-      );
+        "{" +
+            "  \"plugins\": [" +
+            "    {" +
+            "      \"update\": {" +
+            "        \"status\": \"" + expectedValue + "\"" +
+            "      }" +
+            "    }" +
+            "  ]" +
+            "}"
+    );
   }
 
+  @Test
+  public void plugins_are_sorted_by_name_then_key_and_made_unique() throws Exception {
+    when(updateCenter.findAvailablePlugins()).thenReturn(of(
+        pluginUpdate("key2", "name2"),
+        pluginUpdate("key1", "name2"),
+        pluginUpdate("key2", "name2"),
+        pluginUpdate("key0", "name0"),
+        pluginUpdate("key1", "name1")
+    ));
+  }
 }
index 81f0e8602321b2616f4652693ae7d76e6c32f29e..a5baa19f4a75ccec47465917aec2dcc3cf5c4d42 100644 (file)
@@ -22,10 +22,6 @@ package org.sonar.server.plugins.ws;
 import org.junit.Test;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.server.ws.WsTester;
-import org.sonar.updatecenter.common.Plugin;
-import org.sonar.updatecenter.common.PluginUpdate;
-import org.sonar.updatecenter.common.Release;
-import org.sonar.updatecenter.common.Version;
 
 import static com.google.common.collect.ImmutableList.of;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -128,11 +124,4 @@ public class UpdatesPluginsWsActionTest extends AbstractUpdateCenterBasedPlugins
         "}"
       );
   }
-
-  private static PluginUpdate pluginUpdate(String key, String name) {
-    return PluginUpdate.createWithStatus(
-      new Release(new Plugin(key).setName(name), Version.create("1.0")),
-      COMPATIBLE
-      );
-  }
 }