diff options
author | Reinier Zwitserloot <reinier@tipit.to> | 2009-06-28 05:50:51 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@tipit.to> | 2009-06-28 05:50:51 +0200 |
commit | 19f1b265931737a28760ccfe0200b4721f545989 (patch) | |
tree | 8bba739cf2d232c3fc4a21e7eb4ba86e63e8f71f /src/lombok/core | |
parent | dc7d0cacf5c12201fb51a8758e3fcca385cc583c (diff) | |
download | lombok-19f1b265931737a28760ccfe0200b4721f545989.tar.gz lombok-19f1b265931737a28760ccfe0200b4721f545989.tar.bz2 lombok-19f1b265931737a28760ccfe0200b4721f545989.zip |
Rolled our own ServiceLoader, because its not part of java 1.5.
Diffstat (limited to 'src/lombok/core')
-rw-r--r-- | src/lombok/core/SpiLoadUtil.java | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/lombok/core/SpiLoadUtil.java b/src/lombok/core/SpiLoadUtil.java index bf4bddf4..b26dd747 100644 --- a/src/lombok/core/SpiLoadUtil.java +++ b/src/lombok/core/SpiLoadUtil.java @@ -1,12 +1,75 @@ package lombok.core; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.lang.annotation.Annotation; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.net.URL; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; + +import lombok.Lombok; public class SpiLoadUtil { private SpiLoadUtil() {} + public static <C> Iterator<C> findServices(Class<C> target) throws IOException { + return findServices(target, Thread.currentThread().getContextClassLoader()); + } + + public static <C> Iterator<C> findServices(final Class<C> target, final ClassLoader loader) throws IOException { + Enumeration<URL> resources = loader.getResources("META-INF/services/" + target.getName()); + final Set<String> entries = new LinkedHashSet<String>(); + while ( resources.hasMoreElements() ) { + URL url = resources.nextElement(); + readServicesFromUrl(entries, url); + } + + final Iterator<String> names = entries.iterator(); + return new Iterator<C>() { + public boolean hasNext() { + return names.hasNext(); + } + + public C next() { + try { + return target.cast(Class.forName(names.next(), true, loader).newInstance()); + } catch ( Throwable t ) { + throw Lombok.sneakyThrow(t); + } + } + + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + + private static void readServicesFromUrl(Collection<String> list, URL url) throws IOException { + InputStream in = url.openStream(); + try { + if ( in == null ) return; + BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8")); + while ( true ) { + String line = r.readLine(); + if ( line == null ) break; + int idx = line.indexOf('#'); + if ( idx != -1 ) line = line.substring(0, idx); + line = line.trim(); + if ( line.length() == 0 ) continue; + list.add(line); + } + } finally { + try { in.close(); } catch ( Throwable ignore ) {} + } + } + @SuppressWarnings("unchecked") public static Class<? extends Annotation> findAnnotationClass(Class<?> c, Class<?> base) { if ( c == Object.class || c == null ) return null; |