package org.dcache.gplazma.loader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.util.Enumeration; import java.util.List; import java.util.ArrayList; /** * Use the <tt>META-INF/gplazma-plugins.xml</tt> file(s) available from the thread's * class-loader to build a PluginRepository. */ public class XmlResourcePluginRepositoryFactory implements PluginRepositoryFactory { private static final Logger LOGGER = LoggerFactory.getLogger( XmlResourcePluginRepositoryFactory.class); public static final String RESOURCE_PATH = "META-INF/gplazma-plugins.xml"; @Override public PluginRepository newRepository() { List<URL> xmlResources = findXmlResources(); PluginRepository repository = new PluginRepository(); addPlugins( repository, xmlResources); return repository; } private List<URL> findXmlResources() { List<URL> results = new ArrayList<>(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try { Enumeration<URL> resources = classLoader.getResources( RESOURCE_PATH); while (resources.hasMoreElements()) { results.add( resources.nextElement()); } } catch (IOException e) { LOGGER.error( "Unable to locate plugin metadata", e); } return results; } private void addPlugins( PluginRepository repository, List<URL> xmlResources) { for( URL xmlLocation : xmlResources) { tryAddingPluginsFromXml( repository, xmlLocation); } } private void tryAddingPluginsFromXml( PluginRepository repository, URL xmlLocation) { try { addPluginsFromXml( repository, xmlLocation); } catch (IOException e1) { LOGGER.error( "Unable read XML data from {}", xmlLocation .toExternalForm()); } } private void addPluginsFromXml( PluginRepository repository, URL xmlLocation) throws IOException { InputStream is = xmlLocation.openStream(); Reader in = new BufferedReader( new InputStreamReader( is)); XmlParser parser = new XmlParser( in); parser.parse(); for( PluginMetadata plugin : parser.getPlugins()) { repository.addPlugin( plugin); } } }