diff --git a/drools-core/src/main/java/org/drools/factmodel/traits/TraitFactory.java b/drools-core/src/main/java/org/drools/factmodel/traits/TraitFactory.java index 035ec72ed22..a432d2ef832 100644 --- a/drools-core/src/main/java/org/drools/factmodel/traits/TraitFactory.java +++ b/drools-core/src/main/java/org/drools/factmodel/traits/TraitFactory.java @@ -261,9 +261,7 @@ private Class buildProxyClass( String key, K core, Class trait ) { try { BitSet mask = ruleBase.getTraitRegistry().getFieldMask( trait.getName(), cdef.getDefinedClass().getName() ); Class proxyClass = (Class) ruleBase.getRootClassLoader().loadClass( proxyName, true ); - bindAccessors( proxyClass, tdef, cdef, mask ); Class wrapperClass = (Class) ruleBase.getRootClassLoader().loadClass( wrapperName, true ); - bindCoreAccessors( wrapperClass, cdef ); return proxyClass; } catch (ClassNotFoundException e) { e.printStackTrace(); @@ -271,48 +269,6 @@ private Class buildProxyClass( String key, K core, Class trait ) { } } - private void bindAccessors( Class 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 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 ) { @@ -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 ) } ) ); } diff --git a/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapPropertyWrapperClassBuilderImpl.java b/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapPropertyWrapperClassBuilderImpl.java index 8001e2bb8e8..79b393ace87 100644 --- a/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapPropertyWrapperClassBuilderImpl.java +++ b/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapPropertyWrapperClassBuilderImpl.java @@ -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; @@ -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(); diff --git a/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapProxyClassBuilderImpl.java b/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapProxyClassBuilderImpl.java index 04c98c0454d..2544657ba63 100644 --- a/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapProxyClassBuilderImpl.java +++ b/drools-core/src/main/java/org/drools/factmodel/traits/TraitMapProxyClassBuilderImpl.java @@ -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; @@ -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 ); diff --git a/drools-core/src/main/java/org/drools/factmodel/traits/TraitTriplePropertyWrapperClassBuilderImpl.java b/drools-core/src/main/java/org/drools/factmodel/traits/TraitTriplePropertyWrapperClassBuilderImpl.java index a92819d9205..116f0632dae 100644 --- a/drools-core/src/main/java/org/drools/factmodel/traits/TraitTriplePropertyWrapperClassBuilderImpl.java +++ b/drools-core/src/main/java/org/drools/factmodel/traits/TraitTriplePropertyWrapperClassBuilderImpl.java @@ -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; @@ -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(); diff --git a/drools-core/src/main/java/org/drools/factmodel/traits/TraitTripleProxyClassBuilderImpl.java b/drools-core/src/main/java/org/drools/factmodel/traits/TraitTripleProxyClassBuilderImpl.java index da2be6aeee9..8929b3764bf 100644 --- a/drools-core/src/main/java/org/drools/factmodel/traits/TraitTripleProxyClassBuilderImpl.java +++ b/drools-core/src/main/java/org/drools/factmodel/traits/TraitTripleProxyClassBuilderImpl.java @@ -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; @@ -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 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 ) {