Skip to content

Commit

Permalink
Remove Internal write accessors
Browse files Browse the repository at this point in the history
  • Loading branch information
sotty committed Nov 10, 2013
1 parent c3880e0 commit 97e5b97
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 91 deletions.
Expand Up @@ -261,58 +261,14 @@ private Class<T> buildProxyClass( String key, K core, Class<?> trait ) {
try {
BitSet mask = ruleBase.getTraitRegistry().getFieldMask( trait.getName(), cdef.getDefinedClass().getName() );
Class<T> proxyClass = (Class<T>) ruleBase.getRootClassLoader().loadClass( proxyName, true );
bindAccessors( proxyClass, tdef, cdef, mask );
Class<T> wrapperClass = (Class<T>) ruleBase.getRootClassLoader().loadClass( wrapperName, true );
bindCoreAccessors( wrapperClass, cdef );
return proxyClass;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}

private void bindAccessors( Class<T> proxyClass, ClassDefinition tdef, ClassDefinition cdef, BitSet mask ) {
int j = 0;
for ( FieldDefinition traitField : tdef.getFieldsDefinitions() ) {
boolean isSoftField = TraitRegistry.isSoftField( traitField, j++, mask );
if ( ! isSoftField ) {
String traitFieldHook = traitField.resolveAlias( );
FieldDefinition field = cdef.getFieldByAlias( traitFieldHook );

Field staticField;
try {
if ( ( cdef.isFullTraiting() && ( ! traitField.getType().isPrimitive() || field.getType().equals( traitField.getType() ) ) )
|| field.getType().isAssignableFrom( traitField.getType() ) ) {

staticField = proxyClass.getField( traitField.getName() + "_writer" );
staticField.set( null, field.getFieldAccessor().getWriteAccessor() );
}
} catch (NoSuchFieldException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
}

private void bindCoreAccessors( Class<T> wrapperClass, ClassDefinition cdef ) {
for ( FieldDefinition field : cdef.getFieldsDefinitions() ) {
Field staticField;
try {

staticField = wrapperClass.getField(field.getName() + "_writer");
staticField.set(null, field.getFieldAccessor().getWriteAccessor() );
} catch (NoSuchFieldException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}



private Package getPackage(String pack) {
Package pkg = ruleBase.getPackage( pack );
if ( pkg == null ) {
Expand Down Expand Up @@ -497,31 +453,33 @@ public static void invokeExtractor( MethodVisitor mv, String masterName, ClassDe
}


public static void invokeInjector( MethodVisitor mv, String masterName, ClassDefinition source, ClassDefinition target, FieldDefinition field, boolean toNull, int pointer ) {
String fieldName = field.getName();
String fieldType = field.getTypeName();
mv.visitFieldInsn( GETSTATIC,
BuildUtils.getInternalType( masterName ),
fieldName + "_writer",
"Lorg/drools/spi/WriteAccessor;");
public static void invokeInjector( MethodVisitor mv, String masterName, ClassDefinition trait, ClassDefinition core, FieldDefinition field, boolean toNull, int pointer ) {
FieldDefinition tgtField = core.getFieldByAlias( field.resolveAlias() );
String fieldType = tgtField.getTypeName();
String fieldName = tgtField.getName();
String returnType = BuildUtils.getTypeDescriptor( fieldType );


mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn( GETFIELD,
BuildUtils.getInternalType( masterName ),
"object",
BuildUtils.getTypeDescriptor( target.getName() ) );
BuildUtils.getInternalType( masterName ),
"object",
BuildUtils.getTypeDescriptor( core.getName() ) );

if ( toNull ) {
mv.visitInsn( BuildUtils.zero( field.getTypeName() ) );
} else {
mv.visitVarInsn( BuildUtils.varType( fieldType ), pointer );
}
String argType = BuildUtils.isPrimitive( fieldType ) ?
BuildUtils.getTypeDescriptor( fieldType ) :
"Ljava/lang/Object;";
mv.visitMethodInsn( INVOKEINTERFACE,
"org/drools/spi/WriteAccessor",
BuildUtils.injector( fieldType ),
"(Ljava/lang/Object;" + argType + ")V");

if ( ! BuildUtils.isPrimitive( fieldType ) ) {
mv.visitTypeInsn( CHECKCAST, BuildUtils.getInternalType( fieldType ) );
}

mv.visitMethodInsn( INVOKEVIRTUAL,
Type.getInternalName( core.getDefinedClass() ),
BuildUtils.setterName( fieldName, fieldType ),
Type.getMethodDescriptor( Type.getType( void.class ), new Type[] { Type.getType( returnType ) } ) );

}

Expand Down
Expand Up @@ -19,7 +19,6 @@
import org.drools.factmodel.BuildUtils;
import org.drools.factmodel.ClassDefinition;
import org.drools.factmodel.FieldDefinition;
import org.drools.spi.WriteAccessor;
import org.mvel2.asm.ClassVisitor;
import org.mvel2.asm.ClassWriter;
import org.mvel2.asm.FieldVisitor;
Expand Down Expand Up @@ -88,13 +87,6 @@ public byte[] buildClass( ClassDefinition core ) throws IOException,

cw.visitInnerClass( Type.getInternalName( Map.Entry.class ), Type.getInternalName( Map.class ), "Entry", ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT + ACC_INTERFACE );


for ( FieldDefinition fld : core.getFieldsDefinitions() ) {
fv = cw.visitField( ACC_PUBLIC + ACC_STATIC, fld.getName()+"_writer", Type.getDescriptor( WriteAccessor.class ), null, null);
fv.visitEnd();
}


{
fv = cw.visitField( 0, "object", descrCore, null, null );
fv.visitEnd();
Expand Down
Expand Up @@ -21,7 +21,6 @@
import org.drools.factmodel.BuildUtils;
import org.drools.factmodel.ClassDefinition;
import org.drools.factmodel.FieldDefinition;
import org.drools.spi.WriteAccessor;
import org.drools.util.ExternalizableLinkedHashMap;
import org.mvel2.MVEL;
import org.mvel2.asm.ClassVisitor;
Expand Down Expand Up @@ -442,10 +441,6 @@ public byte[] buildClass( ClassDefinition core ) throws IOException,
for ( FieldDefinition field : trait.getFieldsDefinitions() ) {

boolean hardField = ! TraitRegistry.isSoftField( field, j++, mask );
if ( hardField ) {
fv = cw.visitField( ACC_PUBLIC + ACC_STATIC, field.getName() + "_writer", Type.getDescriptor( WriteAccessor.class ), null, null );
fv.visitEnd();
}

if ( core.isFullTraiting() ) {
buildLogicalGetter( cw, field, masterName, trait, core );
Expand Down
Expand Up @@ -22,7 +22,6 @@
import org.drools.factmodel.BuildUtils;
import org.drools.factmodel.ClassDefinition;
import org.drools.factmodel.FieldDefinition;
import org.drools.spi.WriteAccessor;
import org.mvel2.asm.ClassVisitor;
import org.mvel2.asm.ClassWriter;
import org.mvel2.asm.FieldVisitor;
Expand Down Expand Up @@ -99,16 +98,6 @@ public byte[] buildClass( ClassDefinition core ) throws IOException,



for ( FieldDefinition fld : core.getFieldsDefinitions() ) {
fv = cw.visitField( ACC_PUBLIC + ACC_STATIC,
fld.getName() + "_writer",
Type.getDescriptor( WriteAccessor.class ),
null,
null );
fv.visitEnd();
}


{
fv = cw.visitField(0, "object", descrCore, null, null);
fv.visitEnd();
Expand Down
Expand Up @@ -24,7 +24,6 @@
import org.drools.factmodel.BuildUtils;
import org.drools.factmodel.ClassDefinition;
import org.drools.factmodel.FieldDefinition;
import org.drools.spi.WriteAccessor;
import org.mvel2.MVEL;
import org.mvel2.asm.ClassVisitor;
import org.mvel2.asm.ClassWriter;
Expand Down Expand Up @@ -579,11 +578,6 @@ protected void buildProxyAccessors( BitSet mask, ClassWriter cw, String masterNa
protected void buildProxyAccessor( BitSet mask, ClassWriter cw, String masterName, ClassDefinition core, Map<String,Method> mixinGetSet, FieldDefinition field, boolean isSoftField ) {
FieldVisitor fv;

if ( ! isSoftField ) {
fv = cw.visitField( ACC_PUBLIC + ACC_STATIC, field.getName() + "_writer", Type.getDescriptor( WriteAccessor.class ), null, null );
fv.visitEnd();
}

if ( core.isFullTraiting() ) {
buildLogicalGetter( cw, field, masterName, trait, core );
if ( ! isSoftField ) {
Expand Down

0 comments on commit 97e5b97

Please sign in to comment.