Show updatable plugins

This commit is contained in:
Rene Pfeuffer
2019-09-11 14:51:38 +02:00
parent df78c90510
commit 202a638a0f
9 changed files with 277 additions and 51 deletions

View File

@@ -3,8 +3,8 @@ package sonia.scm.api.v2.resources;
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.AvailablePlugin;
import sonia.scm.plugin.InstalledPlugin;
import sonia.scm.plugin.InstalledPluginDescriptor;
import sonia.scm.plugin.PluginManager;
import sonia.scm.plugin.PluginPermissions;
import sonia.scm.web.VndMediaType;
@@ -50,7 +50,8 @@ public class InstalledPluginResource {
public Response getInstalledPlugins() {
PluginPermissions.read().check();
List<InstalledPlugin> plugins = pluginManager.getInstalled();
return Response.ok(collectionMapper.mapInstalled(plugins)).build();
List<AvailablePlugin> available = pluginManager.getAvailable();
return Response.ok(collectionMapper.mapInstalled(plugins, available)).build();
}
/**
@@ -72,8 +73,9 @@ public class InstalledPluginResource {
public Response getInstalledPlugin(@PathParam("name") String name) {
PluginPermissions.read().check();
Optional<InstalledPlugin> pluginDto = pluginManager.getInstalled(name);
List<AvailablePlugin> available = pluginManager.getAvailable();
if (pluginDto.isPresent()) {
return Response.ok(mapper.mapInstalled(pluginDto.get())).build();
return Response.ok(mapper.mapInstalled(pluginDto.get(), available)).build();
} else {
throw notFound(entity("Plugin", name));
}

View File

@@ -1,5 +1,6 @@
package sonia.scm.api.v2.resources;
import com.fasterxml.jackson.annotation.JsonInclude;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import lombok.Getter;
@@ -16,6 +17,8 @@ public class PluginDto extends HalRepresentation {
private String name;
private String version;
@JsonInclude(JsonInclude.Include.NON_NULL)
private String newVersion;
private String displayName;
private String description;
private String author;

View File

@@ -26,8 +26,11 @@ public class PluginDtoCollectionMapper {
this.mapper = mapper;
}
public HalRepresentation mapInstalled(List<InstalledPlugin> plugins) {
List<PluginDto> dtos = plugins.stream().map(mapper::mapInstalled).collect(toList());
public HalRepresentation mapInstalled(List<InstalledPlugin> plugins, List<AvailablePlugin> availablePlugins) {
List<PluginDto> dtos = plugins
.stream()
.map(i -> mapper.mapInstalled(i, availablePlugins))
.collect(toList());
return new HalRepresentation(createInstalledPluginsLinks(), embedDtos(dtos));
}

View File

@@ -11,6 +11,9 @@ import sonia.scm.plugin.PluginPermissions;
import javax.inject.Inject;
import java.util.List;
import java.util.Optional;
import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo;
@@ -22,8 +25,8 @@ public abstract class PluginDtoMapper {
public abstract void map(PluginInformation plugin, @MappingTarget PluginDto dto);
public PluginDto mapInstalled(InstalledPlugin plugin) {
PluginDto dto = createDtoForInstalled(plugin);
public PluginDto mapInstalled(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
PluginDto dto = createDtoForInstalled(plugin, availablePlugins);
map(dto, plugin);
return dto;
}
@@ -57,13 +60,33 @@ public abstract class PluginDtoMapper {
return new PluginDto(links.build());
}
private PluginDto createDtoForInstalled(InstalledPlugin plugin) {
private PluginDto createDtoForInstalled(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
PluginInformation information = plugin.getDescriptor().getInformation();
Optional<AvailablePlugin> availablePlugin = checkForUpdates(plugin, availablePlugins);
Links.Builder links = linkingTo()
.self(resourceLinks.installedPlugin()
.self(information.getName()));
if (availablePlugin.isPresent()
&& !availablePlugin.get().isPending()
&& PluginPermissions.manage().isPermitted()
) {
links.single(link("update", resourceLinks.availablePlugin().install(information.getName())));
}
return new PluginDto(links.build());
PluginDto dto = new PluginDto(links.build());
availablePlugin.ifPresent(value -> {
dto.setNewVersion(value.getDescriptor().getInformation().getVersion());
dto.setPending(value.isPending());
});
return dto;
}
private Optional<AvailablePlugin> checkForUpdates(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
return availablePlugins.stream()
.filter(a -> a.getDescriptor().getInformation().getName().equals(plugin.getDescriptor().getInformation().getName()))
.findAny();
}
}

View File

@@ -42,6 +42,7 @@ import org.slf4j.LoggerFactory;
import sonia.scm.NotFoundException;
import sonia.scm.event.ScmEventBus;
import sonia.scm.lifecycle.RestartEvent;
import sonia.scm.version.Version;
//~--- JDK imports ------------------------------------------------------------
import javax.inject.Inject;
@@ -83,7 +84,7 @@ public class DefaultPluginManager implements PluginManager {
return center.getAvailable()
.stream()
.filter(filterByName(name))
.filter(this::isNotInstalled)
.filter(this::isNotInstalledOrMoreUpToDate)
.map(p -> getPending(name).orElse(p))
.findFirst();
}
@@ -116,7 +117,7 @@ public class DefaultPluginManager implements PluginManager {
PluginPermissions.read().check();
return center.getAvailable()
.stream()
.filter(this::isNotInstalled)
.filter(this::isNotInstalledOrMoreUpToDate)
.map(p -> getPending(p.getDescriptor().getInformation().getName()).orElse(p))
.collect(Collectors.toList());
}
@@ -125,8 +126,14 @@ public class DefaultPluginManager implements PluginManager {
return plugin -> name.equals(plugin.getDescriptor().getInformation().getName());
}
private boolean isNotInstalled(AvailablePlugin availablePlugin) {
return !getInstalled(availablePlugin.getDescriptor().getInformation().getName()).isPresent();
private boolean isNotInstalledOrMoreUpToDate(AvailablePlugin availablePlugin) {
return getInstalled(availablePlugin.getDescriptor().getInformation().getName())
.map(installedPlugin -> availableIsMoreUpToDateThanInstalled(availablePlugin, installedPlugin))
.orElse(true);
}
private boolean availableIsMoreUpToDateThanInstalled(AvailablePlugin availablePlugin, InstalledPlugin installed) {
return Version.parse(availablePlugin.getDescriptor().getInformation().getVersion()).isNewer(installed.getDescriptor().getInformation().getVersion());
}
@Override