diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java index 663fd81f9f..74cca02d92 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java @@ -46,7 +46,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; -import java.util.List; +import java.util.Map; //~--- JDK imports ------------------------------------------------------------ @@ -288,7 +288,7 @@ public class PluginInformation * * @return */ - public List getLinks() { + public Map getLinks() { return links; } @@ -391,7 +391,7 @@ public class PluginInformation * * @param links */ - public void setLinks(List links) { + public void setLinks(Map links) { this.links = links; } @@ -419,6 +419,6 @@ public class PluginInformation private String version; /** Field description */ - private List links; + private Map links; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java index 7b2108cd0e..4886138a6b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java @@ -5,6 +5,8 @@ import sonia.scm.plugin.PluginInformation; import sonia.scm.plugin.PluginWrapper; import javax.inject.Inject; +import java.util.Map; + import static de.otto.edison.hal.Links.linkingTo; public class PluginDtoMapper { @@ -25,6 +27,11 @@ public class PluginDtoMapper { .self(resourceLinks.plugin() .self(pluginInformation.getName())); + for (Object link : pluginInformation.getLinks().values()) { + System.out.println("Link is = " + link.toString()); + linksBuilder.item(((Map) link).values().iterator().next().toString()); + } + PluginDto pluginDto = new PluginDto(linksBuilder.build()); pluginDto.setName(pluginInformation.getName()); pluginDto.setCategory(pluginInformation.getCategory() != null ? pluginInformation.getCategory() : "Miscellaneous"); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginResource.java index 99c61191fa..be57e3f674 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginResource.java @@ -9,6 +9,7 @@ import sonia.scm.plugin.PluginInformation; import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.PluginManager; import sonia.scm.plugin.PluginPermissions; +import sonia.scm.plugin.PluginState; import sonia.scm.plugin.PluginWrapper; import sonia.scm.web.VndMediaType; @@ -22,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.NotFoundException.notFound; @@ -34,7 +36,7 @@ public class PluginResource { private final PluginManager pluginManager; @Inject - public PluginResource(PluginLoader pluginLoader, PluginDtoCollectionMapper collectionMapper, PluginDtoMapper mapper, PluginCenter pluginCenter1, PluginManager pluginManager) { + public PluginResource(PluginLoader pluginLoader, PluginDtoCollectionMapper collectionMapper, PluginDtoMapper mapper, PluginManager pluginManager) { this.pluginLoader = pluginLoader; this.collectionMapper = collectionMapper; this.mapper = mapper; @@ -105,7 +107,10 @@ public class PluginResource { @Produces(VndMediaType.PLUGIN_COLLECTION) public Response getAvailablePlugins() { PluginPermissions.read().check(); - Collection plugins = pluginManager.getAvailable(); + Collection plugins = pluginManager.getAvailable() + .stream() + .filter(plugin -> plugin.getState().equals(PluginState.AVAILABLE)) + .collect(Collectors.toList()); return Response.ok(collectionMapper.map(plugins)).build(); } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index a62916ed41..93e2e9aaa1 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -75,11 +75,14 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.xml.bind.JAXB; import sonia.scm.net.ahc.AdvancedHttpClient; +import static sonia.scm.plugin.PluginCenterDtoMapper.*; + /** * TODO replace aether stuff. * TODO check AdvancedPluginConfiguration from 1.x @@ -592,8 +595,8 @@ public class DefaultPluginManager implements PluginManager { PluginCenter center = null; // cache.get(PluginCenter.class.getName()); - if (center == null) - { +// if (center == null) +// { synchronized (DefaultPluginManager.class) { String pluginUrl = configuration.getPluginUrl(); @@ -611,7 +614,8 @@ public class DefaultPluginManager implements PluginManager { center = new PluginCenter(); PluginCenterDto pluginCenterDto = httpClient.get(pluginUrl).request().contentFromJson(PluginCenterDto.class); - center.setPlugins(mapPluginsFromPluginCenter(pluginCenterDto.getEmbedded().getPlugins())); + Set pluginInformationSet = map(pluginCenterDto.getEmbedded().getPlugins()); + center.setPlugins(pluginInformationSet); preparePlugins(center); cache.put(PluginCenter.class.getName(), center); @@ -632,33 +636,11 @@ public class DefaultPluginManager implements PluginManager } } } - } +// } return center; } - private Set mapPluginsFromPluginCenter(List plugins) { - HashSet 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()); - - 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 * diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDto.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDto.java index 468249157a..f15c646c03 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDto.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDto.java @@ -9,6 +9,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; import java.util.List; +import java.util.Map; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @@ -56,8 +57,7 @@ public final class PluginCenterDto implements Serializable { private Dependency dependencies; @XmlElement(name = "_links") - private Links links; - + private Map links; } @XmlAccessorType(XmlAccessType.FIELD) @@ -81,7 +81,14 @@ public final class PluginCenterDto implements Serializable { @XmlRootElement(name = "_links") @Getter static class Links { - private String download; + private Link link; + private boolean templated; + } + + @XmlAccessorType(XmlAccessType.FIELD) + @Getter + static class Link { + private String url; } } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDtoMapper.java index 77593fe56a..cca5da6520 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenterDtoMapper.java @@ -1,5 +1,35 @@ package sonia.scm.plugin; -public class PluginCenterDtoMapper { +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +public class PluginCenterDtoMapper { + + public static Set map(List plugins) { + HashSet 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()); + + if (plugin.getConditions() != null) { + PluginCenterDto.Condition condition = plugin.getConditions(); + pluginInformation.setCondition(new PluginCondition(condition.getMinVersion(), Collections.singletonList(condition.getOs()), condition.getArch())); + } + + if (plugin.getLinks() != null) { + pluginInformation.setLinks(plugin.getLinks()); + } + + pluginInformationSet.add(pluginInformation); + } + return pluginInformationSet; + } }