// Copyright 2003, FreeHEP. package org.freehep.util; import java.io.*; import java.net.*; import java.util.*; /** * This class does the same as sun.misc.Service, which may become public * in some java or javax package at some point. See Sun BUG# 4640520. * * @author Mark Donszelmann * @version $Id: Service.java 8584 2006-08-10 23:06:37Z duns $ */ public class Service { private Service() { } public static Collection providers(Class service, ClassLoader loader) { List classList = new ArrayList(); List nameSet = new ArrayList(); String name = "META-INF/services/" + service.getName(); Enumeration services; try { services = (loader == null) ? ClassLoader.getSystemResources(name) : loader.getResources(name); } catch (IOException ioe) { System.err.println("Service: cannot load "+name); return classList; } while (services.hasMoreElements()) { URL url = (URL)services.nextElement(); // System.out.println(url); InputStream input = null; BufferedReader reader = null; try { input = url.openStream(); reader = new BufferedReader(new InputStreamReader(input, "utf-8")); String line = reader.readLine(); while (line != null) { int ci = line.indexOf('#'); if (ci >= 0) line = line.substring(0, ci); line = line.trim(); int si = line.indexOf(' '); if (si >= 0) line = line.substring(0, si); line = line.trim(); if (line.length() > 0) { if (!nameSet.contains(line)) nameSet.add(line); } line = reader.readLine(); } } catch (IOException ioe) { System.err.println("Service: problem with: "+url); } finally { try { if (input != null) input.close(); if (reader != null) reader.close(); } catch (IOException ioe2) { System.err.println("Service: problem with: "+url); } } } Iterator names = nameSet.iterator(); while (names.hasNext()) { String className = (String)names.next(); try { classList.add(Class.forName(className, true, loader).newInstance()); } catch (ClassNotFoundException e) { System.err.println("Service: cannot find class: "+className); } catch (InstantiationException e) { System.err.println("Service: cannot instantiate: "+className); } catch (IllegalAccessException e) { System.err.println("Service: illegal access to: "+className); } catch (NoClassDefFoundError e) { System.err.println("Service: "+e+" for "+className); } catch (Exception e) { System.err.println("Service: exception for: "+className+" "+e); } } return classList; } public static Collection providers(Class service) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); return Service.providers(service, loader); } public static Collection installedProviders(Class service) { ClassLoader loader = ClassLoader.getSystemClassLoader(); ClassLoader previous = null; while (loader != null) { previous = loader; loader = loader.getParent(); } return providers(service, previous); } }