parse pluginBackendResponse to pluginCenterDto / add Endpoint / remove groupId + artefactId from plugins

This commit is contained in:
Eduard Heimbuch
2019-07-26 13:04:54 +02:00
parent 1ea2bdfedf
commit 27dc47a590
15 changed files with 217 additions and 157 deletions

View File

@@ -4,6 +4,7 @@ import com.google.inject.Inject;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import sonia.scm.plugin.PluginInformation;
import sonia.scm.plugin.PluginWrapper;
import java.util.Collection;
@@ -24,7 +25,12 @@ public class PluginDtoCollectionMapper {
this.mapper = mapper;
}
public HalRepresentation map(Collection<PluginWrapper> plugins) {
public HalRepresentation map(List<PluginWrapper> plugins) {
List<PluginDto> dtos = plugins.stream().map(mapper::map).collect(toList());
return new HalRepresentation(createLinks(), embedDtos(dtos));
}
public HalRepresentation map(Collection<PluginInformation> plugins) {
List<PluginDto> dtos = plugins.stream().map(mapper::map).collect(toList());
return new HalRepresentation(createLinks(), embedDtos(dtos));
}

View File

@@ -1,6 +1,7 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Links;
import sonia.scm.plugin.PluginInformation;
import sonia.scm.plugin.PluginWrapper;
import javax.inject.Inject;
@@ -16,16 +17,20 @@ public class PluginDtoMapper {
}
public PluginDto map(PluginWrapper plugin) {
return map(plugin.getPlugin().getInformation());
}
public PluginDto map(PluginInformation pluginInformation) {
Links.Builder linksBuilder = linkingTo()
.self(resourceLinks.plugin()
.self(plugin.getPlugin().getInformation().getId(false)));
.self(pluginInformation.getName()));
PluginDto pluginDto = new PluginDto(linksBuilder.build());
pluginDto.setName(plugin.getPlugin().getInformation().getName());
pluginDto.setType(plugin.getPlugin().getInformation().getCategory() != null ? plugin.getPlugin().getInformation().getCategory() : "Miscellaneous");
pluginDto.setVersion(plugin.getPlugin().getInformation().getVersion());
pluginDto.setAuthor(plugin.getPlugin().getInformation().getAuthor());
pluginDto.setDescription(plugin.getPlugin().getInformation().getDescription());
pluginDto.setName(pluginInformation.getName());
pluginDto.setCategory(pluginInformation.getCategory() != null ? pluginInformation.getCategory() : "Miscellaneous");
pluginDto.setVersion(pluginInformation.getVersion());
pluginDto.setAuthor(pluginInformation.getAuthor());
pluginDto.setDescription(pluginInformation.getDescription());
return pluginDto;
}

View File

