added compare link to plugin detail page

This commit is contained in:
Sebastian Sdorra
2011-12-04 14:19:53 +01:00
parent 40ecd879c8
commit ab78f5f246
4 changed files with 294 additions and 3 deletions

View File

@@ -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<PluginInformation>
{
/** 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;
}
}

View File

@@ -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<PluginDetailWrapper> detailList = createDetailList(latest,
pluginVersions);
Map<String, Object> 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<PluginDetailWrapper> createDetailList(PluginInformation latest,
List<PluginInformation> pluginVersions)
{
List<PluginDetailWrapper> detailList = new ArrayList<PluginDetailWrapper>();
Collections.sort(pluginVersions,
PluginInformationVersionComparator.INSTANCE);
Iterator<PluginInformation> 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;
}

View File

@@ -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;
}

View File

@@ -85,7 +85,8 @@
<div id="accordion">
<#if versions?has_content>
<#list versions as version>
<#list versions as versionWrapper>
<#assign version=versionWrapper.plugin>
<h3><a href="#">${version.version}</a></h3>
<div>
<p>${version.description}</p>
@@ -108,6 +109,11 @@
</#if>
</ul>
</#if>
<#if versionWrapper.compareUrl??>
<a href="${versionWrapper.compareUrl}" target="_blank" style="color: #1C94C4;">
compare
</a>
</#if>
</div>
</#list>
<#else>