package com.atlassian.labs.speakeasy.manager; import com.atlassian.labs.speakeasy.descriptor.external.DescriptorGenerator; import com.atlassian.labs.speakeasy.model.Extension; import com.atlassian.labs.speakeasy.model.UserExtension; import com.atlassian.plugin.ModuleDescriptor; import com.atlassian.plugin.Plugin; import com.atlassian.plugin.PluginAccessor; import com.google.common.base.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.transform; /** * */ @Component public class ExtensionManager { private final PluginAccessor pluginAccessor; private final ExtensionBuilder extensionBuilder; private static final Logger log = LoggerFactory.getLogger(ExtensionManager.class); @Autowired public ExtensionManager(ExtensionBuilder extensionBuilder, PluginAccessor pluginAccessor) { this.extensionBuilder = extensionBuilder; this.pluginAccessor = pluginAccessor; } public Extension getExtension(String pluginKey) { Plugin plugin = getPlugin(pluginKey); return extensionBuilder.build(plugin); } public UserExtension getUserExtension(String pluginKey, String user) { Plugin plugin = getPlugin(pluginKey); if (plugin == null) { return null; } else { return getUserExtension(plugin, user, getAllExtensionPlugins()); } } public Iterable<UserExtension> getAllUserExtensions(final String userName) { final List<Plugin> rawPlugins = getAllExtensionPlugins(); return transform(rawPlugins, new Function<Plugin, UserExtension>() { public UserExtension apply(Plugin from) { try { return getUserExtension(from, userName, rawPlugins); } catch (RuntimeException ex) { log.error("Unable to load plugin '" + from.getKey() + "'", ex); UserExtension plugin = new UserExtension(from); plugin.setDescription("Unable to load due to " + ex.getMessage()); return plugin; } } }); } private UserExtension getUserExtension(Plugin plugin, String user, Iterable<Plugin> plugins) { return extensionBuilder.build(plugin, user, plugins); } public List<Plugin> getAllExtensionPlugins() { // todo: cache this? List<Plugin> plugins = new ArrayList<Plugin>(); for (Plugin plugin : pluginAccessor.getPlugins()) { for (ModuleDescriptor moduleDescriptor : plugin.getModuleDescriptors()) { if (moduleDescriptor instanceof DescriptorGenerator) { plugins.add(plugin); break; } } } return plugins; } private Plugin getPlugin(String pluginKey) { return pluginAccessor.getPlugin(pluginKey); } public void resetExtension(String key) { // todo: clear cache when we add a cache } public void resetExtensions(List<String> result) { // todo: clear cache when there is one to clear } }