[jbossws-commits] JBossWS SVN: r11278 - spi/trunk/src/main/java/org/jboss/wsf/spi/util.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Fri Dec 11 11:54:20 EST 2009


Author: richard.opalka at jboss.com
Date: 2009-12-11 11:54:19 -0500 (Fri, 11 Dec 2009)
New Revision: 11278

Modified:
   spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java
Log:
[JBWS-2859] rollback

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java	2009-12-11 12:13:27 UTC (rev 11277)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java	2009-12-11 16:54:19 UTC (rev 11278)
@@ -33,21 +33,22 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Load a service class using this ordered lookup procedure
  *
  * @author Thomas.Diesler at jboss.com
  * @author alessio.soldano at jboss.com
- * @author ropalka at redhat.com
  * @since 14-Dec-2006
  */
 public abstract class ServiceLoader
 {
    /**
-    * A synchronized weak hash map that keeps factory objects.
+    * A synchronized weak hash map that keeps factory names retrieved using Service API (META-INF/services/*) for each classloader.
+    * Weak keys are used to remove entries when classloaders are garbage collected; values are service-property-name -> factory name maps.
     */
-   private static Map<String, Object> serviceMap = Collections.synchronizedMap(new WeakHashMap<String, Object>());
+   private static Map<ClassLoader, Map<String, String>> serviceMap = Collections.synchronizedMap(new WeakHashMap<ClassLoader, Map<String, String>>());
    
    /**
     * This method uses the algorithm below using the JAXWS Provider as an example.
@@ -66,21 +67,15 @@
     */
    public static Object loadService(String propertyName, String defaultFactory)
    {
-      Object factory = serviceMap.get(propertyName);
+      Object factory = loadFromServices(propertyName, null);
       if (factory == null)
       {
-         factory = loadFromServices(propertyName, null);
-         if (factory == null)
-         {
-            factory = loadFromPropertiesFile(propertyName, null);
-         }
-         if (factory == null)
-         {
-            factory = loadFromSystemProperty(propertyName, defaultFactory);
-         }
-         if (factory != null)
-            serviceMap.put(propertyName, factory);
+         factory = loadFromPropertiesFile(propertyName, null);
       }
+      if (factory == null)
+      {
+         factory = loadFromSystemProperty(propertyName, defaultFactory);
+      }
       return factory;
    }
    
@@ -120,15 +115,29 @@
 
    private static String getServiceNameUsingCache(ClassLoader loader, String filename) throws IOException
    {
-      InputStream inStream = SecurityActions.getResourceAsStream(loader, filename);
-      String factoryName = null;
-      if (inStream != null)
+      Map<String, String> map = serviceMap.get(loader);
+      if (map != null && map.containsKey(filename))
       {
-         BufferedReader br = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));
-         factoryName = br.readLine();
-         br.close();
+         return map.get(filename);
       }
-      return factoryName;
+      else
+      {
+         if (map == null)
+         {
+            map = new ConcurrentHashMap<String, String>();
+            serviceMap.put(loader, map);
+         }
+         InputStream inStream = SecurityActions.getResourceAsStream(loader, filename);
+         String factoryName = null;
+         if (inStream != null)
+         {
+            BufferedReader br = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));
+            factoryName = br.readLine();
+            br.close();
+            map.put(filename, factoryName);
+         }
+         return factoryName;
+      }
    }
    
    /** Use the system property



More information about the jbossws-commits mailing list