package com.alibaba.fastjson.util;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
public class ServiceLoader {
private static final String PREFIX = "META-INF/services/";
private static final Set<String> loadedUrls = new HashSet<String>();
@SuppressWarnings("unchecked")
public static <T> Set<T> load(Class<T> clazz, ClassLoader classLoader) {
Set<T> services = new HashSet<T>();
String className = clazz.getName();
String path = PREFIX + className;
Set<String> serviceNames = new HashSet<String>();
try {
Enumeration<URL> urls = classLoader.getResources(path);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (loadedUrls.contains(url.toString())) {
continue;
}
load(url, serviceNames);
loadedUrls.add(url.toString());
}
} catch (IOException ex) {
// skip
}
for (String serviceName : serviceNames) {
try {
Class<?> serviceClass = classLoader.loadClass(serviceName);
T service = (T) serviceClass.newInstance();
services.add(service);
} catch (Exception e) {
// skip
}
}
return services;
}
public static void load(URL url, Set<String> set) throws IOException {
InputStream is = null;
BufferedReader reader = null;
try {
is = url.openStream();
reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
for (;;) {
String line = reader.readLine();
if (line == null) {
break;
}
int ci = line.indexOf('#');
if (ci >= 0) {
line = line.substring(0, ci);
}
line = line.trim();
if (line.length() == 0) {
continue;
}
set.add(line);
}
} finally {
close(reader);
close(is);
}
}
public static void close(Closeable x) throws IOException {
if (x != null) {
x.close();
}
}
}