You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2007/02/20 23:51:50 UTC
svn commit: r509793 -
/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
Author: pcl
Date: Tue Feb 20 14:51:50 2007
New Revision: 509793
URL: http://svn.apache.org/viewvc?view=rev&rev=509793
Log:
OPENJPA-156. Applied Michael Dick's patch (thanks). Updated symbolic constant to use OpenJPA norms, changed references to external symbolic constants to use constants from the map impl being used, and reduced if-else statements for readability.
Modified:
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java?view=diff&rev=509793&r1=509792&r2=509793
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java Tue Feb 20 14:51:50 2007
@@ -23,6 +23,7 @@
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.TreeSet;
+
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
@@ -34,6 +35,9 @@
import org.apache.openjpa.lib.util.Options;
import org.apache.openjpa.lib.util.ParseException;
import org.apache.openjpa.lib.util.StringDistance;
+import org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap;
+import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
+
import serp.util.Strings;
/**
@@ -46,6 +50,12 @@
private static final Localizer _loc = Localizer.forPackage
(Configurations.class);
+
+ private static ConcurrentReferenceHashMap _loaders = new
+ ConcurrentReferenceHashMap(ConcurrentReferenceHashMap.WEAK,
+ ConcurrentReferenceHashMap.HARD);
+
+ private static final Object NULL_LOADER = "null-loader";
/**
* Return the class name from the given plugin string, or null if none.
@@ -163,18 +173,33 @@
if (StringUtils.isEmpty(clsName))
return null;
- Class cls = null;
- try {
- cls = Strings.toClass(clsName, findDerivedLoader(conf, loader));
- } catch (RuntimeException re) {
- if (val != null)
- re = getCreateException(clsName, val, re);
- if (fatal)
- throw re;
- Log log = (conf == null) ? null : conf.getConfigurationLog();
- if (log != null && log.isErrorEnabled())
- log.error(_loc.get("plugin-creation-exception", val), re);
- return null;
+ Class cls = null;
+
+ // can't have a null reference in the map, so use symbolic
+ // constant as key
+ Object key = loader == null ? NULL_LOADER : loader;
+ Map loaderCache = (Map) _loaders.get(key);
+ if (loaderCache == null) { // We don't have a cache for this loader.
+ loaderCache = new ConcurrentHashMap();
+ _loaders.put(key, loaderCache);
+ } else { // We have a cache for this loader.
+ cls = (Class) loaderCache.get(clsName);
+ }
+
+ if (cls == null) { // we haven't cached this.
+ try {
+ cls = Strings.toClass(clsName, findDerivedLoader(conf, loader));
+ loaderCache.put(clsName, cls);
+ } catch (RuntimeException re) {
+ if (val != null)
+ re = getCreateException(clsName, val, re);
+ if (fatal)
+ throw re;
+ Log log = (conf == null) ? null : conf.getConfigurationLog();
+ if (log != null && log.isErrorEnabled())
+ log.error(_loc.get("plugin-creation-exception", val), re);
+ return null;
+ }
}
try {