diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/Category.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/Category.java new file mode 100644 index 0000000000..57dbed6399 --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/Category.java @@ -0,0 +1,128 @@ +/** + * 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; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Arrays; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * + * @author Sebastian Sdorra + */ +public class Category +{ + + /** + * Constructs ... + * + * + * @param name + * @param plugins + */ + public Category(String name, PluginInformation... plugins) + { + this.name = name; + this.plugins = + new TreeSet(PluginInformationNameComparator.INSTANCE); + + if (plugins != null) + { + this.plugins.addAll(Arrays.asList(plugins)); + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public String getName() + { + return name; + } + + /** + * Method description + * + * + * @return + */ + public SortedSet getPlugins() + { + if (plugins == null) + { + plugins = new TreeSet(); + } + + return plugins; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param name + */ + public void setName(String name) + { + this.name = name; + } + + /** + * Method description + * + * + * @param plugins + */ + public void setPlugins(SortedSet plugins) + { + this.plugins = plugins; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private String name; + + /** Field description */ + private SortedSet plugins; +} diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/CategoryNameComaparator.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/CategoryNameComaparator.java new file mode 100644 index 0000000000..26f560e41a --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/CategoryNameComaparator.java @@ -0,0 +1,71 @@ +/** + * 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 + */ +public class CategoryNameComaparator implements Comparator +{ + + /** Field description */ + public static final CategoryNameComaparator INSTANCE = + new CategoryNameComaparator(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param c1 + * @param c2 + * + * @return + */ + @Override + public int compare(Category c1, Category c2) + { + return Util.compare(c1.getName(), c2.getName()); + } +} diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/OverviewResource.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/OverviewResource.java index 170d9a6fb9..78e5f07870 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/OverviewResource.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/OverviewResource.java @@ -37,9 +37,11 @@ package sonia.scm.plugin.rest; import com.google.inject.Inject; +import sonia.scm.plugin.Category; +import sonia.scm.plugin.CategoryNameComaparator; import sonia.scm.plugin.PluginBackend; import sonia.scm.plugin.PluginInformation; -import sonia.scm.plugin.PluginInformationNameComparator; +import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ @@ -47,6 +49,7 @@ import com.sun.jersey.api.view.Viewable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -63,6 +66,11 @@ import javax.ws.rs.Path; public class OverviewResource extends ViewableResource { + /** Field description */ + public static final String DEFAULT_CATEGORY = "Miscellaneous"; + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * @@ -89,14 +97,42 @@ public class OverviewResource extends ViewableResource @GET public Viewable overview() { - List plugins = getPluginOverview(); + List categories = getPluginOverview(); Map vars = createVarMap("Plugin Overview"); - vars.put("plugins", plugins); + vars.put("categories", categories); return new Viewable("/index", vars); } + /** + * Method description + * + * + * @param categories + * @param plugin + */ + private void append(Map categories, + PluginInformation plugin) + { + String name = plugin.getCategory(); + + if (Util.isEmpty(name)) + { + name = DEFAULT_CATEGORY; + } + + Category category = categories.get(name); + + if (category == null) + { + category = new Category(name, plugin); + categories.put(name, category); + } + + category.getPlugins().add(plugin); + } + //~--- get methods ---------------------------------------------------------- /** @@ -105,14 +141,14 @@ public class OverviewResource extends ViewableResource * * @return */ - private List getPluginOverview() + private List getPluginOverview() { List allPlugins = backend.getPlugins(); Collections.sort(allPlugins, PluginInformationComparator.INSTANCE); - List plugins = new ArrayList(); String pid = ""; + Map categoryMap = new HashMap(); for (PluginInformation p : allPlugins) { @@ -121,13 +157,15 @@ public class OverviewResource extends ViewableResource if (!currentPid.equals(pid)) { pid = currentPid; - plugins.add(p); + append(categoryMap, p); } } - Collections.sort(plugins, PluginInformationNameComparator.INSTANCE); + List categories = new ArrayList(categoryMap.values()); - return plugins; + Collections.sort(categories, CategoryNameComaparator.INSTANCE); + + return categories; } //~--- fields --------------------------------------------------------------- diff --git a/scm-plugin-backend/src/main/webapp/index.html b/scm-plugin-backend/src/main/webapp/index.html index b4747f7ab9..1211979cff 100644 --- a/scm-plugin-backend/src/main/webapp/index.html +++ b/scm-plugin-backend/src/main/webapp/index.html @@ -1,18 +1,23 @@ <#include "template/header.html"> -
-<#list plugins as plugin> -

${plugin.name}

-
- ${plugin.description}
- more +
+<#list categories as category> +

${category.name}

+
+ <#list category.plugins as plugin> +

${plugin.name}

+
+ ${plugin.description}
+ more +
+