[jboss-svn-commits] JBL Code SVN: r35984 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/factmodel and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 15 20:04:43 EST 2010


Author: mark.proctor at jboss.com
Date: 2010-11-15 20:04:42 -0500 (Mon, 15 Nov 2010)
New Revision: 35984

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsCompositeClassLoader.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java
Log:
-removed classloader crap from ClassBuilder
-removed injecting of byte[] into the app classloader

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2010-11-15 23:23:26 UTC (rev 35983)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2010-11-16 01:04:42 UTC (rev 35984)
@@ -1070,7 +1070,7 @@
                                       TypeDeclaration type,
                                       PackageRegistry pkgRegistry) {
         // need to fix classloader?
-        ClassBuilder cb = new ClassBuilder();
+        ClassBuilder cb = new ClassBuilder( );
         String fullName = typeDescr.getNamespace() + "." + typeDescr.getTypeName();
         // generated beans should be serializable
 
@@ -1116,15 +1116,8 @@
                 field = queue.poll();
             }
 
-
-
-
-
-
-
             byte[] d = cb.buildClass(def);
 
-
             JavaDialectRuntimeData dialect = (JavaDialectRuntimeData) pkgRegistry.getDialectRuntimeRegistry().getDialectData( "java" );
 
             dialect.write( JavaDialectRuntimeData.convertClassToResourcePath( fullName ),

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java	2010-11-15 23:23:26 UTC (rev 35983)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java	2010-11-16 01:04:42 UTC (rev 35984)
@@ -49,81 +49,17 @@
  */
 public class ClassBuilder {
     private boolean     debug  = false;
-    private ClassLoader loader = null;
 
     public ClassBuilder() {
-        this( null,
-              "true".equalsIgnoreCase( System.getProperty( "org.drools.classbuilder.debug" ) ) );
+        this( "true".equalsIgnoreCase( System.getProperty( "org.drools.classbuilder.debug" ) ) );
     }
 
     public ClassBuilder(final boolean debug) {
-        this( null,
-              debug );
-    }
-
-    public ClassBuilder(final ClassLoader loader) {
-        this( loader,
-              false );
-    }
-
-    public ClassBuilder(final ClassLoader loader,
-                        final boolean debug) {
-        this.loader = loader;
-        if ( this.loader == null ) {
-            this.loader = Thread.currentThread().getContextClassLoader();
-            if ( this.loader == null ) {
-                this.loader = getClass().getClassLoader();
-            }
-        }
         this.debug = debug;
     }
 
 
-
-
-
     /**
-     * Loads a class once it has been created in serialized form
-     *
-     * @param classDef the class definition object structure
-     * @param serializedClazz the serialized class
-     *
-     * @return the Class instance for the given class definition
-     *
-     * @throws IOException
-     * @throws IntrospectionException
-     * @throws InvocationTargetException
-     * @throws IllegalAccessException
-     * @throws NoSuchMethodException
-     * @throws ClassNotFoundException
-     * @throws IllegalArgumentException
-     * @throws SecurityException
-     * @throws NoSuchFieldException
-     * @throws InstantiationException
-     */
-    public Class< ? > loadBuiltClass(ClassDefinition classDef, byte[] serializedClazz) throws IOException,
-                                                                 IntrospectionException,
-                                                                 SecurityException,
-                                                                 IllegalArgumentException,
-                                                                 ClassNotFoundException,
-                                                                 NoSuchMethodException,
-                                                                 IllegalAccessException,
-                                                                 InvocationTargetException,
-                                                                 InstantiationException,
-                                                                 NoSuchFieldException {
-
-        try {
-            Class< ? > clazz = Class.forName( classDef.getClassName() );
-            return clazz;
-        } catch ( ClassNotFoundException e ) {
-            Class< ? > clazz = this.loadClass( classDef.getClassName(),serializedClazz );
-            classDef.setDefinedClass( clazz );
-            return clazz;
-        }
-
-    }
-
-    /**
      * Dynamically builds, defines and loads a class based on the given class definition
      *
      * @param classDef the class definition object structure
@@ -141,53 +77,6 @@
      * @throws NoSuchFieldException
      * @throws InstantiationException
      */
-    public Class< ? > buildAndLoadClass(ClassDefinition classDef) throws IOException,
-                                                                 IntrospectionException,
-                                                                 SecurityException,
-                                                                 IllegalArgumentException,
-                                                                 ClassNotFoundException,
-                                                                 NoSuchMethodException,
-                                                                 IllegalAccessException,
-                                                                 InvocationTargetException,
-                                                                 InstantiationException,
-                                                                 NoSuchFieldException {
-        try {
-            Class< ? > clazz = Class.forName( classDef.getClassName() );
-
-            classDef.setDefinedClass( clazz );
-
-            return clazz;
-
-        } catch ( ClassNotFoundException e ) {
-            // class not loaded, so create and load it
-            byte[] serializedClazz = this.buildClass( classDef );
-
-           // Class< ? > clazz = this.loadClass( classDef.getClassName(),
-           //                                    serializedClazz );
-           // classDef.setDefinedClass( clazz );
-            Class< ? >  clazz = Class.forName( classDef.getClassName() );
-            return clazz;
-        }
-    }
-
-    /**
-     * Dynamically builds, defines and loads a class based on the given class definition
-     *
-     * @param classDef the class definition object structure
-     *
-     * @return the Class instance for the given class definition
-     *
-     * @throws IOException
-     * @throws IntrospectionException
-     * @throws InvocationTargetException
-     * @throws IllegalAccessException
-     * @throws NoSuchMethodException
-     * @throws ClassNotFoundException
-     * @throws IllegalArgumentException
-     * @throws SecurityException
-     * @throws NoSuchFieldException
-     * @throws InstantiationException
-     */
     public byte[] buildClass(ClassDefinition classDef) throws IOException,
                                                       IntrospectionException,
                                                       SecurityException,
@@ -254,7 +143,6 @@
         cw.visitEnd();
 
         byte[] serializedClass = cw.toByteArray();
-            loadBuiltClass(classDef, serializedClass);
 
         return serializedClass;
     }
@@ -1038,32 +926,6 @@
         }
     }
 
