package org.dcache.gplazma.loader; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * PluginRepository is a container class that provides information about zero * or more plugins. For each plugin, a {@link PluginMetadata} object is * stored, which stores the static metadata for this plugin. * <p> * The class allows the discovery of the number of stored plugins, discovery * of a plugin by name and support an arbitrary processing of stored plugins * via the PluginMetadataProcessor interface. */ public class PluginRepository { private final Set<PluginMetadata> _plugins = new HashSet<>(); private final Map<String, PluginMetadata> _pluginByName = new HashMap<>(); public void addPlugin(PluginMetadata metadata) { _plugins.add(metadata); for( String name : metadata.getPluginNames()) { _pluginByName.put(name, metadata); } } public boolean hasPluginWithName(String name) { return _pluginByName.containsKey(name); } public PluginMetadata getPlugin(String name) throws PluginLoadingException { PluginMetadata metadata = _pluginByName.get(name); if(metadata == null) { throw new PluginLoadingException("no such plugin"); } return metadata; } public void processPluginsWith(PluginMetadataProcessor processor) { for( PluginMetadata plugin : _plugins) { processor.process( plugin); } } public int size() { return _plugins.size(); } /** * Classes that implement this method accept each stored PluginMetadata, * one at a time, allowing arbitrary processing of that plugin's static * metadata. */ public interface PluginMetadataProcessor { void process(PluginMetadata plugin); } }