package org.herac.tuxguitar.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; public class TGServiceReader { private static final String SERVICE_PATH = new String("META-INF/services/"); public static Iterator lookupProviders(Class spi){ return TGServiceReader.lookupProviders(spi,TGClassLoader.instance().getClassLoader()); } public static Iterator lookupProviders(Class spi,ClassLoader loader){ try{ if (spi == null || loader == null){ throw new IllegalArgumentException(); } return new IteratorImpl(spi,loader,loader.getResources(SERVICE_PATH + spi.getName())); }catch (IOException ioex){ return Collections.EMPTY_LIST.iterator(); } } private static final class IteratorImpl implements Iterator{ private Class spi; private ClassLoader loader; private Enumeration urls; private Iterator iterator; public IteratorImpl(Class spi,ClassLoader loader,Enumeration urls){ this.spi = spi; this.loader = loader; this.urls = urls; this.initialize(); } private void initialize(){ List providers = new ArrayList(); while (this.urls.hasMoreElements()) { URL url = (URL) this.urls.nextElement(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); String line = null; while((line = reader.readLine()) != null){ String provider = uncommentLine(line).trim(); if(provider != null && provider.length() > 0){ providers.add(provider); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } this.iterator = providers.iterator(); } private String uncommentLine(String line){ int index = line.indexOf('#'); if(index >= 0){ return (line.substring(0,index)); } return line; } public boolean hasNext() { return (this.iterator != null && this.iterator.hasNext()); } public Object next() { if (!hasNext()){ throw new NoSuchElementException(); } try { Object provider = this.loader.loadClass( (String)this.iterator.next() ).newInstance(); if(this.spi.isInstance(provider)){ return provider; } } catch (Throwable throwable) { throwable.printStackTrace(); } throw new NoSuchElementException(); } public void remove() { throw new UnsupportedOperationException(); } } }