package org.bndtools.headless.build.manager; import java.io.File; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.bndtools.api.NamedPlugin; import org.bndtools.headless.build.manager.api.HeadlessBuildManager; import org.bndtools.headless.build.manager.api.HeadlessBuildPlugin; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; @Component public class HeadlessBuildManagerImpl implements HeadlessBuildManager { private final ILogger logger = Logger.getLogger(this.getClass()); private final Map<String,HeadlessBuildPlugin> plugins = new TreeMap<String,HeadlessBuildPlugin>(); private final Map<String,NamedPlugin> pluginsInformation = new TreeMap<String,NamedPlugin>(); @Reference(cardinality = ReferenceCardinality.AT_LEAST_ONE, policy = ReferencePolicy.DYNAMIC) void addPlugin(HeadlessBuildPlugin plugin) { if (plugin == null) { return; } NamedPlugin pluginInformation = plugin.getInformation(); String name = pluginInformation.getName(); synchronized (plugins) { plugins.put(name, plugin); pluginsInformation.put(name, pluginInformation); } } void removePlugin(HeadlessBuildPlugin plugin) { if (plugin == null) { return; } String name = plugin.getInformation().getName(); synchronized (plugins) { pluginsInformation.remove(name); plugins.remove(name); } } /* * HeadlessBuildManager */ @Override public Collection<NamedPlugin> getAllPluginsInformation() { synchronized (plugins) { return Collections.unmodifiableCollection(pluginsInformation.values()); } } @Override @Deprecated public void setup(Set<String> plugins, boolean cnf, File projectDir, boolean add, Set<String> enabledIgnorePlugins) { setup(plugins, cnf, projectDir, add, enabledIgnorePlugins, new LinkedList<String>()); } @Override public void setup(Set<String> plugins, boolean cnf, File projectDir, boolean add, Set<String> enabledIgnorePlugins, List<String> warnings) { if (plugins == null || plugins.isEmpty()) { return; } for (String pluginName : plugins) { HeadlessBuildPlugin plugin = null; synchronized (this.plugins) { plugin = this.plugins.get(pluginName); } if (plugin == null) { continue; } try { plugin.setup(cnf, projectDir, add, enabledIgnorePlugins, warnings); } catch (Throwable e) { logger.logError(String.format("Unable to %s headless build file(s) for the %sproject in %s", add ? "add" : "remove", cnf ? "cnf " : "", projectDir.getAbsolutePath()), e); } } } }