[jboss-svn-commits] JBL Code SVN: r9876 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base: extractors and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 1 08:51:01 EST 2007


Author: tirelli
Date: 2007-03-01 08:51:01 -0500 (Thu, 01 Mar 2007)
New Revision: 9876

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/extractors/BaseBooleanClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
Log:
JBRULES-710: caching field inspector instances to avoid recreating it every single time

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-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -20,6 +20,8 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.ProtectionDomain;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.asm.ClassWriter;
@@ -50,30 +52,38 @@
 
 public class ClassFieldExtractorFactory {
 
-    private static final String BASE_PACKAGE = "org/drools/base";
-    
-    private static final String SELF_REFERENCE_FIELD = "this";
+    private static final String           BASE_PACKAGE         = "org/drools/base";
 
+    private static final String           SELF_REFERENCE_FIELD = "this";
+
     private static final ProtectionDomain PROTECTION_DOMAIN;
 
+    private static final Map              inspectors           = new HashMap();
+
     static {
-            PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
-                public Object run() {
-                    return ClassFieldExtractorFactory.class.getProtectionDomain();
-                }
-            } );
+        PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
+            public Object run() {
+                return ClassFieldExtractorFactory.class.getProtectionDomain();
+            }
+        } );
     }
 
     public static BaseClassFieldExtractor getClassFieldExtractor(final Class clazz,
                                                                  final String fieldName) {
         try {
             // if it is a self reference
-            if( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
+            if ( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
                 // then just create an instance of the special class field extractor
-                return new SelfReferenceClassFieldExtractor(clazz, fieldName);
+                return new SelfReferenceClassFieldExtractor( clazz,
+                                                             fieldName );
             } else {
                 // otherwise, bytecode generate a specific extractor
-                final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
+                ClassFieldInspector inspector = (ClassFieldInspector) inspectors.get( clazz );
+                if ( inspector == null ) {
+                    inspector = new ClassFieldInspector( clazz );
+                    inspectors.put( clazz,
+                                    inspector );
+                }
                 final Class fieldType = (Class) inspector.getFieldTypes().get( fieldName );
                 final Method getterMethod = (Method) inspector.getGetterMethods().get( fieldName );
                 final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + "$" + getterMethod.getName();
@@ -89,9 +99,11 @@
                 final Class newClass = classLoader.defineClass( className.replace( '/',
                                                                                    '.' ),
                                                                 bytes,
-                                                                PROTECTION_DOMAIN);
+                                                                PROTECTION_DOMAIN );
                 // instantiating target class
-                final Object[] params = {clazz, fieldName};
+                int index = ((Integer) inspector.getFieldNames().get( fieldName )).intValue();
+                ValueType valueType = ValueType.determineValueType( fieldType );
+                final Object[] params = { index, fieldType, valueType };
                 return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
             }
         } catch ( final Exception e ) {
@@ -112,10 +124,14 @@
                           className,
                           cw );
 
-        buildConstructor( superClass,
-                          className,
-                          cw );
+//        buildConstructor( superClass,
+//                          className,
+//                          cw );
 
+        build3ArgConstructor( superClass,
+                              className,
+                              cw );
+
         buildGetMethod( originalClass,
                         className,
                         superClass,
@@ -148,23 +164,85 @@
                         null );
     }
 
+//    /**
+//     * Creates a constructor for the field extractor receiving
+//     * the class instance and field name
+//     * 
+//     * @param originalClassName
+//     * @param className
+//     * @param cw
+//     */
+//    private static void buildConstructor(final Class superClazz,
+//                                         final String className,
+//                                         final ClassWriter cw) {
+//        MethodVisitor mv;
+//        {
+//            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
+//                                 "<init>",
+//                                 Type.getMethodDescriptor( Type.VOID_TYPE,
+//                                                           new Type[]{Type.getType( Class.class ), Type.getType( String.class )} ),
+//                                 null,
+//                                 null );
+//            mv.visitCode();
+//            final Label l0 = new Label();
+//            mv.visitLabel( l0 );
+//            mv.visitVarInsn( Opcodes.ALOAD,
+//                             0 );
+//            mv.visitVarInsn( Opcodes.ALOAD,
+//                             1 );
+//            mv.visitVarInsn( Opcodes.ALOAD,
+//                             2 );
+//            mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
+//                                Type.getInternalName( superClazz ),
+//                                "<init>",
+//                                Type.getMethodDescriptor( Type.VOID_TYPE,
+//                                                          new Type[]{Type.getType( Class.class ), Type.getType( String.class )} ) );
+//            final Label l1 = new Label();
+//            mv.visitLabel( l1 );
+//            mv.visitInsn( Opcodes.RETURN );
+//            final Label l2 = new Label();
+//            mv.visitLabel( l2 );
+//            mv.visitLocalVariable( "this",
+//                                   "L" + className + ";",
+//                                   null,
+//                                   l0,
+//                                   l2,
+//                                   0 );
+//            mv.visitLocalVariable( "clazz",
+//                                   Type.getDescriptor( Class.class ),
+//                                   null,
+//                                   l0,
+//                                   l2,
+//                                   1 );
+//            mv.visitLocalVariable( "fieldName",
+//                                   Type.getDescriptor( String.class ),
+//                                   null,
+//                                   l0,
+//                                   l2,
+//                                   2 );
+//            mv.visitMaxs( 0,
+//                          0 );
+//            mv.visitEnd();
+//        }
+//    }
+
     /**
-     * Creates a constructor for the shadow proxy receiving
-     * the actual delegate class as parameter
+     * Creates a constructor for the field extractor receiving
+     * the index, field type and value type
      * 
      * @param originalClassName
      * @param className
      * @param cw
      */
