Author: tv
Date: Sat Nov 15 13:39:20 2008
New Revision: 717930
URL: http://svn.apache.org/viewvc?rev=717930&view=rev
Log:
Ported the class cache for JavaBaseFactory from Turbine 2.3
Modified:
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
Modified:
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
URL:
http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java?rev=717930&r1=717929&r2=717930&view=diff
==============================================================================
---
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
(original)
+++
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
Sat Nov 15 13:39:20 2008
@@ -20,13 +20,16 @@
* under the License.
*/
-
+import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.turbine.Turbine;
import org.apache.turbine.TurbineConstants;
import org.apache.turbine.modules.Assembler;
@@ -52,6 +55,12 @@
/** Logging */
protected Log log = LogFactory.getLog(this.getClass());
+ /**
+ * A cache for previously obtained Class instances, which we keep in order
+ * to reduce the Class.forName() overhead (which can be sizable).
+ */
+ private Map classCache = Collections.synchronizedMap(new HashMap());
+
static
{
ObjectUtils.addOnce(packages, GenericLoader.getBasePackage());
@@ -74,19 +83,22 @@
{
for (Iterator it = packages.iterator(); it.hasNext();)
{
- StringBuffer className = new StringBuffer();
+ StringBuffer sb = new StringBuffer();
- className.append(it.next());
- className.append('.');
- className.append(packageName);
- className.append('.');
- className.append(name);
+
sb.append(it.next()).append('.').append(packageName).append('.').append(name);
+
+ String className = sb.toString();
log.debug("Trying " + className);
try
{
- Class servClass = Class.forName(className.toString());
+ Class servClass = (Class) classCache.get(className);
+ if(servClass == null)
+ {
+ servClass = Class.forName(className.toString());
+ classCache.put(className, servClass);
+ }
assembler = (Assembler) servClass.newInstance();
break; // for()
}