-    private Class< ? > loadClass(String classname,
-                                 byte[] b) throws ClassNotFoundException,
-                                          SecurityException,
-                                          NoSuchMethodException,
-                                          IllegalArgumentException,
-                                          IllegalAccessException,
-                                          InvocationTargetException {
-        //override classDefine (as it is protected) and define the class.
-        Class< ? > clazz = null;
-        ClassLoader loader = ClassBuilder.class.getClassLoader();
-        Class< ? > cls = Class.forName( "java.lang.ClassLoader" );
-        java.lang.reflect.Method method = cls.getDeclaredMethod( "defineClass",
-                                                                 new Class[]{String.class, byte[].class, int.class, int.class} );
-
-        // protected method invocaton
-        method.setAccessible( true );
-        try {
-            Object[] args = new Object[]{classname, b, new Integer( 0 ), new Integer( b.length )};
-            clazz = (Class< ? >) method.invoke( loader,
-                                                args );
-        } finally {
-            method.setAccessible( false );
-        }
-        return clazz;
-    }
-
     /**
      * Returns the corresponding internal type representation for the
      * given type.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsCompositeClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsCompositeClassLoader.java	2010-11-15 23:23:26 UTC (rev 35983)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsCompositeClassLoader.java	2010-11-16 01:04:42 UTC (rev 35984)
@@ -40,7 +40,8 @@
     }
 
     public synchronized void addClassLoader(final ClassLoader classLoader) {
-        if ( classLoader == null ) {
+        if ( classLoader == null || classLoader == this ) {
+            // do not add a null classloader or add itself
             return;
         }
         /* NB: we need synchronized here even though we use a COW list:

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java	2010-11-15 23:23:26 UTC (rev 35983)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java	2010-11-16 01:04:42 UTC (rev 35984)
@@ -31,23 +31,43 @@
 
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassFieldAccessorStore;
+import org.drools.rule.DroolsCompositeClassLoader;
+import org.drools.rule.JavaDialectRuntimeData;
+import org.drools.rule.JavaDialectRuntimeData.PackageClassLoader;
 
 public class ClassBuilderTest extends TestCase {
 
     ClassFieldAccessorStore store = new ClassFieldAccessorStore();
-    private ClassLoader     classLoader;
-
+    ClassLoader classLoader;
+    JavaDialectRuntimeData data;
+    
     protected void setUp() throws Exception {
         super.setUp();
-        classLoader = this.getClass().getClassLoader();
-        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( classLoader ) );
-        store.setEagerWire( true );
+        data = new JavaDialectRuntimeData();        
     }
 
     protected void tearDown() throws Exception {
         super.tearDown();
     }
 
+    private Class build(ClassBuilder builder, ClassDefinition classDef) throws Exception {
+        byte[] d = builder.buildClass( classDef);
+                     
+        data.write( JavaDialectRuntimeData.convertClassToResourcePath( classDef.getClassName() ),
+                       d );
+        classLoader = new PackageClassLoader(data, new DroolsCompositeClassLoader( getClass().getClassLoader(), false ));
+        
+        this.store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( classLoader ) );
+        store.setEagerWire( true );            
+        
+        Class clazz = classLoader.loadClass( classDef.getClassName() );
+        classDef.setDefinedClass( clazz );    
+        
+        return clazz;
+        
+    }
+    
     /*
      * Test method for 'org.drools.common.asm.ClassBuilder.buildClass(ClassDefinition)'
      */
