*/
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;
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 {
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()
+ );
}
}
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";
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();
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();
+ }
+ }
}
*/
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;
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.
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;
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();
- }
- }
}
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 {
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);
*/
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;
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());
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")
+ ));
+ }
}
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;
"}"
);
}
-
- private static PluginUpdate pluginUpdate(String key, String name) {
- return PluginUpdate.createWithStatus(
- new Release(new Plugin(key).setName(name), Version.create("1.0")),
- COMPATIBLE
- );
- }
}