[weld-commits] Weld SVN: r6163 - in extensions/trunk/src/main: java/org/jboss/weld/extensions/resources and 3 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Mon Apr 26 11:11:58 EDT 2010


Author: pete.muir at jboss.org
Date: 2010-04-26 11:11:56 -0400 (Mon, 26 Apr 2010)
New Revision: 6163

Added:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ClasspathResourceLoader.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoader.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoaderManager.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/util/Sortable.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoader.java
   extensions/trunk/src/main/resources/META-INF/services/org.jboss.weld.extensions.resources.ResourceLoader
Removed:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/spi/
   extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoader.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoaderFactory.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoaderFactory.java
Modified:
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerAware.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerProvider.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProducer.java
   extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProvider.java
Log:
clean up service loader exception handling to be specific about what it catches and what it does with errors, remove junk files, remove uneeded load methods, alter resource loader to use META-INF/services, extract out Sortable

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerAware.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerAware.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerAware.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -23,7 +23,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
@@ -31,7 +30,8 @@
 import javax.enterprise.inject.spi.Extension;
 import javax.inject.Inject;
 
-import org.jboss.weld.extensions.util.service.DefaultServiceLoader;
+import org.jboss.weld.extensions.util.Sortable;
+import org.jboss.weld.extensions.util.service.ServiceLoader;
 
 /**
  * Super-class for non-CDI-native components that need a reference to the
@@ -54,21 +54,13 @@
    private void loadServices()
    {
       beanManagerProviders.clear();
-      Iterator<BeanManagerProvider> providers = DefaultServiceLoader.load(BeanManagerProvider.class).iterator();
+      Iterator<BeanManagerProvider> providers = ServiceLoader.load(BeanManagerProvider.class).iterator();
       while (providers.hasNext())
       {
          beanManagerProviders.add(providers.next());
       }
    }
 
-   private class ProviderWeightSorter implements Comparator<BeanManagerProvider>
-   {
-      public int compare(BeanManagerProvider provider1, BeanManagerProvider provider2)
-      {
-         return -1 * Integer.valueOf(provider1.getPrecedence()).compareTo(Integer.valueOf(provider2.getPrecedence()));
-      }
-   }
-
    protected BeanManager getBeanManager()
    {
       if (beanManager == null)
@@ -76,7 +68,7 @@
          if (beanManagerProviders.isEmpty())
          {
             loadServices();
-            Collections.sort(beanManagerProviders, new ProviderWeightSorter());
+            Collections.sort(beanManagerProviders, new Sortable.Comparator());
          }
          beanManager = lookupBeanManager();
       }

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerProvider.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerProvider.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/beanManager/BeanManagerProvider.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -23,13 +23,15 @@
 
 import javax.enterprise.inject.spi.BeanManager;
 
+import org.jboss.weld.extensions.util.Sortable;
+
 /**
  * Provider for obtaining a BeanManager
  * 
  * @author Nicklas Karlsson
  * 
  */
-public interface BeanManagerProvider
+public interface BeanManagerProvider extends Sortable
 {
    /**
     * Try to obtain a BeanManager
@@ -37,11 +39,4 @@
     * @return The BeanManager (or null if non found at this location)
     */
    public abstract BeanManager getBeanManager();
-
-   /**
-    * An integer precedence value that indicates how favorable the implementation
-    * considers itself amongst alternatives. A higher value is a higher
-    * precedence. If two implementations have the save precedence, the order is undetermined.
-    */
-   public abstract int getPrecedence();
 }

