[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