[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