Copied: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ClasspathResourceLoader.java (from rev 6159, extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/spi/ResourceLoaderImpl.java)
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ClasspathResourceLoader.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ClasspathResourceLoader.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1,127 @@
+package org.jboss.weld.extensions.resources;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class ClasspathResourceLoader implements ResourceLoader
+{
+
+   private static final Logger log = LoggerFactory.getLogger("org.jboss.weld.extensions.resources");
+   
+   ClasspathResourceLoader()
+   {
+   }
+
+   public InputStream getResourceAsStream(String name)
+   {
+      // Always use the strippedName, classloader always assumes no starting /
+      String strippedName = getStrippedName(name);
+      // Try to load from the TCCL
+      if (Thread.currentThread().getContextClassLoader() != null)
+      {
+         InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(strippedName);
+         if (stream != null)
+         {
+            log.trace("Loaded resource from context classloader: " + strippedName);
+            return stream;
+         }
+      }
+      // Try to load from the extension's classloader
+      else
+      {
+         InputStream stream = ResourceProducer.class.getResourceAsStream(strippedName);
+         if (stream != null)
+         {
+            log.trace("Loaded resource from Seam classloader: " + strippedName);
+            return stream;
+         }
+      }
+      return null;
+   }
+
+   public URL getResource(String name)
+   {
+      // Always use the strippedName, classloader always assumes no starting /
+      String strippedName = getStrippedName(name);
+      // Try to load from the TCCL
+      if (Thread.currentThread().getContextClassLoader() != null)
+      {
+         URL url = Thread.currentThread().getContextClassLoader().getResource(strippedName);
+         if (url != null)
+         {
+            log.trace("Loaded resource from context classloader: " + strippedName);
+            return url;
+         }
+      }
+      // Try to load from the extension's classloader
+      else
+      {
+         URL url = ResourceProducer.class.getResource(strippedName);
+         if (url != null)
+         {
+            log.trace("Loaded resource from Seam classloader: " + strippedName);
+            return url;
+         }
+      }
+      return null;
+   }
+   
+
+   public Set<URL> getResources(String name)
+   {
+      Set<URL> urls = new HashSet<URL>();
+      // Always use the strippedName, classloader always assumes no starting /
+      String strippedName = getStrippedName(name);
+      // Try to load from the TCCL
+      if (Thread.currentThread().getContextClassLoader() != null)
+      {
+         try
+         {
+            Enumeration<URL> urlEnum = Thread.currentThread().getContextClassLoader().getResources(strippedName);
+            while (urlEnum.hasMoreElements())
+            {
+               urls.add(urlEnum.nextElement());
+            }
+         }
+         catch (IOException e)
+         {
+            // we are probably not going to recover from an IOException
+            throw new RuntimeException(e);
+         }
+      }
+      // Try to load from the extension's classloader
+      else
+      {
+         try
+         {
+            Enumeration<URL> urlEnum = ResourceProducer.class.getClassLoader().getResources(strippedName);
+            while (urlEnum.hasMoreElements())
+            {
+               urls.add(urlEnum.nextElement());
+            }
+         }
+         catch (IOException e)
+         {
+            throw new RuntimeException(e);
+         }
+      }
+      return urls;
+   }
+   
+   public int getPrecedence()
+   {
+      return 10;
+   }
+
+   private static String getStrippedName(String name)
+   {
+      return name.startsWith("/") ? name.substring(1) : name;
+   }
+}


Property changes on: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ClasspathResourceLoader.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Copied: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoader.java (from rev 6159, extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/spi/ResourceLoader.java)
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoader.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoader.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1,18 @@
+package org.jboss.weld.extensions.resources;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Set;
+
+import org.jboss.weld.extensions.util.Sortable;
+
+public interface ResourceLoader extends Sortable
+{
+   
+   public URL getResource(String resource);
+   
+   public InputStream getResourceAsStream(String name);
+
+   public Set<URL> getResources(String name);
+
+}


Property changes on: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoader.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Added: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoaderManager.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoaderManager.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoaderManager.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1,39 @@
+package org.jboss.weld.extensions.resources;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+
+import org.jboss.weld.extensions.util.Sortable;
+import org.jboss.weld.extensions.util.service.ServiceLoader;
+
+ at ApplicationScoped
+class ResourceLoaderManager
+{
+   
+   private final List<ResourceLoader> resourceLoaders;
+   
+   ResourceLoaderManager()
+   {
+      this.resourceLoaders = new ArrayList<ResourceLoader>();
+   }
+   
+   @PostConstruct
+   void init()
+   {
+      for (ResourceLoader resourceLoader : ServiceLoader.load(ResourceLoader.class))
+      {
+         resourceLoaders.add(resourceLoader);
+      }
+      Collections.sort(resourceLoaders, new Sortable.Comparator());
+   }
+   
+   public Iterable<ResourceLoader> getResourceLoaders()
+   {
+      return resourceLoaders;
+   }
+
+}


