From: Sébastien Lesaint Date: Mon, 20 Apr 2015 15:31:31 +0000 (+0200) Subject: SONAR-6377 available plugins WS should sort plugins explictly X-Git-Tag: 5.2-RC1~2145 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F237%2Fhead;p=sonarqube.git SONAR-6377 available plugins WS should sort plugins explictly --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/AvailablePluginsWsAction.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/AvailablePluginsWsAction.java index e16955a2b07..17e1eb7df4d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/AvailablePluginsWsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/AvailablePluginsWsAction.java @@ -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 retrieveAvailablePlugins() { - return updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH).findAvailablePlugins(); + private Collection retrieveAvailablePlugins() { + return ImmutableSortedSet.copyOf( + NAME_KEY_PLUGIN_UPDATE_ORDERING, + updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH).findAvailablePlugins() + ); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/PluginWSCommons.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/PluginWSCommons.java index 9bb852a5ac1..5924784a292 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/PluginWSCommons.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/PluginWSCommons.java @@ -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 NAME_KEY_PLUGIN_METADATA_COMPARATOR = Ordering.natural() .onResultOf(PluginMetadataToName.INSTANCE) .compound(Ordering.natural().onResultOf(PluginMetadataToKey.INSTANCE)); + public static final Comparator 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 { + INSTANCE; + + @Override + public String apply(@Nullable PluginUpdate input) { + if (input == null) { + return null; + } + return input.getPlugin().getKey(); + } + } + + private enum PluginUpdateToName implements Function { + INSTANCE; + + @Override + public String apply(@Nullable PluginUpdate input) { + if (input == null) { + return null; + } + return input.getPlugin().getName(); + } + } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatesPluginsWsAction.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatesPluginsWsAction.java index 9a9362f2daf..22af90dc79f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatesPluginsWsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ws/UpdatesPluginsWsAction.java @@ -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 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 { - INSTANCE; - - @Override - public String apply(@Nullable PluginUpdate input) { - if (input == null) { - return null; - } - return input.getPlugin().getKey(); - } - } - - private enum PluginUpdateToName implements Function { - INSTANCE; - - @Override - public String apply(@Nullable PluginUpdate input) { - if (input == null) { - return null; - } - return input.getPlugin().getName(); - } - } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AbstractUpdateCenterBasedPluginsWsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AbstractUpdateCenterBasedPluginsWsActionTest.java index 204a15c9aa2..94042b73857 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AbstractUpdateCenterBasedPluginsWsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AbstractUpdateCenterBasedPluginsWsActionTest.java @@ -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); diff --git a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AvailablePluginsWsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AvailablePluginsWsActionTest.java index fcf1389e1cc..9cee6366461 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AvailablePluginsWsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/AvailablePluginsWsActionTest.java @@ -19,6 +19,14 @@ */ 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") + )); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatesPluginsWsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatesPluginsWsActionTest.java index 81f0e860232..a5baa19f4a7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatesPluginsWsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/plugins/ws/UpdatesPluginsWsActionTest.java @@ -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 - ); - } }