package open.dolphin.plugin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Kazushi Minagawa. Digital Globe, inc.
* @param <S>
*/
public class PluginLister<S> {
private static final String PREFIX = "META-INF/plugins/";
// ロードするプラグインのインターフェイス
private final Class<S> plugin;
// クラスローダ
private final ClassLoader loader;
/** Creates a new instance of PluginLoader */
private PluginLister(Class<S> plugin, ClassLoader loader) {
this.plugin = plugin;
this.loader = loader;
}
public LinkedHashMap<String,String> getProviders() {
try {
LinkedHashMap<String,String> providers = new LinkedHashMap<>(10);
String fullName = PREFIX + plugin.getName();
Enumeration<URL> configs = loader.getResources(fullName);
while (configs.hasMoreElements()) {
URL url = configs.nextElement();
try (InputStream in = url.openStream(); BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8"))) {
String line;
while ((line = r.readLine()) != null) {
line = line.trim();
Scanner s = new Scanner(line).useDelimiter("\\s*,\\s*");
String menu = s.next();
String cmd = s.next();
String value = s.next();
providers.put(cmd, value);
}
}
}
return providers;
} catch (IOException ex) {
Logger.getLogger(PluginLister.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
public static <S> PluginLister<S> list(Class<S> plugin, ClassLoader loader) {
return new PluginLister<>(plugin, loader);
}
public static <S> PluginLister<S> list(Class<S> plugin) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
return PluginLister.list(plugin, cl);
}
}