Property changes on: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceLoaderManager.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProducer.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProducer.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProducer.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -12,26 +12,40 @@
 import javax.inject.Inject;
 
 import org.jboss.weld.extensions.Resource;
-import org.jboss.weld.extensions.resources.spi.ResourceLoader;
 
-public class ResourceProducer
+/**
+ * Resource producer allows injecting of resources
+ * 
+ * @author pmuir
+ *
+ */
+class ResourceProducer
 {
    
-   private final ResourceLoader loader;
+   private final ResourceLoaderManager resourceLoaderManager;
    
    @Inject
-   private ResourceProducer(ResourceLoader loader)
+   ResourceProducer(ResourceLoaderManager resourceLoaderManager)
    {
-      this.loader = loader;
+      this.resourceLoaderManager = resourceLoaderManager;
    }
    
    @Produces @Resource("")
-   protected InputStream loadResourceStream(InjectionPoint injectionPoint) throws IOException
+   InputStream loadResourceStream(InjectionPoint injectionPoint) throws IOException
    {
-      return loader.getResourceAsStream(getName(injectionPoint));
+      String name = getName(injectionPoint);
+      for (ResourceLoader loader : resourceLoaderManager.getResourceLoaders())
+      {
+         InputStream is = loader.getResourceAsStream(name);
+         if (is != null)
+         {
+            return is;
+         }
+      }
+      return null;
    }
    
-   protected void closeResourceStream(@Disposes @Resource("") InputStream inputStream) throws IOException
+   void closeResourceStream(@Disposes @Resource("") InputStream inputStream) throws IOException
    {
       try
       {
@@ -44,9 +58,18 @@
    }
    
    @Produces @Resource("")
-   protected URL loadResource(InjectionPoint injectionPoint)
+   URL loadResource(InjectionPoint injectionPoint)
    {
-      return loader.getResource(getName(injectionPoint));
+      String name = getName(injectionPoint);
+      for (ResourceLoader loader : resourceLoaderManager.getResourceLoaders())
+      {
+         URL url = loader.getResource(name);
+         if (url != null)
+         {
+            return url;
+         }
+      }
+      return null;
    }
    
    private String getName(InjectionPoint ip)

Modified: extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProvider.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProvider.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/resources/ResourceProvider.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -18,7 +18,7 @@
 import org.jboss.weld.extensions.util.AnnotationInstanceProvider;
 
 /**
- * The ResourceLoader allows dynamic loading of managed resources.
+ * The ResourceProvider allows dynamic loading of managed resources.
  * 
  * If a input stream is loaded, it will be automatically closed when the InputStream goes 
  * out of scope. If a URL is used to create an input stream, the application is responsible 

Added: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/Sortable.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/util/Sortable.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/util/Sortable.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1,34 @@
+package org.jboss.weld.extensions.util;
+
+
+/**
+ * A Sortable class is given a precedence which is used to decide it's relative order
+ * 
+ * @author pmuir
+ *
+ */
+public interface Sortable
+{
+   
+   /**
+    * A comparator which can order Sortables
+    * 
+    * @author pmuir
+    *
+    */
+   public class Comparator implements java.util.Comparator<Sortable>
+   {
+      public int compare(Sortable arg1, Sortable arg2)
+      {
+         return -1 * Integer.valueOf(arg1.getPrecedence()).compareTo(Integer.valueOf(arg2.getPrecedence()));
+      }
+   }
+
+   /**
+    * An integer precedence value that indicates how favorable the implementation
+    * considers itself amongst alternatives. A higher value is a higher
+    * precedence. If two implementations have the save precedence, the order is undetermined.
+    */
+   public abstract int getPrecedence();
+
+}
\ No newline at end of file


Property changes on: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/Sortable.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Deleted: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoader.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoader.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoader.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -1,336 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.weld.extensions.util.service;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This class handles looking up service providers on the class path. It
- * implements the <a href="http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider"
- * >Service Provider section of the JAR File Specification</a>.
- * 
- * The Service Provider programmatic lookup was not specified prior to Java 6 so
- * this interface allows use of the specification prior to Java 6.
- * 
- * The API is copied from <a
- * href="http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html"
- * >java.util.ServiceLoader</a>
- * 
- * @author Pete Muir
- * @author <a href="mailto:dev at avalon.apache.org">Avalon Development Team</a>
- * @author Nicklas Karlsson
- */
-public class DefaultServiceLoader<S> implements Iterable<S>
-{
-   private static final String SERVICES = "META-INF/services";
-
-   private static final Logger log = LoggerFactory.getLogger(DefaultServiceLoader.class);
-
-   /**
-    * Creates a new service loader for the given service type, using the current
-    * thread's context class loader.
-    * 
-    * An invocation of this convenience method of the form
-    * 
-    * {@code ServiceLoader.load(service)</code>}
-    * 
-    * is equivalent to
-    * 
-    * <code>ServiceLoader.load(service,
-    *                   Thread.currentThread().getContextClassLoader())</code>
-    * 
-    * @param service The interface or abstract class representing the service
-    * @return A new service loader
-    */
-   public static <S> DefaultServiceLoader<S> load(Class<S> service)
-   {
-      return load(SERVICES, service, Thread.currentThread().getContextClassLoader());
-   }
-
-   public static <S> DefaultServiceLoader<S> load(String directoryName, Class<S> service)
-   {
-      return load(directoryName, service, Thread.currentThread().getContextClassLoader());
-   }
-
-   public static <S> DefaultServiceLoader<S> load(String directoryName, Class<S> service, ClassLoader loader)
-   {
-      if (loader == null)
-      {
-         loader = service.getClassLoader();
-      }
-      return new DefaultServiceLoader<S>(directoryName, service, loader);
-   }
-
-   /**
-    * Creates a new service loader for the given service type and class loader.
-    * 
-    * @param service The interface or abstract class representing the service
-    * @param loader The class loader to be used to load provider-configuration
-    *           files and provider classes, or null if the system class loader
-    *           (or, failing that, the bootstrap class loader) is to be used
-    * @return A new service loader
-    */
-   public static <S> DefaultServiceLoader<S> load(Class<S> service, ClassLoader loader)
-   {
-      return load(SERVICES, service, loader);
-   }
-
-   /**
-    * Creates a new service loader for the given service type, using the
-    * extension class loader.
-    * 
-    * This convenience method simply locates the extension class loader, call it
-    * extClassLoader, and then returns
-    * 
-    * <code>ServiceLoader.load(service, extClassLoader)</code>
-    * 
-    * If the extension class loader cannot be found then the system class loader
-    * is used; if there is no system class loader then the bootstrap class
-    * loader is used.
-    * 
-    * This method is intended for use when only installed providers are desired.
-    * The resulting service will only find and load providers that have been
-    * installed into the current Java virtual machine; providers on the
-    * application's class path will be ignored.
-    * 
-    * @param service The interface or abstract class representing the service
-    * @return A new service loader
-    */
-   public static <S> DefaultServiceLoader<S> loadInstalled(Class<S> service)
-   {
-      throw new UnsupportedOperationException("Not implemented");
-   }
-
-   private final String serviceFile;
-   private Class<S> expectedType;
-   private final ClassLoader loader;
-
-   private Set<S> providers;
-
-   private DefaultServiceLoader(String prefix, Class<S> service, ClassLoader loader)
-   {
-      this.loader = loader;
-      this.serviceFile = prefix + "/" + service.getName();
-      this.expectedType = service;
-   }
-
-   /**
-    * Clear this loader's provider cache so that all providers will be reloaded.
-    * 
-    * After invoking this method, subsequent invocations of the iterator method
-    * will lazily look up and instantiate providers from scratch, just as is
-    * done by a newly-created loader.
-    * 
-    * This method is intended for use in situations in which new providers can
-    * be installed into a running Java virtual machine.
-    */
-   public void reload()
-   {
-      providers = new HashSet<S>();
-
-      for (URL serviceFile : loadServiceFiles())
-      {
-         loadServiceFile(serviceFile);
-      }
-   }
-
-   private List<URL> loadServiceFiles()
-   {
-      List<URL> serviceFiles = new ArrayList<URL>();
-      try
-      {
-         Enumeration<URL> serviceFileEnumerator = loader.getResources(serviceFile);
-         while (serviceFileEnumerator.hasMoreElements())
-         {
-            serviceFiles.add(serviceFileEnumerator.nextElement());
-         }
-      }
-      catch (IOException e)
-      {
-         throw new RuntimeException("Could not load resources from " + serviceFile, e);
-      }
-      return serviceFiles;
-   }
-
-   private void loadServiceFile(URL serviceFile)
-   {
-      InputStream is = null;
-      try
-      {
-         is = serviceFile.openStream();
-         BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-         String serviceClassName = null;
-         while ((serviceClassName = reader.readLine()) != null)
-         {
-            serviceClassName = trim(serviceClassName);
-            if (serviceClassName.length() > 0)
-            {
-               loadService(serviceClassName);
-            }
-         }
-      }
-      catch (IOException e)
-      {
-         // FIXME: correct exception
-         throw new RuntimeException("Could not read services file " + serviceFile);
-      }
-      finally
-      {
-         if (is != null)
-         {
-            try
-            {
-               is.close();
-            }
-            catch (IOException e)
-            {
-               // FIXME: correct exception
-               throw new RuntimeException("Could not close services file " + serviceFile, e);
-            }
-         }
-      }
-   }
-
-   private String trim(String line)
-   {
-      final int comment = line.indexOf('#');
-
-      if (comment > -1)
-      {
-         line = line.substring(0, comment);
-      }
-      return line.trim();
-   }
-
-   private void loadService(String serviceClassName)
-   {
-      Class<? extends S> serviceClass = loadClass(serviceClassName);
-      if (serviceClass == null)
-      {
-         return;
-      }
-      S serviceInstance = prepareInstance(serviceClass);
-      if (serviceInstance == null)
-      {
-         return;
-      }
-      providers.add(serviceInstance);
-   }
-
-   private Class<? extends S> loadClass(String serviceClassName)
-   {
-      Class<?> clazz = null;
-      Class<? extends S> serviceClass = null;
-      try
-      {
-         clazz = loader.loadClass(serviceClassName);
-         serviceClass = clazz.asSubclass(expectedType);
-      }
-      catch (ClassNotFoundException e)
-      {
-         log.warn("Could not load service class " + serviceClassName);
-      }
-      catch (ClassCastException e)
-      {
-         log.warn("Service class " + serviceClassName + " didn't implement the Extension interface");
-      }
-      return serviceClass;
-   }
-
-   private S prepareInstance(Class<? extends S> serviceClass)
-   {
-      try
-      {
-         // FIXME: SM compatible instatiation
-         return serviceClass.newInstance();
-      }
-      catch (Exception e)
-      {
-         log.warn("Could not instantiate service class " + serviceClass.getName(), e);
-      }
-      return null;
-   }
-
-   /**
-    * Lazily loads the available providers of this loader's service.
-    * 
-    * The iterator returned by this method first yields all of the elements of
-    * the provider cache, in instantiation order. It then lazily loads and
-    * instantiates any remaining providers, adding each one to the cache in
-    * turn.
-    * 
-    * To achieve laziness the actual work of parsing the available
-    * provider-configuration files and instantiating providers must be done by
-    * the iterator itself. Its hasNext and next methods can therefore throw a
-    * ServiceConfigurationError if a provider-configuration file violates the
-    * specified format, or if it names a provider class that cannot be found and
-    * instantiated, or if the result of instantiating the class is not
-    * assignable to the service type, or if any other kind of exception or error
-    * is thrown as the next provider is located and instantiated. To write
-    * robust code it is only necessary to catch ServiceConfigurationError when
-    * using a service iterator.
-    * 
-    * If such an error is thrown then subsequent invocations of the iterator
-    * will make a best effort to locate and instantiate the next available
-    * provider, but in general such recovery cannot be guaranteed.
-    * 
-    * Design Note Throwing an error in these cases may seem extreme. The
-    * rationale for this behavior is that a malformed provider-configuration
-    * file, like a malformed class file, indicates a serious problem with the
-    * way the Java virtual machine is configured or is being used. As such it is
-    * preferable to throw an error rather than try to recover or, even worse,
-    * fail silently.
-    * 
-    * The iterator returned by this method does not support removal. Invoking
-    * its remove method will cause an UnsupportedOperationException to be
-    * thrown.
-    * 
-    * @return An iterator that lazily loads providers for this loader's service
-    */
-   public Iterator<S> iterator()
-   {
-      if (providers == null)
-      {
-         reload();
-      }
-      return providers.iterator();
-   }
-
-   /**
-    * Returns a string describing this service.
-    * 
-    * @return A descriptive string
-    */
-   @Override
-   public String toString()
-   {
-      return "Services for " + serviceFile;
-   }
-}

Deleted: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoaderFactory.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoaderFactory.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoaderFactory.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -1,30 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.weld.extensions.util.service;
-
-public class DefaultServiceLoaderFactory implements ServiceLoaderFactory
-{
-   public <S> DefaultServiceLoader<S> load(Class<S> service)
-   {
-      return DefaultServiceLoader.load(service);
-   }
-
-   public <S> DefaultServiceLoader<S> load(Class<S> service, ClassLoader loader)
-   {
-      return DefaultServiceLoader.load(service, loader);
-   }
-}

Copied: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoader.java (from rev 6159, extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/DefaultServiceLoader.java)
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoader.java	                        (rev 0)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoader.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1,354 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.weld.extensions.util.service;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class handles looking up service providers on the class path. It
+ * implements the <a href="http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider"
+ * >Service Provider section of the JAR File Specification</a>.
+ * 
+ * The Service Provider programmatic lookup was not specified prior to Java 6 so
+ * this interface allows use of the specification prior to Java 6.
+ * 
+ * The API is copied from <a
+ * href="http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html"
+ * >java.util.ServiceLoader</a>
+ * 
+ * @author Pete Muir
+ * @author <a href="mailto:dev at avalon.apache.org">Avalon Development Team</a>
+ * @author Nicklas Karlsson
+ */
+public class ServiceLoader<S> implements Iterable<S>
+{
+   private static final String SERVICES = "META-INF/services";
+
+   private static final Logger log = LoggerFactory.getLogger(ServiceLoader.class);
+
+   /**
+    * Creates a new service loader for the given service type, using the current
+    * thread's context class loader.
+    * 
+    * An invocation of this convenience method of the form
+    * 
+    * {@code ServiceLoader.load(service)</code>}
+    * 
+    * is equivalent to
+    * 
+    * <code>ServiceLoader.load(service,
+    *                   Thread.currentThread().getContextClassLoader())</code>
+    * 
+    * @param service The interface or abstract class representing the service
+    * @return A new service loader
+    */
+   public static <S> ServiceLoader<S> load(Class<S> service)
+   {
+      return load(service, Thread.currentThread().getContextClassLoader());
+   }
+
+   /**
+    * Creates a new service loader for the given service type and class loader.
+    * 
+    * @param service The interface or abstract class representing the service
+    * @param loader The class loader to be used to load provider-configuration
+    *           files and provider classes, or null if the system class loader
+    *           (or, failing that, the bootstrap class loader) is to be used
+    * @return A new service loader
+    */
+   public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader)
+   {
+      if (loader == null)
+      {
+         loader = service.getClassLoader();
+      }
+      return new ServiceLoader<S>(service, loader);
+   }
+
+   /**
+    * Creates a new service loader for the given service type, using the
+    * extension class loader.
+    * 
+    * This convenience method simply locates the extension class loader, call it
+    * extClassLoader, and then returns
+    * 
+    * <code>ServiceLoader.load(service, extClassLoader)</code>
+    * 
+    * If the extension class loader cannot be found then the system class loader
+    * is used; if there is no system class loader then the bootstrap class
+    * loader is used.
+    * 
+    * This method is intended for use when only installed providers are desired.
+    * The resulting service will only find and load providers that have been
+    * installed into the current Java virtual machine; providers on the
+    * application's class path will be ignored.
+    * 
+    * @param service The interface or abstract class representing the service
+    * @return A new service loader
+    */
+   public static <S> ServiceLoader<S> loadInstalled(Class<S> service)
+   {
+      throw new UnsupportedOperationException("Not implemented");
+   }
+
+   private final String serviceFile;
+   private Class<S> expectedType;
+   private final ClassLoader loader;
+
+   private Set<S> providers;
+
+   private ServiceLoader(Class<S> service, ClassLoader loader)
+   {
+      this.loader = loader;
+      this.serviceFile = SERVICES + "/" + service.getName();
+      this.expectedType = service;
+   }
+
+   /**
+    * Clear this loader's provider cache so that all providers will be reloaded.
+    * 
+    * After invoking this method, subsequent invocations of the iterator method
+    * will lazily look up and instantiate providers from scratch, just as is
+    * done by a newly-created loader.
+    * 
+    * This method is intended for use in situations in which new providers can
+    * be installed into a running Java virtual machine.
+    */
+   public void reload()
+   {
+      providers = new HashSet<S>();
+
+      for (URL serviceFile : loadServiceFiles())
+      {
+         loadServiceFile(serviceFile);
+      }
+   }
+
+   private List<URL> loadServiceFiles()
+   {
+      List<URL> serviceFiles = new ArrayList<URL>();
+      try
+      {
+         Enumeration<URL> serviceFileEnumerator = loader.getResources(serviceFile);
+         while (serviceFileEnumerator.hasMoreElements())
+         {
+            serviceFiles.add(serviceFileEnumerator.nextElement());
+         }
+      }
+      catch (IOException e)
+      {
+         throw new RuntimeException("Could not load resources from " + serviceFile, e);
+      }
+      return serviceFiles;
+   }
+
+   private void loadServiceFile(URL serviceFile)
+   {
+      InputStream is = null;
+      try
+      {
+         is = serviceFile.openStream();
+         BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+         String serviceClassName = null;
+         while ((serviceClassName = reader.readLine()) != null)
+         {
+            serviceClassName = trim(serviceClassName);
+            if (serviceClassName.length() > 0)
+            {
+               loadService(serviceClassName);
+            }
+         }
+      }
+      catch (IOException e)
+      {
+         // FIXME: correct exception
+         throw new RuntimeException("Could not read services file " + serviceFile);
+      }
+      finally
+      {
+         if (is != null)
+         {
+            try
+            {
+               is.close();
+            }
+            catch (IOException e)
+            {
+               // FIXME: correct exception
+               throw new RuntimeException("Could not close services file " + serviceFile, e);
+            }
+         }
+      }
+   }
+
+   private String trim(String line)
+   {
+      final int comment = line.indexOf('#');
+
+      if (comment > -1)
+      {
+         line = line.substring(0, comment);
+      }
+      return line.trim();
+   }
+
+   private void loadService(String serviceClassName)
+   {
+      Class<? extends S> serviceClass = loadClass(serviceClassName);
+      if (serviceClass == null)
+      {
+         return;
+      }
+      S serviceInstance = prepareInstance(serviceClass);
+      if (serviceInstance == null)
+      {
+         return;
+      }
+      providers.add(serviceInstance);
+   }
+
+   private Class<? extends S> loadClass(String serviceClassName)
+   {
+      Class<?> clazz = null;
+      Class<? extends S> serviceClass = null;
+      try
+      {
+         clazz = loader.loadClass(serviceClassName);
+         serviceClass = clazz.asSubclass(expectedType);
+      }
+      catch (ClassNotFoundException e)
+      {
+         log.warn("Could not load service class " + serviceClassName);
+      }
+      catch (ClassCastException e)
+      {
+         throw new RuntimeException("Service class " + serviceClassName + " didn't implement the Extension interface");
+      }
+      return serviceClass;
+   }
+
+   private S prepareInstance(Class<? extends S> serviceClass)
+   {
+      try
+      {
+         // TODO Support the SM
+         Constructor<? extends S> constructor = serviceClass.getDeclaredConstructor();
+         constructor.setAccessible(true);
+         return constructor.newInstance();
+      }
+      catch (NoClassDefFoundError e) 
+      {
+         log.warn("Could not instantiate service class " + serviceClass.getName(), e);
+         return null;
+      }
+      catch (InvocationTargetException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e.getCause());
+      }
+      catch (IllegalArgumentException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e);
+      }
+      catch (InstantiationException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e);
+      }
+      catch (SecurityException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e);
+      }
+      catch (NoSuchMethodException e)
+      {
+         throw new RuntimeException("Error instantiating " + serviceClass, e);
+      }
+   }
+
+   /**
+    * Lazily loads the available providers of this loader's service.
+    * 
+    * The iterator returned by this method first yields all of the elements of
+    * the provider cache, in instantiation order. It then lazily loads and
+    * instantiates any remaining providers, adding each one to the cache in
+    * turn.
+    * 
+    * To achieve laziness the actual work of parsing the available
+    * provider-configuration files and instantiating providers must be done by
+    * the iterator itself. Its hasNext and next methods can therefore throw a
+    * ServiceConfigurationError if a provider-configuration file violates the
+    * specified format, or if it names a provider class that cannot be found and
+    * instantiated, or if the result of instantiating the class is not
+    * assignable to the service type, or if any other kind of exception or error
+    * is thrown as the next provider is located and instantiated. To write
+    * robust code it is only necessary to catch ServiceConfigurationError when
+    * using a service iterator.
+    * 
+    * If such an error is thrown then subsequent invocations of the iterator
+    * will make a best effort to locate and instantiate the next available
+    * provider, but in general such recovery cannot be guaranteed.
+    * 
+    * Design Note Throwing an error in these cases may seem extreme. The
+    * rationale for this behavior is that a malformed provider-configuration
+    * file, like a malformed class file, indicates a serious problem with the
+    * way the Java virtual machine is configured or is being used. As such it is
+    * preferable to throw an error rather than try to recover or, even worse,
+    * fail silently.
+    * 
+    * The iterator returned by this method does not support removal. Invoking
+    * its remove method will cause an UnsupportedOperationException to be
+    * thrown.
+    * 
+    * @return An iterator that lazily loads providers for this loader's service
+    */
+   public Iterator<S> iterator()
+   {
+      if (providers == null)
+      {
+         reload();
+      }
+      return providers.iterator();
+   }
+
+   /**
+    * Returns a string describing this service.
+    * 
+    * @return A descriptive string
+    */
+   @Override
+   public String toString()
+   {
+      return "Services for " + serviceFile;
+   }
+}

Deleted: extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoaderFactory.java
===================================================================
--- extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoaderFactory.java	2010-04-26 11:35:59 UTC (rev 6162)
+++ extensions/trunk/src/main/java/org/jboss/weld/extensions/util/service/ServiceLoaderFactory.java	2010-04-26 15:11:56 UTC (rev 6163)
@@ -1,24 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,  
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.weld.extensions.util.service;
-
-public interface ServiceLoaderFactory
-{
-   public <S> DefaultServiceLoader<S> load(Class<S> service);
-
-   public <S> DefaultServiceLoader<S> load(Class<S> service, ClassLoader loader);
-}

Added: extensions/trunk/src/main/resources/META-INF/services/org.jboss.weld.extensions.resources.ResourceLoader
===================================================================
--- extensions/trunk/src/main/resources/META-INF/services/org.jboss.weld.extensions.resources.ResourceLoader	                        (rev 0)
+++ extensions/trunk/src/main/resources/META-INF/services/org.jboss.weld.extensions.resources.ResourceLoader	2010-04-26 15:11:56 UTC (rev 6163)
@@ -0,0 +1 @@
+org.jboss.weld.extensions.resources.ClasspathResourceLoader
\ No newline at end of file



More information about the weld-commits mailing list