aboutsummaryrefslogtreecommitdiff
path: root/src/lombok/core
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@tipit.to>2009-06-28 05:50:51 +0200
committerReinier Zwitserloot <reinier@tipit.to>2009-06-28 05:50:51 +0200
commit19f1b265931737a28760ccfe0200b4721f545989 (patch)
tree8bba739cf2d232c3fc4a21e7eb4ba86e63e8f71f /src/lombok/core
parentdc7d0cacf5c12201fb51a8758e3fcca385cc583c (diff)
downloadlombok-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.java63
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;