diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginInformationVersionComparator.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginInformationVersionComparator.java new file mode 100644 index 0000000000..5d3c4b0506 --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/PluginInformationVersionComparator.java @@ -0,0 +1,97 @@ +/** + * 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 PluginInformationVersionComparator + implements Comparator +{ + + /** Field description */ + public static final PluginInformationVersionComparator INSTANCE = + new PluginInformationVersionComparator(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param p1 + * @param p2 + * + * @return + */ + @Override + public int compare(PluginInformation p1, PluginInformation p2) + { + int result = 0; + String v1 = p1.getVersion(); + String v2 = p2.getVersion(); + + if (Util.isNotEmpty(v1) && Util.isNotEmpty(v2)) + { + if (PluginVersion.createVersion(v1).isNewer( + PluginVersion.createVersion(v2))) + { + result = -1; + } + else + { + result = 1; + } + } + else if (Util.isEmpty(v1) && Util.isNotEmpty(v2)) + { + result = 1; + } + else if (Util.isNotEmpty(v1) && Util.isEmpty(v2)) + { + result = -1; + } + + return result; + } +} diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/DetailResource.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/DetailResource.java index 3541d66813..f5c7fc89ee 100644 --- a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/DetailResource.java +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/DetailResource.java @@ -40,14 +40,21 @@ import com.google.inject.Inject; import sonia.scm.plugin.BackendConfiguration; import sonia.scm.plugin.PluginBackend; import sonia.scm.plugin.PluginInformation; +import sonia.scm.plugin.PluginInformationVersionComparator; import sonia.scm.plugin.PluginUtil; +import sonia.scm.plugin.rest.url.CompareUrlBuilder; +import sonia.scm.plugin.rest.url.CompareUrlBuilderFactory; import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ import com.sun.jersey.api.view.Viewable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Map; import javax.servlet.ServletContext; @@ -76,13 +83,16 @@ public class DetailResource extends ViewableResource * @param context * @param backend * @param configuration + * @param urlFactory */ @Inject public DetailResource(ServletContext context, PluginBackend backend, - BackendConfiguration configuration) + BackendConfiguration configuration, + CompareUrlBuilderFactory urlFactory) { super(context, configuration); this.backend = backend; + this.urlFactory = urlFactory; } //~--- get methods ---------------------------------------------------------- @@ -118,16 +128,68 @@ public class DetailResource extends ViewableResource pluginVersions = PluginUtil.filterSnapshots(pluginVersions); } + List detailList = createDetailList(latest, + pluginVersions); Map vars = createVarMap(latest.getName()); vars.put("latest", latest); - vars.put("versions", pluginVersions); + vars.put("versions", detailList); return new Viewable("/detail", vars); } + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param latest + * @param pluginVersions + * + * @return + */ + private List createDetailList(PluginInformation latest, + List pluginVersions) + { + List detailList = new ArrayList(); + + Collections.sort(pluginVersions, + PluginInformationVersionComparator.INSTANCE); + + Iterator pluginIterator = pluginVersions.iterator(); + CompareUrlBuilder urlBuilder = urlFactory.createCompareUrlBuilder(latest); + PluginInformation last = null; + + while (pluginIterator.hasNext()) + { + PluginInformation current = pluginIterator.next(); + + if (last != null) + { + String url = null; + + if (urlBuilder != null) + { + url = urlBuilder.createCompareUrl(latest, last, current); + } + + detailList.add(new PluginDetailWrapper(last, url)); + } + + last = current; + } + + detailList.add(new PluginDetailWrapper(last)); + + return detailList; + } + //~--- fields --------------------------------------------------------------- /** Field description */ private PluginBackend backend; + + /** Field description */ + private CompareUrlBuilderFactory urlFactory; } diff --git a/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginDetailWrapper.java b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginDetailWrapper.java new file mode 100644 index 0000000000..324c741bf6 --- /dev/null +++ b/scm-plugin-backend/src/main/java/sonia/scm/plugin/rest/PluginDetailWrapper.java @@ -0,0 +1,126 @@ +/** + * 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.rest; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.plugin.PluginInformation; + +/** + * + * @author Sebastian Sdorra + */ +public class PluginDetailWrapper +{ + + /** + * Constructs ... + * + * + * @param plugin + */ + public PluginDetailWrapper(PluginInformation plugin) + { + this.plugin = plugin; + } + + /** + * Constructs ... + * + * + * @param plugin + * @param compareUrl + */ + public PluginDetailWrapper(PluginInformation plugin, String compareUrl) + { + this.plugin = plugin; + this.compareUrl = compareUrl; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public String getCompareUrl() + { + return compareUrl; + } + + /** + * Method description + * + * + * @return + */ + public PluginInformation getPlugin() + { + return plugin; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param compareUrl + */ + public void setCompareUrl(String compareUrl) + { + this.compareUrl = compareUrl; + } + + /** + * Method description + * + * + * @param plugin + */ + public void setPlugin(PluginInformation plugin) + { + this.plugin = plugin; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private String compareUrl; + + /** Field description */ + private PluginInformation plugin; +} diff --git a/scm-plugin-backend/src/main/webapp/detail.html b/scm-plugin-backend/src/main/webapp/detail.html index ed6602aae0..841d574a79 100644 --- a/scm-plugin-backend/src/main/webapp/detail.html +++ b/scm-plugin-backend/src/main/webapp/detail.html @@ -85,7 +85,8 @@
<#if versions?has_content> - <#list versions as version> + <#list versions as versionWrapper> + <#assign version=versionWrapper.plugin>

${version.version}

${version.description}

@@ -108,6 +109,11 @@ + <#if versionWrapper.compareUrl??> + + compare + +
<#else>