-    private static void buildConstructor(final Class superClazz,
-                                         final String className,
-                                         final ClassWriter cw) {
+    private static void build3ArgConstructor(final Class superClazz,
+                                             final String className,
+                                             final ClassWriter cw) {
         MethodVisitor mv;
         {
             mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
                                  "<init>",
                                  Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                           new Type[]{Type.getType( Class.class ), Type.getType( String.class )} ),
+                                                           new Type[]{Type.getType( int.class ), Type.getType( Class.class ), Type.getType( ValueType.class )} ),
                                  null,
                                  null );
             mv.visitCode();
@@ -172,15 +250,17 @@
             mv.visitLabel( l0 );
             mv.visitVarInsn( Opcodes.ALOAD,
                              0 );
-            mv.visitVarInsn( Opcodes.ALOAD,
+            mv.visitVarInsn( Opcodes.ILOAD,
                              1 );
             mv.visitVarInsn( Opcodes.ALOAD,
                              2 );
+            mv.visitVarInsn( Opcodes.ALOAD,
+                             3 );
             mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
                                 Type.getInternalName( superClazz ),
                                 "<init>",
                                 Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                          new Type[]{Type.getType( Class.class ), Type.getType( String.class )} ) );
+                                                          new Type[]{Type.getType( int.class ), Type.getType( Class.class ), Type.getType( ValueType.class )} ) );
             final Label l1 = new Label();
             mv.visitLabel( l1 );
             mv.visitInsn( Opcodes.RETURN );
@@ -192,18 +272,24 @@
                                    l0,
                                    l2,
                                    0 );
-            mv.visitLocalVariable( "clazz",
-                                   Type.getDescriptor( Class.class ),
+            mv.visitLocalVariable( "index",
+                                   Type.getDescriptor( int.class ),
                                    null,
                                    l0,
                                    l2,
                                    1 );
-            mv.visitLocalVariable( "fieldName",
-                                   Type.getDescriptor( String.class ),
+            mv.visitLocalVariable( "fieldType",
+                                   Type.getDescriptor( Class.class ),
                                    null,
                                    l0,
                                    l2,
                                    2 );
+            mv.visitLocalVariable( "valueType",
+                                   Type.getDescriptor( ValueType.class ),
+                                   null,
+                                   l0,
+                                   l2,
+                                   3 );
             mv.visitMaxs( 0,
                           0 );
             mv.visitEnd();
@@ -234,10 +320,10 @@
                                               e );
         }
         final MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                           overridingMethod.getName(),
-                                           Type.getMethodDescriptor( overridingMethod ),
-                                           null,
-                                           null );
+                                                 overridingMethod.getName(),
+                                                 Type.getMethodDescriptor( overridingMethod ),
+                                                 null,
+                                                 null );
 
         mv.visitCode();
 
@@ -349,7 +435,7 @@
 
         public Class defineClass(final String name,
                                  final byte[] bytes,
-                                 ProtectionDomain domain ) {
+                                 ProtectionDomain domain) {
             return defineClass( name,
                                 bytes,
                                 0,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -20,6 +20,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 /**
  * A Base class for primitive boolean class field
@@ -37,6 +38,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseBooleanClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return getBooleanValue( object ) ? Boolean.TRUE : Boolean.FALSE;
     }
@@ -70,15 +86,17 @@
     public short getShortValue(final Object object) {
         throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
     }
-    
+
     public Method getNativeReadMethod() {
         try {
-            return this.getClass().getDeclaredMethod( "getBooleanValue", new Class[] { Object.class } );
+            return this.getClass().getDeclaredMethod( "getBooleanValue",
+                                                      new Class[]{Object.class} );
         } catch ( Exception e ) {
-            throw new RuntimeDroolsException("This is a bug. Please report to development team: "+e.getMessage(), e);
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
         }
     }
-    
+
     public int getHashCode(Object object) {
         return getBooleanValue( object ) ? 1231 : 1237;
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -20,6 +20,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 /**
  * A Base class for primitive byte class field
@@ -37,6 +38,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseByteClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Long( getByteValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseCharClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseCharClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Long( getCharValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseDoubleClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseDoubleClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Double( getDoubleValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseFloatClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseFloatClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Float( getFloatValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseIntClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseIntClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Long( getIntValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseLongClassFieldExtractors extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseLongClassFieldExtractors(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Long( getLongValue( object ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2007-03-01 13:40:17 UTC (rev 9875)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2007-03-01 13:51:01 UTC (rev 9876)
@@ -4,6 +4,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseClassFieldExtractor;
+import org.drools.base.ValueType;
 
 public abstract class BaseShortClassFieldExtractor extends BaseClassFieldExtractor {
 
@@ -15,6 +16,21 @@
                fieldName );
     }
 
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseShortClassFieldExtractor(final int index,
+                                             final Class fieldType,
+                                             final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
     public Object getValue(final Object object) {
         return new Long( getShortValue( object ) );
     }




More information about the jboss-svn-commits mailing list