[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