You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2013/04/03 15:54:11 UTC
svn commit: r1464015 -
/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java
Author: adrianc
Date: Wed Apr 3 13:54:10 2013
New Revision: 1464015
URL: http://svn.apache.org/r1464015
Log:
CachedClassLoader.java - replaced Javolution with non-blocking java.util.concurrent.* classes.
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java?rev=1464015&r1=1464014&r2=1464015&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java Wed Apr 3 13:54:10 2013
@@ -20,12 +20,10 @@ package org.ofbiz.base.util;
import java.net.URL;
import java.net.URLClassLoader;
-import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
-
-import javolution.util.FastMap;
-import javolution.util.FastSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
/**
* Caching Class Loader
@@ -38,16 +36,16 @@ public class CachedClassLoader extends U
}
public static final String module = CachedClassLoader.class.getName();
- public static final Map<String, Class<?>> globalClassNameClassMap = FastMap.newInstance();
- public static final Set<String> globalBadClassNameSet = FastSet.newInstance();
- public static final Map<String, URL> globalResourceMap = FastMap.newInstance();
- public static final Set<String> globalBadResourceNameSet = FastSet.newInstance();
-
- private String contextName;
- protected final Map<String, Class<?>> localClassNameClassMap = FastMap.newInstance();
- protected final Set<String> localBadClassNameSet = FastSet.newInstance();
- protected final Map<String, URL> localResourceMap = FastMap.newInstance();
- protected final Set<String> localBadResourceNameSet = FastSet.newInstance();
+ public static final ConcurrentHashMap<String, Class<?>> globalClassNameClassMap = new ConcurrentHashMap<String, Class<?>>(100);
+ private static final Set<String> globalBadClassNameSet = new CopyOnWriteArraySet<String>();
+ private static final ConcurrentHashMap<String, URL> globalResourceMap = new ConcurrentHashMap<String, URL>();
+ private static final Set<String> globalBadResourceNameSet = new CopyOnWriteArraySet<String>();
+
+ private final String contextName;
+ private final ConcurrentHashMap<String, Class<?>> localClassNameClassMap = new ConcurrentHashMap<String, Class<?>>();
+ private final Set<String> localBadClassNameSet = new CopyOnWriteArraySet<String>();
+ private final ConcurrentHashMap<String, URL> localResourceMap = new ConcurrentHashMap<String, URL>();
+ private final Set<String> localBadResourceNameSet = new CopyOnWriteArraySet<String>();
static {
// setup some commonly used classes...
@@ -112,23 +110,21 @@ public class CachedClassLoader extends U
if (theClass.isArray()) {
throw new IllegalArgumentException("theClass cannot be an array");
}
- synchronized(globalClassNameClassMap) {
- Object obj = globalClassNameClassMap.get(theClass.getName());
- if (obj == null) {
- globalClassNameClassMap.put(theClass.getName(), theClass);
- }
- String alias = theClass.getName();
- int pos = alias.lastIndexOf(".");
- if (pos != -1) {
- alias = alias.substring(pos + 1);
- }
- obj = globalClassNameClassMap.get(alias);
- if (obj == null) {
- globalClassNameClassMap.put(alias, theClass);
- }
- if (Debug.verboseOn()) {
- Debug.logVerbose("Registered class " + theClass.getName() + ", alias " + alias, module);
- }
+ Object obj = globalClassNameClassMap.get(theClass.getName());
+ if (obj == null) {
+ globalClassNameClassMap.putIfAbsent(theClass.getName(), theClass);
+ }
+ String alias = theClass.getName();
+ int pos = alias.lastIndexOf(".");
+ if (pos != -1) {
+ alias = alias.substring(pos + 1);
+ }
+ obj = globalClassNameClassMap.get(alias);
+ if (obj == null) {
+ globalClassNameClassMap.putIfAbsent(alias, theClass);
+ }
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Registered class " + theClass.getName() + ", alias " + alias, module);
}
}
@@ -168,95 +164,90 @@ public class CachedClassLoader extends U
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
- //check global common classes, ie for all instances
+ // check global common classes, ie for all instances
Class<?> theClass = globalClassNameClassMap.get(name);
if (theClass != null) {
return theClass;
}
-
- //check local classes, ie for this instance
+ // check local classes, ie for this instance
theClass = this.localClassNameClassMap.get(name);
if (theClass != null) {
return theClass;
}
-
- //make sure it is not a known bad class name
+ // make sure it is not a known bad class name
if (this.localBadClassNameSet.contains(name) || globalBadClassNameSet.contains(name)) {
- if (Debug.verboseOn()) Debug.logVerbose("Cached loader got a known bad class name: [" + name + "]", module);
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Cached loader got a known bad class name: [" + name + "]", module);
+ }
throw new ClassNotFoundException("Cached loader got a known bad class name: " + name);
}
-
- if (Debug.verboseOn()) Debug.logVerbose("Cached loader cache miss for class name: [" + name + "]", module);
-
- synchronized (this) {
- try {
- theClass = super.loadClass(name, resolve);
- if (isGlobalPath(name)) {
- synchronized (globalClassNameClassMap) {
- globalClassNameClassMap.put(name, theClass);
- }
- } else {
- this.localClassNameClassMap.put(name, theClass);
- }
- } catch (ClassNotFoundException e) {
- //Debug.logInfo(e, module);
- if (Debug.verboseOn()) Debug.logVerbose("Remembering invalid class name: [" + name + "]", module);
- if (isGlobalPath(name)) {
- synchronized (globalBadClassNameSet) {
- globalBadClassNameSet.add(name);
- }
- } else {
- this.localBadClassNameSet.add(name);
- }
- throw e;
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Cached loader cache miss for class name: [" + name + "]", module);
+ }
+ try {
+ theClass = super.loadClass(name, resolve);
+ if (isGlobalPath(name)) {
+ globalClassNameClassMap.putIfAbsent(name, theClass);
+ theClass = globalClassNameClassMap.get(name);
+ } else {
+ this.localClassNameClassMap.putIfAbsent(name, theClass);
+ theClass = this.localClassNameClassMap.get(name);
+ }
+ } catch (ClassNotFoundException e) {
+ // Debug.logInfo(e, module);
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Remembering invalid class name: [" + name + "]", module);
+ }
+ if (isGlobalPath(name)) {
+ globalBadClassNameSet.add(name);
+ } else {
+ this.localBadClassNameSet.add(name);
}
+ throw e;
}
return theClass;
}
@Override
public URL getResource(String name) {
- //check global common resources, ie for all instances
+ // check global common resources, ie for all instances
URL theResource = globalResourceMap.get(name);
if (theResource != null) {
return theResource;
}
-
- //check local resources, ie for this instance
+ // check local resources, ie for this instance
theResource = this.localResourceMap.get(name);
if (theResource != null) {
return theResource;
}
-
- //make sure it is not a known bad resource name
+ // make sure it is not a known bad resource name
if (localBadResourceNameSet.contains(name) || globalBadResourceNameSet.contains(name)) {
- if (Debug.verboseOn()) Debug.logVerbose("Cached loader got a known bad resource name: [" + name + "]", module);
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Cached loader got a known bad resource name: [" + name + "]", module);
+ }
return null;
}
-
- if (Debug.verboseOn()) Debug.logVerbose("Cached loader cache miss for resource name: [" + name + "]", module);
- //Debug.logInfo("Cached loader cache miss for resource name: [" + name + "]", module);
-
- synchronized (this) {
- theResource = super.getResource(name);
- if (theResource == null) {
- if (Debug.verboseOn()) Debug.logVerbose("Remembering invalid resource name: [" + name + "]", module);
- //Debug.logInfo("Remembering invalid resource name: [" + name + "]", module);
- if (isGlobalPath(name)) {
- synchronized (globalBadResourceNameSet) {
- globalBadResourceNameSet.add(name);
- }
- } else {
- this.localBadResourceNameSet.add(name);
- }
+ if (Debug.verboseOn()) {
+ Debug.logVerbose("Cached loader cache miss for resource name: [" + name + "]", module);
+ }
+ // Debug.logInfo("Cached loader cache miss for resource name: [" + name + "]", module);
+ theResource = super.getResource(name);
+ if (theResource == null) {
+ if (Debug.verboseOn())
+ Debug.logVerbose("Remembering invalid resource name: [" + name + "]", module);
+ // Debug.logInfo("Remembering invalid resource name: [" + name + "]", module);
+ if (isGlobalPath(name)) {
+ globalBadResourceNameSet.add(name);
} else {
- if (isGlobalPath(name)) {
- synchronized (globalBadResourceNameSet) {
- globalResourceMap.put(name, theResource);
- }
- } else {
- this.localResourceMap.put(name, theResource);
- }
+ this.localBadResourceNameSet.add(name);
+ }
+ } else {
+ if (isGlobalPath(name)) {
+ globalResourceMap.putIfAbsent(name, theResource);
+ theResource = globalResourceMap.get(name);
+ } else {
+ this.localResourceMap.putIfAbsent(name, theResource);
+ theResource = this.localResourceMap.get(name);
}
}
return theResource;
@@ -266,7 +257,7 @@ public class CachedClassLoader extends U
if (name.startsWith("java.") || name.startsWith("java/") || name.startsWith("/java/")) return true;
if (name.startsWith("javax.") || name.startsWith("javax/") || name.startsWith("/javax/")) return true;
if (name.startsWith("sun.") || name.startsWith("sun/") || name.startsWith("/sun/")) return true;
- if (name.startsWith("org.ofbiz.")) return true;
+ if (name.startsWith("org.ofbiz.") || name.startsWith("org/ofbiz/")) return true;
return false;
}
}