[jboss-svn-commits] JBL Code SVN: r12513 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: common and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Jun 12 15:52:06 EDT 2007
Author: mark.proctor at jboss.com
Date: 2007-06-12 15:52:06 -0400 (Tue, 12 Jun 2007)
New Revision: 12513
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectInputStreamWithLoader.java
Log:
JBRULES-921 Use one ClassLoader for all extractor bytecode generation
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java 2007-06-12 19:51:42 UTC (rev 12512)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java 2007-06-12 19:52:06 UTC (rev 12513)
@@ -21,6 +21,7 @@
import java.lang.reflect.Method;
import org.drools.RuntimeDroolsException;
+import org.drools.common.ObjectInputStreamWithLoader;
import org.drools.spi.FieldExtractor;
/**
@@ -61,8 +62,15 @@
Exception {
//always perform the default de-serialization first
is.defaultReadObject();
- init(null);
+
+ // do not create the extractor yet, readResolver will do this, as it stops duplicate bytecode generation.
}
+
+
+ private Object readResolve() {
+ // always return the value from the cache
+ return ClassFieldExtractorCache.getExtractor( this.clazz, this.fieldName );
+ }
public void init(final ClassLoader classLoader) {
try {
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java 2007-06-12 19:51:42 UTC (rev 12512)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java 2007-06-12 19:52:06 UTC (rev 12513)
@@ -13,25 +13,43 @@
*
*/
public class ClassFieldExtractorCache {
- private Map cache;
+ private static ClassFieldExtractorCache instance = new ClassFieldExtractorCache();
+ private static Map cache;
- public ClassFieldExtractorCache() {
- this.cache = new HashMap();
+ public static ClassFieldExtractorCache getInstance() {
+ return instance;
}
- public ClassFieldExtractor getExtractor(final Class clazz,
- final String fieldName,
- ClassLoader classLoader) {
+ private ClassFieldExtractorCache() {
+
+ }
+
+ public static ClassFieldExtractor getExtractor(final Class clazz,
+ final String fieldName) {
+ return getExtractor( clazz,
+ fieldName,
+ null );
+ }
+
+ public static ClassFieldExtractor getExtractor(final Class clazz,
+ final String fieldName,
+ ClassLoader classLoader) {
+ if ( cache == null ) {
+ cache = new HashMap();
+ }
+
final String key = clazz.getName() + "|" + fieldName;
- if ( this.cache.containsKey( key ) ) {
- return (ClassFieldExtractor) this.cache.get( key );
+
+ if ( cache.containsKey( key ) ) {
+ return (ClassFieldExtractor) cache.get( key );
} else {
final ClassFieldExtractor ex = new ClassFieldExtractor( clazz,
fieldName,
classLoader );
- this.cache.put( key,
- ex );
+ cache.put( key,
+ ex );
return ex;
}
}
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java 2007-06-12 19:51:42 UTC (rev 12512)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java 2007-06-12 19:52:06 UTC (rev 12513)
@@ -60,6 +60,8 @@
private static final ProtectionDomain PROTECTION_DOMAIN;
private static final Map inspectors = new HashMap();
+
+ private static ByteArrayClassLoader byteArrayClassLoader;
static {
PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
@@ -79,6 +81,9 @@
public static BaseClassFieldExtractor getClassFieldExtractor(final Class clazz,
final String fieldName,
final ClassLoader classLoader) {
+ if ( byteArrayClassLoader == null ) {
+ byteArrayClassLoader = new ByteArrayClassLoader( (classLoader != null) ? classLoader : Thread.currentThread().getContextClassLoader() );
+ }
try {
// if it is a self reference
if ( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
@@ -108,7 +113,7 @@
fieldType,
clazz.isInterface() );
// use bytes to get a class
- final ByteArrayClassLoader byteArrayClassLoader = new ByteArrayClassLoader( (classLoader != null) ? classLoader : Thread.currentThread().getContextClassLoader() );
+
final Class newClass = byteArrayClassLoader.defineClass( className.replace( '/',
'.' ),
bytes,
@@ -120,6 +125,7 @@
return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
}
} catch ( final Exception e ) {
+ System.out.println( e );
throw new RuntimeDroolsException( e );
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectInputStreamWithLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectInputStreamWithLoader.java 2007-06-12 19:51:42 UTC (rev 12512)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectInputStreamWithLoader.java 2007-06-12 19:52:06 UTC (rev 12513)
@@ -42,6 +42,10 @@
this.classLoader = classLoader;
enableResolveObject( true );
}
+
+ public ClassLoader getClassLoader() {
+ return this.classLoader;
+ }
protected Class resolveClass(final ObjectStreamClass desc) throws IOException,
ClassNotFoundException {
More information about the jboss-svn-commits
mailing list