diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformationComparator.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformationComparator.java new file mode 100644 index 0000000000..cdb0777cae --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformationComparator.java @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Comparator; + +/** + * + * @author Sebastian Sdorra + * @since 1.6 + */ +public class PluginInformationComparator + implements Comparator +{ + + /** Field description */ + public static final PluginInformationComparator INSTANCE = + new PluginInformationComparator(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param plugin + * @param other + * + * @return + */ + @Override + public int compare(PluginInformation plugin, PluginInformation other) + { + int result = 0; + + result = Util.compare(plugin.getGroupId(), other.getGroupId()); + + if (result == 0) + { + result = Util.compare(plugin.getArtifactId(), other.getArtifactId()); + + if (result == 0) + { + result = plugin.getState().getCompareValue() + - other.getState().getCompareValue(); + } + } + + return result; + } +} diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginState.java b/scm-core/src/main/java/sonia/scm/plugin/PluginState.java index 566537e275..635b408b06 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginState.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginState.java @@ -39,5 +39,36 @@ package sonia.scm.plugin; */ public enum PluginState { - CORE, AVAILABLE, INSTALLED, NEWER_VERSION_INSTALLED, UPDATE_AVAILABLE; + CORE(100), AVAILABLE(60), INSTALLED(80), NEWER_VERSION_INSTALLED(20), + UPDATE_AVAILABLE(40); + + /** + * Constructs ... + * + * + * @param compareValue + */ + private PluginState(int compareValue) + { + this.compareValue = compareValue; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @since 1.6 + * @return + */ + public int getCompareValue() + { + return compareValue; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + int compareValue; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java index f021f1b057..d3ddc57116 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java @@ -41,10 +41,18 @@ import com.google.inject.Singleton; import sonia.scm.plugin.DefaultPluginManager; import sonia.scm.plugin.OverviewPluginFilter; import sonia.scm.plugin.PluginInformation; +import sonia.scm.plugin.PluginInformationComparator; +import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Set; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -196,7 +204,29 @@ public class PluginResource @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Collection getOverview() { - return pluginManager.get(OverviewPluginFilter.INSTANCE); + List plugins = new ArrayList( + pluginManager.get( + OverviewPluginFilter.INSTANCE)); + + Collections.sort(plugins, PluginInformationComparator.INSTANCE); + + Iterator it = plugins.iterator(); + String last = null; + + while (it.hasNext()) + { + PluginInformation pi = it.next(); + String id = pi.getGroupId().concat(":").concat(pi.getArtifactId()); + + if ((last != null) && id.equals(last)) + { + it.remove(); + } + + last = id; + } + + return plugins; } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 22730454aa..dceb70683d 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -307,12 +307,12 @@ public class DefaultPluginManager implements PluginManager Set infoSet = new HashSet(); - for (PluginInformation pi : getPluginCenter().getPlugins()) + for ( PluginInformation pi : getPluginCenter().getPlugins() ) { - System.out.println(pi.getArtifactId() + ": " + pi.getVersion() + ":" - + pi.getState()); + System.out.println( pi.getArtifactId() + ": " + pi.getVersion() + ":" + pi.getState() ); + } - + filter(infoSet, getInstalled(), filter); filter(infoSet, getPluginCenter().getPlugins(), filter);