package com.buschmais.xo.impl.plugin; import java.util.HashMap; import java.util.Map; import java.util.ServiceLoader; /** * Manages the available {@link com.buschmais.xo.impl.plugin.PluginRepository} * instances. * <p> * A {@link com.buschmais.xo.impl.plugin.PluginRepository} is identified by the * plugin interface type it holds plugins. * </p> */ public class PluginRepositoryManager { private Map<Class<?>, PluginRepository<?, ?>> pluginRepositories = new HashMap<>(); /** * Constructor. * * @param pluginRepositories * The plugin repositories to manage. */ public <Plugin> PluginRepositoryManager(PluginRepository<?, Plugin>... pluginRepositories) { for (PluginRepository<?, Plugin> pluginRepository : pluginRepositories) { Class<? super Plugin> pluginType = pluginRepository.getPluginType(); this.pluginRepositories.put(pluginType, pluginRepository); for (Plugin plugin : (Iterable<Plugin>) ServiceLoader.load(pluginType)) { pluginRepository.register(plugin); } } } /** * Return a plugin repository identified by the plugin interface type. * * @param pluginType * The plugin interface. * @param <P> * The plugin type * @return The {@link com.buschmais.xo.impl.plugin.PluginRepository}. */ public <P extends PluginRepository<?, ?>> P getPluginManager(Class<?> pluginType) { return (P) pluginRepositories.get(pluginType); } }