@@ -65,8 +85,11 @@
                                                              "java.lang.String" );//"java.lang.String" );
             classDef.addField( intDef );
             classDef.addField( stringDef );
+            
+            Class clazz = build(builder, classDef);
 
-            Class clazz = builder.buildAndLoadClass( classDef );
+            
+            
             intDef.setReadWriteAccessor( store.getAccessor( clazz,
                                                             intDef.getName(),
                                                             classLoader ) );
@@ -74,7 +97,7 @@
                                                                stringDef.getName(),
                                                                classLoader ) );
 
-            byte[] data = builder.buildClass( classDef );
+            byte[] d = builder.buildClass( classDef );
 
             Assert.assertSame( "Returned class should be the same",
                                clazz,
@@ -100,7 +123,7 @@
                                  ((Integer) intDef.getValue( instance )).intValue() );
 
             // testing class rebuilding
-            clazz = builder.buildAndLoadClass( classDef );
+            clazz = build(builder, classDef);
 
         } catch ( Exception e ) {
             e.printStackTrace();
@@ -160,7 +183,7 @@
             classDef.addField( dateDef );
             classDef.addField( str2Def );
 
-            Class clazz = builder.buildAndLoadClass( classDef );
+            Class clazz = build(builder, classDef);
             long1Def.setReadWriteAccessor( store.getAccessor( clazz,
                                                               long1Def.getName(),
                                                               classLoader ) );
@@ -270,7 +293,7 @@
             classDef.addField( intDef );
             classDef.addField( strDef );
 
-            Class clazz = builder.buildAndLoadClass( classDef );
+            Class clazz = build(builder, classDef);
             intDef.setReadWriteAccessor( store.getAccessor( clazz,
                                                             intDef.getName(),
                                                             classLoader ) );
@@ -333,7 +356,7 @@
             classDef.addField( dateDef );
             classDef.addField( str2Def );
 
-            Class clazz = builder.buildAndLoadClass( classDef );
+            Class clazz = build(builder, classDef);
             long1Def.setReadWriteAccessor( store.getAccessor( clazz,
                                                               long1Def.getName(),
                                                               classLoader ) );
@@ -410,7 +433,7 @@
                 classDef.addField( fields[i] );
             }
 
-            Class< ? > clazz = builder.buildAndLoadClass( classDef );
+            Class clazz = build(builder, classDef);
 
             for ( FieldDefinition field : fields ) {
                 field.setReadWriteAccessor( store.getAccessor( clazz,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java	2010-11-15 23:23:26 UTC (rev 35983)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java	2010-11-16 01:04:42 UTC (rev 35984)
@@ -19,6 +19,12 @@
 import java.util.Calendar;
 import java.util.Date;
 
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
+import org.drools.rule.DroolsCompositeClassLoader;
+import org.drools.rule.JavaDialectRuntimeData;
+import org.drools.rule.JavaDialectRuntimeData.PackageClassLoader;
+
 import junit.framework.TestCase;
 
 /**
@@ -40,6 +46,23 @@
 		</dimension> 
  */	
 
+    private Class build(ClassBuilder builder, ClassDefinition classDef) throws Exception {
+        byte[] d = builder.buildClass( classDef);
+        JavaDialectRuntimeData data = new JavaDialectRuntimeData();  
+        data.write( JavaDialectRuntimeData.convertClassToResourcePath( classDef.getClassName() ),
+                       d );
+        ClassLoader classLoader = new PackageClassLoader(data, new DroolsCompositeClassLoader( getClass().getClassLoader(), false ));
+        
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( classLoader ) );
+        store.setEagerWire( true );            
+        
+        Class clazz = classLoader.loadClass( classDef.getClassName() );
+        classDef.setDefinedClass( clazz );    
+        
+        return clazz;
+        
+    }    
 	
 	public void testInstanceHashcodes() {
 		
@@ -65,7 +88,7 @@
 		Date d2 = cal.getTime();
 			
 		try {
-			Class klass = cb.buildAndLoadClass(cd);
+			Class klass = build(cb, cd);
 			Object o1 = klass.newInstance();
 			cd.getField("cutDate").getFieldAccessor().setValue(o1, cut);
 			cd.getField("dueDate").getFieldAccessor().setValue(o1, d1);



More information about the jboss-svn-commits mailing list