blob: e45c812f71c43c1c305052832a13ba781c3a53be [file] [log] [blame]
/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.batik.util;
import java.util.HashMap;
import java.util.Vector;
import java.util.Iterator;
import java.util.Enumeration;
import java.io.IOException;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
/**
* This class handles looking up service providers on the class path.
* it implements the system described in:
*
* http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html
* Under Service Provider. Note that this interface is very
* similar to the one they describe which seems to be missing in the JDK.
*
* @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
* @version $Id$
*/
public class Service {
static HashMap providerMap = new HashMap();
public static synchronized Iterator providers(Class cls) {
ClassLoader cl = cls.getClassLoader();
String serviceFile = "META-INF/services/"+cls.getName();
// System.out.println("File: " + serviceFile);
Vector v = (Vector)providerMap.get(serviceFile);
if (v != null)
return v.iterator();
v = new Vector();
providerMap.put(serviceFile, v);
Enumeration e;
try {
e = cl.getResources(serviceFile);
} catch (IOException ioe) {
return v.iterator();
}
while (e.hasMoreElements()) {
try {
URL u = (URL)e.nextElement();
// System.out.println("URL: " + u);
InputStream is = u.openStream();
Reader r = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(r);
String line = br.readLine();
while (line != null) {
try {
// First strip any comment...
int idx = line.indexOf('#');
if (idx != -1)
line = line.substring(0, idx);
// Trim whitespace.
line = line.trim();
// If nothing left then loop around...
if (line.length() == 0) {
line = br.readLine();
continue;
}
// System.out.println("Line: " + line);
// Try and load the class
Object obj = cl.loadClass(line).newInstance();
// stick it into our vector...
v.add(obj);
} catch (Exception ex) {
// Just try the next line
}
line = br.readLine();
}
} catch (Exception ex) {
// Just try the next file...
}
}
return v.iterator();
}
}