Author: richard.opalka(a)jboss.com
Date: 2009-12-11 06:25:48 -0500 (Fri, 11 Dec 2009)
New Revision: 11274
Modified:
spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java
Log:
[JBWS-2859] optimizing ServiceLoader
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 06:40:34
UTC (rev 11273)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/util/ServiceLoader.java 2009-12-11 11:25:48
UTC (rev 11274)
@@ -33,22 +33,21 @@
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(a)jboss.com
* @author alessio.soldano(a)jboss.com
+ * @author ropalka(a)redhat.com
* @since 14-Dec-2006
*/
public abstract class ServiceLoader
{
/**
- * 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.
+ * A synchronized weak hash map that keeps factory objects.
*/
- private static Map<ClassLoader, Map<String, String>> serviceMap =
Collections.synchronizedMap(new WeakHashMap<ClassLoader, Map<String,
String>>());
+ private static Map<String, Object> serviceMap = Collections.synchronizedMap(new
WeakHashMap<String, Object>());
/**
* This method uses the algorithm below using the JAXWS Provider as an example.
@@ -67,15 +66,21 @@
*/
public static Object loadService(String propertyName, String defaultFactory)
{
- Object factory = loadFromServices(propertyName, null);
+ Object factory = serviceMap.get(propertyName);
if (factory == null)
{
- factory = loadFromPropertiesFile(propertyName, 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);
}
- if (factory == null)
- {
- factory = loadFromSystemProperty(propertyName, defaultFactory);
- }
return factory;
}
@@ -115,29 +120,15 @@
private static String getServiceNameUsingCache(ClassLoader loader, String filename)
throws IOException
{
- Map<String, String> map = serviceMap.get(loader);
- if (map != null && map.containsKey(filename))
+ InputStream inStream = SecurityActions.getResourceAsStream(loader, filename);
+ String factoryName = null;
+ if (inStream != null)
{
- return map.get(filename);
+ BufferedReader br = new BufferedReader(new InputStreamReader(inStream,
"UTF-8"));
+ factoryName = br.readLine();
+ br.close();
}
- 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;
- }
+ return factoryName;
}
/** Use the system property
Show replies by date