1
package org.herac.tuxguitar.util;
3
import java.io.BufferedReader;
4
import java.io.IOException;
5
import java.io.InputStreamReader;
6
import java.io.UnsupportedEncodingException;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.Enumeration;
11
import java.util.Iterator;
12
import java.util.List;
13
import java.util.NoSuchElementException;
15
public class TGServiceReader {
17
private static final String SERVICE_PATH = new String("META-INF/services/");
19
public static Iterator lookupProviders(Class spi){
20
return TGServiceReader.lookupProviders(spi,TGClassLoader.instance().getClassLoader());
23
public static Iterator lookupProviders(Class spi,ClassLoader loader){
25
if (spi == null || loader == null){
26
throw new IllegalArgumentException();
28
return new IteratorImpl(spi,loader,loader.getResources(SERVICE_PATH + spi.getName()));
29
}catch (IOException ioex){
30
return Collections.EMPTY_LIST.iterator();
34
private static final class IteratorImpl implements Iterator{
36
private ClassLoader loader;
37
private Enumeration urls;
38
private Iterator iterator;
40
public IteratorImpl(Class spi,ClassLoader loader,Enumeration urls){
47
private void initialize(){
48
List providers = new ArrayList();
49
while (this.urls.hasMoreElements()) {
50
URL url = (URL) this.urls.nextElement();
52
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
54
while((line = reader.readLine()) != null){
55
String provider = uncommentLine(line).trim();
56
if(provider != null && provider.length() > 0){
57
providers.add(provider);
60
} catch (UnsupportedEncodingException e) {
62
} catch (IOException e) {
66
this.iterator = providers.iterator();
69
private String uncommentLine(String line){
70
int index = line.indexOf('#');
72
return (line.substring(0,index));
77
public boolean hasNext() {
78
return (this.iterator != null && this.iterator.hasNext());
81
public Object next() {
83
throw new NoSuchElementException();
86
Object provider = this.loader.loadClass( (String)this.iterator.next() ).newInstance();
87
if(this.spi.isInstance(provider)){
90
} catch (Throwable throwable) {
91
throwable.printStackTrace();
93
throw new NoSuchElementException();
96
public void remove() {
97
throw new UnsupportedOperationException();