@@ -4,7 +4,10 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode;
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
import com.webcohesion.enunciate.metadata.rs.TypeHint;
import sonia.scm.plugin.Plugin;
import sonia.scm.plugin.PluginCenter;
import sonia.scm.plugin.PluginInformation;
import sonia.scm.plugin.PluginLoader;
import sonia.scm.plugin.PluginManager;
import sonia.scm.plugin.PluginPermissions;
import sonia.scm.plugin.PluginWrapper;
import sonia.scm.web.VndMediaType;
@@ -16,6 +19,7 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
@@ -27,12 +31,14 @@ public class PluginResource {
private final PluginLoader pluginLoader;
private final PluginDtoCollectionMapper collectionMapper;
private final PluginDtoMapper mapper;
private final PluginManager pluginManager;
@Inject
public PluginResource(PluginLoader pluginLoader, PluginDtoCollectionMapper collectionMapper, PluginDtoMapper mapper) {
public PluginResource(PluginLoader pluginLoader, PluginDtoCollectionMapper collectionMapper, PluginDtoMapper mapper, PluginCenter pluginCenter1, PluginManager pluginManager) {
this.pluginLoader = pluginLoader;
this.collectionMapper = collectionMapper;
this.mapper = mapper;
this.pluginManager = pluginManager;
}
/**
@@ -74,7 +80,7 @@ public class PluginResource {
PluginPermissions.read().check();
Optional<PluginDto> pluginDto = pluginLoader.getInstalledPlugins()
.stream()
.filter(plugin -> id.equals(plugin.getPlugin().getInformation().getId(false)))
.filter(plugin -> id.equals(plugin.getPlugin().getInformation().getName(false)))
.map(mapper::map)
.findFirst();
if (pluginDto.isPresent()) {
@@ -84,4 +90,23 @@ public class PluginResource {
}
}
/**
* Returns a collection of available plugins.
*
* @return collection of available plugins.
*/
@GET
@Path("/available")
@StatusCodes({
@ResponseCode(code = 200, condition = "success"),
@ResponseCode(code = 500, condition = "internal server error")
})
@TypeHint(CollectionDto.class)
@Produces(VndMediaType.PLUGIN_COLLECTION)
public Response getAvailablePlugins() {
PluginPermissions.read().check();
Collection<PluginInformation> plugins = pluginManager.getAvailable();
return Response.ok(collectionMapper.map(plugins)).build();
}
}

View File

@@ -67,10 +67,12 @@ import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -99,7 +101,7 @@ public class DefaultPluginManager implements PluginManager
LoggerFactory.getLogger(DefaultPluginManager.class);
/** enable or disable remote plugins */
private static final boolean REMOTE_PLUGINS_ENABLED = false;
private static final boolean REMOTE_PLUGINS_ENABLED = true;
/** Field description */
public static final Predicate<PluginInformation> FILTER_UPDATES =
@@ -309,14 +311,12 @@ public class DefaultPluginManager implements PluginManager
PluginPermissions.manage().check();
String[] idParts = id.split(":");
String groupId = idParts[0];
String artefactId = idParts[1];
String name = idParts[0];
PluginInformation installed = null;
for (PluginInformation info : getInstalled())
{
if (groupId.equals(info.getGroupId())
&& artefactId.equals(info.getArtifactId()))
if (name.equals(info.getName()))
{
installed = info;
@@ -326,9 +326,9 @@ public class DefaultPluginManager implements PluginManager
if (installed == null)
{
StringBuilder msg = new StringBuilder(groupId);
StringBuilder msg = new StringBuilder(name);
msg.append(":").append(groupId).append(" is not install");
msg.append(" is not install");
throw new PluginNotInstalledException(msg.toString());
}
@@ -423,7 +423,7 @@ public class DefaultPluginManager implements PluginManager
for (PluginInformation info : centerPlugins)
{
if (!installedPlugins.containsKey(info.getId()))
if (!installedPlugins.containsKey(info.getName()))
{
availablePlugins.add(info);
}
@@ -590,7 +590,7 @@ public class DefaultPluginManager implements PluginManager
*/
private PluginCenter getPluginCenter()
{
PluginCenter center = cache.get(PluginCenter.class.getName());
PluginCenter center = null; // cache.get(PluginCenter.class.getName());
if (center == null)
{
@@ -605,15 +605,13 @@ public class DefaultPluginManager implements PluginManager
logger.info("fetch plugin informations from {}", pluginUrl);
}
/**
* remote plugins are disabled for early 2.0.0-SNAPSHOTS
* TODO enable remote plugins later
*/
if (REMOTE_PLUGINS_ENABLED && Util.isNotEmpty(pluginUrl))
{
try
{
center = httpClient.get(pluginUrl).request().contentFromXml(PluginCenter.class);
center = new PluginCenter();
PluginCenterDto pluginCenterDto = httpClient.get(pluginUrl).request().contentFromJson(PluginCenterDto.class);
center.setPlugins(mapPluginsFromPluginCenter(pluginCenterDto.getEmbedded().getPlugins()));
preparePlugins(center);
cache.put(PluginCenter.class.getName(), center);
@@ -633,17 +631,35 @@ public class DefaultPluginManager implements PluginManager
logger.error("could not load plugins from plugin center", ex);
}
}
if (center == null)
{
center = new PluginCenter();
}
}
}
return center;
}
private Set<PluginInformation> mapPluginsFromPluginCenter(List<PluginCenterDto.Plugin> plugins) {
HashSet<PluginInformation> pluginInformationSet = new HashSet<>();
for (PluginCenterDto.Plugin plugin : plugins) {
PluginInformation pluginInformation = new PluginInformation();
pluginInformation.setName(plugin.getName());
pluginInformation.setAuthor(plugin.getAuthor());
pluginInformation.setCategory(plugin.getCategory());
pluginInformation.setVersion(plugin.getVersion());
pluginInformation.setDescription(plugin.getDescription());
pluginInformation.setUrl(plugin.getLinks().getDownload());
if (plugin.getConditions() != null) {
PluginCenterDto.Condition condition = plugin.getConditions();
pluginInformation.setCondition(new PluginCondition(condition.getMinVersion(), Collections.singletonList(condition.getOs()), condition.getArch()));
}
pluginInformationSet.add(pluginInformation);
}
return pluginInformationSet;
}
/**
* Method description
*
@@ -719,8 +735,7 @@ public class DefaultPluginManager implements PluginManager
*/
private boolean isSamePlugin(PluginInformation p1, PluginInformation p2)
{
return p1.getGroupId().equals(p2.getGroupId())
&& p1.getArtifactId().equals(p2.getArtifactId());
return p1.getName().equals(p2.getName());
}
//~--- fields ---------------------------------------------------------------

View File

@@ -115,8 +115,8 @@ public final class ExplodedSmp implements Comparable<ExplodedSmp>
}
else
{
String id = plugin.getInformation().getId(false);
String oid = o.plugin.getInformation().getId(false);
String id = plugin.getInformation().getName(false);
String oid = o.plugin.getInformation().getName(false);
if (depends.contains(oid) && odepends.contains(id))
{

View File

@@ -0,0 +1,87 @@
package sonia.scm.plugin;
import com.google.common.collect.ImmutableList;
import lombok.Getter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public final class PluginCenterDto implements Serializable {
@XmlElement(name = "_embedded")
private Embedded embedded;
public Embedded getEmbedded() {
return embedded;
}
@XmlRootElement(name = "_embedded")
@XmlAccessorType(XmlAccessType.FIELD)
static class Embedded {
@XmlElement(name = "plugins")
private List<Plugin> plugins;
public List<Plugin> getPlugins() {
if (plugins == null) {
plugins = ImmutableList.of();
}
return plugins;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "plugins")
@Getter
static class Plugin {
private String name;
private String displayName;
private String description;
private String category;
private String version;
private String author;
private String sha256;
@XmlElement(name = "conditions")
private Condition conditions;
@XmlElement(name = "dependecies")
private Dependency dependencies;
@XmlElement(name = "_links")
private Links links;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "conditions")
@Getter
static class Condition {
private String os;
private String arch;
private String minVersion;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "dependencies")
@Getter
static class Dependency {
private String name;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "_links")
@Getter
static class Links {
private String download;
}
}

View File

@@ -0,0 +1,5 @@
package sonia.scm.plugin;
public class PluginCenterDtoMapper {
}

View File

@@ -126,7 +126,7 @@ public final class PluginNode
*/
public String getId()
{
return plugin.getPlugin().getInformation().getId(false);
return plugin.getPlugin().getInformation().getName(false);
}
/**

View File

@@ -377,7 +377,7 @@ public final class PluginProcessor
URL[] urlArray = urls.toArray(new URL[urls.size()]);
Plugin plugin = smp.getPlugin();
String id = plugin.getInformation().getId(false);
String id = plugin.getInformation().getName(false);
if (smp.getPlugin().isChildFirstClassLoader())
{

View File

@@ -109,7 +109,7 @@ public final class PluginsInternal
{
PluginInformation info = plugin.getInformation();
return new File(new File(parent, info.getGroupId()), info.getArtifactId());
return new File(parent, info.getName());
}
/**
@@ -131,14 +131,14 @@ public final class PluginsInternal
if (directory.exists())
{
logger.debug("delete directory {} for plugin extraction",
archive.getPlugin().getInformation().getId(false));
archive.getPlugin().getInformation().getName(false));
IOUtil.delete(directory);
}
IOUtil.mkdirs(directory);
logger.debug("extract plugin {}",
archive.getPlugin().getInformation().getId(false));
archive.getPlugin().getInformation().getName(false));
archive.extract(directory);
Files.write(checksum, checksumFile, Charsets.UTF_8);