package com.atlassian.labs.speakeasy.model; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.TreeSet; import static com.google.common.collect.Lists.newArrayList; /** * */ @XmlRootElement public class UserPlugins { private List<String> updated = new ArrayList<String>(); private final Collection<UserExtension> plugins = new ArrayList<UserExtension>(); public UserPlugins() { } public UserPlugins(Iterable<UserExtension> plugins) { setPlugins(newArrayList(plugins)); } @XmlElement public Collection<UserExtension> getPlugins() { return plugins; } public void setPlugins(Collection<UserExtension> allPlugins) { this.plugins.clear(); List<UserExtension> plugins = newArrayList(allPlugins); SortedSetMultimap<String,UserExtension> pluginTrees = TreeMultimap.create(); TreeSet<UserExtension> roots = new TreeSet<UserExtension>(); HashMap<String, UserExtension> rootsByKey = new HashMap<String,UserExtension>(); for (UserExtension plugin : plugins) { if (!plugin.isFork()) { roots.add(plugin); rootsByKey.put(plugin.getKey(), plugin); } else { pluginTrees.get(plugin.getForkedPluginKey()).add(plugin); } } for (UserExtension root : roots) { this.plugins.add(root); this.plugins.addAll(pluginTrees.get(root.getKey())); plugins.remove(root); plugins.removeAll(pluginTrees.get(root.getKey())); } this.plugins.addAll(plugins); } public void setUpdated(Collection<String> pluginKeys) { updated.clear(); updated.addAll(pluginKeys); } @XmlElement public Collection<String> getUpdated() { return updated; } }