[jboss-svn-commits] JBL Code SVN: r19971 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/rule/builder and 30 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 16 14:29:20 EDT 2008


Author: tirelli
Date: 2008-05-16 14:29:20 -0400 (Fri, 16 May 2008)
New Revision: 19971

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayElementReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldWriter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/InternalReadAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/WriteAccessor.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java
   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/ArrayExtractor.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/BaseObjectClassFieldExtractor.java
   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/MVELClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessorBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/FieldAccessorBuilderTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/Dialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BeforeEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CoincidesEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DuringEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishedByEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishesEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IncludesEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MeetsEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MetByEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlappedByEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlapsEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartedByEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartsEvaluatorDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInput.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldDefinition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/TypeDeclaration.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/ClassFieldInspector.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TemporalEvaluatorFactoryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/RightTupleIndexHashTableTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/asm/ClassFieldInspectorTest.java
Log:
Refactoring extrators into read accessors and unifying the write accessors framework

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/Dialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/Dialect.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/Dialect.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -4,7 +4,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TypeResolver;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.FunctionDescr;
@@ -50,7 +50,7 @@
 
     TypeResolver getTypeResolver();
 
-    ClassFieldExtractorCache getClassFieldExtractorCache();
+    ClassFieldAccessorCache getClassFieldExtractorCache();
 
     SalienceBuilder getSalienceBuilder();
 

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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassTypeResolver;
 import org.drools.base.TypeResolver;
 import org.drools.commons.jci.problems.CompilationProblem;
@@ -58,7 +58,7 @@
 import org.drools.rule.TypeDeclaration;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.RuleBuilder;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.xml.XmlPackageReader;
 import org.drools.xml.XmlProcessReader;
 import org.xml.sax.SAXException;
@@ -84,7 +84,7 @@
 
     private TypeResolver                typeResolver;
 
-    private ClassFieldExtractorCache    classFieldExtractorCache;
+    private ClassFieldAccessorCache    classFieldExtractorCache;
 
     private RuleBuilder                 ruleBuilder;
 
@@ -143,7 +143,7 @@
         this.configuration = configuration;
         this.results = new ArrayList();
         this.pkg = pkg;
-        this.classFieldExtractorCache = ClassFieldExtractorCache.getInstance();
+        this.classFieldExtractorCache = ClassFieldAccessorCache.getInstance();
 
         if ( this.pkg != null ) {
         	ClassLoader cl = this.pkg.getDialectDatas().getClassLoader();
@@ -473,7 +473,7 @@
             String duration = typeDescr.getMetaAttribute( TypeDeclaration.ATTR_DURATION );
             if ( duration != null ) {
                 type.setDurationAttribute( duration );
-                FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( type.getTypeClass(),
+                InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( type.getTypeClass(),
                                                                                                 duration,
                                                                                                 this.configuration.getClassLoader() );
                 type.setDurationExtractor( extractor );
@@ -619,7 +619,7 @@
      * @return
      *      the ClsasFieldExtractorCache
      */
-    public ClassFieldExtractorCache getClassFieldExtractorCache() {
+    public ClassFieldAccessorCache getClassFieldExtractorCache() {
         return this.classFieldExtractorCache;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -73,8 +73,8 @@
 import org.drools.rule.builder.dialect.mvel.MVELDialect;
 import org.drools.spi.Constraint;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
 import org.drools.spi.Restriction;
 import org.drools.spi.Constraint.ConstraintType;
@@ -296,7 +296,7 @@
         }
 
         // if it is not a complex expression, just build a simple field constraint
-        final FieldExtractor extractor = getFieldExtractor( context,
+        final InternalReadAccessor extractor = getFieldExtractor( context,
                                                             fieldConstraintDescr,
                                                             pattern.getObjectType(),
                                                             fieldName,
@@ -431,7 +431,7 @@
                                           final Pattern pattern,
                                           final FieldConstraintDescr fieldConstraintDescr,
                                           final RestrictionConnectiveDescr top,
-                                          final FieldExtractor extractor) {
+                                          final InternalReadAccessor extractor) {
         Restriction[] restrictions = new Restriction[top.getRestrictions().size()];
         int index = 0;
 
@@ -499,7 +499,7 @@
             return;
         }
 
-        final FieldExtractor extractor = getFieldExtractor( context,
+        final InternalReadAccessor extractor = getFieldExtractor( context,
                                                             fieldBindingDescr,
                                                             pattern.getObjectType(),
                                                             fieldBindingDescr.getFieldName(),
@@ -617,7 +617,7 @@
         final FieldBindingDescr implicitBinding = new FieldBindingDescr( identifier,
                                                                          identifier );
 
-        final FieldExtractor extractor = getFieldExtractor( context,
+        final InternalReadAccessor extractor = getFieldExtractor( context,
                                                             implicitBinding,
                                                             pattern.getObjectType(),
                                                             implicitBinding.getFieldName(),
@@ -635,7 +635,7 @@
 
     private Restriction buildRestriction(final RuleBuildContext context,
                                          final Pattern pattern,
-                                         final FieldExtractor extractor,
+                                         final InternalReadAccessor extractor,
                                          final FieldConstraintDescr fieldConstraintDescr,
                                          final RestrictionDescr restrictionDescr) {
         Restriction restriction = null;
@@ -667,7 +667,7 @@
     }
 
     private VariableRestriction buildRestriction(final RuleBuildContext context,
-                                                 final FieldExtractor extractor,
+                                                 final InternalReadAccessor extractor,
                                                  final FieldConstraintDescr fieldConstraintDescr,
                                                  final VariableRestrictionDescr variableRestrictionDescr) {
         if ( variableRestrictionDescr.getIdentifier() == null || variableRestrictionDescr.getIdentifier().equals( "" ) ) {
@@ -713,7 +713,7 @@
     }
 
     private LiteralRestriction buildRestriction(final RuleBuildContext context,
-                                                final FieldExtractor extractor,
+                                                final InternalReadAccessor extractor,
                                                 final FieldConstraintDescr fieldConstraintDescr,
                                                 final LiteralRestrictionDescr literalRestrictionDescr) {
         FieldValue field = null;
@@ -747,7 +747,7 @@
     }
 
     private Restriction buildRestriction(final RuleBuildContext context,
-                                         final FieldExtractor extractor,
+                                         final InternalReadAccessor extractor,
                                          final FieldConstraintDescr fieldConstraintDescr,
                                          final QualifiedIdentifierRestrictionDescr qiRestrictionDescr) {
         FieldValue field = null;
@@ -839,7 +839,7 @@
 
     private ReturnValueRestriction buildRestriction(final RuleBuildContext context,
                                                     final Pattern pattern,
-                                                    final FieldExtractor extractor,
+                                                    final InternalReadAccessor extractor,
                                                     final FieldConstraintDescr fieldConstraintDescr,
                                                     final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
         Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
@@ -895,12 +895,12 @@
         return returnValueRestriction;
     }
 
-    private FieldExtractor getFieldExtractor(final RuleBuildContext context,
+    private InternalReadAccessor getFieldExtractor(final RuleBuildContext context,
                                              final BaseDescr descr,
                                              final ObjectType objectType,
                                              final String fieldName,
                                              final boolean reportError) {
-        FieldExtractor extractor = null;
+        InternalReadAccessor extractor = null;
 
         if ( ValueType.FACTTEMPLATE_TYPE.equals(objectType.getValueType()) ) {
             //@todo use extractor cache            
@@ -910,7 +910,7 @@
         } else {
             try {
                 ClassLoader classloader = context.getPkg().getDialectDatas().getClassLoader();
-                extractor = context.getDialect().getClassFieldExtractorCache().getExtractor( ((ClassObjectType) objectType).getClassType(),
+                extractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
                                                                                              fieldName,
                                                                                              classloader );
             } catch ( final RuntimeDroolsException e ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -6,14 +6,13 @@
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
-import org.drools.base.extractors.ArrayExtractor;
+import org.drools.base.extractors.ArrayElementReader;
 import org.drools.compiler.DescrBuildError;
 import org.drools.lang.descr.QueryDescr;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Pattern;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
 
 public class QueryBuilder {
@@ -25,7 +24,7 @@
                                              objectType,
                                              null );
         ClassLoader classloader = context.getPkg().getDialectDatas().getClassLoader();
-        final FieldExtractor extractor = context.getDialect().getClassFieldExtractorCache().getExtractor( DroolsQuery.class,
+        final InternalReadAccessor extractor = context.getDialect().getClassFieldExtractorCache().getReader( DroolsQuery.class,
                                                                                                           "name",
                                                                                                           classloader );
 
@@ -39,9 +38,9 @@
         // adds appropriate constraint to the pattern
         pattern.addConstraint( constraint );
 
-        Extractor arrayExtractor = null;
+        InternalReadAccessor arrayExtractor = null;
         try {
-            arrayExtractor = context.getDialect().getClassFieldExtractorCache().getExtractor( ((ClassObjectType) objectType).getClassType(),
+            arrayExtractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
                                                                                               "arguments",
                                                                                               classloader );
         } catch ( final RuntimeDroolsException e ) {
@@ -57,7 +56,7 @@
         try {
             for ( i = 0; i < params.length; i++ ) {
                 pattern.addDeclaration( params[i],
-                                        new ArrayExtractor( arrayExtractor,
+                                        new ArrayElementReader( arrayExtractor,
                                                             i,
                                                             context.getDialect().getTypeResolver().resolveType( types[i] ) ) );
             }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -12,7 +12,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TypeResolver;
 import org.drools.commons.jci.compilers.CompilationResult;
 import org.drools.commons.jci.compilers.JavaCompiler;
@@ -120,7 +120,7 @@
     private PackageBuilder packageBuilder;
 
     private TypeResolver typeResolver;
-    private ClassFieldExtractorCache classFieldExtractorCache;
+    private ClassFieldAccessorCache classFieldExtractorCache;
 
     // a map of registered builders
     private static Map builders;
@@ -293,7 +293,7 @@
      *
      * @return
      */
-    public ClassFieldExtractorCache getClassFieldExtractorCache() {
+    public ClassFieldAccessorCache getClassFieldExtractorCache() {
         return this.classFieldExtractorCache;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -14,7 +14,7 @@
 import java.util.Set;
 import java.util.Map.Entry;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ModifyInterceptor;
 import org.drools.base.TypeResolver;
 import org.drools.base.mvel.MVELDebugHandler;
@@ -110,7 +110,7 @@
     protected MVELDialectData data;
     private MVELDialectConfiguration configuration;
     private TypeResolver typeResolver;
-    private ClassFieldExtractorCache classFieldExtractorCache;
+    private ClassFieldAccessorCache classFieldExtractorCache;
     private MVELExprAnalyzer analyzer;
 
     private Map imports;
@@ -134,7 +134,7 @@
         data = (MVELDialectData) in.readObject();
         configuration = (MVELDialectConfiguration) in.readObject();
         typeResolver = (TypeResolver) in.readObject();
-        classFieldExtractorCache = (ClassFieldExtractorCache) in.readObject();
+        classFieldExtractorCache = (ClassFieldAccessorCache) in.readObject();
         analyzer = (MVELExprAnalyzer) in.readObject();
         imports = (Map) in.readObject();
         packageImports = (Map) in.readObject();
@@ -554,7 +554,7 @@
         return this.builders;
     }
 
-    public ClassFieldExtractorCache getClassFieldExtractorCache() {
+    public ClassFieldAccessorCache getClassFieldExtractorCache() {
         return this.classFieldExtractorCache;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -8,7 +8,7 @@
 
 import junit.framework.TestCase;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TypeResolver;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.AttributeDescr;
@@ -355,7 +355,7 @@
             return null;
         }
 
-        public ClassFieldExtractorCache getClassFieldExtractorCache() {
+        public ClassFieldAccessorCache getClassFieldExtractorCache() {
             return null;
         }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -17,16 +17,12 @@
  */
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.ObjectInput;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
 import java.io.Reader;
 import java.io.StringReader;
-import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
@@ -83,7 +79,6 @@
 import org.drools.StatelessSession;
 import org.drools.TestParam;
 import org.drools.WorkingMemory;
-import org.drools.util.DroolsStreamUtils;
 import org.drools.Cheesery.Maturity;
 import org.drools.audit.WorkingMemoryFileLogger;
 import org.drools.audit.WorkingMemoryInMemoryLogger;
@@ -127,6 +122,7 @@
 import org.drools.spi.Activation;
 import org.drools.spi.ConsequenceExceptionHandler;
 import org.drools.spi.GlobalResolver;
+import org.drools.util.DroolsStreamUtils;
 import org.drools.xml.XmlDumper;
 
 /** Run all the tests with the ReteOO engine implementation */
@@ -544,8 +540,6 @@
         Package p = builder.getPackage();
         assertEquals(2, p.getRules().length);
 
-
-
         //to test it we will generate another class that looks just like it
         ClassBuilder cb = new ClassBuilder();
         ClassDefinition def = new ClassDefinition("org.drools.generatedbeans.Cheese");

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -9,7 +9,7 @@
 
 import org.drools.Cheese;
 import org.drools.Person;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.rule.Declaration;
 import org.drools.spi.PatternExtractor;
@@ -23,11 +23,11 @@
 
 public class AccumulateTemplateTest extends TestCase {
 
-    private ClassFieldExtractorCache cache;
+    private ClassFieldAccessorCache cache;
 
     protected void setUp() throws Exception {
         super.setUp();
-        cache = ClassFieldExtractorCache.getInstance();
+        cache = ClassFieldAccessorCache.getInstance();
     }
 
     protected void tearDown() throws Exception {
@@ -46,7 +46,7 @@
         final Declaration[] inner = new Declaration[]{new Declaration( "cheese",
                                                                        new PatternExtractor( new ClassObjectType( Cheese.class ) ),
                                                                        null ), new Declaration( "price",
-                                                                                                cache.getExtractor( Cheese.class,
+                                                                                                cache.getReader( Cheese.class,
                                                                                                                     "price",
                                                                                                                     getClass().getClassLoader() ),
                                                                                                 null )};
@@ -119,18 +119,18 @@
 
         final String[] declarationTypes = new String[]{"String", "int"};
         final Declaration[] declarations = new Declaration[]{new Declaration( "name",
-                                                                              cache.getExtractor( Person.class,
+                                                                              cache.getReader( Person.class,
                                                                                                   "name",
                                                                                                   getClass().getClassLoader() ),
                                                                               null ), new Declaration( "age",
-                                                                                                       cache.getExtractor( Person.class,
+                                                                                                       cache.getReader( Person.class,
                                                                                                                            "age",
                                                                                                                            getClass().getClassLoader() ),
                                                                                                        null )};
         final Declaration[] inner = new Declaration[]{new Declaration( "cheese",
                                                                        new PatternExtractor( new ClassObjectType( Cheese.class ) ),
                                                                        null ), new Declaration( "price",
-                                                                                                cache.getExtractor( Cheese.class,
+                                                                                                cache.getReader( Cheese.class,
                                                                                                                     "price",
                                                                                                                     getClass().getClassLoader() ),
                                                                                                 null )};
@@ -203,11 +203,11 @@
 
         final String[] declarationTypes = new String[]{"String", "int"};
         final Declaration[] declarations = new Declaration[]{new Declaration( "name",
-                                                                              cache.getExtractor( Person.class,
+                                                                              cache.getReader( Person.class,
                                                                                                   "name",
                                                                                                   getClass().getClassLoader() ),
                                                                               null ), new Declaration( "age",
-                                                                                                       cache.getExtractor( Person.class,
+                                                                                                       cache.getReader( Person.class,
                                                                                                                            "age",
                                                                                                                            getClass().getClassLoader() ),
                                                                                                        null )};

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -9,7 +9,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
@@ -22,14 +22,14 @@
 import org.drools.rule.EvalCondition;
 import org.drools.rule.Package;
 import org.drools.rule.Pattern;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class MVELEvalBuilderTest extends TestCase {
 
-    private ClassFieldExtractorCache cache;
+    private ClassFieldAccessorCache cache;
 
     public void setUp() {
-        cache = ClassFieldExtractorCache.getInstance();
+        cache = ClassFieldAccessorCache.getInstance();
     }
 
     public void testSimpleExpression() {
@@ -48,7 +48,7 @@
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
 
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "price",
                                                              getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -10,7 +10,7 @@
 import org.drools.Cheese;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -25,11 +25,11 @@
 import org.drools.rule.Pattern;
 import org.drools.rule.PredicateConstraint;
 import org.drools.rule.PredicateConstraint.PredicateContextEntry;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class MVELPredicateBuilderTest extends TestCase {
 
-    private ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    private ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
 
     public void setUp() {
     }
@@ -49,7 +49,7 @@
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "price",
                                                              getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -10,7 +10,7 @@
 import org.drools.Cheese;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
@@ -27,14 +27,14 @@
 import org.drools.rule.Package;
 import org.drools.rule.Pattern;
 import org.drools.rule.ReturnValueRestriction;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class MVELReturnValueBuilderTest extends TestCase {
 
-    private ClassFieldExtractorCache cache;
+    private ClassFieldAccessorCache cache;
 
     public void setUp() {
-        cache = ClassFieldExtractorCache.getInstance();
+        cache = ClassFieldAccessorCache.getInstance();
     }
 
     public void testSimpleExpression() {
@@ -52,7 +52,7 @@
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "price",
                                                              getClass().getClassLoader() );
 

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,131 +0,0 @@
-package org.drools.base;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.drools.RuntimeDroolsException;
-import org.drools.spi.FieldExtractor;
-import org.drools.util.ClassUtils;
-import org.drools.util.asm.ClassFieldInspector;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-
-/**
- * This is the supertype for the ASM generated classes for accessing a field.
- * @author Alexander Bagerman
- */
-abstract public class BaseClassFieldExtractor
-    implements
-    FieldExtractor {
-    private int       index;
-
-    private Class     fieldType;
-
-    private ValueType valueType;
-
-    public BaseClassFieldExtractor() {
-
-    }
-
-    /**
-     * This constructor is not supposed to be used from outside the class hirarchy
-     *
-     * @param index
-     * @param fieldType
-     * @param valueType
-     */
-    protected BaseClassFieldExtractor(final int index,
-                                      final Class fieldType,
-                                      final ValueType valueType) {
-        this.index = index;
-        this.fieldType = fieldType;
-        this.valueType = valueType;
-    }
-
-    /**
-     * This is the constructor to be used
-     *
-     * @param clazz
-     * @param fieldName
-     */
-    public BaseClassFieldExtractor(final Class clazz,
-                                   final String fieldName) {
-        try {
-            final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
-            this.index = ((Integer) inspector.getFieldNames().get( fieldName )).intValue();
-            this.fieldType = (Class) inspector.getFieldTypes().get( fieldName );
-            this.valueType = ValueType.determineValueType( this.fieldType );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( e );
-        }
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        index   = in.readInt();
-        fieldType   = (Class)in.readObject();
-        valueType   = (ValueType)in.readObject();
-        if (valueType != null)
-            valueType   = ValueType.determineValueType(valueType.getClassType());
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeInt(index);
-        out.writeObject(fieldType);
-        out.writeObject(valueType);
-    }
-
-    public int getIndex() {
-        return this.index;
-    }
-
-    public Class getExtractToClass() {
-        return this.fieldType;
-    }
-
-    public String getExtractToClassName() {
-        return ClassUtils.canonicalName( this.fieldType );
-    }
-
-    public ValueType getValueType() {
-        return this.valueType;
-    }
-
-    public boolean isGlobal() {
-        return false;
-    }
-
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + this.fieldType.hashCode();
-        result = PRIME * result + this.index;
-        result = PRIME * result + this.valueType.hashCode();
-        return result;
-    }
-
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
-        if ( !(object instanceof BaseClassFieldExtractor) ) {
-            return false;
-        }
-        final BaseClassFieldExtractor other = (BaseClassFieldExtractor) object;
-        return this.fieldType == other.fieldType && this.index == other.index && this.valueType.equals( other.valueType );
-    }
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,187 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.util.ClassUtils;
+import org.drools.util.asm.ClassFieldInspector;
+
+/**
+ * This is the supertype for the ASM generated classes for accessing a field.
+ * @author Alexander Bagerman
+ */
+abstract public class BaseClassFieldReader
+    implements
+    org.drools.spi.InternalReadAccessor {
+
+    private int        index;
+
+    private Class< ? > fieldType;
+
+    private ValueType  valueType;
+
+    public BaseClassFieldReader() {
+
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     *
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseClassFieldReader(final int index,
+                                      final Class fieldType,
+                                      final ValueType valueType) {
+        this.index = index;
+        this.fieldType = fieldType;
+        this.valueType = valueType;
+    }
+
+    /**
+     * This is the constructor to be used
+     *
+     * @param clazz
+     * @param fieldName
+     */
+    public BaseClassFieldReader(final Class clazz,
+                                   final String fieldName) {
+        try {
+            final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
+            this.index = ((Integer) inspector.getFieldNames().get( fieldName )).intValue();
+            this.fieldType = (Class) inspector.getFieldTypes().get( fieldName );
+            this.valueType = ValueType.determineValueType( this.fieldType );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        index = in.readInt();
+        fieldType = (Class) in.readObject();
+        valueType = (ValueType) in.readObject();
+        if ( valueType != null ) valueType = ValueType.determineValueType( valueType.getClassType() );
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt( index );
+        out.writeObject( fieldType );
+        out.writeObject( valueType );
+    }
+
+    public int getIndex() {
+        return this.index;
+    }
+
+    public Class getExtractToClass() {
+        return this.fieldType;
+    }
+
+    public String getExtractToClassName() {
+        return ClassUtils.canonicalName( this.fieldType );
+    }
+
+    public ValueType getValueType() {
+        return this.valueType;
+    }
+
+    public boolean isGlobal() {
+        return false;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.fieldType.hashCode();
+        result = PRIME * result + this.index;
+        result = PRIME * result + this.valueType.hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( !(object instanceof BaseClassFieldReader) ) {
+            return false;
+        }
+        final BaseClassFieldReader other = (BaseClassFieldReader) object;
+        return this.fieldType == other.fieldType && this.index == other.index && this.valueType.equals( other.valueType );
+    }
+
+    public Object getValue(Object object) {
+        return getValue( null,
+                         object );
+    }
+
+    public char getCharValue(Object object) {
+        return getCharValue( null,
+                             object );
+    }
+
+    public int getIntValue(Object object) {
+        return getIntValue( null,
+                            object );
+    }
+
+    public byte getByteValue(Object object) {
+        return getByteValue( null,
+                             object );
+    }
+
+    public short getShortValue(Object object) {
+        return getShortValue( null,
+                              object );
+    }
+
+    public long getLongValue(Object object) {
+        return getLongValue( null,
+                             object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getFloatValue( null,
+                              object );
+    }
+
+    public double getDoubleValue(Object object) {
+        return getDoubleValue( null,
+                               object );
+    }
+
+    public boolean getBooleanValue(Object object) {
+        return getBooleanValue( null,
+                                object );
+    }
+
+    public boolean isNullValue(Object object) {
+        return isNullValue( null,
+                            object );
+    }
+
+    public int getHashCode(Object object) {
+        return getHashCode( null,
+                            object );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,122 @@
+package org.drools.base;
+
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.spi.WriteAccessor;
+import org.drools.util.asm.ClassFieldInspector;
+
+/**
+ * This is the supertype for the ASM generated classes for writing values into fields.
+ * 
+ * @author Edson Tirelli
+ */
+abstract public class BaseClassFieldWriter
+    implements
+    WriteAccessor {
+    private int        index;
+
+    private Class< ? > fieldType;
+
+    private ValueType  valueType;
+
+    public BaseClassFieldWriter() {
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     *
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseClassFieldWriter(final int index,
+                                   final Class< ? > fieldType,
+                                   final ValueType valueType) {
+        this.index = index;
+        this.fieldType = fieldType;
+        this.valueType = valueType;
+    }
+
+    /**
+     * This is the constructor to be used
+     *
+     * @param clazz
+     * @param fieldName
+     */
+    public BaseClassFieldWriter(final Class< ? > clazz,
+                                final String fieldName) {
+        try {
+            final ClassFieldInspector inspector = new ClassFieldInspector( clazz );
+            this.index = ((Integer) inspector.getFieldNames().get( fieldName )).intValue();
+            this.fieldType = (Class< ? >) inspector.getFieldTypes().get( fieldName );
+            this.valueType = ValueType.determineValueType( this.fieldType );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        index = in.readInt();
+        fieldType = (Class< ? >) in.readObject();
+        valueType = (ValueType) in.readObject();
+        if ( valueType != null ) valueType = ValueType.determineValueType( valueType.getClassType() );
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt( index );
+        out.writeObject( fieldType );
+        out.writeObject( valueType );
+    }
+
+    public int getIndex() {
+        return this.index;
+    }
+
+    public Class< ? > getFieldType() {
+        return this.fieldType;
+    }
+
+    public ValueType getValueType() {
+        return this.valueType;
+    }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + this.fieldType.hashCode();
+        result = PRIME * result + this.index;
+        result = PRIME * result + this.valueType.hashCode();
+        return result;
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+        if ( !(object instanceof BaseClassFieldWriter) ) {
+            return false;
+        }
+        final BaseClassFieldWriter other = (BaseClassFieldWriter) object;
+        return this.fieldType == other.fieldType && this.index == other.index && this.valueType.equals( other.valueType );
+    }
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,419 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.Method;
+
+import org.drools.common.InternalWorkingMemory;
+
+/**
+ * This is a wrapper for a ClassFieldExtractor that provides
+ * default values and a simpler interface for non-used parameters
+ * like the working memory, when the field extractor is used outside
+ * the working memory scope.
+ *
+ * @author Edson Tirelli
+ */
+public class ClassFieldAccessor
+    implements
+    FieldAccessor, Externalizable {
+
+    private static final long   serialVersionUID = 400L;
+    private ClassFieldReader reader;
+    private ClassFieldWriter writer;
+
+    public ClassFieldAccessor() {
+    }
+
+    public ClassFieldAccessor(final ClassFieldReader reader, final ClassFieldWriter writer ) {
+        this.reader = reader;
+        this.writer = writer;
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( reader );
+        out.writeObject( writer );
+    }
+
+    public void readExternal(final ObjectInput is) throws ClassNotFoundException,
+                                                  IOException {
+        this.reader = (ClassFieldReader) is.readObject();
+        this.writer = (ClassFieldWriter) is.readObject();
+    }
+
+    public int getIndex() {
+        return this.reader.getIndex();
+    }
+
+    public String getFieldName() {
+        return this.reader.getFieldName();
+    }
+
+    public Object getValue(final Object object) {
+        return this.reader.getValue( null,
+                                        object );
+    }
+
+    public ValueType getValueType() {
+        return this.reader.getValueType();
+    }
+
+    public Class< ? > getExtractToClass() {
+        return this.reader.getExtractToClass();
+    }
+
+    public String getExtractToClassName() {
+        return this.reader.getExtractToClassName();
+    }
+
+    public String toString() {
+        return this.reader.toString();
+    }
+
+    public int hashCode() {
+        return this.reader.hashCode();
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || !(object instanceof ClassFieldAccessor) ) {
+            return false;
+        }
+
+        final ClassFieldAccessor other = (ClassFieldAccessor) object;
+
+        return this.reader.equals( other.reader );
+    }
+
+    public boolean getBooleanValue(final Object object) {
+        return this.reader.getBooleanValue( null,
+                                               object );
+    }
+
+    public byte getByteValue(final Object object) {
+        return this.reader.getByteValue( null,
+                                            object );
+    }
+
+    public char getCharValue(final Object object) {
+        return this.reader.getCharValue( null,
+                                            object );
+    }
+
+    public double getDoubleValue(final Object object) {
+        return this.reader.getDoubleValue( null,
+                                              object );
+    }
+
+    public float getFloatValue(final Object object) {
+        return this.reader.getFloatValue( null,
+                                             object );
+    }
+
+    public int getIntValue(final Object object) {
+        return this.reader.getIntValue( null,
+                                           object );
+    }
+
+    public long getLongValue(final Object object) {
+        return this.reader.getLongValue( null,
+                                            object );
+    }
+
+    public short getShortValue(final Object object) {
+        return this.reader.getShortValue( null,
+                                             object );
+    }
+
+    public boolean isNullValue(final Object object) {
+        return this.reader.isNullValue( null,
+                                           object );
+    }
+
+    public Method getNativeReadMethod() {
+        return this.reader.getNativeReadMethod();
+    }
+
+    public int getHashCode(final Object object) {
+        return this.reader.getHashCode( null,
+                                           object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getBooleanValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                   Object object) {
+        return reader.getBooleanValue( workingMemory,
+                                       object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getByteValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public byte getByteValue(InternalWorkingMemory workingMemory,
+                             Object object) {
+        return reader.getByteValue( workingMemory,
+                                    object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getCharValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public char getCharValue(InternalWorkingMemory workingMemory,
+                             Object object) {
+        return reader.getCharValue( workingMemory,
+                                    object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getDoubleValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                 Object object) {
+        return reader.getDoubleValue( workingMemory,
+                                      object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getFloatValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public float getFloatValue(InternalWorkingMemory workingMemory,
+                               Object object) {
+        return reader.getFloatValue( workingMemory,
+                                     object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getHashCode(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public int getHashCode(InternalWorkingMemory workingMemory,
+                           Object object) {
+        return reader.getHashCode( workingMemory,
+                                   object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getIntValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public int getIntValue(InternalWorkingMemory workingMemory,
+                           Object object) {
+        return reader.getIntValue( workingMemory,
+                                   object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getLongValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public long getLongValue(InternalWorkingMemory workingMemory,
+                             Object object) {
+        return reader.getLongValue( workingMemory,
+                                    object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getShortValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public short getShortValue(InternalWorkingMemory workingMemory,
+                               Object object) {
+        return reader.getShortValue( workingMemory,
+                                     object );
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#getValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public Object getValue(InternalWorkingMemory workingMemory,
+                           Object object) {
+        return reader.getValue( workingMemory,
+                                object );
+    }
+
+    /**
+     * @return
+     * @see org.drools.base.ClassFieldReader#isGlobal()
+     */
+    public boolean isGlobal() {
+        return reader.isGlobal();
+    }
+
+    /**
+     * @param workingMemory
+     * @param object
+     * @return
+     * @see org.drools.base.ClassFieldReader#isNullValue(org.drools.common.InternalWorkingMemory, java.lang.Object)
+     */
+    public boolean isNullValue(InternalWorkingMemory workingMemory,
+                               Object object) {
+        return reader.isNullValue( workingMemory,
+                                   object );
+    }
+
+    /**
+     * @return
+     * @see org.drools.base.ClassFieldWriter#getFieldType()
+     */
+    public Class< ? > getFieldType() {
+        return writer.getFieldType();
+    }
+
+    /**
+     * @return
+     * @see org.drools.base.ClassFieldWriter#getNativeWriteMethod()
+     */
+    public Method getNativeWriteMethod() {
+        return writer.getNativeWriteMethod();
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setBooleanValue(java.lang.Object, boolean)
+     */
+    public void setBooleanValue(Object bean,
+                                boolean value) {
+        writer.setBooleanValue( bean,
+                                value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setByteValue(java.lang.Object, byte)
+     */
+    public void setByteValue(Object bean,
+                             byte value) {
+        writer.setByteValue( bean,
+                             value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setCharValue(java.lang.Object, char)
+     */
+    public void setCharValue(Object bean,
+                             char value) {
+        writer.setCharValue( bean,
+                             value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setDoubleValue(java.lang.Object, double)
+     */
+    public void setDoubleValue(Object bean,
+                               double value) {
+        writer.setDoubleValue( bean,
+                               value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setFloatValue(java.lang.Object, float)
+     */
+    public void setFloatValue(Object bean,
+                              float value) {
+        writer.setFloatValue( bean,
+                              value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setIntValue(java.lang.Object, int)
+     */
+    public void setIntValue(Object bean,
+                            int value) {
+        writer.setIntValue( bean,
+                            value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setLongValue(java.lang.Object, long)
+     */
+    public void setLongValue(Object bean,
+                             long value) {
+        writer.setLongValue( bean,
+                             value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setShortValue(java.lang.Object, short)
+     */
+    public void setShortValue(Object bean,
+                              short value) {
+        writer.setShortValue( bean,
+                              value );
+    }
+
+    /**
+     * @param bean
+     * @param value
+     * @see org.drools.base.ClassFieldWriter#setValue(java.lang.Object, java.lang.Object)
+     */
+    public void setValue(Object bean,
+                         Object value) {
+        writer.setValue( bean,
+                         value );
+    }
+
+    
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,176 @@
+package org.drools.base;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * As class field accessors have some cost to generate
+ * (inspecting the class, and generating classes via ASM)
+ * it makes sense to cache them.
+ * This is that cache.
+ * 
+ * @author Michael Neale
+ *
+ */
+public class ClassFieldAccessorCache {
+
+    private Map<AccessorKey, ClassFieldReader>   readerCache;
+    private Map<AccessorKey, ClassFieldWriter>   writerCache;
+    private Map<AccessorKey, ClassFieldAccessor> accessorCache;
+    private ClassFieldAccessorFactory            factory;
+
+    private ClassFieldAccessorCache() {
+        this.factory = new ClassFieldAccessorFactory();
+    }
+
+    public static ClassFieldAccessorCache getInstance() {
+        return new ClassFieldAccessorCache();
+    }
+
+    public synchronized ClassFieldReader getReader(final Class< ? > clazz,
+                                                   final String fieldName,
+                                                   ClassLoader classLoader) {
+        if ( readerCache == null ) {
+            readerCache = new HashMap<AccessorKey, ClassFieldReader>();
+        }
+
+        final AccessorKey key = new AccessorKey( clazz,
+                                                 fieldName );
+
+        if ( readerCache.containsKey( key ) ) {
+            return readerCache.get( key );
+        } else {
+            final ClassFieldReader ex = new ClassFieldReader( clazz,
+                                                              fieldName,
+                                                              classLoader,
+                                                              factory );
+            readerCache.put( key,
+                             ex );
+            return ex;
+        }
+    }
+
+    public synchronized ClassFieldWriter getWriter(final Class< ? > clazz,
+                                                   final String fieldName,
+                                                   ClassLoader classLoader) {
+        if ( writerCache == null ) {
+            writerCache = new HashMap<AccessorKey, ClassFieldWriter>();
+        }
+
+        final AccessorKey key = new AccessorKey( clazz,
+                                                 fieldName );
+
+        if ( writerCache.containsKey( key ) ) {
+            return writerCache.get( key );
+        } else {
+            final ClassFieldWriter writer = new ClassFieldWriter( clazz,
+                                                                  fieldName,
+                                                                  classLoader,
+                                                                  factory );
+            writerCache.put( key,
+                             writer );
+            return writer;
+        }
+    }
+
+    public synchronized ClassFieldAccessor getAccessor(final Class< ? > clazz,
+                                                       final String fieldName,
+                                                       ClassLoader classLoader) {
+        if ( accessorCache == null ) {
+            accessorCache = new HashMap<AccessorKey, ClassFieldAccessor>();
+        }
+
+        final AccessorKey key = new AccessorKey( clazz,
+                                                 fieldName );
+
+        if ( accessorCache.containsKey( key ) ) {
+            return accessorCache.get( key );
+        } else {
+            final ClassFieldReader reader = getReader( clazz,
+                                                       fieldName,
+                                                       classLoader );
+            final ClassFieldWriter writer = getWriter( clazz,
+                                                       fieldName,
+                                                       classLoader );
+            final ClassFieldAccessor accessor = new ClassFieldAccessor( reader,
+                                                                        writer );
+            accessorCache.put( key,
+                               accessor );
+            return accessor;
+        }
+    }
+
+    private static class AccessorKey
+        implements
+        Externalizable {
+        private static final long serialVersionUID = 400;
+
+        private Class< ? >        clazz;
+        private String            fieldName;
+        private int               hashCode;
+
+        public AccessorKey() {
+        }
+
+        public AccessorKey(Class< ? > clazz,
+                           String fieldName) {
+            super();
+            this.clazz = clazz;
+            this.fieldName = fieldName;
+
+            final int PRIME = 31;
+            int result = 1;
+            result = PRIME * result + ((clazz == null) ? 0 : clazz.hashCode());
+            result = PRIME * result + ((fieldName == null) ? 0 : fieldName.hashCode());
+            this.hashCode = result;
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            clazz = (Class< ? >) in.readObject();
+            fieldName = (String) in.readObject();
+            hashCode = in.readInt();
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject( clazz );
+            out.writeObject( fieldName );
+            out.writeInt( hashCode );
+        }
+
+        public Class< ? > getClazz() {
+            return clazz;
+        }
+
+        public String getFieldName() {
+            return fieldName;
+        }
+
+        public int hashCode() {
+            return hashCode;
+        }
+
+        public boolean equals(Object obj) {
+            if ( this == obj ) return true;
+            if ( obj == null ) return false;
+            if ( getClass() != obj.getClass() ) return false;
+            final AccessorKey other = (AccessorKey) obj;
+            if ( clazz == null ) {
+                if ( other.clazz != null ) return false;
+            } else if ( !clazz.equals( other.clazz ) ) return false;
+            if ( fieldName == null ) {
+                if ( other.fieldName != null ) return false;
+            } else if ( !fieldName.equals( other.fieldName ) ) return false;
+            return true;
+        }
+
+        public String toString() {
+            return this.clazz + "@" + Math.abs( System.identityHashCode( this.clazz ) ) + "(" + this.fieldName + ")";
+        }
+    }
+
+}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,648 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.lang.reflect.Method;
+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;
+import org.drools.asm.Label;
+import org.drools.asm.MethodVisitor;
+import org.drools.asm.Opcodes;
+import org.drools.asm.Type;
+import org.drools.base.extractors.BaseBooleanClassFieldReader;
+import org.drools.base.extractors.BaseBooleanClassFieldWriter;
+import org.drools.base.extractors.BaseByteClassFieldReader;
+import org.drools.base.extractors.BaseByteClassFieldWriter;
+import org.drools.base.extractors.BaseCharClassFieldReader;
+import org.drools.base.extractors.BaseCharClassFieldWriter;
+import org.drools.base.extractors.BaseDoubleClassFieldReader;
+import org.drools.base.extractors.BaseDoubleClassFieldWriter;
+import org.drools.base.extractors.BaseFloatClassFieldReader;
+import org.drools.base.extractors.BaseFloatClassFieldWriter;
+import org.drools.base.extractors.BaseIntClassFieldReader;
+import org.drools.base.extractors.BaseIntClassFieldWriter;
+import org.drools.base.extractors.BaseLongClassFieldReader;
+import org.drools.base.extractors.BaseLongClassFieldWriter;
+import org.drools.base.extractors.BaseObjectClassFieldReader;
+import org.drools.base.extractors.BaseObjectClassFieldWriter;
+import org.drools.base.extractors.BaseShortClassFieldReader;
+import org.drools.base.extractors.BaseShortClassFieldWriter;
+import org.drools.base.extractors.MVELClassFieldReader;
+import org.drools.base.extractors.SelfReferenceClassFieldReader;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.util.asm.ClassFieldInspector;
+
+/**
+ * This generates subclasses of BaseClassFieldExtractor to provide field extractors.
+ * This should not be used directly, but via ClassFieldExtractor (which ensures that it is 
+ * all nicely serializable).
+ * 
+ * @author Alexander Bagerman
+ * @author Michael Neale
+ * @author Edson Tirelli
+ */
+
+public class ClassFieldAccessorFactory {
+
+    private static final String                        BASE_PACKAGE         = "org/drools/base";
+
+    private static final String                        SELF_REFERENCE_FIELD = "this";
+
+    private static final ProtectionDomain              PROTECTION_DOMAIN;
+
+    private final Map<Class< ? >, ClassFieldInspector> inspectors           = new HashMap<Class< ? >, ClassFieldInspector>();
+
+    private ByteArrayClassLoader                       byteArrayClassLoader;
+
+    static {
+        PROTECTION_DOMAIN = AccessController.doPrivileged( new PrivilegedAction<ProtectionDomain>() {
+            public ProtectionDomain run() {
+                return ClassFieldAccessorFactory.class.getProtectionDomain();
+            }
+        } );
+    }
+
+    public BaseClassFieldReader getClassFieldReader(final Class< ? > clazz,
+                                                       final String fieldName,
+                                                       final ClassLoader classLoader) {
+        if ( byteArrayClassLoader == null || byteArrayClassLoader.getParent() != classLoader ) {
+            if ( classLoader == null ) {
+                throw new RuntimeDroolsException( "ClassFieldAccessorFactory cannot have a null parent ClassLoader" );
+            }
+            byteArrayClassLoader = new ByteArrayClassLoader( classLoader );
+        }
+        try {
+            // if it is a self reference
+            if ( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
+                // then just create an instance of the special class field extractor
+                return new SelfReferenceClassFieldReader( clazz,
+                                                             fieldName );
+            } else if ( fieldName.indexOf( '.' ) > -1 || fieldName.indexOf( '[' ) > -1 ) {
+                // we need MVEL extractor for expressions
+                return new MVELClassFieldReader( clazz,
+                                                    fieldName,
+                                                    classLoader );
+            } else {
+                // otherwise, bytecode generate a specific extractor
+                ClassFieldInspector inspector = 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 );
+                if ( fieldType != null && getterMethod != null ) {
+                    final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + Math.abs( System.identityHashCode( clazz ) ) + "$" + getterMethod.getName();
+
+                    // generating byte array to create target class
+                    final byte[] bytes = dumpReader( clazz,
+                                                     className,
+                                                     getterMethod,
+                                                     fieldType,
+                                                     clazz.isInterface() );
+                    // use bytes to get a class 
+
+                    final Class< ? > newClass = byteArrayClassLoader.defineClass( className.replace( '/',
+                                                                                                     '.' ),
+                                                                                  bytes,
+                                                                                  PROTECTION_DOMAIN );
+                    // instantiating target class
+                    final Integer index = (Integer) inspector.getFieldNames().get( fieldName );
+                    final ValueType valueType = ValueType.determineValueType( fieldType );
+                    final Object[] params = {index, fieldType, valueType};
+                    return (BaseClassFieldReader) newClass.getConstructors()[0].newInstance( params );
+                } else {
+                    throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'" );
+                }
+            }
+        } catch ( final RuntimeDroolsException e ) {
+            throw e;
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public BaseClassFieldWriter getClassFieldWriter(final Class< ? > clazz,
+                                                    final String fieldName,
+                                                    final ClassLoader classLoader) {
+        if ( byteArrayClassLoader == null || byteArrayClassLoader.getParent() != classLoader ) {
+            if ( classLoader == null ) {
+                throw new RuntimeDroolsException( "ClassFieldAccessorFactory cannot have a null parent ClassLoader" );
+            }
+            byteArrayClassLoader = new ByteArrayClassLoader( classLoader );
+        }
+        try {
+            // otherwise, bytecode generate a specific extractor
+            ClassFieldInspector inspector = inspectors.get( clazz );
+            if ( inspector == null ) {
+                inspector = new ClassFieldInspector( clazz );
+                inspectors.put( clazz,
+                                inspector );
+            }
+            final Method setterMethod = (Method) inspector.getSetterMethods().get( fieldName );
+            if ( setterMethod != null ) {
+                final Class< ? > fieldType = setterMethod.getParameterTypes()[0];
+                final String className = ClassFieldAccessorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + Math.abs( System.identityHashCode( clazz ) ) + "$" + setterMethod.getName();
+
+                // generating byte array to create target class
+                final byte[] bytes = dumpWriter( clazz,
+                                                 className,
+                                                 setterMethod,
+                                                 fieldType,
+                                                 clazz.isInterface() );
+                // use bytes to get a class 
+
+                final Class< ? > newClass = byteArrayClassLoader.defineClass( className.replace( '/',
+                                                                                                 '.' ),
+                                                                              bytes,
+                                                                              PROTECTION_DOMAIN );
+                // instantiating target class
+                final Integer index = (Integer) inspector.getFieldNames().get( fieldName );
+                final ValueType valueType = ValueType.determineValueType( fieldType );
+                final Object[] params = {index, fieldType, valueType};
+                return (BaseClassFieldWriter) newClass.getConstructors()[0].newInstance( params );
+            } else {
+                throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'" );
+            }
+        } catch ( final RuntimeDroolsException e ) {
+            throw e;
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    private byte[] dumpReader(final Class< ? > originalClass,
+                              final String className,
+                              final Method getterMethod,
+                              final Class< ? > fieldType,
+                              final boolean isInterface) throws Exception {
+
+        final ClassWriter cw = new ClassWriter( true );
+
+        final Class< ? > superClass = getReaderSuperClassFor( fieldType );
+        buildClassHeader( superClass,
+                          className,
+                          cw );
+
+        //        buildConstructor( superClass,
+        //                          className,
+        //                          cw );
+
+        build3ArgConstructor( superClass,
+                              className,
+                              cw );
+
+        buildGetMethod( originalClass,
+                        className,
+                        superClass,
+                        getterMethod,
+                        cw );
+
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+
+    private byte[] dumpWriter(final Class< ? > originalClass,
+                              final String className,
+                              final Method getterMethod,
+                              final Class< ? > fieldType,
+                              final boolean isInterface) throws Exception {
+
+        final ClassWriter cw = new ClassWriter( true );
+
+        final Class< ? > superClass = getWriterSuperClassFor( fieldType );
+        buildClassHeader( superClass,
+                          className,
+                          cw );
+
+        build3ArgConstructor( superClass,
+                              className,
+                              cw );
+
+        buildSetMethod( originalClass,
+                        className,
+                        superClass,
+                        getterMethod,
+                        fieldType,
+                        cw );
+
+        cw.visitEnd();
+
+        return cw.toByteArray();
+    }
+
+    /**
+     * Builds the class header
+     *  
+     * @param clazz The class to build the extractor for
+     * @param className The extractor class name
+     * @param cw
+     */
+    protected void buildClassHeader(final Class< ? > superClass,
+                                    final String className,
+                                    final ClassWriter cw) {
+        cw.visit( Opcodes.V1_5,
+                  Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
+                  className,
+                  null,
+                  Type.getInternalName( superClass ),
+                  null );
+
+        cw.visitSource( null,
+                        null );
+    }
+
+    /**
+     * Creates a constructor for the field extractor receiving
+     * the index, field type and value type
+     * 
+     * @param originalClassName
+     * @param className
+     * @param cw
+     */
+    private 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( int.class ), Type.getType( Class.class ), Type.getType( ValueType.class )} ),
+                                 null,
+                                 null );
+            mv.visitCode();
+            final Label l0 = new Label();
+            mv.visitLabel( l0 );
+            mv.visitVarInsn( Opcodes.ALOAD,
+                             0 );
+            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( int.class ), Type.getType( Class.class ), Type.getType( ValueType.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( "index",
+                                   Type.getDescriptor( int.class ),
+                                   null,
+                                   l0,
+                                   l2,
+                                   1 );
+            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();
+        }
+    }
+
+    /**
+     * Creates the proxy reader method for the given method
+     * 
+     * @param fieldName
+     * @param fieldFlag
+     * @param method
+     * @param cw
+     */
+    protected void buildGetMethod(final Class< ? > originalClass,
+                                  final String className,
+                                  final Class< ? > superClass,
+                                  final Method getterMethod,
+                                  final ClassWriter cw) {
+
+        final Class< ? > fieldType = getterMethod.getReturnType();
+        Method overridingMethod;
+        try {
+            overridingMethod = superClass.getMethod( getOverridingGetMethodName( fieldType ),
+                                                     new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report back to JBoss Rules team.",
+                                              e );
+        }
+        final MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
+                                                 overridingMethod.getName(),
+                                                 Type.getMethodDescriptor( overridingMethod ),
+                                                 null,
+                                                 null );
+
+        mv.visitCode();
+
+        final Label l0 = new Label();
+        mv.visitLabel( l0 );
+        mv.visitVarInsn( Opcodes.ALOAD,
+                         2 );
+        mv.visitTypeInsn( Opcodes.CHECKCAST,
+                          Type.getInternalName( originalClass ) );
+
+        if ( originalClass.isInterface() ) {
+            mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
+                                Type.getInternalName( originalClass ),
+                                getterMethod.getName(),
+                                Type.getMethodDescriptor( getterMethod ) );
+        } else {
+            mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
+                                Type.getInternalName( originalClass ),
+                                getterMethod.getName(),
+                                Type.getMethodDescriptor( getterMethod ) );
+        }
+        mv.visitInsn( Type.getType( fieldType ).getOpcode( Opcodes.IRETURN ) );
+        final Label l1 = new Label();
+        mv.visitLabel( l1 );
+        mv.visitLocalVariable( "this",
+                               "L" + className + ";",
+                               null,
+                               l0,
+                               l1,
+                               0 );
+        mv.visitLocalVariable( "workingMemory",
+                               Type.getDescriptor( InternalWorkingMemory.class ),
+                               null,
+                               l0,
+                               l1,
+                               1 );
+        mv.visitLocalVariable( "object",
+                               Type.getDescriptor( Object.class ),
+                               null,
+                               l0,
+                               l1,
+                               2 );
+        mv.visitMaxs( 0,
+                      0 );
+        mv.visitEnd();
+    }
+
+    /**
+     * Creates the set method for the given field definition
+     *
+     * @param cw
+     * @param classDef
+     * @param fieldDef
+     */
+    protected void buildSetMethod(final Class< ? > originalClass,
+                                  final String className,
+                                  final Class< ? > superClass,
+                                  final Method setterMethod,
+                                  final Class< ? > fieldType,
+                                  final ClassWriter cw) {
+        MethodVisitor mv;
+        // set method
+        {
+            Method overridingMethod;
+            try {
+                overridingMethod = superClass.getMethod( getOverridingSetMethodName( fieldType ),
+                                                         new Class[]{Object.class, fieldType.isPrimitive() ? fieldType : Object.class } );
+            } catch ( final Exception e ) {
+                throw new RuntimeDroolsException( "This is a bug. Please report back to JBoss Rules team.",
+                                                  e );
+            }
+
+            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
+                                 overridingMethod.getName(),
+                                 Type.getMethodDescriptor( overridingMethod ),
+                                 null,
+                                 null );
+
+            mv.visitCode();
+            final Label l0 = new Label();
+            mv.visitLabel( l0 );
+
+            mv.visitVarInsn( Opcodes.ALOAD,
+                             1 );
+            mv.visitTypeInsn( Opcodes.CHECKCAST,
+                              Type.getInternalName( originalClass ) );
+
+            mv.visitVarInsn( Type.getType( fieldType ).getOpcode( Opcodes.ILOAD ),
+                             2 );
+
+            if ( !fieldType.isPrimitive() ) {
+                mv.visitTypeInsn( Opcodes.CHECKCAST,
+                                  Type.getInternalName( fieldType ) );
+            }
+
+            if ( originalClass.isInterface() ) {
+                mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
+                                    Type.getInternalName( originalClass ),
+                                    setterMethod.getName(),
+                                    Type.getMethodDescriptor( setterMethod ) );
+            } else {
+                mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
+                                    Type.getInternalName( originalClass ),
+                                    setterMethod.getName(),
+                                    Type.getMethodDescriptor( setterMethod ) );
+            }
+
+            mv.visitInsn( Opcodes.RETURN );
+
+            final Label l1 = new Label();
+            mv.visitLabel( l1 );
+            mv.visitLocalVariable( "this",
+                                   "L" + className + ";",
+                                   null,
+                                   l0,
+                                   l1,
+                                   0 );
+            mv.visitLocalVariable( "bean",
+                                   Type.getDescriptor( Object.class ),
+                                   null,
+                                   l0,
+                                   l1,
+                                   1 );
+            mv.visitLocalVariable( "value",
+                                   Type.getDescriptor( fieldType ),
+                                   null,
+                                   l0,
+                                   l1,
+                                   2 );
+            mv.visitMaxs( 0,
+                          0 );
+            mv.visitEnd();
+
+        }
+    }
+
+    private String getOverridingGetMethodName(final Class< ? > fieldType) {
+        String ret = null;
+        if ( fieldType.isPrimitive() ) {
+            if ( fieldType == char.class ) {
+                ret = "getCharValue";
+            } else if ( fieldType == byte.class ) {
+                ret = "getByteValue";
+            } else if ( fieldType == short.class ) {
+                ret = "getShortValue";
+            } else if ( fieldType == int.class ) {
+                ret = "getIntValue";
+            } else if ( fieldType == long.class ) {
+                ret = "getLongValue";
+            } else if ( fieldType == float.class ) {
+                ret = "getFloatValue";
+            } else if ( fieldType == double.class ) {
+                ret = "getDoubleValue";
+            } else if ( fieldType == boolean.class ) {
+                ret = "getBooleanValue";
+            }
+        } else {
+            ret = "getValue";
+        }
+        return ret;
+    }
+
+    private String getOverridingSetMethodName(final Class< ? > fieldType) {
+        String ret = null;
+        if ( fieldType.isPrimitive() ) {
+            if ( fieldType == char.class ) {
+                ret = "setCharValue";
+            } else if ( fieldType == byte.class ) {
+                ret = "setByteValue";
+            } else if ( fieldType == short.class ) {
+                ret = "setShortValue";
+            } else if ( fieldType == int.class ) {
+                ret = "setIntValue";
+            } else if ( fieldType == long.class ) {
+                ret = "setLongValue";
+            } else if ( fieldType == float.class ) {
+                ret = "setFloatValue";
+            } else if ( fieldType == double.class ) {
+                ret = "setDoubleValue";
+            } else if ( fieldType == boolean.class ) {
+                ret = "setBooleanValue";
+            }
+        } else {
+            ret = "setValue";
+        }
+        return ret;
+    }
+
+    /**
+     * Returns the appropriate Base class field extractor class
+     * for the given fieldType
+     * 
+     * @param fieldType
+     * @return
+     */
+    private Class< ? > getReaderSuperClassFor(final Class< ? > fieldType) {
+        Class< ? > ret = null;
+        if ( fieldType.isPrimitive() ) {
+            if ( fieldType == char.class ) {
+                ret = BaseCharClassFieldReader.class;
+            } else if ( fieldType == byte.class ) {
+                ret = BaseByteClassFieldReader.class;
+            } else if ( fieldType == short.class ) {
+                ret = BaseShortClassFieldReader.class;
+            } else if ( fieldType == int.class ) {
+                ret = BaseIntClassFieldReader.class;
+            } else if ( fieldType == long.class ) {
+                ret = BaseLongClassFieldReader.class;
+            } else if ( fieldType == float.class ) {
+                ret = BaseFloatClassFieldReader.class;
+            } else if ( fieldType == double.class ) {
+                ret = BaseDoubleClassFieldReader.class;
+            } else if ( fieldType == boolean.class ) {
+                ret = BaseBooleanClassFieldReader.class;
+            }
+        } else {
+            ret = BaseObjectClassFieldReader.class;
+        }
+        return ret;
+    }
+
+    /**
+     * Returns the appropriate Base class field extractor class
+     * for the given fieldType
+     * 
+     * @param fieldType
+     * @return
+     */
+    private Class< ? > getWriterSuperClassFor(final Class< ? > fieldType) {
+        Class< ? > ret = null;
+        if ( fieldType.isPrimitive() ) {
+            if ( fieldType == char.class ) {
+                ret = BaseCharClassFieldWriter.class;
+            } else if ( fieldType == byte.class ) {
+                ret = BaseByteClassFieldWriter.class;
+            } else if ( fieldType == short.class ) {
+                ret = BaseShortClassFieldWriter.class;
+            } else if ( fieldType == int.class ) {
+                ret = BaseIntClassFieldWriter.class;
+            } else if ( fieldType == long.class ) {
+                ret = BaseLongClassFieldWriter.class;
+            } else if ( fieldType == float.class ) {
+                ret = BaseFloatClassFieldWriter.class;
+            } else if ( fieldType == double.class ) {
+                ret = BaseDoubleClassFieldWriter.class;
+            } else if ( fieldType == boolean.class ) {
+                ret = BaseBooleanClassFieldWriter.class;
+            }
+        } else {
+            ret = BaseObjectClassFieldWriter.class;
+        }
+        return ret;
+    }
+
+    /**
+     * Simple classloader
+     * @author Michael Neale
+     */
+    static class ByteArrayClassLoader extends ClassLoader {
+        public ByteArrayClassLoader(final ClassLoader parent) {
+            super( parent );
+        }
+
+        public Class< ? > defineClass(final String name,
+                                      final byte[] bytes,
+                                      final ProtectionDomain domain) {
+            return defineClass( name,
+                                bytes,
+                                0,
+                                bytes.length,
+                                domain );
+        }
+    }
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,238 +0,0 @@
-package org.drools.base;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Externalizable;
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.common.DroolsObjectInputStream;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.common.DroolsObjectInput;
-import org.drools.spi.FieldExtractor;
-import org.drools.util.ClassUtils;
-
-/**
- * This provides access to fields, and what their numerical index/object type is.
- * This is basically a wrapper class around dynamically generated subclasses of
- * BaseClassFieldExtractor,
- *  which allows serialization by regenerating the accessor classes
- * when needed.
- *
- * @author Michael Neale
- */
-public class ClassFieldExtractor
-    implements
-    FieldExtractor {
-    /**
-     *
-     */
-    private static final long        serialVersionUID = 400L;
-    private String                   fieldName;
-    private Class                    clazz;
-    private transient FieldExtractor extractor;
-
-    public ClassFieldExtractor() {
-
-    }
-
-    public ClassFieldExtractor(final Class clazz,
-                               final String fieldName) {
-        this( clazz,
-              fieldName,
-              clazz.getClassLoader() );
-    }
-
-    public ClassFieldExtractor(final Class clazz,
-                               final String fieldName,
-                               final ClassLoader classLoader) {
-        this( clazz,
-              fieldName,
-              classLoader == null ? clazz.getClassLoader() : classLoader,
-              new ClassFieldExtractorFactory() );
-    }
-
-    public ClassFieldExtractor(final Class clazz,
-                               final String fieldName,
-                               final ClassLoader classLoader,
-                               final ClassFieldExtractorFactory factory) {
-        this.clazz = clazz;
-        this.fieldName = fieldName;
-        init( classLoader,
-              factory );
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        // Call even if there is no default serializable fields.
-        out.writeObject(clazz);
-        out.writeObject(fieldName);
-    }
-
-    public void readExternal(final ObjectInput is) throws ClassNotFoundException,
-                                                       IOException {
-        clazz   = (Class)is.readObject();
-        fieldName   = (String)is.readObject();
-        if (is instanceof DroolsObjectInput) {
-            DroolsObjectInput   droolsInput = (DroolsObjectInput)is;
-            extractor = droolsInput.getExtractorFactory().getExtractor( clazz,
-                                                                        fieldName,
-                                                                        droolsInput.getClassLoader() );
-        }
-        else
-            extractor   = ClassFieldExtractorCache.getInstance().getExtractor( clazz, fieldName,
-                                                                               getClass().getClassLoader());
-    }
-
-//    private Object readResolve() {
-//        // always return the value from the cache
-//        return ClassFieldExtractorCache.getInstance().getExtractor( this.clazz,
-//                                                                    this.fieldName,
-//                                                                    this.clazz.getClassLoader() );
-//    }
-
-    private void init(final ClassLoader classLoader,
-                      final ClassFieldExtractorFactory factory) {
-        try {
-            this.extractor = factory.getClassFieldExtractor( this.clazz,
-                                                             this.fieldName,
-                                                             classLoader );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( e );
-        }
-    }
-
-    public int getIndex() {
-        return this.extractor.getIndex();
-    }
-
-    public String getFieldName() {
-        return this.fieldName;
-    }
-
-    public Object getValue(InternalWorkingMemory workingMemory,
-                           final Object object) {
-        return this.extractor.getValue( workingMemory,
-                                        object );
-    }
-
-    public ValueType getValueType() {
-        return this.extractor.getValueType();
-    }
-
-    public Class getExtractToClass() {
-        return this.extractor.getExtractToClass();
-    }
-
-    public String getExtractToClassName() {
-        return ClassUtils.canonicalName( this.extractor.getExtractToClass() );
-    }
-
-    public String toString() {
-        return "[ClassFieldExtractor class=" + this.clazz + " field=" + this.fieldName + "]";
-    }
-
-    public int hashCode() {
-        return getValueType().hashCode() * 17 + getIndex();
-    }
-
-    public boolean equals(final Object object) {
-        if ( this == object ) {
-            return true;
-        }
-
-        if ( object == null || !(object instanceof ClassFieldExtractor) ) {
-            return false;
-        }
-
-        final ClassFieldExtractor other = (ClassFieldExtractor) object;
-
-        return this.extractor.getValueType() == other.getValueType() && this.extractor.getIndex() == other.getIndex();
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory,
-                                   final Object object) {
-        return this.extractor.getBooleanValue( workingMemory,
-                                               object );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory,
-                             final Object object) {
-        return this.extractor.getByteValue( workingMemory,
-                                            object );
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory,
-                             final Object object) {
-        return this.extractor.getCharValue( workingMemory,
-                                            object );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory,
-                                 final Object object) {
-        return this.extractor.getDoubleValue( workingMemory,
-                                              object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory,
-                               final Object object) {
-        return this.extractor.getFloatValue( workingMemory,
-                                             object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory,
-                           final Object object) {
-        return this.extractor.getIntValue( workingMemory,
-                                           object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory,
-                             final Object object) {
-        return this.extractor.getLongValue( workingMemory,
-                                            object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory,
-                               final Object object) {
-        return this.extractor.getShortValue( workingMemory,
-                                             object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory,
-                               final Object object) {
-        return this.extractor.isNullValue( workingMemory,
-                                           object );
-    }
-
-    public Method getNativeReadMethod() {
-        return this.extractor.getNativeReadMethod();
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory,
-                           final Object object) {
-        return this.extractor.getHashCode( workingMemory,
-                                           object );
-    }
-
-    public boolean isGlobal() {
-        return false;
-    }
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorCache.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,125 +0,0 @@
-package org.drools.base;
-
-import java.io.Externalizable;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * As class field Extractors have some cost to generate
- * (inspecting the class, and generating classes via ASM)
- * it makes sense to cache them.
- * This is that cache.
- * 
- * @author Michael Neale
- *
- */
-public class ClassFieldExtractorCache {
-    private static final ClassFieldExtractorCache INSTANCE = new ClassFieldExtractorCache();
-
-    private Map                                   cache;
-    private ClassFieldExtractorFactory            factory;
-    
-    private ClassFieldExtractorCache() {
-        this.factory = new ClassFieldExtractorFactory();
-    }
-
-    public static ClassFieldExtractorCache getInstance() {
-        //return INSTANCE;
-        return new ClassFieldExtractorCache();
-    }
-
-    public synchronized ClassFieldExtractor getExtractor(final Class clazz,
-                                                         final String fieldName,
-                                                         ClassLoader classLoader) {
-        if ( cache == null ) {
-            cache = new HashMap();
-        }
-
-        final ExtractorKey key = new ExtractorKey( clazz,
-                                                   fieldName );
-
-        if ( cache.containsKey( key ) ) {
-            return (ClassFieldExtractor) cache.get( key );
-        } else {
-            final ClassFieldExtractor ex = new ClassFieldExtractor( clazz,
-                                                                    fieldName,
-                                                                    classLoader,
-                                                                    factory );
-            cache.put( key,
-                       ex );
-            return ex;
-        }
-    }
-
-    private static class ExtractorKey
-        implements
-        Externalizable {
-        private static final long serialVersionUID = 400;
-
-        private Class       clazz;
-        private String      fieldName;
-        private int         hashCode;
-
-        public ExtractorKey() {
-        }
-
-        public ExtractorKey(Class clazz,
-                            String fieldName) {
-            super();
-            this.clazz = clazz;
-            this.fieldName = fieldName;
-
-            final int PRIME = 31;
-            int result = 1;
-            result = PRIME * result + ((clazz == null) ? 0 : clazz.hashCode());
-            result = PRIME * result + ((fieldName == null) ? 0 : fieldName.hashCode());
-            this.hashCode = result;
-        }
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            clazz   = (Class)in.readObject();
-            fieldName   = (String)in.readObject();
-            hashCode    = in.readInt();
-        }
-
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(clazz);
-            out.writeObject(fieldName);
-            out.writeInt(hashCode);
-        }
-
-        public Class getClazz() {
-            return clazz;
-        }
-
-        public String getFieldName() {
-            return fieldName;
-        }
-
-        public int hashCode() {
-            return hashCode;
-        }
-
-        public boolean equals(Object obj) {
-            if ( this == obj ) return true;
-            if ( obj == null ) return false;
-            if ( getClass() != obj.getClass() ) return false;
-            final ExtractorKey other = (ExtractorKey) obj;
-            if ( clazz == null ) {
-                if ( other.clazz != null ) return false;
-            } else if ( !clazz.equals( other.clazz ) ) return false;
-            if ( fieldName == null ) {
-                if ( other.fieldName != null ) return false;
-            } else if ( !fieldName.equals( other.fieldName ) ) return false;
-            return true;
-        }
-
-        public String toString() {
-            return this.clazz + "@" + Math.abs( System.identityHashCode( this.clazz ) ) + "(" + this.fieldName + ")";
-        }
-    }
-
-}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractorFactory.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,474 +0,0 @@
-package org.drools.base;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.lang.reflect.Method;
-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;
-import org.drools.asm.Label;
-import org.drools.asm.MethodVisitor;
-import org.drools.asm.Opcodes;
-import org.drools.asm.Type;
-import org.drools.base.extractors.BaseBooleanClassFieldExtractor;
-import org.drools.base.extractors.BaseByteClassFieldExtractor;
-import org.drools.base.extractors.BaseCharClassFieldExtractor;
-import org.drools.base.extractors.BaseDoubleClassFieldExtractor;
-import org.drools.base.extractors.BaseFloatClassFieldExtractor;
-import org.drools.base.extractors.BaseIntClassFieldExtractor;
-import org.drools.base.extractors.BaseLongClassFieldExtractors;
-import org.drools.base.extractors.BaseObjectClassFieldExtractor;
-import org.drools.base.extractors.BaseShortClassFieldExtractor;
-import org.drools.base.extractors.MVELClassFieldExtractor;
-import org.drools.base.extractors.SelfReferenceClassFieldExtractor;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.util.asm.ClassFieldInspector;
-
-/**
- * This generates subclasses of BaseClassFieldExtractor to provide field extractors.
- * This should not be used directly, but via ClassFieldExtractor (which ensures that it is 
- * all nicely serializable).
- * 
- * @author Alexander Bagerman
- * @author Michael Neale
- */
-
-public class ClassFieldExtractorFactory {
-
-    private static final String           BASE_PACKAGE         = "org/drools/base";
-
-    private static final String           SELF_REFERENCE_FIELD = "this";
-
-    private static final ProtectionDomain PROTECTION_DOMAIN;
-
-    private final Map                     inspectors           = new HashMap();
-
-    private ByteArrayClassLoader          byteArrayClassLoader;
-
-    static {
-        PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
-            public Object run() {
-                return ClassFieldExtractorFactory.class.getProtectionDomain();
-            }
-        } );
-    }
-
-    public BaseClassFieldExtractor getClassFieldExtractor(final Class clazz,
-                                                          final String fieldName,
-                                                          final ClassLoader classLoader) {
-        if ( byteArrayClassLoader == null || byteArrayClassLoader.getParent() != classLoader ) {
-            if ( classLoader == null ) {
-                throw new RuntimeDroolsException( "ClassFieldExtractorFactory cannot have a null parent ClassLoader" );
-            }
-            byteArrayClassLoader = new ByteArrayClassLoader( classLoader );
-        }
-        try {
-            // if it is a self reference
-            if ( SELF_REFERENCE_FIELD.equals( fieldName ) ) {
-                // then just create an instance of the special class field extractor
-                return new SelfReferenceClassFieldExtractor( clazz,
-                                                             fieldName );
-            } else if ( fieldName.indexOf( '.' ) > -1 || fieldName.indexOf( '[' ) > -1 ) {
-                // we need MVEL extractor for expressions
-                return new MVELClassFieldExtractor( clazz,
-                                                    fieldName,
-                                                    classLoader );
-            } else {
-                // otherwise, bytecode generate a specific extractor
-                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 );
-                if ( fieldType != null && getterMethod != null ) {
-                    final String className = ClassFieldExtractorFactory.BASE_PACKAGE + "/" + Type.getInternalName( clazz ) + Math.abs( System.identityHashCode( clazz ) ) + "$" + getterMethod.getName();
-
-                    // generating byte array to create target class
-                    final byte[] bytes = dump( clazz,
-                                               className,
-                                               getterMethod,
-                                               fieldType,
-                                               clazz.isInterface() );
-                    // use bytes to get a class 
-
-                    final Class newClass = byteArrayClassLoader.defineClass( className.replace( '/',
-                                                                                                '.' ),
-                                                                             bytes,
-                                                                             PROTECTION_DOMAIN );
-                    // instantiating target class
-                    final Integer index = (Integer) inspector.getFieldNames().get( fieldName );
-                    final ValueType valueType = ValueType.determineValueType( fieldType );
-                    final Object[] params = {index, fieldType, valueType};
-                    return (BaseClassFieldExtractor) newClass.getConstructors()[0].newInstance( params );
-                } else {
-                    throw new RuntimeDroolsException( "Field/method '" + fieldName + "' not found for class '" + clazz.getName() + "'" );
-                }
-            }
-        } catch ( final RuntimeDroolsException e ) {
-            throw e;
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( e );
-        }
-    }
-
-    private byte[] dump(final Class originalClass,
-                        final String className,
-                        final Method getterMethod,
-                        final Class fieldType,
-                        final boolean isInterface) throws Exception {
-
-        final ClassWriter cw = new ClassWriter( true );
-
-        final Class superClass = getSuperClassFor( fieldType );
-        buildClassHeader( superClass,
-                          className,
-                          cw );
-
-        //        buildConstructor( superClass,
-        //                          className,
-        //                          cw );
-
-        build3ArgConstructor( superClass,
-                              className,
-                              cw );
-
-        buildGetMethod( originalClass,
-                        className,
-                        superClass,
-                        getterMethod,
-                        cw );
-
-        cw.visitEnd();
-
-        return cw.toByteArray();
-    }
-
-    /**
-     * Builds the class header
-     *  
-     * @param clazz The class to build the extractor for
-     * @param className The extractor class name
-     * @param cw
-     */
-    protected void buildClassHeader(final Class superClass,
-                                    final String className,
-                                    final ClassWriter cw) {
-        cw.visit( Opcodes.V1_5,
-                  Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
-                  className,
-                  null,
-                  Type.getInternalName( superClass ),
-                  null );
-
-        cw.visitSource( null,
-                        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 field extractor receiving
-     * the index, field type and value type
-     * 
-     * @param originalClassName
-     * @param className
-     * @param cw
-     */
-    private 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( int.class ), Type.getType( Class.class ), Type.getType( ValueType.class )} ),
-                                 null,
-                                 null );
-            mv.visitCode();
-            final Label l0 = new Label();
-            mv.visitLabel( l0 );
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             0 );
-            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( int.class ), Type.getType( Class.class ), Type.getType( ValueType.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( "index",
-                                   Type.getDescriptor( int.class ),
-                                   null,
-                                   l0,
-                                   l2,
-                                   1 );
-            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();
-        }
-    }
-
-    /**
-     * Creates the proxy reader method for the given method
-     * 
-     * @param fieldName
-     * @param fieldFlag
-     * @param method
-     * @param cw
-     */
-    protected void buildGetMethod(final Class originalClass,
-                                  final String className,
-                                  final Class superClass,
-                                  final Method getterMethod,
-                                  final ClassWriter cw) {
-
-        final Class fieldType = getterMethod.getReturnType();
-        Method overridingMethod;
-        try {
-            overridingMethod = superClass.getMethod( getOverridingMethodName( fieldType ),
-                                                     new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report back to JBoss Rules team.",
-                                              e );
-        }
-        final MethodVisitor mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                                 overridingMethod.getName(),
-                                                 Type.getMethodDescriptor( overridingMethod ),
-                                                 null,
-                                                 null );
-
-        mv.visitCode();
-
-        final Label l0 = new Label();
-        mv.visitLabel( l0 );
-        mv.visitVarInsn( Opcodes.ALOAD,
-                         2 );
-        mv.visitTypeInsn( Opcodes.CHECKCAST,
-                          Type.getInternalName( originalClass ) );
-
-        if ( originalClass.isInterface() ) {
-            mv.visitMethodInsn( Opcodes.INVOKEINTERFACE,
-                                Type.getInternalName( originalClass ),
-                                getterMethod.getName(),
-                                Type.getMethodDescriptor( getterMethod ) );
-        } else {
-            mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                Type.getInternalName( originalClass ),
-                                getterMethod.getName(),
-                                Type.getMethodDescriptor( getterMethod ) );
-        }
-        mv.visitInsn( Type.getType( fieldType ).getOpcode( Opcodes.IRETURN ) );
-        final Label l1 = new Label();
-        mv.visitLabel( l1 );
-        mv.visitLocalVariable( "this",
-                               "L" + className + ";",
-                               null,
-                               l0,
-                               l1,
-                               0 );
-        mv.visitLocalVariable( "workingMemory",
-                               Type.getDescriptor( InternalWorkingMemory.class ),
-                               null,
-                               l0,
-                               l1,
-                               1 );
-        mv.visitLocalVariable( "object",
-                               Type.getDescriptor( Object.class ),
-                               null,
-                               l0,
-                               l1,
-                               2 );
-        mv.visitMaxs( 0,
-                      0 );
-        mv.visitEnd();
-    }
-
-    private String getOverridingMethodName(final Class fieldType) {
-        String ret = null;
-        if ( fieldType.isPrimitive() ) {
-            if ( fieldType == char.class ) {
-                ret = "getCharValue";
-            } else if ( fieldType == byte.class ) {
-                ret = "getByteValue";
-            } else if ( fieldType == short.class ) {
-                ret = "getShortValue";
-            } else if ( fieldType == int.class ) {
-                ret = "getIntValue";
-            } else if ( fieldType == long.class ) {
-                ret = "getLongValue";
-            } else if ( fieldType == float.class ) {
-                ret = "getFloatValue";
-            } else if ( fieldType == double.class ) {
-                ret = "getDoubleValue";
-            } else if ( fieldType == boolean.class ) {
-                ret = "getBooleanValue";
-            }
-        } else {
-            ret = "getValue";
-        }
-        return ret;
-    }
-
-    /**
-     * Returns the appropriate Base class field extractor class
-     * for the given fieldType
-     * 
-     * @param fieldType
-     * @return
-     */
-    private Class getSuperClassFor(final Class fieldType) {
-        Class ret = null;
-        if ( fieldType.isPrimitive() ) {
-            if ( fieldType == char.class ) {
-                ret = BaseCharClassFieldExtractor.class;
-            } else if ( fieldType == byte.class ) {
-                ret = BaseByteClassFieldExtractor.class;
-            } else if ( fieldType == short.class ) {
-                ret = BaseShortClassFieldExtractor.class;
-            } else if ( fieldType == int.class ) {
-                ret = BaseIntClassFieldExtractor.class;
-            } else if ( fieldType == long.class ) {
-                ret = BaseLongClassFieldExtractors.class;
-            } else if ( fieldType == float.class ) {
-                ret = BaseFloatClassFieldExtractor.class;
-            } else if ( fieldType == double.class ) {
-                ret = BaseDoubleClassFieldExtractor.class;
-            } else if ( fieldType == boolean.class ) {
-                ret = BaseBooleanClassFieldExtractor.class;
-            }
-        } else {
-            ret = BaseObjectClassFieldExtractor.class;
-        }
-        return ret;
-    }
-
-    /**
-     * Simple classloader
-     * @author Michael Neale
-     */
-    static class ByteArrayClassLoader extends ClassLoader {
-        public ByteArrayClassLoader(final ClassLoader parent) {
-            super( parent );
-        }
-
-        public Class defineClass(final String name,
-                                 final byte[] bytes,
-                                 final ProtectionDomain domain) {
-            return defineClass( name,
-                                bytes,
-                                0,
-                                bytes.length,
-                                domain );
-        }
-    }
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,328 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.common.DroolsObjectInput;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
+import org.drools.util.ClassUtils;
+
+/**
+ * This provides access to fields, and what their numerical index/object type is.
+ * This is basically a wrapper class around dynamically generated subclasses of
+ * BaseClassFieldExtractor,
+ *  which allows serialization by regenerating the accessor classes
+ * when needed.
+ *
+ * @author Michael Neale
+ */
+public class ClassFieldReader
+    implements
+    InternalReadAccessor {
+    /**
+     *
+     */
+    private static final long              serialVersionUID = 400L;
+    private String                         fieldName;
+    private Class< ? >                     clazz;
+    private transient InternalReadAccessor reader;
+
+    public ClassFieldReader() {
+
+    }
+
+    public ClassFieldReader(final Class< ? > clazz,
+                            final String fieldName) {
+        this( clazz,
+              fieldName,
+              clazz.getClassLoader() );
+    }
+
+    public ClassFieldReader(final Class< ? > clazz,
+                            final String fieldName,
+                            final ClassLoader classLoader) {
+        this( clazz,
+              fieldName,
+              classLoader == null ? clazz.getClassLoader() : classLoader,
+              new ClassFieldAccessorFactory() );
+    }
+
+    public ClassFieldReader(final Class< ? > clazz,
+                            final String fieldName,
+                            final ClassLoader classLoader,
+                            final ClassFieldAccessorFactory factory) {
+        this.clazz = clazz;
+        this.fieldName = fieldName;
+        init( classLoader,
+              factory );
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        // Call even if there is no default serializable fields.
+        out.writeObject( clazz );
+        out.writeObject( fieldName );
+    }
+
+    public void readExternal(final ObjectInput is) throws ClassNotFoundException,
+                                                  IOException {
+        clazz = (Class< ? >) is.readObject();
+        fieldName = (String) is.readObject();
+        if ( is instanceof DroolsObjectInput ) {
+            DroolsObjectInput droolsInput = (DroolsObjectInput) is;
+            reader = droolsInput.getExtractorFactory().getReader( clazz,
+                                                                     fieldName,
+                                                                     droolsInput.getClassLoader() );
+        } else reader = ClassFieldAccessorCache.getInstance().getReader( clazz,
+                                                                            fieldName,
+                                                                            getClass().getClassLoader() );
+    }
+
+    private void init(final ClassLoader classLoader,
+                      final ClassFieldAccessorFactory factory) {
+        try {
+            this.reader = factory.getClassFieldReader( this.clazz,
+                                                          this.fieldName,
+                                                          classLoader );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public int getIndex() {
+        return this.reader.getIndex();
+    }
+
+    public String getFieldName() {
+        return this.fieldName;
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return this.reader.getValue( workingMemory,
+                                        object );
+    }
+
+    public ValueType getValueType() {
+        return this.reader.getValueType();
+    }
+
+    public Class< ? > getExtractToClass() {
+        return this.reader.getExtractToClass();
+    }
+
+    public String getExtractToClassName() {
+        return ClassUtils.canonicalName( this.reader.getExtractToClass() );
+    }
+
+    public String toString() {
+        return "[ClassFieldExtractor class=" + this.clazz + " field=" + this.fieldName + "]";
+    }
+
+    public int hashCode() {
+        return getValueType().hashCode() * 17 + getIndex();
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || !(object instanceof ClassFieldReader) ) {
+            return false;
+        }
+
+        final ClassFieldReader other = (ClassFieldReader) object;
+
+        return this.reader.getValueType() == other.getValueType() && this.reader.getIndex() == other.getIndex();
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
+        return this.reader.getBooleanValue( workingMemory,
+                                               object );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        return this.reader.getByteValue( workingMemory,
+                                            object );
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        return this.reader.getCharValue( workingMemory,
+                                            object );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
+        return this.reader.getDoubleValue( workingMemory,
+                                              object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        return this.reader.getFloatValue( workingMemory,
+                                             object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return this.reader.getIntValue( workingMemory,
+                                           object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        return this.reader.getLongValue( workingMemory,
+                                            object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        return this.reader.getShortValue( workingMemory,
+                                             object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        return this.reader.isNullValue( workingMemory,
+                                           object );
+    }
+
+    public Method getNativeReadMethod() {
+        return this.reader.getNativeReadMethod();
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return this.reader.getHashCode( workingMemory,
+                                           object );
+    }
+
+    public boolean isGlobal() {
+        return false;
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getBooleanValue(java.lang.Object)
+     */
+    public boolean getBooleanValue(Object object) {
+        return reader.getBooleanValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getByteValue(java.lang.Object)
+     */
+    public byte getByteValue(Object object) {
+        return reader.getByteValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getCharValue(java.lang.Object)
+     */
+    public char getCharValue(Object object) {
+        return reader.getCharValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getDoubleValue(java.lang.Object)
+     */
+    public double getDoubleValue(Object object) {
+        return reader.getDoubleValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getFloatValue(java.lang.Object)
+     */
+    public float getFloatValue(Object object) {
+        return reader.getFloatValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getHashCode(java.lang.Object)
+     */
+    public int getHashCode(Object object) {
+        return reader.getHashCode( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getIntValue(java.lang.Object)
+     */
+    public int getIntValue(Object object) {
+        return reader.getIntValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getLongValue(java.lang.Object)
+     */
+    public long getLongValue(Object object) {
+        return reader.getLongValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getShortValue(java.lang.Object)
+     */
+    public short getShortValue(Object object) {
+        return reader.getShortValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#getValue(java.lang.Object)
+     */
+    public Object getValue(Object object) {
+        return reader.getValue( object );
+    }
+
+    /**
+     * @param object
+     * @return
+     * @see org.drools.spi.ReadAccessor#isNullValue(java.lang.Object)
+     */
+    public boolean isNullValue(Object object) {
+        return reader.isNullValue( object );
+    }
+    
+    
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,207 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.common.DroolsObjectInput;
+import org.drools.spi.WriteAccessor;
+
+/**
+ * This class implements the WriteAccessor interface
+ * allowing the application to write values into a field
+ * from a class
+ *
+ * @author Edson Tirelli
+ */
+public class ClassFieldWriter
+    implements
+    WriteAccessor {
+
+    private static final long       serialVersionUID = 400L;
+    private String                  fieldName;
+    private Class< ? >              clazz;
+    private transient WriteAccessor writer;
+
+    public ClassFieldWriter() {
+
+    }
+
+    public ClassFieldWriter(final Class< ? > clazz,
+                            final String fieldName) {
+        this( clazz,
+              fieldName,
+              clazz.getClassLoader() );
+    }
+
+    public ClassFieldWriter(final Class< ? > clazz,
+                            final String fieldName,
+                            final ClassLoader classLoader) {
+        this( clazz,
+              fieldName,
+              classLoader,
+              new ClassFieldAccessorFactory() );
+    }
+
+    public ClassFieldWriter(final Class< ? > clazz,
+                            final String fieldName,
+                            final ClassLoader classLoader,
+                            final ClassFieldAccessorFactory factory) {
+        this.clazz = clazz;
+        this.fieldName = fieldName;
+        init( findClassLoader( classLoader ),
+              factory );
+    }
+
+    /**
+     * @param classLoader
+     */
+    private ClassLoader findClassLoader(final ClassLoader classLoader) {
+        ClassLoader loader = classLoader;
+        if ( loader == null ) {
+            loader = Thread.currentThread().getContextClassLoader();
+            if ( loader == null ) {
+                loader = this.getClass().getClassLoader();
+            }
+        }
+        return loader;
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        // Call even if there is no default serializable fields.
+        out.writeObject( clazz );
+        out.writeObject( fieldName );
+    }
+
+    public void readExternal(final ObjectInput is) throws ClassNotFoundException,
+                                                  IOException {
+        clazz = (Class< ? >) is.readObject();
+        fieldName = (String) is.readObject();
+        if ( is instanceof DroolsObjectInput ) {
+            DroolsObjectInput droolsInput = (DroolsObjectInput) is;
+            writer = droolsInput.getExtractorFactory().getWriter( clazz,
+                                                                  fieldName,
+                                                                  droolsInput.getClassLoader() );
+        } else writer = ClassFieldAccessorCache.getInstance().getWriter( clazz,
+                                                                         fieldName,
+                                                                         findClassLoader( null ) );
+    }
+
+    private void init(final ClassLoader classLoader,
+                      final ClassFieldAccessorFactory factory) {
+        try {
+            this.writer = factory.getClassFieldWriter( this.clazz,
+                                                       this.fieldName,
+                                                       classLoader );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( e );
+        }
+    }
+
+    public int getIndex() {
+        return this.writer.getIndex();
+    }
+
+    public String getFieldName() {
+        return this.fieldName;
+    }
+
+    public String toString() {
+        return "[ClassFieldWriter class=" + this.clazz + " field=" + this.fieldName + "]";
+    }
+
+    public int hashCode() {
+        return getValueType().hashCode() * 17 + getIndex();
+    }
+
+    public boolean equals(final Object object) {
+        if ( this == object ) {
+            return true;
+        }
+
+        if ( object == null || !(object instanceof ClassFieldWriter) ) {
+            return false;
+        }
+
+        final ClassFieldWriter other = (ClassFieldWriter) object;
+
+        return this.writer.getValueType() == other.getValueType() && this.writer.getIndex() == other.getIndex();
+    }
+
+    public Class< ? > getFieldType() {
+        return writer.getFieldType();
+    }
+
+    public Method getNativeWriteMethod() {
+        return writer.getNativeWriteMethod();
+    }
+
+    public ValueType getValueType() {
+        return writer.getValueType();
+    }
+
+    public void setBooleanValue(Object bean,
+                                boolean value) {
+        writer.setBooleanValue( bean, value );
+    }
+
+    public void setByteValue(Object bean,
+                             byte value) {
+        writer.setByteValue( bean, value );
+
+    }
+
+    public void setCharValue(Object bean,
+                             char value) {
+        writer.setCharValue( bean, value );
+    }
+
+    public void setDoubleValue(Object bean,
+                               double value) {
+        writer.setDoubleValue( bean, value );
+    }
+
+    public void setFloatValue(Object bean,
+                              float value) {
+        writer.setFloatValue( bean, value );
+    }
+
+    public void setIntValue(Object bean,
+                            int value) {
+        writer.setIntValue( bean, value );
+    }
+
+    public void setLongValue(Object bean,
+                             long value) {
+        writer.setLongValue( bean, value );
+    }
+
+    public void setShortValue(Object bean,
+                              short value) {
+        writer.setShortValue( bean, value );
+    }
+
+    public void setValue(Object bean,
+                         Object value) {
+        writer.setValue( bean, value );
+    }
+
+}
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base;
+
+import org.drools.spi.ReadAccessor;
+import org.drools.spi.WriteAccessor;
+
+
+/**
+ * An interface for Accessor classes that joins both reader and writer accessor methods 
+ *
+ * @author etirelli
+ */
+public interface FieldAccessor extends ReadAccessor, WriteAccessor {
+    
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldAccessor.java
___________________________________________________________________
Name: svn:executable
   + *

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/AfterEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -17,12 +17,12 @@
  */
 package org.drools.base.evaluators;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.BaseEvaluator;
@@ -33,8 +33,8 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 
 /**
  * The implementation of the 'after' evaluator definition
@@ -175,7 +175,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'after' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -204,9 +204,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             if ( extractor1.isNullValue( workingMemory,
                                          object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BeforeEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BeforeEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/BeforeEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -175,7 +175,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'before' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -206,9 +206,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             if ( extractor1.isNullValue( workingMemory,
                                          object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CoincidesEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CoincidesEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/CoincidesEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -175,7 +175,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'coincides' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -209,9 +209,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             if ( extractor1.isNullValue( workingMemory,
                                          object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ComparableEvaluatorsDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -34,7 +34,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 import org.drools.util.DateUtils;
 
@@ -195,7 +195,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -223,9 +223,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -251,7 +251,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -279,9 +279,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -307,7 +307,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -335,9 +335,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -363,7 +363,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -391,9 +391,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -419,7 +419,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -447,9 +447,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -475,7 +475,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -503,9 +503,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -531,7 +531,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -559,9 +559,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -587,7 +587,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -615,9 +615,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -643,7 +643,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -668,9 +668,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -695,7 +695,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -720,9 +720,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -747,7 +747,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -772,9 +772,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -799,7 +799,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -824,9 +824,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -851,7 +851,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -876,9 +876,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -903,7 +903,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -928,9 +928,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -955,7 +955,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -980,9 +980,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1007,7 +1007,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1032,9 +1032,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1059,7 +1059,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1090,9 +1090,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1120,7 +1120,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1151,9 +1151,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1181,7 +1181,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1212,9 +1212,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1242,7 +1242,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1273,9 +1273,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1303,7 +1303,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1331,9 +1331,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1359,7 +1359,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1387,9 +1387,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1415,7 +1415,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1443,9 +1443,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1471,7 +1471,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1499,9 +1499,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1527,7 +1527,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1555,9 +1555,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1583,7 +1583,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1611,9 +1611,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1639,7 +1639,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1667,9 +1667,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1695,7 +1695,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1723,9 +1723,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1751,7 +1751,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1776,9 +1776,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1803,7 +1803,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1828,9 +1828,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1855,7 +1855,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1880,9 +1880,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1907,7 +1907,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1932,9 +1932,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -1959,7 +1959,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -1984,9 +1984,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2011,7 +2011,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2036,9 +2036,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2063,7 +2063,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2088,9 +2088,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2115,7 +2115,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2140,9 +2140,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2166,7 +2166,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2194,9 +2194,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2223,7 +2223,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2251,9 +2251,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2280,7 +2280,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2308,9 +2308,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2337,7 +2337,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2365,9 +2365,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2393,7 +2393,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2418,9 +2418,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2445,7 +2445,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2470,9 +2470,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2497,7 +2497,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2522,9 +2522,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }
@@ -2549,7 +2549,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if( extractor.isNullValue( workingMemory, object1 ) ) {
                 return false;
@@ -2574,9 +2574,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if( extractor1.isNullValue( workingMemory, object1 ) ) {
                 return false;
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DuringEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DuringEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/DuringEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'during' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -212,9 +212,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/EqualityEvaluatorsDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 import org.drools.util.DateUtils;
 
@@ -164,7 +164,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory,
@@ -199,9 +199,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory,
                                                        object1 );
@@ -232,7 +232,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory,
@@ -267,9 +267,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory,
                                                        object1 );
@@ -299,7 +299,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getBigDecimalValue();
@@ -328,9 +328,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -358,7 +358,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getBigDecimalValue();
@@ -387,9 +387,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -416,7 +416,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getBigIntegerValue();
@@ -445,9 +445,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -474,7 +474,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getBigDecimalValue();
@@ -503,9 +503,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -530,7 +530,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -564,9 +564,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -595,7 +595,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -628,9 +628,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -658,7 +658,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -692,9 +692,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -723,7 +723,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -757,9 +757,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -787,7 +787,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -821,9 +821,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -851,7 +851,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -885,9 +885,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -915,7 +915,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -955,9 +955,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
             final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -988,7 +988,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Date value1 = (Date) extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -1028,9 +1028,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Date value1 = (Date) extractor1.getValue( workingMemory, object1 );
             final Date value2 = (Date) extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -1060,7 +1060,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -1095,9 +1095,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1126,7 +1126,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -1163,9 +1163,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1194,7 +1194,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -1223,9 +1223,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -1253,7 +1253,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -1282,9 +1282,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -1309,7 +1309,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -1346,9 +1346,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1377,7 +1377,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -1414,9 +1414,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1445,7 +1445,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -1479,9 +1479,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1510,7 +1510,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -1544,9 +1544,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1574,7 +1574,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -1608,9 +1608,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1638,7 +1638,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -1672,9 +1672,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1703,7 +1703,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -1741,9 +1741,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -1775,7 +1775,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -1813,9 +1813,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -1845,7 +1845,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return object2.isNull();
@@ -1879,9 +1879,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1909,7 +1909,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             if ( extractor.isNullValue( workingMemory, object1 ) ) {
                 return !object2.isNull();
@@ -1943,9 +1943,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             if (extractor1.isNullValue( workingMemory, object1 )) {
                 return !extractor2.isNullValue( workingMemory, object2 );
             } else if (extractor2.isNullValue( workingMemory, object2 )) {
@@ -1973,7 +1973,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -2002,9 +2002,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -2032,7 +2032,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final Object value1 = extractor.getValue( workingMemory, object1 );
             final Object value2 = object2.getValue();
@@ -2061,9 +2061,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishedByEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishedByEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishedByEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -177,7 +177,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'finishedby' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -210,9 +210,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishesEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishesEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/FinishesEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'finishes' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -212,9 +212,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IncludesEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IncludesEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/IncludesEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'includes' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -212,9 +212,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MatchesEvaluatorsDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -23,7 +23,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 import java.io.ObjectInput;
@@ -121,7 +121,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
@@ -150,9 +150,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
@@ -208,9 +208,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MeetsEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MeetsEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MeetsEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -172,7 +172,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'meets' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -204,9 +204,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MetByEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MetByEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/MetByEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -172,7 +172,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'metby' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -204,9 +204,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             if ( extractor1.isNullValue( workingMemory,
                                          object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlappedByEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlappedByEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlappedByEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'overlappedby' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -215,9 +215,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             if ( extractor1.isNullValue( workingMemory,
                                          object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlapsEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlapsEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/OverlapsEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -179,7 +179,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'overlaps' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -216,9 +216,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SetEvaluatorsDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -29,7 +29,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 import org.drools.util.ShadowProxyUtils;
 
@@ -182,7 +182,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value = object2.getValue();
@@ -216,9 +216,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value = extractor2.getValue( workingMemory,
                                                       object2 );
@@ -248,7 +248,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value = object2.getValue();
@@ -282,9 +282,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value = extractor2.getValue( workingMemory,
                                                       object2 );
@@ -314,7 +314,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
@@ -348,9 +348,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object[] array = (Object[]) extractor2.getValue( workingMemory,
                                                                    object2 );
@@ -380,7 +380,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object[] array = (Object[]) object2.getValue();
@@ -414,9 +414,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object[] array = (Object[]) extractor2.getValue( workingMemory,
                                                                    object2 );
@@ -453,7 +453,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             if ( object2.isNull() ) {
@@ -501,9 +501,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object object = extractor2.getValue( workingMemory,
                                                        object2 );
@@ -539,7 +539,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             if ( object2.isNull() ) {
@@ -587,9 +587,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object object = extractor2.getValue( workingMemory,
                                                        object2 );
@@ -923,7 +923,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value = object2.getValue();
@@ -954,9 +954,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value = extractor2.getValue( workingMemory,
                                                       object2 );
@@ -984,7 +984,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             final Object value = object2.getValue();
@@ -1015,9 +1015,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2,
+                                final InternalReadAccessor extractor2,
                                 final Object object2) {
             final Object value = extractor2.getValue( workingMemory,
                                                       object2 );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/SoundslikeEvaluatorsDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -23,7 +23,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 import org.mvel.Soundex;
 
@@ -119,7 +119,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
@@ -149,9 +149,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {
@@ -176,7 +176,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1, final FieldValue object2) {
             final String value1 = (String) extractor.getValue( workingMemory, object1 );
             final String value2 = (String) object2.getValue();
@@ -206,9 +206,9 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor1,
+                                final InternalReadAccessor extractor1,
                                 final Object object1,
-                                final Extractor extractor2, final Object object2) {
+                                final InternalReadAccessor extractor2, final Object object2) {
             final Object value1 = extractor1.getValue( workingMemory, object1 );
             final Object value2 = extractor2.getValue( workingMemory, object2 );
             if ( value1 == null ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartedByEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartedByEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartedByEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -177,7 +177,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'startedby' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -210,9 +210,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartsEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartsEvaluatorDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/StartsEvaluatorDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -33,7 +33,7 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.FieldValue;
 
 /**
@@ -177,7 +177,7 @@
         }
 
         public boolean evaluate(InternalWorkingMemory workingMemory,
-                                final Extractor extractor,
+                                final InternalReadAccessor extractor,
                                 final Object object1,
                                 final FieldValue object2) {
             throw new RuntimeDroolsException( "The 'starts' operator can only be used to compare one event to another, and never to compare to literal constraints." );
@@ -210,9 +210,9 @@
 		}
 
 		public boolean evaluate(InternalWorkingMemory workingMemory,
-			     final Extractor extractor1,
+			     final InternalReadAccessor extractor1,
 			     final Object object1,
-			     final Extractor extractor2,
+			     final InternalReadAccessor extractor2,
 			     final Object object2) {
 			if ( extractor1.isNullValue( workingMemory,
 			              object1 ) ) {

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayElementReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayElementReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayElementReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,184 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectInput;
+
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.util.ClassUtils;
+
+public class ArrayElementReader implements InternalReadAccessor {
+    private InternalReadAccessor arrayExtractor;
+    private int index;
+    private Class<?> type;
+
+    public ArrayElementReader() {
+
+    }
+
+    public ArrayElementReader(InternalReadAccessor arrayExtractor, int index, Class<?> type) {
+        this.arrayExtractor = arrayExtractor;
+        this.index = index;
+        this.type = type;
+    }
+
+    public Class<?> getExtractToClass() {
+        return type;
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        arrayExtractor  = (InternalReadAccessor)in.readObject();
+        index           = in.readInt();
+        type            = (Class<?>)in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject(arrayExtractor);
+        out.writeInt(index);
+        out.writeObject(type);
+    }
+
+    public String getExtractToClassName() {
+        return ClassUtils.canonicalName( type );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Boolean)array[ this.index ]).booleanValue();
+    }
+    public byte getByteValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number)array[ this.index ]).byteValue();
+    }
+    public char getCharValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Character)array[ this.index ]).charValue();
+    }
+    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number)array[ this.index ]).doubleValue();
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number)array[ this.index ]).floatValue();
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number)array[ this.index ]).intValue();
+    }
+    public long getLongValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number) array[ this.index ]).longValue();
+    }
+    public Method getNativeReadMethod() {
+        throw new UnsupportedOperationException("cannot call a method on an array extractor" );
+    }
+    public short getShortValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return ( (Number)array[ this.index ]).shortValue();
+    }
+    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return array[ this.index ];
+    }
+    public ValueType getValueType() {
+        return ValueType.OBJECT_TYPE;
+    }
+    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object ) {
+        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        return array[ this.index ] == null;
+    }
+
+  public int getHashCode(InternalWorkingMemory workingMemory, Object object) {
+      Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+      return array[ this.index ].hashCode();
+  }
+
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((arrayExtractor == null) ? 0 : arrayExtractor.hashCode());
+        result = PRIME * result + index;
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        final ArrayElementReader other = (ArrayElementReader) obj;
+        if ( arrayExtractor == null ) {
+            if ( other.arrayExtractor != null ) return false;
+        } else if ( !arrayExtractor.equals( other.arrayExtractor ) ) return false;
+        if ( index != other.index ) return false;
+        return true;
+    }
+
+    public boolean isGlobal() {
+        return false;
+    }
+
+    public boolean getBooleanValue(Object object) {
+        return getBooleanValue( null,
+                                object );
+    }
+
+    public byte getByteValue(Object object) {
+        return getByteValue( null,
+                             object );
+    }
+
+    public char getCharValue(Object object) {
+        return getCharValue( null,
+                             object );
+    }
+
+    public double getDoubleValue(Object object) {
+        return getDoubleValue( null,
+                               object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getFloatValue( null,
+                              object );
+    }
+
+    public int getHashCode(Object object) {
+        return getHashCode( null,
+                            object );
+    }
+
+    public int getIndex() {
+        return -1;
+    }
+
+    public int getIntValue(Object object) {
+        return getIntValue( null,
+                            object );
+    }
+
+    public long getLongValue(Object object) {
+        return getLongValue( null,
+                             object );
+    }
+
+    public short getShortValue(Object object) {
+        return getShortValue( null,
+                              object );
+    }
+
+    public Object getValue(Object object) {
+        return getValue( null,
+                         object );
+    }
+
+    public boolean isNullValue(Object object) {
+        return isNullValue( null,
+                            object );
+    }
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,125 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.Extractor;
-import org.drools.util.ClassUtils;
-
-public class ArrayExtractor implements Extractor {
-    private Extractor arrayExtractor;
-    private int index;
-    private Class type;
-
-    public ArrayExtractor() {
-
-    }
-
-    public ArrayExtractor(Extractor arrayExtractor, int index, Class type) {
-        this.arrayExtractor = arrayExtractor;
-        this.index = index;
-        this.type = type;
-    }
-
-    public Class getExtractToClass() {
-        return type;
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        arrayExtractor  = (Extractor)in.readObject();
-        index           = in.readInt();
-        type            = (Class)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(arrayExtractor);
-        out.writeInt(index);
-        out.writeObject(type);
-    }
-
-    public String getExtractToClassName() {
-        return ClassUtils.canonicalName( type );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Boolean)array[ this.index ]).booleanValue();
-    }
-    public byte getByteValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number)array[ this.index ]).byteValue();
-    }
-    public char getCharValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Character)array[ this.index ]).charValue();
-    }
-    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number)array[ this.index ]).doubleValue();
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number)array[ this.index ]).floatValue();
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number)array[ this.index ]).intValue();
-    }
-    public long getLongValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number) array[ this.index ]).longValue();
-    }
-    public Method getNativeReadMethod() {
-        throw new UnsupportedOperationException("cannot call a method on an array extractor" );
-    }
-    public short getShortValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return ( (Number)array[ this.index ]).shortValue();
-    }
-    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return array[ this.index ];
-    }
-    public ValueType getValueType() {
-        return ValueType.OBJECT_TYPE;
-    }
-    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object ) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-        return array[ this.index ] == null;
-    }
-
-  public int getHashCode(InternalWorkingMemory workingMemory, Object object) {
-      Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
-      return array[ this.index ].hashCode();
-  }
-
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + ((arrayExtractor == null) ? 0 : arrayExtractor.hashCode());
-        result = PRIME * result + index;
-        return result;
-    }
-
-    public boolean equals(Object obj) {
-        if ( this == obj ) return true;
-        if ( obj == null ) return false;
-        if ( getClass() != obj.getClass() ) return false;
-        final ArrayExtractor other = (ArrayExtractor) obj;
-        if ( arrayExtractor == null ) {
-            if ( other.arrayExtractor != null ) return false;
-        } else if ( !arrayExtractor.equals( other.arrayExtractor ) ) return false;
-        if ( index != other.index ) return false;
-        return true;
-    }
-
-    public boolean isGlobal() {
-        return false;
-    }
-}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,109 +0,0 @@
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-/**
- * A Base class for primitive boolean class field
- * extractors. This class centralizes type conversions.
- *  
- * @author etirelli
- */
-public abstract class BaseBooleanClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseBooleanClassFieldExtractor(final Class clazz,
-                                          final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return getBooleanValue( workingMemory, object ) ? Boolean.TRUE : Boolean.FALSE;
-    }
-
-    public abstract boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to byte not supported from boolean" );
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from boolean" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to double not supported from boolean" );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to float not supported from boolean" );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to int not supported from boolean" );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to long not supported from boolean" );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
-    }
-    
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getBooleanValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getBooleanValue( workingMemory, object ) ? 1231 : 1237;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldReader.java (from rev 19963, 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/BaseBooleanClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+/**
+ * A Base class for primitive boolean class field
+ * extractors. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseBooleanClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseBooleanClassFieldReader(final Class< ? > clazz,
+                                       final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseBooleanClassFieldReader(final int index,
+                                          final Class< ? > fieldType,
+                                          final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return getBooleanValue( workingMemory,
+                                object ) ? Boolean.TRUE : Boolean.FALSE;
+    }
+
+    public abstract boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                            Object object);
+
+    public byte getByteValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        throw new RuntimeDroolsException( "Conversion to byte not supported from boolean" );
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from boolean" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
+        throw new RuntimeDroolsException( "Conversion to double not supported from boolean" );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        throw new RuntimeDroolsException( "Conversion to float not supported from boolean" );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        throw new RuntimeDroolsException( "Conversion to int not supported from boolean" );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
+        throw new RuntimeDroolsException( "Conversion to long not supported from boolean" );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getBooleanValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return getBooleanValue( workingMemory,
+                                object ) ? 1231 : 1237;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseBooleanClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2008 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+/**
+ * A Base class for primitive boolean class field
+ * write accessors. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseBooleanClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseBooleanClassFieldWriter(final Class< ? > clazz,
+                                       final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hierarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseBooleanClassFieldWriter(final int index,
+                                          final Class< ? > fieldType,
+                                          final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setBooleanValue( bean,
+                         value == null ? false : ((Boolean) value).booleanValue() );
+    }
+
+    public abstract void setBooleanValue(final Object bean,
+                                         final boolean value);
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from byte" );
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from double" );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from float" );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from int" );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from long" );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from short" );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setBooleanValue",
+                                                      new Class[]{Object.class, boolean.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,108 +0,0 @@
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-/**
- * A Base class for primitive byte class field
- * extractors. This class centralizes type conversions.
- *  
- * @author etirelli
- */
-public abstract class BaseByteClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseByteClassFieldExtractor(final Class clazz,
-                                       final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Byte( getByteValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from byte" );
-    }
-
-    public abstract byte getByteValue(InternalWorkingMemory workingMemory, Object object);
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from byte" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-    
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getByteValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getByteValue( workingMemory, object );
-    }
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldReader.java (from rev 19963, 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/BaseByteClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+/**
+ * A Base class for primitive byte class field
+ * extractors. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseByteClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseByteClassFieldReader(final Class clazz,
+                                       final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseByteClassFieldReader(final int index,
+                                          final Class fieldType,
+                                          final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Byte( getByteValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from byte" );
+    }
+
+    public abstract byte getByteValue(InternalWorkingMemory workingMemory, Object object);
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from byte" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+    
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getByteValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getByteValue( workingMemory, object );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseByteClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+/**
+ * A Base class for primitive byte class field
+ * writer. This class centralizes type conversions.
+ *  
+ * @author etirelli
+ */
+public abstract class BaseByteClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseByteClassFieldWriter(final Class< ? > clazz,
+                                    final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hierarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseByteClassFieldWriter(final int index,
+                                       final Class< ? > fieldType,
+                                       final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setByteValue( bean,
+                      value == null ? 0 : ((Number) value).byteValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to byte not supported from boolean" );
+    }
+
+    public abstract void setByteValue(final Object bean,
+                                      final byte value);
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to byte not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setByteValue( bean,
+                      (byte) value );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setByteValue( bean,
+                      (byte) value );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setByteValue( bean,
+                      (byte) value );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setByteValue( bean,
+                      (byte) value );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setByteValue( bean,
+                      (byte) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setByteValue",
+                                                      new Class[]{Object.class, byte.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,86 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseCharClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseCharClassFieldExtractor(final Class clazz,
-                                       final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Character( getCharValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from char" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getCharValue( workingMemory, object );
-    }
-
-    public abstract char getCharValue(InternalWorkingMemory workingMemory, Object object);
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getCharValue( workingMemory, object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getCharValue( workingMemory, object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getCharValue( workingMemory, object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getCharValue( workingMemory, object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (short) getCharValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-    
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getCharValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getCharValue( workingMemory, object );
-    }
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldReader.java (from rev 19963, 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/BaseCharClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,86 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseCharClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseCharClassFieldReader(final Class clazz,
+                                       final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseCharClassFieldReader(final int index,
+                                          final Class fieldType,
+                                          final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Character( getCharValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from char" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getCharValue( workingMemory, object );
+    }
+
+    public abstract char getCharValue(InternalWorkingMemory workingMemory, Object object);
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getCharValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+    
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getCharValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getCharValue( workingMemory, object );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseCharClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseCharClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseCharClassFieldWriter(final Class< ? > clazz,
+                                    final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hierarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseCharClassFieldWriter(final int index,
+                                       final Class< ? > fieldType,
+                                       final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setCharValue( bean,
+                     value == null ? '\0' : ((Character) value).charValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public abstract void setCharValue(final Object object,
+                                      final char value);
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setCharValue( bean,
+                      (char) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setCharValue",
+                                                      new Class[]{Object.class, char.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,89 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseDoubleClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseDoubleClassFieldExtractor(final Class clazz,
-                                         final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Double( getDoubleValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from double" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getDoubleValue( workingMemory, object );
-
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from double" );
-    }
-
-    public abstract double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (float) getDoubleValue( workingMemory, object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (int) getDoubleValue( workingMemory, object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (long) getDoubleValue( workingMemory, object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (short) getDoubleValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getDoubleValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        final long temp = Double.doubleToLongBits( getDoubleValue( workingMemory, object ) );
-        return (int) (temp ^ (temp >>> 32));
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldReader.java (from rev 19963, 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/BaseDoubleClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,89 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseDoubleClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseDoubleClassFieldReader(final Class clazz,
+                                         final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseDoubleClassFieldReader(final int index,
+                                            final Class fieldType,
+                                            final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Double( getDoubleValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from double" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getDoubleValue( workingMemory, object );
+
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from double" );
+    }
+
+    public abstract double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (float) getDoubleValue( workingMemory, object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getDoubleValue( workingMemory, object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (long) getDoubleValue( workingMemory, object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getDoubleValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getDoubleValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final long temp = Double.doubleToLongBits( getDoubleValue( workingMemory, object ) );
+        return (int) (temp ^ (temp >>> 32));
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseDoubleClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,94 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseDoubleClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseDoubleClassFieldWriter(final Class< ? > clazz,
+                                      final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hierarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseDoubleClassFieldWriter(final int index,
+                                         final Class< ? > fieldType,
+                                         final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setDoubleValue( bean,
+                        value == null ? 0 : ((Number) value).doubleValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to double not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setDoubleValue( bean,
+                        (double) value );
+
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to double not supported from char" );
+    }
+
+    public abstract void setDoubleValue(final Object object,
+                                        final double value);
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setDoubleValue( bean,
+                        (double) value );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setDoubleValue( bean,
+                        (double) value );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setDoubleValue( bean,
+                        (double) value );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setDoubleValue( bean,
+                        (double) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setDoubleValue",
+                                                      new Class[]{Object.class, double.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,88 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseFloatClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseFloatClassFieldExtractor(final Class clazz,
-                                        final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Float( getFloatValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from float" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getFloatValue( workingMemory, object );
-
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from float" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getFloatValue( workingMemory, object );
-    }
-
-    public abstract float getFloatValue(InternalWorkingMemory workingMemory, Object object);
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (int) getFloatValue( workingMemory, object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (long) getFloatValue( workingMemory, object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (short) getFloatValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getFloatValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return Float.floatToIntBits( getFloatValue( workingMemory, object ) );
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldReader.java (from rev 19963, 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/BaseFloatClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,88 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseFloatClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseFloatClassFieldReader(final Class clazz,
+                                        final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseFloatClassFieldReader(final int index,
+                                           final Class fieldType,
+                                           final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Float( getFloatValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from float" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getFloatValue( workingMemory, object );
+
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from float" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getFloatValue( workingMemory, object );
+    }
+
+    public abstract float getFloatValue(InternalWorkingMemory workingMemory, Object object);
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getFloatValue( workingMemory, object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (long) getFloatValue( workingMemory, object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getFloatValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getFloatValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return Float.floatToIntBits( getFloatValue( workingMemory, object ) );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseFloatClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,93 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseFloatClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseFloatClassFieldWriter(final Class< ? > clazz,
+                                     final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseFloatClassFieldWriter(final int index,
+                                        final Class< ? > fieldType,
+                                        final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setFloatValue( bean,
+                       value == null ? 0 : ((Number) value).floatValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to float not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setFloatValue( bean,
+                       (float) value );
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to float not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setFloatValue( bean,
+                       (float) value );
+    }
+
+    public abstract void setFloatValue(final Object object,
+                                       final float value);
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setFloatValue( bean,
+                       (float) value );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setFloatValue( bean,
+                       (float) value );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setFloatValue( bean,
+                       (float) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setFloatValue",
+                                                      new Class[]{Object.class, float.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,87 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseIntClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseIntClassFieldExtractor(final Class clazz,
-                                      final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Integer( getIntValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from int" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getIntValue( workingMemory, object );
-
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from int" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getIntValue( workingMemory, object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getIntValue( workingMemory, object );
-    }
-
-    public abstract int getIntValue(InternalWorkingMemory workingMemory, Object object);
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getIntValue( workingMemory, object );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (short) getIntValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getIntValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getIntValue( workingMemory, object );
-    }
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldReader.java (from rev 19963, 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/BaseIntClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,87 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseIntClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseIntClassFieldReader(final Class clazz,
+                                      final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseIntClassFieldReader(final int index,
+                                         final Class fieldType,
+                                         final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Integer( getIntValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from int" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getIntValue( workingMemory, object );
+
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from int" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
+    }
+
+    public abstract int getIntValue(InternalWorkingMemory workingMemory, Object object);
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getIntValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getIntValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getIntValue( workingMemory, object );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseIntClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,94 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseIntClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseIntClassFieldWriter(final Class< ? > clazz,
+                                   final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseIntClassFieldWriter(final int index,
+                                      final Class< ? > fieldType,
+                                      final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setIntValue( bean,
+                     value == null ? 0 : ((Number) value).intValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to int not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setIntValue( bean,
+                     (int) value );
+
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to int not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setIntValue( bean,
+                     (int) value );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setIntValue( bean,
+                     (int) value );
+    }
+
+    public abstract void setIntValue(final Object object,
+                                     final int value);
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setIntValue( bean,
+                     (int) value );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setIntValue( bean,
+                     (int) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setIntValue",
+                                                      new Class[]{Object.class, int.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldExtractors.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,89 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseLongClassFieldExtractors extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseLongClassFieldExtractors(final Class clazz,
-                                        final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Long( getLongValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from long" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getLongValue( workingMemory, object );
-
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from long" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getLongValue( workingMemory, object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getLongValue( workingMemory, object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (int) getLongValue( workingMemory, object );
-    }
-
-    public abstract long getLongValue(InternalWorkingMemory workingMemory, Object object);
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (short) getLongValue( workingMemory, object );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getLongValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        final long temp = getLongValue( workingMemory, object );
-        return (int) (temp ^ (temp >>> 32));
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldReader.java (from rev 19963, 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/BaseLongClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,89 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseLongClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseLongClassFieldReader(final Class clazz,
+                                        final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseLongClassFieldReader(final int index,
+                                           final Class fieldType,
+                                           final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Long( getLongValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from long" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getLongValue( workingMemory, object );
+
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from long" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getLongValue( workingMemory, object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getLongValue( workingMemory, object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (int) getLongValue( workingMemory, object );
+    }
+
+    public abstract long getLongValue(InternalWorkingMemory workingMemory, Object object);
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (short) getLongValue( workingMemory, object );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getLongValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final long temp = getLongValue( workingMemory, object );
+        return (int) (temp ^ (temp >>> 32));
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseLongClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,94 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseLongClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseLongClassFieldWriter(final Class< ? > clazz,
+                                    final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseLongClassFieldWriter(final int index,
+                                       final Class< ? > fieldType,
+                                       final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setLongValue( bean,
+                      value == null ? 0 : ((Number) value).longValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to long not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setLongValue( bean,
+                      (long) value );
+
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to long not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setLongValue( bean,
+                      (long) value );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setLongValue( bean,
+                      (long) value );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setLongValue( bean,
+                      (long) value );
+    }
+
+    public abstract void setLongValue(final Object object,
+                                      final long value);
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setLongValue( bean,
+                      (long) value );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setLongValue",
+                                                      new Class[]{Object.class, long.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,147 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseObjectClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseObjectClassFieldExtractor() {
-
-    }
-
-    protected BaseObjectClassFieldExtractor(final int index,
-                                            final Class fieldType,
-                                            final ValueType valueType) {
-        super( index,
-               fieldType,
-               valueType );
-    }
-
-    public BaseObjectClassFieldExtractor(final Class clazz,
-                                         final String fieldName) {
-        super( clazz,
-               fieldName );
-    }
-
-    public abstract Object getValue(InternalWorkingMemory workingMemory, Object object);
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Boolean ) {
-            return ((Boolean) value).booleanValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from " + value.getClass().getName() );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).byteValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to byte not supported from " + value.getClass().getName() );
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Character ) {
-            return ((Character) value).charValue();
-        } else if( value instanceof String && ((String)value).length() == 1 ) {
-            return ((String)value).charAt( 0 );
-        }
-        throw new RuntimeDroolsException( "Conversion to char not supported from " + value.getClass().getName() );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).doubleValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to double not supported from " + value.getClass().getName() );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).floatValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to float not supported from " + value.getClass().getName() );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).intValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to int not supported from " + value.getClass().getName() );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).longValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to long not supported from " + value.getClass().getName() );
-    }
-
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        // this can be improved by generating specific
-        // bytecode generation in the subclass, avoiding the if instanceof
-        final Object value = getValue( workingMemory, object );
-
-        if ( value instanceof Number ) {
-            return ((Number) value).shortValue();
-        }
-        throw new RuntimeDroolsException( "Conversion to short not supported from " + value.getClass().getName() );
-    }
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        if (object == null) {
-            return true;
-        } else {
-            return getValue( workingMemory, object ) == null;
-        }
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        final Object value = getValue( workingMemory, object );
-        return (value != null) ? value.hashCode() : 0;
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,147 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseObjectClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseObjectClassFieldReader() {
+
+    }
+
+    protected BaseObjectClassFieldReader(final int index,
+                                            final Class fieldType,
+                                            final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public BaseObjectClassFieldReader(final Class clazz,
+                                         final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public abstract Object getValue(InternalWorkingMemory workingMemory, Object object);
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Boolean ) {
+            return ((Boolean) value).booleanValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from " + value.getClass().getName() );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).byteValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to byte not supported from " + value.getClass().getName() );
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Character ) {
+            return ((Character) value).charValue();
+        } else if( value instanceof String && ((String)value).length() == 1 ) {
+            return ((String)value).charAt( 0 );
+        }
+        throw new RuntimeDroolsException( "Conversion to char not supported from " + value.getClass().getName() );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).doubleValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to double not supported from " + value.getClass().getName() );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).floatValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to float not supported from " + value.getClass().getName() );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).intValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to int not supported from " + value.getClass().getName() );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).longValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to long not supported from " + value.getClass().getName() );
+    }
+
+    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        // this can be improved by generating specific
+        // bytecode generation in the subclass, avoiding the if instanceof
+        final Object value = getValue( workingMemory, object );
+
+        if ( value instanceof Number ) {
+            return ((Number) value).shortValue();
+        }
+        throw new RuntimeDroolsException( "Conversion to short not supported from " + value.getClass().getName() );
+    }
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        if (object == null) {
+            return true;
+        } else {
+            return getValue( workingMemory, object ) == null;
+        }
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        final Object value = getValue( workingMemory, object );
+        return (value != null) ? value.hashCode() : 0;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseObjectClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,92 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseObjectClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseObjectClassFieldWriter() {
+
+    }
+
+    protected BaseObjectClassFieldWriter(final int index,
+                                         final Class< ? > fieldType,
+                                         final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public BaseObjectClassFieldWriter(final Class< ? > clazz,
+                                      final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    public abstract void setValue(final Object bean,
+                                  final Object value);
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        setValue( bean,
+                  value ? Boolean.TRUE : Boolean.FALSE );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setValue( bean,
+                  new Byte( value ) );
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        setValue( bean,
+                  new Character( value ) );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setValue( bean,
+                  new Double( value ) );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setValue( bean,
+                  new Float( value ) );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setValue( bean,
+                  new Integer( value ) );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setValue( bean,
+                  new Long( value ) );
+    }
+
+    public void setShortValue(final Object bean,
+                              final short value) {
+        setValue( bean,
+                  new Short( value ) );
+    }
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setValue",
+                                                      new Class[]{Object.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: 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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,87 +0,0 @@
-package org.drools.base.extractors;
-
-import java.lang.reflect.Method;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.base.BaseClassFieldExtractor;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public abstract class BaseShortClassFieldExtractor extends BaseClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public BaseShortClassFieldExtractor(final Class clazz,
-                                        final String fieldName) {
-        super( clazz,
-               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(InternalWorkingMemory workingMemory, final Object object) {
-        return new Short( getShortValue( workingMemory, object ) );
-    }
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to boolean not supported from short" );
-    }
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        return (byte) getShortValue( workingMemory, object );
-
-    }
-
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        throw new RuntimeDroolsException( "Conversion to char not supported from short" );
-    }
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getShortValue( workingMemory, object );
-    }
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getShortValue( workingMemory, object );
-    }
-
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getShortValue( workingMemory, object );
-    }
-
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getShortValue( workingMemory, object );
-    }
-
-    public abstract short getShortValue(InternalWorkingMemory workingMemory, Object object);
-    
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return false;
-    }
-
-    public Method getNativeReadMethod() {
-        try {
-            return this.getClass().getDeclaredMethod( "getShortValue",
-                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
-        } catch ( final Exception e ) {
-            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
-                                              e );
-        }
-    }
-
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getShortValue( workingMemory, object );
-    }
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldReader.java (from rev 19963, 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/BaseShortClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,87 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldReader;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+public abstract class BaseShortClassFieldReader extends BaseClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseShortClassFieldReader(final Class clazz,
+                                        final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hirarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseShortClassFieldReader(final int index,
+                                           final Class fieldType,
+                                           final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        return new Short( getShortValue( workingMemory, object ) );
+    }
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to boolean not supported from short" );
+    }
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        return (byte) getShortValue( workingMemory, object );
+
+    }
+
+    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        throw new RuntimeDroolsException( "Conversion to char not supported from short" );
+    }
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
+    }
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
+    }
+
+    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
+    }
+
+    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
+    }
+
+    public abstract short getShortValue(InternalWorkingMemory workingMemory, Object object);
+    
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return false;
+    }
+
+    public Method getNativeReadMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "getShortValue",
+                                                      new Class[]{InternalWorkingMemory.class, Object.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        return getShortValue( workingMemory, object );
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldWriter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldWriter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/BaseShortClassFieldWriter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,94 @@
+package org.drools.base.extractors;
+
+import java.lang.reflect.Method;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.BaseClassFieldWriter;
+import org.drools.base.ValueType;
+
+public abstract class BaseShortClassFieldWriter extends BaseClassFieldWriter {
+
+    private static final long serialVersionUID = 400L;
+
+    public BaseShortClassFieldWriter(final Class< ? > clazz,
+                                     final String fieldName) {
+        super( clazz,
+               fieldName );
+    }
+
+    /**
+     * This constructor is not supposed to be used from outside the class hierarchy
+     * 
+     * @param index
+     * @param fieldType
+     * @param valueType
+     */
+    protected BaseShortClassFieldWriter(final int index,
+                                        final Class< ? > fieldType,
+                                        final ValueType valueType) {
+        super( index,
+               fieldType,
+               valueType );
+    }
+
+    public void setValue(final Object bean,
+                         final Object value) {
+        setShortValue( bean,
+                       value == null ? 0 : ((Number) value).shortValue() );
+    }
+
+    public void setBooleanValue(final Object bean,
+                                final boolean value) {
+        throw new RuntimeDroolsException( "Conversion to short not supported from boolean" );
+    }
+
+    public void setByteValue(final Object bean,
+                             final byte value) {
+        setShortValue( bean,
+                       (short) value );
+
+    }
+
+    public void setCharValue(final Object bean,
+                             final char value) {
+        throw new RuntimeDroolsException( "Conversion to short not supported from char" );
+    }
+
+    public void setDoubleValue(final Object bean,
+                               final double value) {
+        setShortValue( bean,
+                       (short) value );
+    }
+
+    public void setFloatValue(final Object bean,
+                              final float value) {
+        setShortValue( bean,
+                       (short) value );
+    }
+
+    public void setIntValue(final Object bean,
+                            final int value) {
+        setShortValue( bean,
+                       (short) value );
+    }
+
+    public void setLongValue(final Object bean,
+                             final long value) {
+        setShortValue( bean,
+                       (short) value );
+    }
+
+    public abstract void setShortValue(final Object object,
+                                       final short value);
+
+    public Method getNativeWriteMethod() {
+        try {
+            return this.getClass().getDeclaredMethod( "setShortValue",
+                                                      new Class[]{Object.class, short.class} );
+        } catch ( final Exception e ) {
+            throw new RuntimeDroolsException( "This is a bug. Please report to development team: " + e.getMessage(),
+                                              e );
+        }
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,99 +0,0 @@
-/*
- * Copyright 2006 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Created on Jun 12, 2007
- */
-package org.drools.base.extractors;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.io.ObjectInput;
-import java.io.IOException;
-import java.io.ObjectOutput;
-
-import org.drools.base.ClassFieldExtractorCache;
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
-import org.mvel.compiler.CompiledExpression;
-import org.mvel.compiler.ExpressionCompiler;
-import org.mvel.MVEL;
-
-/**
- * A class field extractor that uses MVEL engine to extract the actual value for a given
- * expression. We use MVEL to resolve nested accessor expressions.
- *
- * @author etirelli
- */
-public class MVELClassFieldExtractor extends BaseObjectClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    private CompiledExpression mvelExpression = null;
-    private Map extractors = null;
-
-    public MVELClassFieldExtractor() {
-    }
-    public MVELClassFieldExtractor(Class clazz,
-                                   String fieldName,
-                                   ClassLoader classLoader) {
-        super( -1, // index
-               Object.class, // fieldType
-               ValueType.determineValueType( Object.class ) ); // value type
-        this.extractors = new HashMap();
-
-        ExpressionCompiler compiler = new ExpressionCompiler( fieldName );
-        this.mvelExpression = compiler.compile();
-
-        Set inputs = compiler.getParserContextState().getInputs().keySet();
-        for( Iterator it = inputs.iterator(); it.hasNext(); ) {
-            String basefield = (String) it.next();
-
-            Extractor extr = ClassFieldExtractorCache.getInstance().getExtractor(  clazz, basefield, classLoader );
-            this.extractors.put( basefield, extr );
-        }
-    }
-
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        mvelExpression  = (CompiledExpression)in.readObject();
-        extractors  = (Map)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(mvelExpression);
-        out.writeObject(extractors);
-    }
-
-    /* (non-Javadoc)
-     * @see org.drools.base.extractors.BaseObjectClassFieldExtractor#getValue(java.lang.Object)
-     */
-    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
-        Map variables = new HashMap();
-        for( Iterator it = this.extractors.entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry entry = (Map.Entry) it.next();
-            String var = (String) entry.getKey();
-            FieldExtractor extr = (FieldExtractor) entry.getValue();
-
-            variables.put( var, extr.getValue( workingMemory, object ));
-        }
-        return MVEL.executeExpression( mvelExpression, variables );
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2006 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Created on Jun 12, 2007
+ */
+package org.drools.base.extractors;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.InternalReadAccessor;
+import org.mvel.MVEL;
+import org.mvel.compiler.CompiledExpression;
+import org.mvel.compiler.ExpressionCompiler;
+
+/**
+ * A class field extractor that uses MVEL engine to extract the actual value for a given
+ * expression. We use MVEL to resolve nested accessor expressions.
+ *
+ * @author etirelli
+ */
+public class MVELClassFieldReader extends BaseObjectClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    private CompiledExpression mvelExpression = null;
+    private Map extractors = null;
+
+    public MVELClassFieldReader() {
+    }
+    public MVELClassFieldReader(Class clazz,
+                                   String fieldName,
+                                   ClassLoader classLoader) {
+        super( -1, // index
+               Object.class, // fieldType
+               ValueType.determineValueType( Object.class ) ); // value type
+        this.extractors = new HashMap();
+
+        ExpressionCompiler compiler = new ExpressionCompiler( fieldName );
+        this.mvelExpression = compiler.compile();
+
+        Set inputs = compiler.getParserContextState().getInputs().keySet();
+        for( Iterator it = inputs.iterator(); it.hasNext(); ) {
+            String basefield = (String) it.next();
+
+            InternalReadAccessor extr = ClassFieldAccessorCache.getInstance().getReader(  clazz, basefield, classLoader );
+            this.extractors.put( basefield, extr );
+        }
+    }
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal(in);
+        mvelExpression  = (CompiledExpression)in.readObject();
+        extractors  = (Map)in.readObject();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal(out);
+        out.writeObject(mvelExpression);
+        out.writeObject(extractors);
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.base.extractors.BaseObjectClassFieldExtractor#getValue(java.lang.Object)
+     */
+    public Object getValue(InternalWorkingMemory workingMemory, Object object) {
+        Map variables = new HashMap();
+        for( Iterator it = this.extractors.entrySet().iterator(); it.hasNext(); ) {
+            Map.Entry entry = (Map.Entry) it.next();
+            String var = (String) entry.getKey();
+            InternalReadAccessor extr = (InternalReadAccessor) entry.getValue();
+
+            variables.put( var, extr.getValue( workingMemory, object ));
+        }
+        return MVEL.executeExpression( mvelExpression, variables );
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,46 +0,0 @@
-/*
- * Copyright 2006 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.base.extractors;
-
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-/**
- * A special field extractor for the self reference "this".
- *  
- * @author etirelli
- */
-public class SelfReferenceClassFieldExtractor extends BaseObjectClassFieldExtractor {
-
-    private static final long serialVersionUID = 400L;
-
-    public SelfReferenceClassFieldExtractor(final Class clazz,
-                                            final String fieldName) {
-        super( -1, // index
-               clazz, // fieldType
-               ValueType.determineValueType( clazz ) ); // value type
-    }
-
-    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
-        //return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
-        return object;
-    }   
-    
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
-        return getValue( workingMemory, object ) == null;
-    }
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldReader.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldReader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/SelfReferenceClassFieldReader.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.base.extractors;
+
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+
+/**
+ * A special field extractor for the self reference "this".
+ *  
+ * @author etirelli
+ */
+public class SelfReferenceClassFieldReader extends BaseObjectClassFieldReader {
+
+    private static final long serialVersionUID = 400L;
+
+    public SelfReferenceClassFieldReader(final Class clazz,
+                                            final String fieldName) {
+        super( -1, // index
+               clazz, // fieldType
+               ValueType.determineValueType( clazz ) ); // value type
+    }
+
+    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        //return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
+        return object;
+    }   
+    
+    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object) {
+        return getValue( workingMemory, object ) == null;
+    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultBetaConstraints.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,30 +16,30 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.evaluators.Operator;
 import org.drools.reteoo.BetaMemory;
-import org.drools.reteoo.RightTupleMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.LeftTupleMemory;
+import org.drools.reteoo.RightTupleMemory;
 import org.drools.rule.ContextEntry;
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Constraint;
-import org.drools.util.AbstractHashTable.FieldIndex;
+import org.drools.util.LeftTupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
 import org.drools.util.RightTupleIndexHashTable;
 import org.drools.util.RightTupleList;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
-import org.drools.util.LeftTupleList;
-import org.drools.util.LeftTupleIndexHashTable;
+import org.drools.util.AbstractHashTable.FieldIndex;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.ArrayList;
-import java.util.List;
-
 public class DefaultBetaConstraints
     implements
     BetaConstraints {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInput.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInput.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInput.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,7 +2,7 @@
 
 import org.drools.rule.*;
 import org.drools.rule.Package;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 
 import java.io.ObjectInput;
 
@@ -21,6 +21,6 @@
     void setPackage(Package pkg);
     DialectDatas getDialectDatas();
     void setDialectDatas(DialectDatas dialectDatas);
-    ClassFieldExtractorCache getExtractorFactory();
-    void setExtractorFactory(ClassFieldExtractorCache extractorFactory);
+    ClassFieldAccessorCache getExtractorFactory();
+    void setExtractorFactory(ClassFieldAccessorCache extractorFactory);
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -22,7 +22,7 @@
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.rule.DialectDatas;
 import org.drools.rule.Package;
 
@@ -59,7 +59,7 @@
     private InternalWorkingMemory    workingMemory;
     private Package                  pkg;
     private DialectDatas             dialectDatas;
-    private ClassFieldExtractorCache extractorFactory;
+    private ClassFieldAccessorCache extractorFactory;
 
     /**
      * Created this inner class to handle un-Externalizable objects just in case.
@@ -109,11 +109,11 @@
             DroolsObjectInputStream.this.setDialectDatas(dialectDatas);
         }
 
-        public ClassFieldExtractorCache getExtractorFactory() {
+        public ClassFieldAccessorCache getExtractorFactory() {
             return DroolsObjectInputStream.this.getExtractorFactory();
         }
 
-        public void setExtractorFactory(ClassFieldExtractorCache extractorFactory) {
+        public void setExtractorFactory(ClassFieldAccessorCache extractorFactory) {
             DroolsObjectInputStream.this.setExtractorFactory(extractorFactory);
         }
 
@@ -138,7 +138,7 @@
 
     public DroolsObjectInputStream(InputStream inputStream, ClassLoader classLoader) throws IOException {
         dataInput    = new DroolsInternalInputStream(inputStream, classLoader);
-        extractorFactory = ClassFieldExtractorCache.getInstance();
+        extractorFactory = ClassFieldAccessorCache.getInstance();
         readStreamHeader();
     }
 
@@ -178,11 +178,11 @@
         this.dialectDatas   = dialectDatas;
     }
 
-    public ClassFieldExtractorCache getExtractorFactory() {
+    public ClassFieldAccessorCache getExtractorFactory() {
         return extractorFactory;
     }
 
-    public void setExtractorFactory(ClassFieldExtractorCache extractorFactory) {
+    public void setExtractorFactory(ClassFieldAccessorCache extractorFactory) {
         this.extractorFactory   = extractorFactory;
     }
 

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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,5 +1,20 @@
 package org.drools.factmodel;
 
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 import java.beans.IntrospectionException;
 import java.io.IOException;
@@ -13,23 +28,23 @@
 import org.drools.asm.Type;
 
 /**
- * <p><b>Title:</b> ClassBuilder</p>
- * <p><b>Description:</b> A builder to dinamically build simple Value Object classes</p>
- * <p><b>Copyright:</b> Copyright (c) 2005</p>
- * <p><b>Company:</b> Auster Solutions</p>
- *
+ * A builder to dynamically build simple Javabean(TM) classes
+ * 
  * @author etirelli
- * @version $Id: ClassBuilder.java 241 2006-05-11 19:48:25Z framos $
  */
 public class ClassBuilder {
     private boolean debug = false;
 
     public ClassBuilder() {
-        this.debug = "false".equalsIgnoreCase( System.getProperty( "br.com.auster.common.asm.debug" ) );
+        this( "true".equalsIgnoreCase( System.getProperty( "org.drools.classbuilder.debug" ) ) );
     }
 
+    public ClassBuilder(final boolean debug) {
+        this.debug = debug;
+    }
+
     /**
-     * Dinamically builds, defines and loads a class based on the given class definition
+     * Dynamically builds, defines and loads a class based on the given class definition
      *
      * @param classDef the class definition object structure
      *
@@ -46,18 +61,18 @@
      * @throws NoSuchFieldException
      * @throws InstantiationException
      */
-    public Class buildAndLoadClass(ClassDefinition classDef) throws IOException,
-                                                            IntrospectionException,
-                                                            SecurityException,
-                                                            IllegalArgumentException,
-                                                            ClassNotFoundException,
-                                                            NoSuchMethodException,
-                                                            IllegalAccessException,
-                                                            InvocationTargetException,
-                                                            InstantiationException,
-                                                            NoSuchFieldException {
+    public Class< ? > buildAndLoadClass(ClassDefinition classDef) throws IOException,
+                                                                 IntrospectionException,
+                                                                 SecurityException,
+                                                                 IllegalArgumentException,
+                                                                 ClassNotFoundException,
+                                                                 NoSuchMethodException,
+                                                                 IllegalAccessException,
+                                                                 InvocationTargetException,
+                                                                 InstantiationException,
+                                                                 NoSuchFieldException {
         try {
-            Class clazz = Class.forName( classDef.getClassName() );
+            Class< ? > clazz = Class.forName( classDef.getClassName() );
 
             classDef.setDefinedClass( clazz );
 
@@ -67,8 +82,8 @@
             // class not loaded, so create and load it
             byte[] serializedClazz = this.buildClass( classDef );
 
-            Class clazz = this.loadClass( classDef.getClassName(),
-                                          serializedClazz );
+            Class< ? > clazz = this.loadClass( classDef.getClassName(),
+                                               serializedClazz );
             classDef.setDefinedClass( clazz );
 
             return clazz;
@@ -76,7 +91,7 @@
     }
 
     /**
-     * Dinamically builds, defines and loads a class based on the given class definition
+     * Dynamically builds, defines and loads a class based on the given class definition
      *
      * @param classDef the class definition object structure
      *
@@ -142,7 +157,6 @@
         return cw.toByteArray();
     }
 
-
     /**
      * Defines the class header for the given class definition
      *
@@ -724,17 +738,17 @@
         }
     }
 
-    private Class loadClass(String classname,
-                            byte[] b) throws ClassNotFoundException,
-                                     SecurityException,
-                                     NoSuchMethodException,
-                                     IllegalArgumentException,
-                                     IllegalAccessException,
-                                     InvocationTargetException {
+    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;
+        Class< ? > clazz = null;
         ClassLoader loader = ClassBuilder.class.getClassLoader();
-        Class cls = Class.forName( "java.lang.ClassLoader" );
+        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} );
 
@@ -742,14 +756,12 @@
         method.setAccessible( true );
         try {
             Object[] args = new Object[]{classname, b, new Integer( 0 ), new Integer( b.length )};
-            clazz = (Class) method.invoke( loader,
-                                           args );
+            clazz = (Class< ? >) method.invoke( loader,
+                                                args );
         } finally {
             method.setAccessible( false );
         }
         return clazz;
     }
 
-
-
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,5 +1,20 @@
 package org.drools.factmodel;
 
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 import java.beans.IntrospectionException;
 import java.io.IOException;
@@ -9,20 +24,21 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.drools.base.ClassFieldAccessor;
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldWriter;
+
 /**
- * <p><b>Title:</b> ClassDefinition</p>
- * <p><b>Description:</b> Declares a class to be dinamically created</p>
- * <p><b>Copyright:</b> Copyright (c) 2004-2006</p>
- * <p><b>Company:</b> Auster Solutions</p>
+ * Declares a class to be dynamically created
  *
  * @author etirelli
- * @version $Id: ClassDefinition.java 216 2006-03-24 19:16:31Z etirelli $
  */
 public class ClassDefinition {
     private String                       className;
     private String                       superClass;
     private String[]                     interfaces;
-    private Class                        definedClass;
+    private Class< ? >                   definedClass;
 
     private Map<String, FieldDefinition> fields = new LinkedHashMap<String, FieldDefinition>();
 
@@ -86,7 +102,7 @@
     /**
      * @return Returns the className.
      */
-    public final Class getDefinedClass() {
+    public final Class< ? > getDefinedClass() {
         return definedClass;
     }
 
@@ -103,16 +119,16 @@
      * @throws IllegalArgumentException 
      * @throws SecurityException 
      */
-    final void setDefinedClass(final Class definedClass) throws IntrospectionException,
-                                                        SecurityException,
-                                                        IllegalArgumentException,
-                                                        InstantiationException,
-                                                        IllegalAccessException,
-                                                        IOException,
-                                                        ClassNotFoundException,
-                                                        NoSuchMethodException,
-                                                        InvocationTargetException,
-                                                        NoSuchFieldException {
+    final void setDefinedClass(final Class< ? > definedClass) throws IntrospectionException,
+                                                             SecurityException,
+                                                             IllegalArgumentException,
+                                                             InstantiationException,
+                                                             IllegalAccessException,
+                                                             IOException,
+                                                             ClassNotFoundException,
+                                                             NoSuchMethodException,
+                                                             InvocationTargetException,
+                                                             NoSuchFieldException {
 
         this.definedClass = definedClass;
 
@@ -171,11 +187,12 @@
                                            NoSuchMethodException,
                                            InvocationTargetException,
                                            NoSuchFieldException {
-        FieldAccessorBuilder builder = new FieldAccessorBuilder();
+        ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
 
         for ( FieldDefinition attrDef : this.fields.values() ) {
-            FieldAccessor accessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( this.getDefinedClass(),
-                                                                                        attrDef.getName() ).newInstance();
+            ClassFieldReader reader = cache.getReader( this.getDefinedClass(), attrDef.getName(), this.getClass().getClassLoader() );
+            ClassFieldWriter writer = cache.getWriter( this.getDefinedClass(), attrDef.getName(), this.getClass().getClassLoader() );
+            ClassFieldAccessor accessor = new ClassFieldAccessor( reader, writer );
             attrDef.setFieldAccessor( accessor );
         }
     }

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,19 +0,0 @@
-package org.drools.factmodel;
-
-
-/**
- * <p><b>Title:</b> FieldAccessor</p>
- * <p><b>Description:</b> An interface for dynamic generated FieldAccessor classes </p>
- * <p><b>Copyright:</b> Copyright (c) 2004-2006</p>
- * <p><b>Company:</b> Auster Solutions</p>
- *
- * @author etirelli
- * @version $Id: FieldAccessor.java 203 2006-03-20 21:44:48Z etirelli $
- */
-public interface FieldAccessor {
-    
-    public void setValue(Object instance, Object value);
-    
-    public Object getValue(Object instance);
-
-}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessorBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessorBuilder.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldAccessorBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,410 +0,0 @@
-package org.drools.factmodel;
-
-
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.drools.asm.ClassWriter;
-import org.drools.asm.Label;
-import org.drools.asm.MethodVisitor;
-import org.drools.asm.Opcodes;
-import org.drools.asm.Type;
-
-/**
- * <p><b>Title:</b> FieldAccessorBuilder</p>
- * <p><b>Description:</b> A builder for FieldAccessor instances</p>
- * <p><b>Copyright:</b> Copyright (c) 2004-2006</p>
- * <p><b>Company:</b> Auster Solutions</p>
- *
- * @author etirelli
- * @version $Id: FieldAccessorBuilder.java 241 2006-05-11 19:48:25Z framos $
- */
-public class FieldAccessorBuilder {
-    private Map typeMap = null;
-
-    public FieldAccessorBuilder() {
-        typeMap = new HashMap();
-        typeMap.put( Boolean.TYPE,
-                     Boolean.class );
-        typeMap.put( Byte.TYPE,
-                     Byte.class );
-        typeMap.put( Character.TYPE,
-                     Character.class );
-        typeMap.put( Double.TYPE,
-                     Double.class );
-        typeMap.put( Float.TYPE,
-                     Float.class );
-        typeMap.put( Integer.TYPE,
-                     Integer.class );
-        typeMap.put( Long.TYPE,
-                     Long.class );
-        typeMap.put( Short.TYPE,
-                     Short.class );
-        typeMap.put( Void.TYPE,
-                     Void.class );
-    }
-
-    public Class buildAndLoadFieldAccessor(Class clazz,
-                                           String fieldName) throws SecurityException,
-                                                            IllegalArgumentException,
-                                                            IOException,
-                                                            IntrospectionException,
-                                                            ClassNotFoundException,
-                                                            NoSuchMethodException,
-                                                            IllegalAccessException,
-                                                            InvocationTargetException,
-                                                            NoSuchFieldException {
-
-        ClassDefinition accClass = new ClassDefinition( clazz.getName() + fieldName.substring( 0,
-                                                                                               1 ).toUpperCase() + fieldName.substring( 1 ) + "FA" );
-        try {
-            return Class.forName( accClass.getClassName() );
-        } catch ( ClassNotFoundException e ) {
-            byte[] serializedClazz = this.buildFieldAccessor( clazz,
-                                                              fieldName );
-            Class newClazz = this.loadClass( accClass.getClassName(),
-                                             serializedClazz );
-            return newClazz;
-        }
-    }
-
-    /**
-     * Dinamically builds, defines and loads a field accessor class for the given field
-     *
-     * @param class the class to build the field accessor for
-     * @param fieldName the name of the field to build the field accessor for
-     *
-     * @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
-     */
-    public byte[] buildFieldAccessor(Class clazz,
-                                     String fieldName) throws IOException,
-                                                      IntrospectionException,
-                                                      SecurityException,
-                                                      IllegalArgumentException,
-                                                      ClassNotFoundException,
-                                                      NoSuchMethodException,
-                                                      IllegalAccessException,
-                                                      InvocationTargetException,
-                                                      NoSuchFieldException {
-
-        ClassDefinition accClass = new ClassDefinition( clazz.getName() + fieldName.substring( 0,
-                                                                                               1 ).toUpperCase() + fieldName.substring( 1 ) + "FA" );
-        accClass.setInterfaces( new String[]{FieldAccessor.class.getName()} );
-        accClass.setSuperClass( Object.class.getName() );
-
-        PropertyDescriptor field = getPropertyDescriptor( clazz,
-                                                          fieldName );
-
-        ClassWriter cw = new ClassWriter( true );
-
-        this.buildClassHeader( cw,
-                               accClass );
-
-        // Building default constructor
-        this.buildDefaultConstructor( cw );
-
-        // Building methods
-        this.buildGetMethod( cw,
-                             accClass,
-                             clazz,
-                             field );
-        this.buildSetMethod( cw,
-                             accClass,
-                             clazz,
-                             field );
-
-        cw.visitEnd();
-
-        return cw.toByteArray();
-    }
-
-    /**
-     * @param clazz
-     * @param fieldName
-     * @param field
-     * @return
-     * @throws IntrospectionException
-     * @throws NoSuchFieldException
-     */
-    private PropertyDescriptor getPropertyDescriptor(Class clazz,
-                                                     String fieldName) throws IntrospectionException,
-                                                                      NoSuchFieldException {
-        PropertyDescriptor field = null;
-        PropertyDescriptor[] propDescr = Introspector.getBeanInfo( clazz ).getPropertyDescriptors();
-        for ( int i = 0; i < propDescr.length; i++ ) {
-            if ( fieldName.equals( propDescr[i].getName() ) ) {
-                field = propDescr[i];
-                break;
-            }
-        }
-        if ( field == null ) {
-            throw new NoSuchFieldException( "Field [" + fieldName + "] not found in class [" + clazz.getName() + "]" );
-        }
-        return field;
-    }
-
-    /**
-     * Defines the class header for the given class definition
-     *
-     * @param cw
-     * @param dimDef
-     */
-    private void buildClassHeader(ClassWriter cw,
-                                  ClassDefinition classDef) {
-        // Building class header
-        cw.visit( Opcodes.V1_4,
-                  Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
-                  classDef.getClassNameAsInternal(),
-                  null,
-                  classDef.getSuperClassAsInternal(),
-                  classDef.getInterfacesAsInternal() );
-
-        cw.visitSource( classDef.getClassName() + ".java",
-                        null );
-    }
-
-    /**
-     * Creates the get method for the given field definition
-     *
-     * @param cw
-     * @param classDef
-     * @param fieldDef
-     */
-    private void buildGetMethod(ClassWriter cw,
-                                ClassDefinition classDef,
-                                Class clazz,
-                                PropertyDescriptor field) {
-        MethodVisitor mv;
-        // Get method
-        {
-            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                 "getValue",
-                                 Type.getMethodDescriptor( Type.getType( Object.class ),
-                                                           new Type[]{Type.getType( Object.class )} ),
-                                 null,
-                                 null );
-            mv.visitCode();
-            if ( field.getPropertyType().isPrimitive() ) {
-                mv.visitTypeInsn( Opcodes.NEW,
-                                  Type.getInternalName( (Class) typeMap.get( field.getPropertyType() ) ) );
-                mv.visitInsn( Opcodes.DUP );
-            }
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             1 );
-            mv.visitTypeInsn( Opcodes.CHECKCAST,
-                              Type.getInternalName( clazz ) );
-            mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                Type.getInternalName( clazz ),
-                                field.getReadMethod().getName(),
-                                Type.getMethodDescriptor( Type.getType( field.getPropertyType() ),
-                                                          new Type[]{} ) );
-
-            if ( field.getPropertyType().isPrimitive() ) {
-                mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
-                                    Type.getInternalName( (Class) typeMap.get( field.getPropertyType() ) ),
-                                    "<init>",
-                                    Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                              new Type[]{Type.getType( field.getPropertyType() )} ) );
-            }
-            mv.visitInsn( Opcodes.ARETURN );
-            mv.visitMaxs( 0,
-                          0 ); // automatically calculated
-            mv.visitEnd();
-        }
-    }
-
-    /**
-     * Creates the set method for the given field definition
-     *
-     * @param cw
-     * @param classDef
-     * @param fieldDef
-     */
-    private void buildSetMethod(ClassWriter cw,
-                                ClassDefinition classDef,
-                                Class clazz,
-                                PropertyDescriptor field) {
-        MethodVisitor mv;
-        // set method
-        {
-            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                 "setValue",
-                                 Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                           new Type[]{Type.getType( Object.class ), Type.getType( Object.class )} ),
-                                 null,
-                                 null );
-
-            mv.visitCode();
-
-            if ( field.getPropertyType().isPrimitive() ) {
-                // value != null ?
-                mv.visitVarInsn( Opcodes.ALOAD,
-                                 2 );
-
-                Label ifnull = new Label();
-                mv.visitJumpInsn( Opcodes.IFNULL,
-                                  ifnull );
-
-                // ((PrimitiveWrapper)value).xxxValue() :
-                mv.visitVarInsn( Opcodes.ALOAD,
-                                 2 );
-                mv.visitTypeInsn( Opcodes.CHECKCAST,
-                                  Type.getInternalName( (Class) typeMap.get( field.getPropertyType() ) ) );
-                mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                    Type.getInternalName( (Class) typeMap.get( field.getPropertyType() ) ),
-                                    field.getPropertyType().getName() + "Value",
-                                    Type.getMethodDescriptor( Type.getType( field.getPropertyType() ),
-                                                              new Type[]{} ) );
-
-                Label afterif = new Label();
-                mv.visitJumpInsn( Opcodes.GOTO,
-                                  afterif );
-
-                // 0
-                mv.visitLabel( ifnull );
-                if ( field.getPropertyType().isAssignableFrom( long.class ) ) {
-                    mv.visitInsn( Opcodes.LCONST_0 );
-                } else if ( field.getPropertyType().isAssignableFrom( double.class ) ) {
-                    mv.visitInsn( Opcodes.DCONST_0 );
-                } else if ( field.getPropertyType().isAssignableFrom( float.class ) ) {
-                    mv.visitInsn( Opcodes.FCONST_0 );
-                } else {
-                    mv.visitInsn( Opcodes.ICONST_0 );
-                }
-
-                // localVar = pop()
-                mv.visitLabel( afterif );
-                mv.visitVarInsn( Type.getType( field.getPropertyType() ).getOpcode( Opcodes.ISTORE ),
-                                 3 );
-            } else {
-                // localVar = (xxxClass) value
-                mv.visitVarInsn( Opcodes.ALOAD,
-                                 2 );
-                mv.visitTypeInsn( Opcodes.CHECKCAST,
-                                  Type.getInternalName( field.getPropertyType() ) );
-                mv.visitVarInsn( Opcodes.ASTORE,
-                                 3 );
-            }
-
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             1 );
-            mv.visitTypeInsn( Opcodes.CHECKCAST,
-                              Type.getInternalName( clazz ) );
-            mv.visitVarInsn( Type.getType( field.getPropertyType() ).getOpcode( Opcodes.ILOAD ),
-                             3 );
-
-            mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL,
-                                Type.getInternalName( clazz ),
-                                field.getWriteMethod().getName(),
-                                Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                          new Type[]{Type.getType( field.getPropertyType() )} ) );
-
-            mv.visitInsn( Opcodes.RETURN );
-            mv.visitMaxs( 0,
-                          0 ); // auto calculated
-            mv.visitEnd();
-        }
-    }
-
-    /**
-     * Creates a default constructor for the class
-     *
-     * @param cw
-     */
-    private void buildDefaultConstructor(ClassWriter cw) {
-        MethodVisitor mv;
-        // Building default constructor
-        {
-            mv = cw.visitMethod( Opcodes.ACC_PUBLIC,
-                                 "<init>",
-                                 Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                           new Type[]{} ),
-                                 null,
-                                 null );
-            mv.visitCode();
-            mv.visitVarInsn( Opcodes.ALOAD,
-                             0 );
-            mv.visitMethodInsn( Opcodes.INVOKESPECIAL,
-                                Type.getInternalName( Object.class ),
-                                "<init>",
-                                Type.getMethodDescriptor( Type.VOID_TYPE,
-                                                          new Type[]{} ) );
-            mv.visitInsn( Opcodes.RETURN );
-            mv.visitMaxs( 0,
-                          0 );
-            mv.visitEnd();
-        }
-    }
-
-    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;
-    }
-
-    /**
-     * Creates the String name for the get method for a field with the given name and type
-     * @param name
-     * @param type
-     * @return
-     */
-    public String getReadMethod(Field field) {
-        String prefix = null;
-        if ( Boolean.TYPE.equals( field.getType() ) ) {
-            prefix = "is";
-        } else {
-            prefix = "get";
-        }
-        return prefix + field.getName().substring( 0,
-                                                   1 ).toUpperCase() + field.getName().substring( 1 );
-    }
-
-    /**
-     * Creates the String name for the set method for a field with the given name and type
-     *
-     * @param name
-     * @param type
-     * @return
-     */
-    public String getWriteMethod(Field field) {
-        return "set" + field.getName().substring( 0,
-                                                  1 ).toUpperCase() + field.getName().substring( 1 );
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldDefinition.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldDefinition.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,27 +1,40 @@
 package org.drools.factmodel;
 
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.drools.base.ClassFieldAccessor;
+
 /**
- * <p><b>Title:</b> FieldDefinition</p>
- * <p><b>Description:</b> Declares a field to be dynamically generated</p>
- * <p><b>Copyright:</b> Copyright (c) 2004-2006</p>
- * <p><b>Company:</b> Auster Solutions</p>
+ * Declares a field to be dynamically generated.
  *
  * @author etirelli
- * @version $Id: FieldDefinition.java 205 2006-03-21 18:27:52Z etirelli $
  */
 public class FieldDefinition {
     private String             name         = null;
     private String             type         = null;
     private boolean            key          = false;
-    
+
     private String             internalType = null;
     private String             boxTypeName  = null;
     private boolean            primitive    = false;
     private String             unboxMethod  = null;
-    private FieldAccessor      accessor     = null;
+    private ClassFieldAccessor accessor     = null;
 
     /**
      * Default constructor
@@ -31,7 +44,9 @@
      */
     public FieldDefinition(String name,
                            String type) {
-        this(name, type, false);
+        this( name,
+              type,
+              false );
     }
 
     /**
@@ -41,11 +56,11 @@
      * @param type the fully qualified fields type
      */
     public FieldDefinition(String name,
-                           String type, 
+                           String type,
                            boolean key) {
         this.name = name;
         this.type = type;
-        this.key  = key;
+        this.key = key;
         this.setInternals();
     }
 
@@ -154,16 +169,16 @@
     }
 
     /**
-     * @return Returns the field accessor
+     * @return Returns the field extractor
      */
-    FieldAccessor getFieldAccessor() {
+    public ClassFieldAccessor getFieldAccessor() {
         return this.accessor;
     }
 
     /**
      * @param property The property descriptor to set.
      */
-    void setFieldAccessor(FieldAccessor accessor) {
+    public void setFieldAccessor(ClassFieldAccessor accessor) {
         this.accessor = accessor;
     }
 
@@ -189,10 +204,8 @@
                          Object value) throws IllegalArgumentException,
                                       IllegalAccessException,
                                       InvocationTargetException {
-        if(this.accessor == null) {
-            System.out.println("ACCESSOR NULL");
-        }
-        this.accessor.setValue( bean, value );
+        this.accessor.setValue( bean,
+                                value );
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,19 +1,18 @@
 package org.drools.facttemplates;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.reflect.Method;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.FieldExtractor;
 import org.drools.util.ClassUtils;
 
 public class FactTemplateFieldExtractor
     implements
-    FieldExtractor {
+    org.drools.spi.InternalReadAccessor {
 
     private static final long serialVersionUID = 400L;
     private FactTemplate      factTemplate;
@@ -29,21 +28,23 @@
         this.fieldIndex = fieldIndex;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        factTemplate    = (FactTemplate)in.readObject();
-        fieldIndex      = in.readInt();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        factTemplate = (FactTemplate) in.readObject();
+        fieldIndex = in.readInt();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(factTemplate);
-        out.writeInt(fieldIndex);
+        out.writeObject( factTemplate );
+        out.writeInt( fieldIndex );
     }
 
     public ValueType getValueType() {
         return this.factTemplate.getFieldTemplate( this.fieldIndex ).getValueType();
     }
 
-    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
         return ((Fact) object).getFieldValue( this.fieldIndex );
     }
 
@@ -59,35 +60,43 @@
         return ClassUtils.canonicalName( getExtractToClass() );
     }
 
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
         return ((Boolean) ((Fact) object).getFieldValue( this.fieldIndex )).booleanValue();
     }
 
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).byteValue();
     }
 
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         return ((Character) ((Fact) object).getFieldValue( this.fieldIndex )).charValue();
     }
 
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).doubleValue();
     }
 
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).floatValue();
     }
 
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).intValue();
     }
 
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).longValue();
     }
 
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
         return ((Number) ((Fact) object).getFieldValue( this.fieldIndex )).shortValue();
     }
 
@@ -101,8 +110,10 @@
         }
     }
 
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getValue( workingMemory, object ).hashCode();
+    public int getHashCode(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return getValue( workingMemory,
+                         object ).hashCode();
     }
 
     public boolean isGlobal() {
@@ -113,4 +124,59 @@
                                Object object) {
         return ((Fact) object).getFieldValue( this.fieldIndex ) == null;
     }
+
+    public boolean getBooleanValue(Object object) {
+        return getBooleanValue( null,
+                                object );
+    }
+
+    public byte getByteValue(Object object) {
+        return getByteValue( null,
+                             object );
+    }
+
+    public char getCharValue(Object object) {
+        return getCharValue( null,
+                             object );
+    }
+
+    public double getDoubleValue(Object object) {
+        return getDoubleValue( null,
+                               object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getFloatValue( null,
+                              object );
+    }
+
+    public int getHashCode(Object object) {
+        return getHashCode( null,
+                            object );
+    }
+
+    public int getIntValue(Object object) {
+        return getIntValue( null,
+                            object );
+    }
+
+    public long getLongValue(Object object) {
+        return getLongValue( null,
+                             object );
+    }
+
+    public short getShortValue(Object object) {
+        return getShortValue( null,
+                              object );
+    }
+
+    public Object getValue(Object object) {
+        return getValue( null,
+                         object );
+    }
+
+    public boolean isNullValue(Object object) {
+        return isNullValue( null,
+                            object );
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CompositeObjectSinkAdapter.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,24 +1,24 @@
 package org.drools.reteoo;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Externalizable;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
+import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.common.BaseNode;
 import org.drools.rule.LiteralConstraint;
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PropagationContext;
+import org.drools.spi.ReadAccessor;
 import org.drools.util.Iterator;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedListNode;
@@ -251,7 +251,7 @@
      * @return
      */
     private FieldIndex registerFieldIndex(final int index,
-                                          final FieldExtractor fieldExtractor) {
+                                          final InternalReadAccessor fieldExtractor) {
         FieldIndex fieldIndex = null;
 
         // is linkedlist null, if so create and add
@@ -322,7 +322,7 @@
                 }
                 // this field is hashed so set the existing hashKey and see if there is a sink for it
                 final int index = fieldIndex.getIndex();
-                final FieldExtractor extractor = fieldIndex.getFieldExtactor();
+                final ReadAccessor extractor = fieldIndex.getFieldExtactor();
                 HashKey hashKey = new HashKey( index,
                                                object,
                                                fieldIndex.getFieldExtractor() );
@@ -443,7 +443,7 @@
 
         public HashKey(final int index,
                        final FieldValue value,
-                       final Extractor extractor) {
+                       final InternalReadAccessor extractor) {
             this.setValue( index,
                            extractor,
                            value );
@@ -451,7 +451,7 @@
 
         public HashKey(final int index,
                        final Object value,
-                       final Extractor extractor) {
+                       final InternalReadAccessor extractor) {
             this.setValue( index,
                            value,
                            extractor );
@@ -486,7 +486,7 @@
 
         public void setValue(final int index,
                              final Object value,
-                             final Extractor extractor) {
+                             final InternalReadAccessor extractor) {
             this.index = index;
             final ValueType vtype = extractor.getValueType();
 
@@ -534,7 +534,7 @@
         }
 
         public void setValue(final int index,
-                             final Extractor extractor,
+                             final InternalReadAccessor extractor,
                              final FieldValue value) {
             this.index = index;
 
@@ -702,7 +702,7 @@
         LinkedListNode {
         private static final long serialVersionUID = 400L;
         private int               index;
-        private FieldExtractor    fieldExtactor;
+        private InternalReadAccessor    fieldExtactor;
 
         private int               count;
 
@@ -716,7 +716,7 @@
         }
 
         public FieldIndex(final int index,
-                          final FieldExtractor fieldExtractor) {
+                          final InternalReadAccessor fieldExtractor) {
             this.index = index;
             this.fieldExtactor = fieldExtractor;
         }
@@ -724,7 +724,7 @@
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {
             index = in.readInt();
-            fieldExtactor = (FieldExtractor) in.readObject();
+            fieldExtactor = (InternalReadAccessor) in.readObject();
             count = in.readInt();
             hashed = in.readBoolean();
             previous = (LinkedListNode) in.readObject();
@@ -740,7 +740,7 @@
             out.writeObject( next );
         }
 
-        public FieldExtractor getFieldExtractor() {
+        public InternalReadAccessor getFieldExtractor() {
             return this.fieldExtactor;
         }
 
@@ -752,7 +752,7 @@
             return this.count;
         }
 
-        public FieldExtractor getFieldExtactor() {
+        public ReadAccessor getFieldExtactor() {
             return this.fieldExtactor;
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooFactHandleFactory.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -58,14 +58,15 @@
             TypeDeclaration type = conf.getTypeDeclaration();
             long timestamp = ((TemporalSession) workingMemory).getSessionClock().getCurrentTime();
             long duration = 0;
-            if( type.getDurationExtractor() != null ) {
-                duration = type.getDurationExtractor().getLongValue( workingMemory, object );
+            if ( type.getDurationExtractor() != null ) {
+                duration = type.getDurationExtractor().getLongValue( workingMemory,
+                                                                     object );
             }
             return new EventFactHandle( id,
                                         object,
                                         recency,
                                         timestamp,
-                                        duration ); 
+                                        duration );
         } else {
             return new DefaultFactHandle( id,
                                           object,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -22,7 +22,7 @@
 
 import org.drools.InitialFact;
 import org.drools.RuleIntegrationException;
-import org.drools.base.ClassFieldExtractor;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassObjectType;
 import org.drools.base.DroolsQuery;
 import org.drools.base.FieldFactory;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -3,7 +3,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.Restriction;
 
 public class AndCompositeRestriction extends AbstractCompositeRestriction {
@@ -17,7 +17,7 @@
         super( restriction );
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -53,7 +53,7 @@
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 /*
  * Copyright 2005 JBoss Inc
@@ -93,7 +93,7 @@
     /** The identifier for the variable. */
     private String      identifier;
 
-    private Extractor   extractor;
+    private InternalReadAccessor   extractor;
 
     private Pattern           pattern;
 
@@ -117,7 +117,7 @@
      *            The index within a rule.
      */
     public Declaration(final String identifier,
-                       final Extractor extractor,
+                       final InternalReadAccessor extractor,
                        final Pattern pattern) {
         this( identifier,
               extractor,
@@ -139,7 +139,7 @@
      *            of a collect CE
      */
     public Declaration(final String identifier,
-                       final Extractor extractor,
+                       final InternalReadAccessor extractor,
                        final Pattern pattern,
                        final boolean internalFact) {
         this.identifier = identifier;
@@ -150,7 +150,7 @@
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         identifier  = (String)in.readObject();
-        extractor   = (Extractor)in.readObject();
+        extractor   = (InternalReadAccessor)in.readObject();
         pattern     = (Pattern)in.readObject();
         internalFact    = in.readBoolean();
     }
@@ -209,7 +209,7 @@
      *
      * @return
      */
-    public Extractor getExtractor() {
+    public InternalReadAccessor getExtractor() {
         return this.extractor;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,33 +16,33 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Constraint;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 
-import java.io.Externalizable;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-
 public class LiteralConstraint
     implements
     AlphaNodeFieldConstraint, Externalizable {
 
     private static final long        serialVersionUID = 400L;
 
-    private FieldExtractor     extractor;
+    private InternalReadAccessor     extractor;
     private LiteralRestriction restriction;
 
     public LiteralConstraint() {
         this(null, null);
     }
 
-    public LiteralConstraint(final FieldExtractor extractor,
+    public LiteralConstraint(final InternalReadAccessor extractor,
                              final Evaluator evaluator,
                              final FieldValue field) {
         this.extractor = extractor;
@@ -51,14 +51,14 @@
                                                    extractor );
     }
 
-    public LiteralConstraint(final FieldExtractor extractor,
+    public LiteralConstraint(final InternalReadAccessor extractor,
                              final LiteralRestriction restriction) {
         this.extractor = extractor;
         this.restriction = restriction;
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        extractor   = (FieldExtractor)in.readObject();
+        extractor   = (InternalReadAccessor)in.readObject();
         restriction = (LiteralRestriction)in.readObject();
     }
 
@@ -75,7 +75,7 @@
         return this.restriction.getField();
     }
 
-    public FieldExtractor getFieldExtractor() {
+    public InternalReadAccessor getFieldExtractor() {
         return this.extractor;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,20 +16,19 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.Restriction;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-
 public class LiteralRestriction
     implements
     Restriction, Externalizable {
@@ -40,7 +39,7 @@
 
     private Evaluator            evaluator;
 
-    private FieldExtractor       extractor;
+    private InternalReadAccessor       extractor;
 
     private static final Declaration[] requiredDeclarations = new Declaration[0];
 
@@ -50,7 +49,7 @@
 
     public LiteralRestriction(final FieldValue field,
                               final Evaluator evaluator,
-                              final FieldExtractor fieldExtractor) {
+                              final InternalReadAccessor fieldExtractor) {
         this.field = field;
         this.evaluator = evaluator;
         this.extractor = fieldExtractor;
@@ -59,7 +58,7 @@
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         field   = (FieldValue)in.readObject();
         evaluator   = (Evaluator)in.readObject();
-        extractor   = (FieldExtractor)in.readObject();
+        extractor   = (InternalReadAccessor)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -75,7 +74,7 @@
         return this.field;
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemoiry,
                              final ContextEntry context ) {
@@ -153,19 +152,19 @@
         ContextEntry {
 
         private static final long serialVersionUID = 2621864784428098347L;
-        public FieldExtractor     extractor;
+        public InternalReadAccessor     extractor;
         public Object             object;
         public ContextEntry       next;
 
         public LiteralContextEntry() {
         }
 
-        public LiteralContextEntry(final FieldExtractor extractor) {
+        public LiteralContextEntry(final InternalReadAccessor extractor) {
             this.extractor = extractor;
         }
 
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            extractor   = (FieldExtractor)in.readObject();
+            extractor   = (InternalReadAccessor)in.readObject();
             object      = in.readObject();
             next        = (ContextEntry)in.readObject();
         }
@@ -176,7 +175,7 @@
             out.writeObject(next);
         }
 
-        public FieldExtractor getFieldExtractor() {
+        public InternalReadAccessor getFieldExtractor() {
             return this.extractor;
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,45 +1,48 @@
 package org.drools.rule;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
 import org.drools.spi.Restriction;
 
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
-
 public class MultiRestrictionFieldConstraint extends MutableTypeConstraint {
 
     private static final long    serialVersionUID = 400L;
 
-    private FieldExtractor extractor;
+    private InternalReadAccessor extractor;
 
-    private Restriction    restrictions;
+    private Restriction          restrictions;
 
     public MultiRestrictionFieldConstraint() {
 
     }
 
-    public MultiRestrictionFieldConstraint(final FieldExtractor extractor,
+    public MultiRestrictionFieldConstraint(final InternalReadAccessor extractor,
                                            final Restriction restrictions) {
         this.extractor = extractor;
         this.restrictions = restrictions;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        extractor   = (FieldExtractor)in.readObject();
-        restrictions   = (Restriction)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        super.readExternal( in );
+        extractor = (InternalReadAccessor) in.readObject();
+        restrictions = (Restriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(extractor);
-        out.writeObject(restrictions);
+        super.writeExternal( out );
+        out.writeObject( extractor );
+        out.writeObject( restrictions );
     }
-    public FieldExtractor getFieldExtractor() {
+
+    public ReadAccessor getFieldExtractor() {
         return this.extractor;
     }
 
@@ -79,7 +82,7 @@
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
-                             final ContextEntry context ) {
+                             final ContextEntry context) {
         return this.restrictions.isAllowed( this.extractor,
                                             handle,
                                             workingMemory,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -3,7 +3,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.Restriction;
 
 public class OrCompositeRestriction extends AbstractCompositeRestriction {
@@ -17,7 +17,7 @@
         super( restriction );
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -28,7 +28,7 @@
 import java.io.IOException;
 
 import org.drools.spi.Constraint;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PatternExtractor;
 import org.drools.spi.Constraint.ConstraintType;
@@ -201,7 +201,7 @@
     }
 
     public Declaration addDeclaration(final String identifier,
-                                      final Extractor extractor) {
+                                      final InternalReadAccessor extractor) {
         if ( this.constraints == Collections.EMPTY_LIST ) {
             this.constraints = new ArrayList( 1 );
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -26,7 +26,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PredicateExpression;
 import org.drools.spi.Restriction;
 
@@ -253,7 +253,7 @@
         }
     }
 
-    public boolean isAllowed(Extractor extractor,
+    public boolean isAllowed(InternalReadAccessor extractor,
                              InternalFactHandle handle,
                              InternalWorkingMemory workingMemory,
                              ContextEntry context ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,46 +16,51 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
 import org.drools.RuntimeDroolsException;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ReturnValueExpression;
 
-import java.io.Externalizable;
-import java.io.ObjectOutput;
-import java.io.IOException;
-import java.io.ObjectInput;
+public class ReturnValueConstraint extends MutableTypeConstraint
+    implements
+    Externalizable {
 
-public class ReturnValueConstraint extends MutableTypeConstraint implements Externalizable {
+    private static final long      serialVersionUID = 400L;
 
-    private static final long            serialVersionUID = 400L;
-
-    private FieldExtractor         fieldExtractor;
+    private InternalReadAccessor   fieldExtractor;
     private ReturnValueRestriction restriction;
 
     public ReturnValueConstraint() {
-        this(null, null);
+        this( null,
+              null );
     }
-    public ReturnValueConstraint(final FieldExtractor fieldExtractor,
+
+    public ReturnValueConstraint(final InternalReadAccessor fieldExtractor,
                                  final ReturnValueRestriction restriction) {
         this.fieldExtractor = fieldExtractor;
         this.restriction = restriction;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        fieldExtractor  = (FieldExtractor)in.readObject();
-        restriction     = (ReturnValueRestriction)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        super.readExternal( in );
+        fieldExtractor = (InternalReadAccessor) in.readObject();
+        restriction = (ReturnValueRestriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(fieldExtractor);
-        out.writeObject(restriction);
+        super.writeExternal( out );
+        out.writeObject( fieldExtractor );
+        out.writeObject( restriction );
     }
 
     public Declaration[] getRequiredDeclarations() {
@@ -112,7 +117,7 @@
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
-                             final ContextEntry context ) {
+                             final ContextEntry context) {
         try {
             return this.restriction.isAllowed( this.fieldExtractor,
                                                handle,
@@ -156,7 +161,8 @@
     }
 
     public Object clone() {
-        return new ReturnValueConstraint( this.fieldExtractor, (ReturnValueRestriction) this.restriction.clone() );
+        return new ReturnValueConstraint( this.fieldExtractor,
+                                          (ReturnValueRestriction) this.restriction.clone() );
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -28,8 +28,8 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
 import org.drools.spi.Restriction;
 import org.drools.spi.ReturnValueExpression;
 import org.drools.spi.Tuple;
@@ -52,7 +52,7 @@
 
     private Evaluator            evaluator;
 
-    private FieldExtractor       extractor;
+    private ReadAccessor       extractor;
 
     private static final Declaration[] noRequiredDeclarations = new Declaration[]{};
 
@@ -62,7 +62,7 @@
 
     }
 
-    public ReturnValueRestriction(final FieldExtractor fieldExtractor,
+    public ReturnValueRestriction(final ReadAccessor fieldExtractor,
                                   final Declaration[] previousDeclarations,
                                   final Declaration[] localDeclarations,
                                   final String[] requiredGlobals,
@@ -75,7 +75,7 @@
               evaluator );
     }
 
-    public ReturnValueRestriction(final FieldExtractor fieldExtractor,
+    public ReturnValueRestriction(final ReadAccessor fieldExtractor,
                                   final ReturnValueExpression returnValueExpression,
                                   final Declaration[] previousDeclarations,
                                   final Declaration[] localDeclarations,
@@ -123,7 +123,7 @@
         previousDeclarations  = (Declaration[])in.readObject();
         localDeclarations  = ( Declaration[])in.readObject();
         evaluator  = (Evaluator)in.readObject();
-        extractor  = (FieldExtractor)in.readObject();
+        extractor  = (ReadAccessor)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -182,7 +182,7 @@
         return this.evaluator;
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory,
@@ -202,7 +202,7 @@
         }
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemoiry,
                              final ContextEntry context) {
@@ -315,7 +315,7 @@
 
         private static final long    serialVersionUID = 400L;
 
-        public FieldExtractor        fieldExtractor;
+        public ReadAccessor        fieldExtractor;
         public InternalFactHandle    handle;
         public LeftTuple             leftTuple;
         public InternalWorkingMemory workingMemory;
@@ -329,7 +329,7 @@
         public ReturnValueContextEntry() {
         }
 
-        public ReturnValueContextEntry(final FieldExtractor fieldExtractor,
+        public ReturnValueContextEntry(final ReadAccessor fieldExtractor,
                                        final Declaration[] previousDeclarations,
                                        final Declaration[] localDeclarations) {
             this.fieldExtractor = fieldExtractor;
@@ -338,7 +338,7 @@
         }
 
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            fieldExtractor  = (FieldExtractor)in.readObject();
+            fieldExtractor  = (ReadAccessor)in.readObject();
             handle  = (InternalFactHandle)in.readObject();
             leftTuple  = (LeftTuple)in.readObject();
             workingMemory  = (InternalWorkingMemory)in.readObject();
@@ -382,7 +382,7 @@
         /* (non-Javadoc)
          * @see org.drools.rule.ReturnValueContextEntry#getFieldExtractor()
          */
-        public FieldExtractor getFieldExtractor() {
+        public ReadAccessor getFieldExtractor() {
             return this.fieldExtractor;
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/TypeDeclaration.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/TypeDeclaration.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/TypeDeclaration.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -25,7 +25,7 @@
 
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.facttemplates.FactTemplate;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
 /**
  * The type declaration class stores all type's metadata
@@ -36,17 +36,17 @@
 public class TypeDeclaration
     implements
     Externalizable {
-    
-    public static final String ATTR_CLASS = "class";
-    public static final String ATTR_TEMPLATE = "template";
-    public static final String ATTR_DURATION = "duration";
+
+    public static final String ATTR_CLASS     = "class";
+    public static final String ATTR_TEMPLATE  = "template";
+    public static final String ATTR_DURATION  = "duration";
     public static final String ATTR_TIMESTAMP = "timestamp";
-    
+
     public static enum Role {
         FACT, EVENT;
 
         public static final String ID = "role";
-        
+
         public static Role parseRole(String role) {
             if ( "event".equalsIgnoreCase( role ) ) {
                 return EVENT;
@@ -61,7 +61,7 @@
         POJO, TEMPLATE;
 
         public static final String ID = "format";
-        
+
         public static Format parseFormat(String format) {
             if ( "pojo".equalsIgnoreCase( format ) ) {
                 return POJO;
@@ -72,14 +72,14 @@
         }
     }
 
-    private String                   typeName;
-    private Role                     role;
-    private Format                   format;
-    private String                   timestampAttribute;
-    private String                   durationAttribute;
-    private transient FieldExtractor durationExtractor;
-    private Class< ? >               typeClass;
-    private FactTemplate             typeTemplate;
+    private String                         typeName;
+    private Role                           role;
+    private Format                         format;
+    private String                         timestampAttribute;
+    private String                         durationAttribute;
+    private transient InternalReadAccessor durationExtractor;
+    private Class< ? >                     typeClass;
+    private FactTemplate                   typeTemplate;
 
     public TypeDeclaration() {
     }
@@ -107,9 +107,9 @@
         if ( this.durationAttribute != null ) {
             // generate the extractor
             DroolsObjectInputStream dois = (DroolsObjectInputStream) in;
-            this.durationExtractor = dois.getExtractorFactory().getExtractor( this.typeClass,
-                                                                              this.durationAttribute,
-                                                                              dois.getClassLoader() );
+            this.durationExtractor = dois.getExtractorFactory().getReader( this.typeClass,
+                                                                           this.durationAttribute,
+                                                                           dois.getClassLoader() );
         }
     }
 
@@ -250,11 +250,11 @@
         return a == b || a != null && a.equals( b );
     }
 
-    public FieldExtractor getDurationExtractor() {
+    public InternalReadAccessor getDurationExtractor() {
         return durationExtractor;
     }
 
-    public void setDurationExtractor(FieldExtractor durationExtractor) {
+    public void setDurationExtractor(InternalReadAccessor durationExtractor) {
         this.durationExtractor = durationExtractor;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,28 +16,30 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.io.Externalizable;
+public class VariableConstraint extends MutableTypeConstraint
+    implements
+    Externalizable {
 
-public class VariableConstraint extends MutableTypeConstraint implements Externalizable {
+    private static final long    serialVersionUID = 400L;
 
-    private static final long         serialVersionUID = 400L;
+    private InternalReadAccessor fieldExtractor;
+    private VariableRestriction  restriction;
 
-    private FieldExtractor      fieldExtractor;
-    private VariableRestriction restriction;
-
     public VariableConstraint() {
     }
 
-    public VariableConstraint(final FieldExtractor fieldExtractor,
+    public VariableConstraint(final InternalReadAccessor fieldExtractor,
                               final Declaration declaration,
                               final Evaluator evaluator) {
         this.fieldExtractor = fieldExtractor;
@@ -46,23 +48,25 @@
                                                     evaluator );
     }
 
-    public VariableConstraint(final FieldExtractor fieldExtractor,
+    public VariableConstraint(final InternalReadAccessor fieldExtractor,
                               final VariableRestriction restriction) {
         this.fieldExtractor = fieldExtractor;
         this.restriction = restriction;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        fieldExtractor  = (FieldExtractor)in.readObject();
-        restriction     = (VariableRestriction)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        super.readExternal( in );
+        fieldExtractor = (InternalReadAccessor) in.readObject();
+        restriction = (VariableRestriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(fieldExtractor);
-        out.writeObject(restriction);
+        super.writeExternal( out );
+        out.writeObject( fieldExtractor );
+        out.writeObject( restriction );
     }
+
     public Declaration[] getRequiredDeclarations() {
         return this.restriction.getRequiredDeclarations();
     }
@@ -73,7 +77,7 @@
                                              newDecl );
     }
 
-    public FieldExtractor getFieldExtractor() {
+    public InternalReadAccessor getFieldExtractor() {
         return this.fieldExtractor;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,19 +16,18 @@
  * limitations under the License.
  */
 
-import java.util.Arrays;
-import java.io.Externalizable;
-import java.io.ObjectOutput;
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Arrays;
 
 import org.drools.base.ValueType;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
 import org.drools.spi.Restriction;
 
 public class VariableRestriction
@@ -43,12 +42,12 @@
 
     private Evaluator      evaluator;
 
-    private FieldExtractor extractor;
+    private InternalReadAccessor extractor;
 
     public VariableRestriction() {
     }
 
-    public VariableRestriction(final FieldExtractor fieldExtractor,
+    public VariableRestriction(final InternalReadAccessor fieldExtractor,
                                final Declaration declaration,
                                final Evaluator evaluator) {
         this.declaration = declaration;
@@ -68,7 +67,7 @@
         declaration = (Declaration) in.readObject();
         requiredDeclarations = (Declaration[]) in.readObject();
         evaluator = (Evaluator) in.readObject();
-        extractor = (FieldExtractor) in.readObject();
+        extractor = (InternalReadAccessor) in.readObject();
     }
 
     public Declaration[] getRequiredDeclarations() {
@@ -87,7 +86,7 @@
         return this.evaluator;
     }
 
-    public boolean isAllowed(final Extractor extractor,
+    public boolean isAllowed(final InternalReadAccessor extractor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context ) {
@@ -144,7 +143,7 @@
     }
 
     private final VariableContextEntry createContextEntry(final Evaluator eval,
-                                                          final FieldExtractor fieldExtractor) {
+                                                          final InternalReadAccessor fieldExtractor) {
         ValueType coerced = eval.getCoercedValueType();
 
         if ( coerced.isBoolean() ) {
@@ -184,7 +183,7 @@
     public static abstract class VariableContextEntry
         implements
         ContextEntry {
-        public FieldExtractor        extractor;
+        public InternalReadAccessor  extractor;
         public Evaluator             evaluator;
         public Object                object;
         public Declaration           declaration;
@@ -197,7 +196,7 @@
         public VariableContextEntry() {
         }
 
-        public VariableContextEntry(final FieldExtractor extractor,
+        public VariableContextEntry(final InternalReadAccessor extractor,
                                     final Declaration declaration,
                                     final Evaluator evaluator) {
             this.extractor = extractor;
@@ -207,7 +206,7 @@
 
         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
             workingMemory   = (InternalWorkingMemory)in.readObject();
-            extractor       = (FieldExtractor)in.readObject();
+            extractor       = (InternalReadAccessor)in.readObject();
             evaluator       = (Evaluator)in.readObject();
             object          = in.readObject();
             declaration     = (Declaration)in.readObject();
@@ -237,7 +236,7 @@
             this.entry = entry;
         }
 
-        public FieldExtractor getFieldExtractor() {
+        public ReadAccessor getFieldExtractor() {
             return this.extractor;
         }
 
@@ -279,7 +278,7 @@
         public ObjectVariableContextEntry() {
         }
 
-        public ObjectVariableContextEntry(final FieldExtractor extractor,
+        public ObjectVariableContextEntry(final InternalReadAccessor extractor,
                                           final Declaration declaration,
                                           final Evaluator evaluator) {
             super( extractor,
@@ -340,7 +339,7 @@
         public LongVariableContextEntry() {
         }
 
-        public LongVariableContextEntry(final FieldExtractor extractor,
+        public LongVariableContextEntry(final InternalReadAccessor extractor,
                                         final Declaration declaration,
                                         final Evaluator evaluator) {
             super( extractor,
@@ -401,7 +400,7 @@
         public CharVariableContextEntry() {
         }
 
-        public CharVariableContextEntry(final FieldExtractor extractor,
+        public CharVariableContextEntry(final InternalReadAccessor extractor,
                                         final Declaration declaration,
                                         final Evaluator evaluator) {
             super( extractor,
@@ -462,7 +461,7 @@
         public DoubleVariableContextEntry() {
         }
 
-        public DoubleVariableContextEntry(final FieldExtractor extractor,
+        public DoubleVariableContextEntry(final InternalReadAccessor extractor,
                                           final Declaration declaration,
                                           final Evaluator evaluator) {
             super( extractor,
@@ -522,7 +521,7 @@
         public BooleanVariableContextEntry() {
         }
 
-        public BooleanVariableContextEntry(final FieldExtractor extractor,
+        public BooleanVariableContextEntry(final InternalReadAccessor extractor,
                                            final Declaration declaration,
                                            final Evaluator evaluator) {
             super( extractor,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Evaluator.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -83,14 +83,14 @@
      * @return Returns true if evaluation is successfull. false otherwise.
      */
     public boolean evaluate(InternalWorkingMemory workingMemory,
-                            Extractor extractor,
+                            InternalReadAccessor extractor,
                             Object object1,
                             FieldValue value);
 
     public boolean evaluate(InternalWorkingMemory workingMemory,
-                            Extractor leftExtractor,
+                            InternalReadAccessor leftExtractor,
                             Object left,
-                            Extractor rightExtractor,
+                            InternalReadAccessor rightExtractor,
                             Object right);
 
     public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,61 +0,0 @@
-package org.drools.spi;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.Externalizable;
-import java.lang.reflect.Method;
-
-import org.drools.base.ValueType;
-import org.drools.common.InternalWorkingMemory;
-
-public interface Extractor
-    extends
-    Externalizable {
-
-    public Object getValue(InternalWorkingMemory workingMemory, Object object);
-
-    public char getCharValue(InternalWorkingMemory workingMemory, Object object);
-
-    public int getIntValue(InternalWorkingMemory workingMemory, Object object);
-
-    public byte getByteValue(InternalWorkingMemory workingMemory, Object object);
-
-    public short getShortValue(InternalWorkingMemory workingMemory, Object object);
-
-    public long getLongValue(InternalWorkingMemory workingMemory, Object object);
-
-    public float getFloatValue(InternalWorkingMemory workingMemory, Object object);
-
-    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
-
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
-
-    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object);
-
-    public boolean isGlobal();
-
-    public ValueType getValueType();
-
-    public Class getExtractToClass();
-
-    public String getExtractToClassName();
-
-    public Method getNativeReadMethod();
-
-    public int getHashCode(InternalWorkingMemory workingMemory, Object object);
-
-}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,24 +0,0 @@
-package org.drools.spi;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public interface FieldExtractor
-    extends
-    Extractor {
-    public int getIndex();
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,11 +16,11 @@
 
 package org.drools.spi;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.reflect.Method;
 import java.util.Map;
-import java.io.ObjectOutput;
-import java.io.IOException;
-import java.io.ObjectInput;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassObjectType;
@@ -35,7 +35,7 @@
  */
 public class GlobalExtractor
     implements
-    Extractor {
+    InternalReadAccessor {
 
     private static final long serialVersionUID = 400L;
     private String            key;
@@ -175,4 +175,40 @@
     public boolean isGlobal() {
         return true;
     }
+    public boolean getBooleanValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public byte getByteValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public char getCharValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public double getDoubleValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public float getFloatValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public int getHashCode(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public int getIndex() {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public int getIntValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public long getLongValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public short getShortValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public Object getValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
+    public boolean isNullValue(Object object) {
+        throw new RuntimeDroolsException("Can't extract a value from a global without a working memory reference");
+    }
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/InternalReadAccessor.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Extractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/InternalReadAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/InternalReadAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,49 @@
+package org.drools.spi;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.common.InternalWorkingMemory;
+
+public interface InternalReadAccessor
+    extends
+    ReadAccessor {
+
+    public Object getValue(InternalWorkingMemory workingMemory, Object object);
+
+    public char getCharValue(InternalWorkingMemory workingMemory, Object object);
+
+    public int getIntValue(InternalWorkingMemory workingMemory, Object object);
+
+    public byte getByteValue(InternalWorkingMemory workingMemory, Object object);
+
+    public short getShortValue(InternalWorkingMemory workingMemory, Object object);
+
+    public long getLongValue(InternalWorkingMemory workingMemory, Object object);
+
+    public float getFloatValue(InternalWorkingMemory workingMemory, Object object);
+
+    public double getDoubleValue(InternalWorkingMemory workingMemory, Object object);
+
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object);
+
+    public boolean isNullValue(InternalWorkingMemory workingMemory, Object object);
+
+    public int getHashCode(InternalWorkingMemory workingMemory, Object object);
+    
+    public boolean isGlobal();
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,12 +1,10 @@
 package org.drools.spi;
 
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Iterator;
 import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.lang.reflect.Method;
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassObjectType;
@@ -34,7 +32,8 @@
 
 public class PatternExtractor
     implements
-    Extractor, Externalizable {
+    InternalReadAccessor,
+    Externalizable {
 
     /**
      *
@@ -43,21 +42,24 @@
     private ObjectType        objectType;
 
     public PatternExtractor() {
-        this(null);
+        this( null );
     }
+
     public PatternExtractor(final ObjectType objectType) {
         this.objectType = objectType;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        objectType  = (ObjectType)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        objectType = (ObjectType) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(objectType);
+        out.writeObject( objectType );
     }
 
-    public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+    public Object getValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
         // need to use instanceof because an object may be created in nodes like accumulate and from
         // where no shadow is applied
         return (object instanceof ShadowProxy) ? ((ShadowProxy) object).getShadowedObject() : object;
@@ -67,7 +69,7 @@
         return this.objectType;
     }
 
-    public Class getExtractToClass() {
+    public Class<?> getExtractToClass() {
         // @todo : this is a bit nasty, but does the trick
         if ( this.objectType instanceof ClassObjectType ) {
             return ((ClassObjectType) this.objectType).getClassType();
@@ -77,7 +79,7 @@
     }
 
     public String getExtractToClassName() {
-        Class clazz = null;
+        Class<?> clazz = null;
         // @todo : this is a bit nasty, but does the trick
         if ( this.objectType instanceof ClassObjectType ) {
             clazz = ((ClassObjectType) this.objectType).getClassType();
@@ -91,56 +93,64 @@
         return this.objectType.getValueType();
     }
 
-    public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+    public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
         if ( this.objectType.getValueType().isBoolean() ) {
             return ((Boolean) object).booleanValue();
         }
         throw new RuntimeDroolsException( "Conversion to boolean not supported for type: " + object.getClass() );
     }
 
-    public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+    public byte getByteValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).byteValue();
         }
         throw new RuntimeDroolsException( "Conversion to byte not supported for type: " + object.getClass() );
     }
 
-    public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+    public char getCharValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         if ( this.objectType.getValueType().isChar() ) {
             return ((Character) object).charValue();
         }
         throw new RuntimeDroolsException( "Conversion to char not supported for type: " + object.getClass() );
     }
 
-    public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+    public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).doubleValue();
         }
         throw new RuntimeDroolsException( "Conversion to double not supported for type: " + object.getClass() );
     }
 
-    public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+    public float getFloatValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).floatValue();
         }
         throw new RuntimeDroolsException( "Conversion to float not supported for type: " + object.getClass() );
     }
 
-    public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+    public int getIntValue(InternalWorkingMemory workingMemory,
+                           final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).intValue();
         }
         throw new RuntimeDroolsException( "Conversion to int not supported for type: " + object.getClass() );
     }
 
-    public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+    public long getLongValue(InternalWorkingMemory workingMemory,
+                             final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).longValue();
         }
         throw new RuntimeDroolsException( "Conversion to long not supported for type: " + object.getClass() );
     }
 
-    public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+    public short getShortValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
         if ( this.objectType.getValueType().isNumber() ) {
             return ((Number) object).shortValue();
         }
@@ -157,12 +167,16 @@
         }
     }
 
-    public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object ) {
-        return getValue( workingMemory, object ) == null;
+    public boolean isNullValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+        return getValue( workingMemory,
+                         object ) == null;
     }
 
-    public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
-        return getValue( workingMemory, object ).hashCode();
+    public int getHashCode(InternalWorkingMemory workingMemory,
+                           final Object object) {
+        return getValue( workingMemory,
+                         object ).hashCode();
     }
 
     public int hashCode() {
@@ -183,4 +197,63 @@
     public boolean isGlobal() {
         return false;
     }
+
+    public boolean getBooleanValue(Object object) {
+        return getBooleanValue( null,
+                                object );
+    }
+
+    public byte getByteValue(Object object) {
+        return getByteValue( null,
+                             object );
+    }
+
+    public char getCharValue(Object object) {
+        return getCharValue( null,
+                             object );
+    }
+
+    public double getDoubleValue(Object object) {
+        return getDoubleValue( null,
+                               object );
+    }
+
+    public float getFloatValue(Object object) {
+        return getFloatValue( null,
+                              object );
+    }
+
+    public int getHashCode(Object object) {
+        return getHashCode( null,
+                            object );
+    }
+
+    public int getIndex() {
+        return -1;
+    }
+
+    public int getIntValue(Object object) {
+        return getIntValue( null,
+                            object );
+    }
+
+    public long getLongValue(Object object) {
+        return getLongValue( null,
+                             object );
+    }
+
+    public short getShortValue(Object object) {
+        return getShortValue( null,
+                              object );
+    }
+
+    public Object getValue(Object object) {
+        return getValue( null,
+                         object );
+    }
+
+    public boolean isNullValue(Object object) {
+        return isNullValue( null,
+                            object );
+    }
 }

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/FieldExtractor.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,63 @@
+package org.drools.spi;
+
+import java.io.Externalizable;
+import java.lang.reflect.Method;
+
+import org.drools.base.ValueType;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * A public interface for Read accessors
+ */
+public interface ReadAccessor
+    extends
+    Externalizable {
+
+    public Object getValue(Object object);
+
+    public char getCharValue(Object object);
+
+    public int getIntValue(Object object);
+
+    public byte getByteValue(Object object);
+
+    public short getShortValue(Object object);
+
+    public long getLongValue(Object object);
+
+    public float getFloatValue(Object object);
+
+    public double getDoubleValue(Object object);
+
+    public boolean getBooleanValue(Object object);
+
+    public boolean isNullValue(Object object);
+
+    public ValueType getValueType();
+
+    public Class< ? > getExtractToClass();
+
+    public String getExtractToClassName();
+
+    public Method getNativeReadMethod();
+
+    public int getHashCode(Object object);
+
+    public int getIndex();
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Restriction.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -15,7 +15,7 @@
     Cloneable {
     Declaration[] getRequiredDeclarations();
 
-    public boolean isAllowed(Extractor extractor,
+    public boolean isAllowed(InternalReadAccessor extractor,
                              InternalFactHandle handle,
                              InternalWorkingMemory workingMemory,
                              ContextEntry context );

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/WriteAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/WriteAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/WriteAccessor.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,59 @@
+package org.drools.spi;
+
+/*
+ * Copyright 2008 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Externalizable;
+import java.lang.reflect.Method;
+
+import org.drools.base.ValueType;
+
+/**
+ * An interface for a class that is able to write values into a class
+ * field
+ * 
+ * @author etirelli
+ */
+public interface WriteAccessor
+    extends
+    Externalizable {
+
+    public int getIndex();
+
+    public void setValue( Object bean, Object value );
+
+    public void setCharValue( Object bean, char value );
+
+    public void setIntValue( Object bean, int value );
+
+    public void setByteValue( Object bean, byte value );
+
+    public void setShortValue( Object bean, short value );
+
+    public void setLongValue( Object bean, long value );
+
+    public void setFloatValue( Object bean, float value );
+
+    public void setDoubleValue( Object bean, double value );
+
+    public void setBooleanValue( Object bean, boolean value );
+
+    public ValueType getValueType();
+
+    public Class< ? > getFieldType();
+
+    public Method getNativeWriteMethod();
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -4,15 +4,15 @@
 package org.drools.util;
 
 import java.io.Externalizable;
-import java.io.ObjectOutput;
 import java.io.IOException;
 import java.io.ObjectInput;
+import java.io.ObjectOutput;
 
-import org.drools.common.InternalFactHandle;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.Declaration;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
 
 public abstract class AbstractHashTable
     implements
@@ -43,7 +43,8 @@
     }
 
     public AbstractHashTable(final Entry[] table) {
-        this( 0.75f, table);
+        this( 0.75f,
+              table );
     }
 
     public AbstractHashTable(final float loadFactor,
@@ -54,22 +55,23 @@
         this.comparator = EqualityEquals.getInstance();
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        size        = in.readInt();
-        threshold   = in.readInt();
-        loadFactor  = in.readFloat();
-        comparator  = (ObjectComparator)in.readObject();
-        table   = (Entry[])in.readObject();
-        iterator    = (HashTableIterator)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        size = in.readInt();
+        threshold = in.readInt();
+        loadFactor = in.readFloat();
+        comparator = (ObjectComparator) in.readObject();
+        table = (Entry[]) in.readObject();
+        iterator = (HashTableIterator) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeInt(size);
-        out.writeInt(threshold);
-        out.writeFloat(loadFactor);
-        out.writeObject(comparator);
-        out.writeObject(table);
-        out.writeObject(iterator);
+        out.writeInt( size );
+        out.writeInt( threshold );
+        out.writeFloat( loadFactor );
+        out.writeObject( comparator );
+        out.writeObject( table );
+        out.writeObject( iterator );
     }
 
     public Iterator iterator() {
@@ -250,7 +252,8 @@
      */
     public static class HashTableIterator
         implements
-        Iterator, Externalizable {
+        Iterator,
+        Externalizable {
 
         private static final long serialVersionUID = 400L;
 
@@ -267,27 +270,28 @@
             this.hashTable = hashTable;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            hashTable   = (AbstractHashTable)in.readObject();
-            table       = (Entry[])in.readObject();
-            row         = in.readInt();
-            length      = in.readInt();
-            entry       = (Entry)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            hashTable = (AbstractHashTable) in.readObject();
+            table = (Entry[]) in.readObject();
+            row = in.readInt();
+            length = in.readInt();
+            entry = (Entry) in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(hashTable);
-            out.writeObject(table);
-            out.writeInt(row);
-            out.writeInt(length);
-            out.writeObject(entry);
+            out.writeObject( hashTable );
+            out.writeObject( table );
+            out.writeInt( row );
+            out.writeInt( length );
+            out.writeObject( entry );
         }
 
         /* (non-Javadoc)
          * @see org.drools.util.Iterator#next()
          */
         public Object next() {
-            if ( this.entry != null  ) {
+            if ( this.entry != null ) {
                 this.entry = this.entry.getNext();
             }
 
@@ -303,51 +307,51 @@
             return this.entry;
         }
 
-//        /* (non-Javadoc)
-//         * @see org.drools.util.Iterator#next()
-//         */
-//        public Object next() {
-//            if ( this.entry == null ) {
-//                // keep skipping rows until we come to the end, or find one that is populated
-//                while ( this.entry == null ) {
-//                    this.row++;
-//                    if ( this.row == this.length ) {
-//                        return null;
-//                    }
-//                    this.entry = this.table[this.row];
-//                }
-//            } else {
-//                this.entry = this.entry.getNext();
-//                if ( this.entry == null ) {
-//                    this.entry = (Entry) next();
-//                }
-//            }
-//
-//            return this.entry;
-//        }
+        //        /* (non-Javadoc)
+        //         * @see org.drools.util.Iterator#next()
+        //         */
+        //        public Object next() {
+        //            if ( this.entry == null ) {
+        //                // keep skipping rows until we come to the end, or find one that is populated
+        //                while ( this.entry == null ) {
+        //                    this.row++;
+        //                    if ( this.row == this.length ) {
+        //                        return null;
+        //                    }
+        //                    this.entry = this.table[this.row];
+        //                }
+        //            } else {
+        //                this.entry = this.entry.getNext();
+        //                if ( this.entry == null ) {
+        //                    this.entry = (Entry) next();
+        //                }
+        //            }
+        //
+        //            return this.entry;
+        //        }
 
-//        /* (non-Javadoc)
-//         * @see org.drools.util.Iterator#next()
-//         */
-//        public Object next() {
-//            if ( this.entry == null ) {
-//                // keep skipping rows until we come to the end, or find one that is populated
-//                while ( this.entry == null ) {
-//                    this.row++;
-//                    if ( this.row == this.length ) {
-//                        return null;
-//                    }
-//                    this.entry = this.table[this.row];
-//                }
-//            } else {
-//                this.entry = this.entry.getNext();
-//                if ( this.entry == null ) {
-//                    this.entry = (Entry) next();
-//                }
-//            }
-//
-//            return this.entry;
-//        }
+        //        /* (non-Javadoc)
+        //         * @see org.drools.util.Iterator#next()
+        //         */
+        //        public Object next() {
+        //            if ( this.entry == null ) {
+        //                // keep skipping rows until we come to the end, or find one that is populated
+        //                while ( this.entry == null ) {
+        //                    this.row++;
+        //                    if ( this.row == this.length ) {
+        //                        return null;
+        //                    }
+        //                    this.entry = this.table[this.row];
+        //                }
+        //            } else {
+        //                this.entry = this.entry.getNext();
+        //                if ( this.entry == null ) {
+        //                    this.entry = (Entry) next();
+        //                }
+        //            }
+        //
+        //            return this.entry;
+        //        }
 
         /* (non-Javadoc)
          * @see org.drools.util.Iterator#reset()
@@ -367,7 +371,8 @@
         private static final long      serialVersionUID = 400L;
         public static ObjectComparator INSTANCE         = new InstanceEquals();
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
@@ -406,7 +411,8 @@
         private static final long      serialVersionUID = 400L;
         public static ObjectComparator INSTANCE         = new EqualityEquals();
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
@@ -441,19 +447,21 @@
         }
     }
 
-    public static class FieldIndex implements Externalizable {
+    public static class FieldIndex
+        implements
+        Externalizable {
 
         private static final long serialVersionUID = 1020010166351582645L;
 
-        FieldExtractor   extractor;
-        Declaration      declaration;
-        public Evaluator evaluator;
+        InternalReadAccessor      extractor;
+        Declaration               declaration;
+        public Evaluator          evaluator;
 
         public FieldIndex() {
 
         }
 
-        public FieldIndex(final FieldExtractor extractor,
+        public FieldIndex(final InternalReadAccessor extractor,
                           final Declaration declaration,
                           final Evaluator evaluator) {
             super();
@@ -462,22 +470,24 @@
             this.evaluator = evaluator;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            extractor   = (FieldExtractor)in.readObject();
-            declaration   = (Declaration)in.readObject();
-            evaluator   = (Evaluator)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            extractor = (InternalReadAccessor) in.readObject();
+            declaration = (Declaration) in.readObject();
+            evaluator = (Evaluator) in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(extractor);
-            out.writeObject(declaration);
-            out.writeObject(evaluator);
+            out.writeObject( extractor );
+            out.writeObject( declaration );
+            out.writeObject( evaluator );
         }
+
         public Declaration getDeclaration() {
             return this.declaration;
         }
 
-        public FieldExtractor getExtractor() {
+        public ReadAccessor getExtractor() {
             return this.extractor;
         }
 
@@ -486,7 +496,9 @@
         }
     }
 
-    public static interface Index extends Externalizable {
+    public static interface Index
+        extends
+        Externalizable {
         public FieldIndex getFieldIndex(int index);
 
         public int hashCodeOf(LeftTuple tuple);
@@ -507,13 +519,13 @@
         implements
         Index {
 
-        private static final long serialVersionUID = -1022777958435032326L;
+        private static final long    serialVersionUID = -1022777958435032326L;
 
-        private FieldExtractor extractor;
-        private Declaration    declaration;
-        private Evaluator      evaluator;
+        private InternalReadAccessor extractor;
+        private Declaration          declaration;
+        private Evaluator            evaluator;
 
-        private int            startResult;
+        private int                  startResult;
 
         public SingleIndex() {
 
@@ -528,38 +540,41 @@
             this.evaluator = indexes[0].evaluator;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            extractor   = (FieldExtractor)in.readObject();
-            declaration = (Declaration)in.readObject();
-            evaluator   = (Evaluator)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            extractor = (InternalReadAccessor) in.readObject();
+            declaration = (Declaration) in.readObject();
+            evaluator = (Evaluator) in.readObject();
             startResult = in.readInt();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(extractor);
-            out.writeObject(declaration);
-            out.writeObject(evaluator);
-            out.writeInt(startResult);
+            out.writeObject( extractor );
+            out.writeObject( declaration );
+            out.writeObject( evaluator );
+            out.writeInt( startResult );
         }
 
-
         public FieldIndex getFieldIndex(int index) {
             if ( index > 0 ) {
-                throw new IllegalArgumentException("Index position " + index + " does not exist" );
+                throw new IllegalArgumentException( "Index position " + index + " does not exist" );
             }
-            return new FieldIndex(extractor, declaration, evaluator);
+            return new FieldIndex( extractor,
+                                   declaration,
+                                   evaluator );
         }
 
-
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null, object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.extractor.getHashCode( null,
+                                                                                              object );
             return rehash( hashCode );
         }
 
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null, tuple.get( this.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.declaration.getHashCode( null,
+                                                                                                tuple.get( this.declaration ).getObject() );
             return rehash( hashCode );
         }
 
@@ -570,7 +585,8 @@
             return this.evaluator.evaluate( null,
                                             this.declaration.getExtractor(),
                                             left,
-                                            this.extractor, right );
+                                            this.extractor,
+                                            right );
         }
 
         public boolean equal(final Object object1,
@@ -579,7 +595,8 @@
             return this.evaluator.evaluate( null,
                                             this.extractor,
                                             object1,
-                                            this.extractor, object2 );
+                                            this.extractor,
+                                            object2 );
         }
 
         public boolean equal(final LeftTuple tuple1,
@@ -589,7 +606,8 @@
             return this.evaluator.evaluate( null,
                                             this.declaration.getExtractor(),
                                             object1,
-                                            this.declaration.getExtractor(), object2 );
+                                            this.declaration.getExtractor(),
+                                            object2 );
         }
 
         public int rehash(int h) {
@@ -608,14 +626,15 @@
 
         private static final long serialVersionUID = 5453765340969897686L;
 
-        private FieldIndex index0;
-        private FieldIndex index1;
+        private FieldIndex        index0;
+        private FieldIndex        index1;
 
-        private int        startResult;
+        private int               startResult;
 
         public DoubleCompositeIndex() {
 
         }
+
         public DoubleCompositeIndex(final FieldIndex[] indexes,
                                     final int startResult) {
             this.startResult = startResult;
@@ -624,34 +643,37 @@
             this.index1 = indexes[1];
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            index0  = (FieldIndex)in.readObject();
-            index1  = (FieldIndex)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            index0 = (FieldIndex) in.readObject();
+            index1 = (FieldIndex) in.readObject();
             startResult = in.readInt();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(index0);
-            out.writeObject(index1);
-            out.writeInt(startResult);
+            out.writeObject( index0 );
+            out.writeObject( index1 );
+            out.writeInt( startResult );
         }
 
         public FieldIndex getFieldIndex(int index) {
             switch ( index ) {
-                case 0:
+                case 0 :
                     return index0;
-                case 1:
+                case 1 :
                     return index1;
-                default:
-                    throw new IllegalArgumentException("Index position " + index + " does not exist" );
+                default :
+                    throw new IllegalArgumentException( "Index position " + index + " does not exist" );
             }
         }
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null,
+                                                                                                     object );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null,
+                                                                                                     object );
 
             return rehash( hashCode );
         }
@@ -659,8 +681,10 @@
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null,
+                                                                                                       tuple.get( this.index0.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null,
+                                                                                                       tuple.get( this.index1.declaration ).getObject() );
 
             return rehash( hashCode );
         }
@@ -673,10 +697,12 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.declaration.getExtractor(),
                                                    left1,
-                                                   this.index0.extractor, right ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.extractor,
+                                                   right ) && this.index1.evaluator.evaluate( null,
                                                                                               this.index1.declaration.getExtractor(),
                                                                                               left2,
-                                                                                              this.index1.extractor, right );
+                                                                                              this.index1.extractor,
+                                                                                              right );
         }
 
         public boolean equal(final LeftTuple tuple1,
@@ -690,10 +716,12 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.declaration.getExtractor(),
                                                    object11,
-                                                   this.index0.declaration.getExtractor(), object12 ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
+                                                   object12 ) && this.index1.evaluator.evaluate( null,
                                                                                                  this.index1.declaration.getExtractor(),
                                                                                                  object21,
-                                                                                                 this.index1.declaration.getExtractor(), object22 );
+                                                                                                 this.index1.declaration.getExtractor(),
+                                                                                                 object22 );
         }
 
         public boolean equal(final Object object1,
@@ -701,10 +729,12 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.extractor,
                                                    object1,
-                                                   this.index0.extractor, object2 ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.extractor,
+                                                   object2 ) && this.index1.evaluator.evaluate( null,
                                                                                                 this.index1.extractor,
                                                                                                 object1,
-                                                                                                this.index1.extractor, object2 );
+                                                                                                this.index1.extractor,
+                                                                                                object2 );
         }
 
         public int rehash(int h) {
@@ -722,11 +752,11 @@
 
         private static final long serialVersionUID = 7743486670399440233L;
 
-        private FieldIndex index0;
-        private FieldIndex index1;
-        private FieldIndex index2;
+        private FieldIndex        index0;
+        private FieldIndex        index1;
+        private FieldIndex        index2;
 
-        private int        startResult;
+        private int               startResult;
 
         public TripleCompositeIndex() {
 
@@ -741,39 +771,43 @@
             this.index2 = indexes[2];
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            index0  = (FieldIndex)in.readObject();
-            index1  = (FieldIndex)in.readObject();
-            index2  = (FieldIndex)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            index0 = (FieldIndex) in.readObject();
+            index1 = (FieldIndex) in.readObject();
+            index2 = (FieldIndex) in.readObject();
             startResult = in.readInt();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(index0);
-            out.writeObject(index1);
-            out.writeObject(index2);
-            out.writeInt(startResult);
+            out.writeObject( index0 );
+            out.writeObject( index1 );
+            out.writeObject( index2 );
+            out.writeInt( startResult );
         }
 
         public FieldIndex getFieldIndex(int index) {
             switch ( index ) {
-                case 0:
+                case 0 :
                     return index0;
-                case 1:
+                case 1 :
                     return index1;
-                case 2:
+                case 2 :
                     return index2;
-                default:
-                    throw new IllegalArgumentException("Index position " + index + " does not exist" );
+                default :
+                    throw new IllegalArgumentException( "Index position " + index + " does not exist" );
             }
         }
 
         public int hashCodeOf(final Object object) {
             int hashCode = this.startResult;
 
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null, object );;
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null, object );;
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null, object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.extractor.getHashCode( null,
+                                                                                                     object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.extractor.getHashCode( null,
+                                                                                                     object );;
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.extractor.getHashCode( null,
+                                                                                                     object );;
 
             return rehash( hashCode );
         }
@@ -781,9 +815,12 @@
         public int hashCodeOf(final LeftTuple tuple) {
             int hashCode = this.startResult;
 
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null, tuple.get( this.index0.declaration ).getObject() );
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null, tuple.get( this.index1.declaration ).getObject() );
-            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null, tuple.get( this.index2.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index0.declaration.getHashCode( null,
+                                                                                                       tuple.get( this.index0.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index1.declaration.getHashCode( null,
+                                                                                                       tuple.get( this.index1.declaration ).getObject() );
+            hashCode = LeftTupleIndexHashTable.PRIME * hashCode + this.index2.declaration.getHashCode( null,
+                                                                                                       tuple.get( this.index2.declaration ).getObject() );
 
             return rehash( hashCode );
         }
@@ -797,13 +834,16 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.declaration.getExtractor(),
                                                    left1,
-                                                   this.index0.extractor, right ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.extractor,
+                                                   right ) && this.index1.evaluator.evaluate( null,
                                                                                               this.index1.declaration.getExtractor(),
                                                                                               left2,
-                                                                                              this.index1.extractor, right ) && this.index2.evaluator.evaluate( null,
+                                                                                              this.index1.extractor,
+                                                                                              right ) && this.index2.evaluator.evaluate( null,
                                                                                                                                          this.index2.declaration.getExtractor(),
                                                                                                                                          left3,
-                                                                                                                                         this.index2.extractor, right );
+                                                                                                                                         this.index2.extractor,
+                                                                                                                                         right );
         }
 
         public boolean equal(final LeftTuple tuple1,
@@ -818,13 +858,16 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.declaration.getExtractor(),
                                                    object11,
-                                                   this.index0.declaration.getExtractor(), object12 ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.declaration.getExtractor(),
+                                                   object12 ) && this.index1.evaluator.evaluate( null,
                                                                                                  this.index1.declaration.getExtractor(),
                                                                                                  object21,
-                                                                                                 this.index1.declaration.getExtractor(), object22 ) && this.index2.evaluator.evaluate( null,
+                                                                                                 this.index1.declaration.getExtractor(),
+                                                                                                 object22 ) && this.index2.evaluator.evaluate( null,
                                                                                                                                                this.index2.declaration.getExtractor(),
                                                                                                                                                object31,
-                                                                                                                                               this.index2.declaration.getExtractor(), object32 );
+                                                                                                                                               this.index2.declaration.getExtractor(),
+                                                                                                                                               object32 );
         }
 
         public boolean equal(final Object object1,
@@ -832,13 +875,16 @@
             return this.index0.evaluator.evaluate( null,
                                                    this.index0.extractor,
                                                    object1,
-                                                   this.index0.extractor, object2 ) && this.index1.evaluator.evaluate( null,
+                                                   this.index0.extractor,
+                                                   object2 ) && this.index1.evaluator.evaluate( null,
                                                                                                 this.index1.extractor,
                                                                                                 object1,
-                                                                                                this.index1.extractor, object2 ) && this.index2.evaluator.evaluate( null,
+                                                                                                this.index1.extractor,
+                                                                                                object2 ) && this.index2.evaluator.evaluate( null,
                                                                                                                                              this.index2.extractor,
                                                                                                                                              object1,
-                                                                                                                                             this.index2.extractor, object2 );
+                                                                                                                                             this.index2.extractor,
+                                                                                                                                             object2 );
         }
 
         public int rehash(int h) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/ClassFieldInspector.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/ClassFieldInspector.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/ClassFieldInspector.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -21,10 +21,8 @@
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -47,22 +45,22 @@
  */
 public class ClassFieldInspector {
 
-    private final List methods     = new ArrayList();
-    private final Map  fieldNames  = new HashMap();
-    private final Map  fieldTypes  = new HashMap();
-    private final Map  methodNames = new HashMap();
-    private final Set  nonGetters  = new HashSet();
+    private final Map<String, Integer>    fieldNames    = new HashMap<String, Integer>();
+    private final Map<String, Class< ? >> fieldTypes    = new HashMap<String, Class< ? >>();
+    private final Map<String, Method>     getterMethods = new HashMap<String, Method>();
+    private final Map<String, Method>     setterMethods = new HashMap<String, Method>();
+    private final Set<String>             nonGetters    = new HashSet<String>();
 
     /**
-     * @param clazz The class that the fields to be shadowed are extracted for.
+     * @param clazz The class sthat the fields to be shadowed are extracted for.
      * @throws IOException
      */
-    public ClassFieldInspector(final Class clazz) throws IOException {
+    public ClassFieldInspector(final Class< ? > clazz) throws IOException {
         this( clazz,
               true );
     }
 
-    public ClassFieldInspector(final Class clazz,
+    public ClassFieldInspector(final Class< ? > clazz,
                                final boolean includeFinalMethods) throws IOException {
         final String name = getResourcePath( clazz );
         final InputStream stream = clazz.getResourceAsStream( name );
@@ -78,7 +76,7 @@
     }
 
     /** Walk up the inheritance hierarchy recursively, reading in fields */
-    private void processClassWithByteCode(final Class clazz,
+    private void processClassWithByteCode(final Class< ? > clazz,
                                           final InputStream stream,
                                           final boolean includeFinalMethods) throws IOException {
 
@@ -101,7 +99,7 @@
             }
         }
         if ( clazz.isInterface() ) {
-            final Class[] interfaces = clazz.getInterfaces();
+            final Class< ? >[] interfaces = clazz.getInterfaces();
             for ( int i = 0; i < interfaces.length; i++ ) {
                 final String name = getResourcePath( interfaces[i] );
                 final InputStream parentStream = clazz.getResourceAsStream( name );
@@ -117,20 +115,28 @@
         }
     }
 
-    private void processClassWithoutByteCode(final Class clazz,
+    private void processClassWithoutByteCode(final Class< ? > clazz,
                                              final boolean includeFinalMethods) {
         final Method[] methods = clazz.getMethods();
         for ( int i = 0; i < methods.length; i++ ) {
-
-            //only want public methods that start with 'get' or 'is'
-            //and have no args, and return a value
+            // modifiers mask  
             final int mask = includeFinalMethods ? Modifier.PUBLIC : Modifier.PUBLIC | Modifier.FINAL;
-            if ( ((methods[i].getModifiers() & mask) == Modifier.PUBLIC) && (methods[i].getParameterTypes().length == 0) && (!methods[i].getName().equals( "<init>" )) &&
-                 ( !methods[i].getName().equals( "<clinit>" )) && 
-                 (methods[i].getReturnType() != void.class) ) {
-                final int fieldIndex = this.methods.size();
+            
+            if ( ((methods[i].getModifiers() & mask) == Opcodes.ACC_PUBLIC ) && (methods[i].getParameterTypes().length == 0) && (!methods[i].getName().equals( "<init>" )) && (!methods[i].getName().equals( "<clinit>" ))
+                 && (methods[i].getReturnType() != void.class) ) {
+                
+                // want public methods that start with 'get' or 'is' and have no args, and return a value
+                final int fieldIndex = this.fieldNames.size();
                 addToMapping( methods[i],
                               fieldIndex );
+                
+            } else if ( ((methods[i].getModifiers() & mask) == Opcodes.ACC_PUBLIC ) && (methods[i].getParameterTypes().length == 1) && (methods[i].getName().startsWith( "set" ))) {
+
+                // want public methods that start with 'set' and have one arg
+                final int fieldIndex = this.fieldNames.size();
+                addToMapping( methods[i],
+                              fieldIndex );
+                
             }
         }
     }
@@ -138,48 +144,46 @@
     /**
      * Convert it to a form so we can load the bytes from the classpath.
      */
-    private String getResourcePath(final Class clazz) {
-        return "/" + clazz.getName().replace( '.',
-                                              '/' ) + ".class";
+    private String getResourcePath(final Class< ? > clazz) {
+        return "/" + clazz.getCanonicalName() + ".class";
     }
 
-    /** 
-     * Return a list in order of which the getters (and "is") methods were found.
-     * This should only be done once when compiling a rulebase ideally.
-     */
-    public List getPropertyGetters() {
-        return this.methods;
-    }
-
     /**
      * Return a mapping of the field "names" (ie bean property name convention)
      * to the numerical index by which they can be accessed.
      */
-    public Map getFieldNames() {
+    public Map<String, Integer> getFieldNames() {
         return this.fieldNames;
     }
 
     /**
      * @return A mapping of field types (unboxed).
      */
-    public Map getFieldTypes() {
+    public Map<String, Class< ? >> getFieldTypes() {
         return this.fieldTypes;
     }
 
     /** 
      * @return A mapping of methods for the getters. 
      */
-    public Map getGetterMethods() {
-        return this.methodNames;
+    public Map<String, Method> getGetterMethods() {
+        return this.getterMethods;
     }
 
+    /** 
+     * @return A mapping of methods for the getters. 
+     */
+    public Map<String, Method> getSetterMethods() {
+        return this.setterMethods;
+    }
+
     private void addToMapping(final Method method,
                               final int index) {
         final String name = method.getName();
         int offset;
         if ( name.startsWith( "is" ) ) {
             offset = 2;
-        } else if ( name.startsWith( "get" ) ) {
+        } else if ( name.startsWith( "get" ) || name.startsWith( "set" ) ) {
             offset = 3;
         } else {
             offset = 0;
@@ -190,42 +194,67 @@
             //only want it once, the first one thats found
             if ( offset != 0 && this.nonGetters.contains( fieldName ) ) {
                 //replace the non getter method with the getter one
-                removeOldField( fieldName );
+                Integer oldIndex = removeOldField( fieldName );
                 storeField( method,
-                            index,
+                            oldIndex,
                             fieldName );
+                storeGetterSetter( method,
+                                   fieldName );
                 this.nonGetters.remove( fieldName );
+            } else if ( offset != 0 ) {
+                storeGetterSetter( method,
+                                   fieldName );
             }
         } else {
             storeField( method,
-                        index,
+                        new Integer( index ),
                         fieldName );
+            storeGetterSetter( method,
+                               fieldName );
+            
             if ( offset == 0 ) {
+                // only if it is a non-standard getter method
                 this.nonGetters.add( fieldName );
             }
         }
     }
 
-    private void removeOldField(final String fieldName) {
-        this.fieldNames.remove( fieldName );
+    private Integer removeOldField(final String fieldName) {
+        Integer index = this.fieldNames.remove( fieldName );
         this.fieldTypes.remove( fieldName );
-        this.methods.remove( this.methodNames.get( fieldName ) );
-        this.methodNames.remove( fieldName );
+        this.getterMethods.remove( fieldName );
+        return index;
 
     }
 
     private void storeField(final Method method,
-                            final int index,
+                            final Integer index,
                             final String fieldName) {
         this.fieldNames.put( fieldName,
-                             new Integer( index ) );
-        this.fieldTypes.put( fieldName,
-                             method.getReturnType() );
-        this.methodNames.put( fieldName,
-                              method );
-        this.methods.add( method );
+                             index );
     }
 
+    /**
+     * @param method
+     * @param fieldName
+     */
+    private void storeGetterSetter(final Method method,
+                                   final String fieldName) {
+        if( method.getName().startsWith( "set" ) ) {
+            this.setterMethods.put( fieldName,
+                                    method );
+            if( ! fieldTypes.containsKey( fieldName ) ) {
+                this.fieldTypes.put( fieldName,
+                                     method.getParameterTypes()[0] );
+            }
+        } else {
+            this.getterMethods.put( fieldName, 
+                                    method );
+            this.fieldTypes.put( fieldName,
+                                 method.getReturnType() );
+        }
+    }
+
     private String calcFieldName(String name,
                                  final int offset) {
         name = name.substring( offset );
@@ -240,11 +269,11 @@
         implements
         ClassVisitor {
 
-        private Class               clazz;
+        private Class< ? >          clazz;
         private ClassFieldInspector inspector;
         private boolean             includeFinalMethods;
 
-        ClassFieldVisitor(final Class cls,
+        ClassFieldVisitor(final Class< ? > cls,
                           final boolean includeFinalMethods,
                           final ClassFieldInspector inspector) {
             this.clazz = cls;
@@ -261,13 +290,14 @@
             //and have no args, and return a value
             final int mask = this.includeFinalMethods ? Opcodes.ACC_PUBLIC : Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL;
             if ( (access & mask) == Opcodes.ACC_PUBLIC ) {
-                if ( desc.startsWith( "()" ) && (!name.equals( "<init>" )) &&
-                 ( ! name.equals( "<clinit>" ) ) ) {// && ( name.startsWith("get") || name.startsWith("is") ) ) {
+                if (( desc.startsWith( "()" ) && (!name.equals( "<init>" )) && (!name.equals( "<clinit>" )) ) ||
+                    ( name.startsWith( "set" ) ) ){// && ( name.startsWith("get") || name.startsWith("is") ) ) {
                     try {
                         final Method method = this.clazz.getMethod( name,
                                                                     (Class[]) null );
-                        if ( method.getReturnType() != void.class ) {
-                            final int fieldIndex = this.inspector.methods.size();
+                        if ( method.getReturnType() != void.class || 
+                             ( method.getName().startsWith( "set" ) && ( method.getParameterTypes().length == 1 ) ) ) {
+                            final int fieldIndex = this.inspector.fieldNames.size();
                             this.inspector.addToMapping( method,
                                                          fieldIndex );
                         }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleAgentTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -136,10 +136,10 @@
 
         //now check subsequent changes
         p1.addGlobal( "goo2", String.class );
-        System.err.println("-->WRITING CHANGE");
+//        System.err.println("-->WRITING CHANGE");
         Thread.sleep( 1000 );
         RuleBaseAssemblerTest.writePackage( p1, p1f );
-        System.err.println("-->WROTE CHANGE");
+//        System.err.println("-->WROTE CHANGE");
         Thread.sleep( 1000 );
         ag.refreshRuleBase();
 

Copied: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,96 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import junit.framework.TestCase;
+
+import org.drools.spi.InternalReadAccessor;
+import org.drools.util.asm.BeanInherit;
+import org.drools.util.asm.TestAbstract;
+import org.drools.util.asm.TestAbstractImpl;
+import org.drools.util.asm.TestInterface;
+import org.drools.util.asm.TestInterfaceImpl;
+
+public class BaseClassFieldAccessorFactoryTest extends TestCase {
+
+    private ClassFieldAccessorCache cache;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        cache = ClassFieldAccessorCache.getInstance();
+    }
+
+    public void testIt() throws Exception {
+        ClassFieldAccessorFactory factory = new ClassFieldAccessorFactory();
+
+        InternalReadAccessor ex = factory.getClassFieldReader( TestBean.class,
+                                                            "name",
+                                                            Thread.currentThread().getContextClassLoader() );
+        assertEquals( "michael",
+                      ex.getValue( null,
+                                   new TestBean() ) );
+        ex = factory.getClassFieldReader( TestBean.class,
+                                             "age",
+                                             Thread.currentThread().getContextClassLoader() );
+        assertEquals( 42,
+                      ((Number) ex.getValue( null,
+                                             new TestBean() )).intValue() );
+
+    }
+
+    public void testInterface() throws Exception {
+        final InternalReadAccessor ex = cache.getReader( TestInterface.class,
+                                                      "something",
+                                                      getClass().getClassLoader() );
+        assertEquals( 0,
+                      ex.getIndex() );
+        assertEquals( "foo",
+                      ex.getValue( null,
+                                   new TestInterfaceImpl() ) );
+    }
+
+    public void testAbstract() throws Exception {
+        final InternalReadAccessor ex = cache.getReader( TestAbstract.class,
+                                                      "something",
+                                                      getClass().getClassLoader() );
+        assertEquals( 0,
+                      ex.getIndex() );
+        assertEquals( "foo",
+                      ex.getValue( null,
+                                   new TestAbstractImpl() ) );
+    }
+
+    public void testInherited() throws Exception {
+        final InternalReadAccessor ex = cache.getReader( BeanInherit.class,
+                                                      "text",
+                                                      getClass().getClassLoader() );
+        assertEquals( "hola",
+                      ex.getValue( null,
+                                   new BeanInherit() ) );
+    }
+
+    public void testSelfReference() throws Exception {
+        final InternalReadAccessor ex = cache.getReader( BeanInherit.class,
+                                                      "this",
+                                                      getClass().getClassLoader() );
+        final TestBean bean = new TestBean();
+        assertEquals( bean,
+                      ex.getValue( null,
+                                   bean ) );
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldExtractorFactoryTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,100 +0,0 @@
-package org.drools.base;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import junit.framework.TestCase;
-
-import org.drools.spi.FieldExtractor;
-import org.drools.util.asm.BeanInherit;
-import org.drools.util.asm.TestAbstract;
-import org.drools.util.asm.TestAbstractImpl;
-import org.drools.util.asm.TestInterface;
-import org.drools.util.asm.TestInterfaceImpl;
-
-public class BaseClassFieldExtractorFactoryTest extends TestCase {
-
-    private ClassFieldExtractorCache cache;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        cache = ClassFieldExtractorCache.getInstance();
-    }
-
-    public void testIt() throws Exception {
-        ClassFieldExtractorFactory factory = new ClassFieldExtractorFactory();
-
-        FieldExtractor ex = factory.getClassFieldExtractor( TestBean.class,
-                                                            "name",
-                                                            Thread.currentThread().getContextClassLoader() );
-        assertEquals( 0,
-                      ex.getIndex() );
-        assertEquals( "michael",
-                      ex.getValue( null,
-                                   new TestBean() ) );
-        ex = factory.getClassFieldExtractor( TestBean.class,
-                                             "age",
-                                             Thread.currentThread().getContextClassLoader() );
-        assertEquals( 1,
-                      ex.getIndex() );
-        assertEquals( 42,
-                      ((Number) ex.getValue( null,
-                                             new TestBean() )).intValue() );
-
-    }
-
-    public void testInterface() throws Exception {
-        final FieldExtractor ex = cache.getExtractor( TestInterface.class,
-                                                      "something",
-                                                      getClass().getClassLoader() );
-        assertEquals( 0,
-                      ex.getIndex() );
-        assertEquals( "foo",
-                      ex.getValue( null,
-                                   new TestInterfaceImpl() ) );
-    }
-
-    public void testAbstract() throws Exception {
-        final FieldExtractor ex = cache.getExtractor( TestAbstract.class,
-                                                      "something",
-                                                      getClass().getClassLoader() );
-        assertEquals( 0,
-                      ex.getIndex() );
-        assertEquals( "foo",
-                      ex.getValue( null,
-                                   new TestAbstractImpl() ) );
-    }
-
-    public void testInherited() throws Exception {
-        final FieldExtractor ex = cache.getExtractor( BeanInherit.class,
-                                                      "text",
-                                                      getClass().getClassLoader() );
-        assertEquals( "hola",
-                      ex.getValue( null,
-                                   new BeanInherit() ) );
-    }
-
-    public void testSelfReference() throws Exception {
-        final FieldExtractor ex = cache.getExtractor( BeanInherit.class,
-                                                      "this",
-                                                      getClass().getClassLoader() );
-        final TestBean bean = new TestBean();
-        assertEquals( bean,
-                      ex.getValue( null,
-                                   bean ) );
-    }
-
-}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java (from rev 19963, labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -0,0 +1,464 @@
+package org.drools.base;
+
+/*
+ * Copyright 2005 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.util.asm.BeanInherit;
+import org.drools.util.asm.InterfaceChild;
+import org.drools.util.asm.TestAbstract;
+import org.drools.util.asm.TestAbstractImpl;
+import org.drools.util.asm.TestBean;
+import org.drools.util.asm.TestInterface;
+import org.drools.util.asm.TestInterfaceImpl;
+
+public class ClassFieldAccessorTest extends TestCase {
+
+    private ClassFieldAccessorCache cache;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        cache = ClassFieldAccessorCache.getInstance();
+    }
+
+    public void testBasic() throws Exception {
+        final Object[] objArray = new Object[1];
+
+        final TestBean obj = new TestBean();
+        obj.setBlah( false );
+        obj.setSomething( "no" );
+        obj.setObjArray( objArray );
+
+        final ClassFieldReader ext = cache.getReader( TestBean.class,
+                                                      "blah",
+                                                      getClass().getClassLoader() );
+        assertEquals( false,
+                      ((Boolean) ext.getValue( null,
+                                               obj )).booleanValue() );
+
+        final ClassFieldReader ext2 = cache.getReader( TestBean.class,
+                                                       "fooBar",
+                                                       getClass().getClassLoader() );
+        assertEquals( "fooBar",
+                      ext2.getValue( null,
+                                     obj ) );
+
+        final ClassFieldReader ext3 = cache.getReader( TestBean.class,
+                                                       "objArray",
+                                                       getClass().getClassLoader() );
+        assertEquals( objArray,
+                      ext3.getValue( null,
+                                     obj ) );
+
+    }
+
+    public void testInterface() throws Exception {
+
+        final TestInterface obj = new TestInterfaceImpl();
+        final ClassFieldReader ext = cache.getReader( TestInterface.class,
+                                                      "something",
+                                                      getClass().getClassLoader() );
+
+        assertEquals( "foo",
+                      (String) ext.getValue( null,
+                                             obj ) );
+
+    }
+
+    public void testAbstract() throws Exception {
+
+        final ClassFieldReader ext = cache.getReader( TestAbstract.class,
+                                                      "something",
+                                                      getClass().getClassLoader() );
+        final TestAbstract obj = new TestAbstractImpl();
+        assertEquals( "foo",
+                      (String) ext.getValue( null,
+                                             obj ) );
+
+    }
+
+    public void testInherited() throws Exception {
+        final ClassFieldReader ext = cache.getReader( BeanInherit.class,
+                                                      "text",
+                                                      getClass().getClassLoader() );
+        final BeanInherit obj = new BeanInherit();
+        assertEquals( "hola",
+                      (String) ext.getValue( null,
+                                             obj ) );
+
+    }
+
+    public void testMultipleInterfaces() throws Exception {
+        final ConcreteChild obj = new ConcreteChild();
+        final ClassFieldReader ext = cache.getReader( InterfaceChild.class,
+                                                      "foo",
+                                                      getClass().getClassLoader() );
+        assertEquals( 42,
+                      ((Number) ext.getValue( null,
+                                              obj )).intValue() );
+    }
+
+    public void testLong() throws Exception {
+        final ClassFieldReader ext = cache.getReader( TestBean.class,
+                                                      "longField",
+                                                      getClass().getClassLoader() );
+        final TestBean bean = new TestBean();
+        assertEquals( 424242,
+                      ((Number) ext.getValue( null,
+                                              bean )).longValue() );
+    }
+
+    public void testNonExistentField() throws Exception {
+        final Object[] objArray = new Object[1];
+
+        final TestBean obj = new TestBean();
+        obj.setBlah( false );
+        obj.setSomething( "no" );
+        obj.setObjArray( objArray );
+
+        try {
+            final ClassFieldReader ext = cache.getReader( TestBean.class,
+                                                          "xyz",
+                                                          getClass().getClassLoader() );
+            fail( "A RuntimeDroolsException should have been raised" );
+        } catch ( RuntimeDroolsException e ) {
+            // everything is fine, since field does not exist
+            // e.printStackTrace();
+        } catch ( Exception e ) {
+            fail( "A RuntimeDroolsException should have been raised" );
+        }
+
+    }
+
+    public void testBuildFieldAccessor() {
+        try {
+            ClassFieldAccessor intAccessor = cache.getAccessor( TestClass.class,
+                                                                "intAttr",
+                                                                getClass().getClassLoader() );
+            ClassFieldAccessor strAccessor = cache.getAccessor( TestClass.class,
+                                                                "strAttr",
+                                                                getClass().getClassLoader() );
+
+            String testString1 = "TestAttr1";
+            String testString2 = "TestAttr2";
+            TestClass instance = new TestClass();
+            instance.setIntAttr( 10 );
+            instance.setStrAttr( testString1 );
+
+            Assert.assertEquals( "Error reading int attr",
+                                 10,
+                                 ((Integer) intAccessor.getValue( instance )).intValue() );
+            Assert.assertEquals( "Error reading int attr",
+                                 10,
+                                 intAccessor.getIntValue( instance ) );
+            Assert.assertEquals( "Error reading String attr",
+                                 testString1,
+                                 strAccessor.getValue( instance ) );
+
+            intAccessor.setValue( instance,
+                                  new Integer( 50 ) );
+            strAccessor.setValue( instance,
+                                  testString2 );
+
+            Assert.assertEquals( "Error setting int attr",
+                                 50,
+                                 instance.getIntAttr() );
+            Assert.assertEquals( "Error setting String attr",
+                                 testString2,
+                                 instance.getStrAttr() );
+
+            intAccessor.setIntValue( instance,
+                                     40 );
+            Assert.assertEquals( "Error reading int attr",
+                                 40,
+                                 intAccessor.getIntValue( instance ) );
+            Assert.assertEquals( "Error reading String attr",
+                                 testString2,
+                                 strAccessor.getValue( instance ) );
+
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            Assert.fail( "No exception is supposed to be generated when creating field accessor: " + e );
+        }
+    }
+
+    public void testNullOnPrimitives() {
+        try {
+            ClassFieldAccessor intAccessor = cache.getAccessor( TestClass.class,
+                                                                "intAttr",
+                                                                getClass().getClassLoader() );
+            ClassFieldAccessor strAccessor = cache.getAccessor( TestClass.class,
+                                                                "strAttr",
+                                                                getClass().getClassLoader() );
+            ClassFieldAccessor byteAccessor = cache.getAccessor( TestClass.class,
+                                                                 "byteAttr",
+                                                                 getClass().getClassLoader() );
+            ClassFieldAccessor booleanAccessor = cache.getAccessor( TestClass.class,
+                                                                    "booleanAttr",
+                                                                    getClass().getClassLoader() );
+            ClassFieldAccessor charAccessor = cache.getAccessor( TestClass.class,
+                                                                 "charAttr",
+                                                                 getClass().getClassLoader() );
+            ClassFieldAccessor doubleAccessor = cache.getAccessor( TestClass.class,
+                                                                   "doubleAttr",
+                                                                   getClass().getClassLoader() );
+            ClassFieldAccessor floatAccessor = cache.getAccessor( TestClass.class,
+                                                                  "floatAttr",
+                                                                  getClass().getClassLoader() );
+            ClassFieldAccessor longAccessor = cache.getAccessor( TestClass.class,
+                                                                 "longAttr",
+                                                                 getClass().getClassLoader() );
+            ClassFieldAccessor shortAccessor = cache.getAccessor( TestClass.class,
+                                                                  "shortAttr",
+                                                                  getClass().getClassLoader() );
+
+            String testString1 = "TestAttr1";
+            TestClass instance = new TestClass();
+            instance.setIntAttr( 25 );
+            instance.setStrAttr( testString1 );
+            instance.setByteAttr( (byte) 10 );
+            instance.setBooleanAttr( true );
+            instance.setCharAttr( 'x' );
+            instance.setDoubleAttr( 10.5d );
+            instance.setFloatAttr( 40.3f );
+            instance.setLongAttr( 43l );
+            instance.setShortAttr( (short) 20 );
+
+            intAccessor.setValue( instance,
+                                  null );
+            strAccessor.setValue( instance,
+                                  null );
+            byteAccessor.setValue( instance,
+                                   null );
+            booleanAccessor.setValue( instance,
+                                      null );
+            charAccessor.setValue( instance,
+                                   null );
+            doubleAccessor.setValue( instance,
+                                     null );
+            floatAccessor.setValue( instance,
+                                    null );
+            longAccessor.setValue( instance,
+                                   null );
+            shortAccessor.setValue( instance,
+                                    null );
+
+            Assert.assertEquals( "Error setting attr",
+                                 0,
+                                 instance.getIntAttr() );
+            Assert.assertNull( "Error setting attr",
+                               instance.getStrAttr() );
+            Assert.assertEquals( "Error setting attr",
+                                 0,
+                                 instance.getByteAttr() );
+            Assert.assertEquals( "Error setting attr",
+                                 false,
+                                 instance.isBooleanAttr() );
+            Assert.assertEquals( "Error setting attr",
+                                 '\0',
+                                 instance.getCharAttr() );
+            Assert.assertEquals( "Error setting attr",
+                                 0.0d,
+                                 instance.getDoubleAttr(),
+                                 0.1d );
+            Assert.assertEquals( "Error setting attr",
+                                 0.0f,
+                                 instance.getFloatAttr(),
+                                 0.1f );
+            Assert.assertEquals( "Error setting attr",
+                                 0l,
+                                 instance.getLongAttr() );
+            Assert.assertEquals( "Error setting attr",
+                                 (short) 0,
+                                 instance.getShortAttr() );
+
+            Assert.assertEquals( "Error reading int attr",
+                                 0,
+                                 ((Integer) intAccessor.getValue( instance )).intValue() );
+            Assert.assertNull( "Error reading String attr",
+                               strAccessor.getValue( instance ) );
+            Assert.assertEquals( "Error reading attr",
+                                 0,
+                                 ((Byte) byteAccessor.getValue( instance )).byteValue() );
+            Assert.assertEquals( "Error reading attr",
+                                 false,
+                                 ((Boolean) booleanAccessor.getValue( instance )).booleanValue() );
+            Assert.assertEquals( "Error reading attr",
+                                 '\0',
+                                 ((Character) charAccessor.getValue( instance )).charValue() );
+            Assert.assertEquals( "Error reading attr",
+                                 0.0d,
+                                 ((Double) doubleAccessor.getValue( instance )).doubleValue(),
+                                 0.1d );
+            Assert.assertEquals( "Error reading attr",
+                                 0.0f,
+                                 ((Float) floatAccessor.getValue( instance )).floatValue(),
+                                 0.1f );
+            Assert.assertEquals( "Error reading attr",
+                                 0l,
+                                 ((Long) longAccessor.getValue( instance )).longValue() );
+            Assert.assertEquals( "Error reading attr",
+                                 (short) 0,
+                                 ((Short) shortAccessor.getValue( instance )).shortValue() );
+
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            Assert.fail( "No exception is supposed to be generated when creating field accessor: " + e );
+        }
+    }
+
+    public static class TestClass {
+        private int     intAttr;
+        private String  strAttr;
+        private byte    byteAttr;
+        private boolean booleanAttr;
+        private char    charAttr;
+        private double  doubleAttr;
+        private float   floatAttr;
+        private long    longAttr;
+        private short   shortAttr;
+
+        /**
+         * @return Returns the intAttr.
+         */
+        public int getIntAttr() {
+            return intAttr;
+        }
+
+        /**
+         * @param intAttr The intAttr to set.
+         */
+        public void setIntAttr(int intAttr) {
+            this.intAttr = intAttr;
+        }
+
+        /**
+         * @return Returns the strAttr.
+         */
+        public String getStrAttr() {
+            return strAttr;
+        }
+
+        /**
+         * @param strAttr The strAttr to set.
+         */
+        public void setStrAttr(String strAttr) {
+            this.strAttr = strAttr;
+        }
+
+        /**
+         * @return Returns the booleanAttr.
+         */
+        public boolean isBooleanAttr() {
+            return booleanAttr;
+        }
+
+        /**
+         * @param booleanAttr The booleanAttr to set.
+         */
+        public void setBooleanAttr(boolean booleanAttr) {
+            this.booleanAttr = booleanAttr;
+        }
+
+        /**
+         * @return Returns the byteAttr.
+         */
+        public byte getByteAttr() {
+            return byteAttr;
+        }
+
+        /**
+         * @param byteAttr The byteAttr to set.
+         */
+        public void setByteAttr(byte byteAttr) {
+            this.byteAttr = byteAttr;
+        }
+
+        /**
+         * @return Returns the charAttr.
+         */
+        public char getCharAttr() {
+            return charAttr;
+        }
+
+        /**
+         * @param charAttr The charAttr to set.
+         */
+        public void setCharAttr(char charAttr) {
+            this.charAttr = charAttr;
+        }
+
+        /**
+         * @return Returns the doubleAttr.
+         */
+        public double getDoubleAttr() {
+            return doubleAttr;
+        }
+
+        /**
+         * @param doubleAttr The doubleAttr to set.
+         */
+        public void setDoubleAttr(double doubleAttr) {
+            this.doubleAttr = doubleAttr;
+        }
+
+        /**
+         * @return Returns the floatAttr.
+         */
+        public float getFloatAttr() {
+            return floatAttr;
+        }
+
+        /**
+         * @param floatAttr The floatAttr to set.
+         */
+        public void setFloatAttr(float floatAttr) {
+            this.floatAttr = floatAttr;
+        }
+
+        /**
+         * @return Returns the longAttr.
+         */
+        public long getLongAttr() {
+            return longAttr;
+        }
+
+        /**
+         * @param longAttr The longAttr to set.
+         */
+        public void setLongAttr(long longAttr) {
+            this.longAttr = longAttr;
+        }
+
+        /**
+         * @return Returns the shortAttr.
+         */
+        public short getShortAttr() {
+            return shortAttr;
+        }
+
+        /**
+         * @param shortAttr The shortAttr to set.
+         */
+        public void setShortAttr(short shortAttr) {
+            this.shortAttr = shortAttr;
+        }
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,148 +0,0 @@
-package org.drools.base;
-
-/*
- * Copyright 2005 JBoss Inc
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import junit.framework.TestCase;
-
-import org.drools.RuntimeDroolsException;
-import org.drools.util.asm.BeanInherit;
-import org.drools.util.asm.InterfaceChild;
-import org.drools.util.asm.TestAbstract;
-import org.drools.util.asm.TestAbstractImpl;
-import org.drools.util.asm.TestBean;
-import org.drools.util.asm.TestInterface;
-import org.drools.util.asm.TestInterfaceImpl;
-
-public class ClassFieldExtractorTest extends TestCase {
-
-    private ClassFieldExtractorCache cache;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        cache = ClassFieldExtractorCache.getInstance();
-    }
-
-    public void testBasic() throws Exception {
-        final Object[] objArray = new Object[1];
-
-        final TestBean obj = new TestBean();
-        obj.setBlah( false );
-        obj.setSomething( "no" );
-        obj.setObjArray( objArray );
-
-        final ClassFieldExtractor ext = cache.getExtractor( TestBean.class,
-                                                            "blah",
-                                                            getClass().getClassLoader() );
-        assertEquals( false,
-                      ((Boolean) ext.getValue( null,
-                                               obj )).booleanValue() );
-
-        final ClassFieldExtractor ext2 = cache.getExtractor( TestBean.class,
-                                                             "fooBar",
-                                                             getClass().getClassLoader() );
-        assertEquals( "fooBar",
-                      ext2.getValue( null,
-                                     obj ) );
-
-        final ClassFieldExtractor ext3 = cache.getExtractor( TestBean.class,
-                                                             "objArray",
-                                                             getClass().getClassLoader() );
-        assertEquals( objArray,
-                      ext3.getValue( null,
-                                     obj ) );
-
-    }
-
-    public void testInterface() throws Exception {
-
-        final TestInterface obj = new TestInterfaceImpl();
-        final ClassFieldExtractor ext = cache.getExtractor( TestInterface.class,
-                                                            "something",
-                                                            getClass().getClassLoader() );
-
-        assertEquals( "foo",
-                      (String) ext.getValue( null,
-                                             obj ) );
-
-    }
-
-    public void testAbstract() throws Exception {
-
-        final ClassFieldExtractor ext = cache.getExtractor( TestAbstract.class,
-                                                            "something",
-                                                            getClass().getClassLoader() );
-        final TestAbstract obj = new TestAbstractImpl();
-        assertEquals( "foo",
-                      (String) ext.getValue( null,
-                                             obj ) );
-
-    }
-
-    public void testInherited() throws Exception {
-        final ClassFieldExtractor ext = cache.getExtractor( BeanInherit.class,
-                                                            "text",
-                                                            getClass().getClassLoader() );
-        final BeanInherit obj = new BeanInherit();
-        assertEquals( "hola",
-                      (String) ext.getValue( null,
-                                             obj ) );
-
-    }
-
-    public void testMultipleInterfaces() throws Exception {
-        final ConcreteChild obj = new ConcreteChild();
-        final ClassFieldExtractor ext = cache.getExtractor( InterfaceChild.class,
-                                                            "foo",
-                                                            getClass().getClassLoader() );
-        assertEquals( 42,
-                      ((Number) ext.getValue( null,
-                                              obj )).intValue() );
-    }
-
-    public void testLong() throws Exception {
-        final ClassFieldExtractor ext = cache.getExtractor( TestBean.class,
-                                                            "longField",
-                                                            getClass().getClassLoader() );
-        final TestBean bean = new TestBean();
-        assertEquals( 424242,
-                      ((Number) ext.getValue( null,
-                                              bean )).longValue() );
-    }
-
-    public void testNonExistentField() throws Exception {
-        final Object[] objArray = new Object[1];
-
-        final TestBean obj = new TestBean();
-        obj.setBlah( false );
-        obj.setSomething( "no" );
-        obj.setObjArray( objArray );
-
-        try {
-            final ClassFieldExtractor ext = cache.getExtractor( TestBean.class,
-                                                                "xyz",
-                                                                getClass().getClassLoader() );
-            fail( "A RuntimeDroolsException should have been raised" );
-        } catch ( RuntimeDroolsException e ) {
-            e.printStackTrace();
-            // everything is fine, since field does not exist
-        } catch ( Exception e ) {
-            fail( "A RuntimeDroolsException should have been raised" );
-        }
-
-    }
-
-}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -26,9 +29,6 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
-import java.io.ObjectOutput;
-import java.io.IOException;
-import java.io.ObjectInput;
 
 import junit.framework.TestCase;
 
@@ -42,9 +42,8 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 
 /**
  * Some test coverage goodness for the evaluators.
@@ -61,52 +60,17 @@
         list.add( "foo" );
         list.add( null );
 
-        Collection col = Arrays.asList( new String[] { "foo", "bar", null} );
+        Collection col = Arrays.asList( new String[]{"foo", "bar", null} );
 
-        final Object[][] data = {
-                                 {"foo", "==", "bar", Boolean.FALSE},
-                                 {"foo", "==", "foo", Boolean.TRUE},
-                                 {"foo", "!=", "bar", Boolean.TRUE},
-                                 {list, "contains", "foo", Boolean.TRUE},
-                                 {list, "contains", "bar", Boolean.FALSE},
-                                 {list, "contains", null, Boolean.TRUE},
-                                 {null, "contains", "bar", Boolean.FALSE},
-                                 {null, "contains", null, Boolean.FALSE},
-                                 {list, "==", null, Boolean.FALSE},
-                                 {list, "!=", null, Boolean.TRUE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "==", list, Boolean.FALSE},
-                                 {null, "!=", list, Boolean.TRUE},
-                                 {null, "<", new Integer( 43 ), Boolean.FALSE},
-                                 {null, ">=", new Integer( -10 ), Boolean.FALSE},
-                                 {null, ">", new Integer( -10 ), Boolean.FALSE},
-                                 {null, "<=", new Integer( 42 ), Boolean.FALSE},
-                                 {new BigDecimal( "42.42" ), "<", new BigDecimal( "43" ), Boolean.TRUE},
-                                 {new BigDecimal( "42.42" ), ">", new BigDecimal( "43" ), Boolean.FALSE},
-                                 {new BigDecimal( "42.42" ), "<=", new BigDecimal( "42.42" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), ">=", new BigInteger( "43" ), Boolean.FALSE},
-                                 {new BigInteger( "42" ), ">=", new BigInteger( "43" ), Boolean.FALSE},
-                                 {list, "excludes", "baz", Boolean.TRUE},
-                                 {list, "excludes", "foo", Boolean.FALSE},
-                                 {"foo", "memberOf", col, Boolean.TRUE},
-                                 {"xyz", "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.TRUE},
-                                 {"foo", "memberOf", null, Boolean.FALSE},
-                                 {"foo", "not memberOf", col, Boolean.FALSE},
-                                 {"xyz", "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.FALSE},
-                                 {"foo", "not memberOf", null, Boolean.FALSE},
-                                 {Boolean.TRUE, "==", "xyz", Boolean.FALSE},
-                                 {Boolean.TRUE, "==", "true", Boolean.TRUE},
-                                 {Boolean.FALSE, "==", "xyz", Boolean.TRUE},
-                                 {Boolean.FALSE, "==", "false", Boolean.TRUE},
-                                 {Boolean.FALSE, "==", "true", Boolean.FALSE},
-                                 {Boolean.TRUE, "!=", "xyz", Boolean.TRUE},
-                                 {Boolean.TRUE, "!=", "true", Boolean.FALSE},
-                                 {Boolean.FALSE, "!=", "xyz", Boolean.FALSE},
-                                 {Boolean.FALSE, "!=", "true", Boolean.TRUE},
-                                 {Boolean.FALSE, "!=", "false", Boolean.FALSE}
-        };
+        final Object[][] data = {{"foo", "==", "bar", Boolean.FALSE}, {"foo", "==", "foo", Boolean.TRUE}, {"foo", "!=", "bar", Boolean.TRUE}, {list, "contains", "foo", Boolean.TRUE}, {list, "contains", "bar", Boolean.FALSE},
+                {list, "contains", null, Boolean.TRUE}, {null, "contains", "bar", Boolean.FALSE}, {null, "contains", null, Boolean.FALSE}, {list, "==", null, Boolean.FALSE}, {list, "!=", null, Boolean.TRUE}, {null, "==", null, Boolean.TRUE},
+                {null, "==", list, Boolean.FALSE}, {null, "!=", list, Boolean.TRUE}, {null, "<", new Integer( 43 ), Boolean.FALSE}, {null, ">=", new Integer( -10 ), Boolean.FALSE}, {null, ">", new Integer( -10 ), Boolean.FALSE},
+                {null, "<=", new Integer( 42 ), Boolean.FALSE}, {new BigDecimal( "42.42" ), "<", new BigDecimal( "43" ), Boolean.TRUE}, {new BigDecimal( "42.42" ), ">", new BigDecimal( "43" ), Boolean.FALSE},
+                {new BigDecimal( "42.42" ), "<=", new BigDecimal( "42.42" ), Boolean.TRUE}, {new BigInteger( "42" ), ">=", new BigInteger( "43" ), Boolean.FALSE}, {new BigInteger( "42" ), ">=", new BigInteger( "43" ), Boolean.FALSE},
+                {list, "excludes", "baz", Boolean.TRUE}, {list, "excludes", "foo", Boolean.FALSE}, {"foo", "memberOf", col, Boolean.TRUE}, {"xyz", "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.TRUE},
+                {"foo", "memberOf", null, Boolean.FALSE}, {"foo", "not memberOf", col, Boolean.FALSE}, {"xyz", "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.FALSE}, {"foo", "not memberOf", null, Boolean.FALSE},
+                {Boolean.TRUE, "==", "xyz", Boolean.FALSE}, {Boolean.TRUE, "==", "true", Boolean.TRUE}, {Boolean.FALSE, "==", "xyz", Boolean.TRUE}, {Boolean.FALSE, "==", "false", Boolean.TRUE}, {Boolean.FALSE, "==", "true", Boolean.FALSE},
+                {Boolean.TRUE, "!=", "xyz", Boolean.TRUE}, {Boolean.TRUE, "!=", "true", Boolean.FALSE}, {Boolean.FALSE, "!=", "xyz", Boolean.FALSE}, {Boolean.FALSE, "!=", "true", Boolean.TRUE}, {Boolean.FALSE, "!=", "false", Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.OBJECT_TYPE );
@@ -117,32 +81,11 @@
 
         final Object[] field = new Object[]{"foo", "bar"};
 
-        final Object[][] data = {{field, "==", new Object[]{"foo"}, Boolean.FALSE},
-                                 {field, "==", field, Boolean.TRUE},
-                                 {field, "!=", new Object[]{"foo"}, Boolean.TRUE},
-                                 {field, "contains", "foo", Boolean.TRUE},
-                                 {field, "contains", "xyz", Boolean.FALSE},
-                                 {field, "contains", null, Boolean.FALSE},
-                                 {null, "contains", "foo", Boolean.FALSE},
-                                 {field, "excludes", "foo", Boolean.FALSE},
-                                 {field, "excludes", "xyz", Boolean.TRUE},
-                                 {field, "excludes", null, Boolean.TRUE},
-                                 {null, "excludes", "foo", Boolean.TRUE},
-                                 {field, "!=", null, Boolean.TRUE},
-                                 {field, "==", null, Boolean.FALSE},
-                                 {null, "==", field, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", field, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {"foo", "memberOf", field, Boolean.TRUE},
-                                 {"xyz", "memberOf", field, Boolean.FALSE},
-                                 {null, "memberOf", field, Boolean.FALSE},
-                                 {"foo", "memberOf", null, Boolean.FALSE},
-                                 {"foo", "not memberOf", field, Boolean.FALSE},
-                                 {"xyz", "not memberOf", field, Boolean.TRUE},
-                                 {null, "not memberOf", field, Boolean.TRUE},
-                                 {"foo", "not memberOf", null, Boolean.TRUE}
-                                 };
+        final Object[][] data = {{field, "==", new Object[]{"foo"}, Boolean.FALSE}, {field, "==", field, Boolean.TRUE}, {field, "!=", new Object[]{"foo"}, Boolean.TRUE}, {field, "contains", "foo", Boolean.TRUE},
+                {field, "contains", "xyz", Boolean.FALSE}, {field, "contains", null, Boolean.FALSE}, {null, "contains", "foo", Boolean.FALSE}, {field, "excludes", "foo", Boolean.FALSE}, {field, "excludes", "xyz", Boolean.TRUE},
+                {field, "excludes", null, Boolean.TRUE}, {null, "excludes", "foo", Boolean.TRUE}, {field, "!=", null, Boolean.TRUE}, {field, "==", null, Boolean.FALSE}, {null, "==", field, Boolean.FALSE}, {null, "==", null, Boolean.TRUE},
+                {null, "!=", field, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {"foo", "memberOf", field, Boolean.TRUE}, {"xyz", "memberOf", field, Boolean.FALSE}, {null, "memberOf", field, Boolean.FALSE},
+                {"foo", "memberOf", null, Boolean.FALSE}, {"foo", "not memberOf", field, Boolean.FALSE}, {"xyz", "not memberOf", field, Boolean.TRUE}, {null, "not memberOf", field, Boolean.TRUE}, {"foo", "not memberOf", null, Boolean.TRUE}};
 
         runEvaluatorTest( data,
                           ValueType.ARRAY_TYPE );
@@ -151,37 +94,14 @@
 
     public void testString() {
 
-        Collection col = Arrays.asList( new String[] { "foo", "bar", null} );
+        Collection col = Arrays.asList( new String[]{"foo", "bar", null} );
 
-        final Object[][] data = {{"foo", "==", "bar", Boolean.FALSE},
-                                 {"foo", "==", "foo", Boolean.TRUE},
-                                 {"foo", "!=", "bar", Boolean.TRUE},
-                                 {"something foo", "matches", ".*foo", Boolean.TRUE},
-                                 {"foo", "matches", ".*foo", Boolean.TRUE},
-                                 {"foo", "matches", "bar", Boolean.FALSE},
-                                 {null, "matches", ".*foo", Boolean.FALSE},
-                                 {"something", "matches", "something", Boolean.TRUE},
-                                 {"something", "matches", "hello ;=", Boolean.FALSE},
-                                 {"something", "not matches", "something", Boolean.FALSE},
-                                 {"something", "not matches", "hello ;=", Boolean.TRUE},
-                                 {"foo", "==", null, Boolean.FALSE},
-                                 {"foo", "!=", null, Boolean.TRUE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {"foo", "!=", null, Boolean.TRUE},
-                                 {null, "!=", "foo", Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {"foo", "memberOf", col, Boolean.TRUE},
-                                 {"xyz", "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.TRUE},
-                                 {"foo", "memberOf", null, Boolean.FALSE},
-                                 {"foo", "not memberOf", col, Boolean.FALSE},
-                                 {"xyz", "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.FALSE},
-                                 {"foo", "not memberOf", null, Boolean.FALSE},
-                                 {"foobar", "soundslike", "fubar", Boolean.TRUE},
-                                 {"fubar", "soundslike", "foobar", Boolean.TRUE},
-                                 {"foobar", "soundslike", "wanklerotaryengine", Boolean.FALSE}
-                                 };
+        final Object[][] data = {{"foo", "==", "bar", Boolean.FALSE}, {"foo", "==", "foo", Boolean.TRUE}, {"foo", "!=", "bar", Boolean.TRUE}, {"something foo", "matches", ".*foo", Boolean.TRUE}, {"foo", "matches", ".*foo", Boolean.TRUE},
+                {"foo", "matches", "bar", Boolean.FALSE}, {null, "matches", ".*foo", Boolean.FALSE}, {"something", "matches", "something", Boolean.TRUE}, {"something", "matches", "hello ;=", Boolean.FALSE},
+                {"something", "not matches", "something", Boolean.FALSE}, {"something", "not matches", "hello ;=", Boolean.TRUE}, {"foo", "==", null, Boolean.FALSE}, {"foo", "!=", null, Boolean.TRUE}, {null, "==", null, Boolean.TRUE},
+                {"foo", "!=", null, Boolean.TRUE}, {null, "!=", "foo", Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {"foo", "memberOf", col, Boolean.TRUE}, {"xyz", "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.TRUE},
+                {"foo", "memberOf", null, Boolean.FALSE}, {"foo", "not memberOf", col, Boolean.FALSE}, {"xyz", "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.FALSE}, {"foo", "not memberOf", null, Boolean.FALSE},
+                {"foobar", "soundslike", "fubar", Boolean.TRUE}, {"fubar", "soundslike", "foobar", Boolean.TRUE}, {"foobar", "soundslike", "wanklerotaryengine", Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.STRING_TYPE );
@@ -191,35 +111,16 @@
     public void testInteger() {
 
         Collection col = new ArrayList();
-        col.add( new Integer(42) );
-        col.add( new Integer(45) );
+        col.add( new Integer( 42 ) );
+        col.add( new Integer( 45 ) );
 
-        final Object[][] data = {{new Integer( 42 ), "==", new Integer( 42 ), Boolean.TRUE},
-                                 {new Integer( 42 ), "<", new Integer( 43 ), Boolean.TRUE},
-                                 {new Integer( 42 ), ">=", new Integer( 41 ), Boolean.TRUE},
-                                 {new Integer( 42 ), "!=", new Integer( 41 ), Boolean.TRUE},
-                                 {new Integer( 42 ), ">", new Integer( 41 ), Boolean.TRUE},
-                                 {new Integer( 42 ), "<=", new Integer( 42 ), Boolean.TRUE},
-                                 {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE},
-                                 {new Integer( 42 ), "!=", null, Boolean.TRUE},
-                                 {new Integer( 42 ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Integer( 42 ), Boolean.TRUE},
-                                 {null, "==", new Integer( 42 ), Boolean.FALSE},
-                                 {null, "<", new Integer( 43 ), Boolean.FALSE},
-                                 {null, ">=", new Integer( -10 ), Boolean.FALSE},
-                                 {null, ">", new Integer( -10 ), Boolean.FALSE},
-                                 {null, "<=", new Integer( 42 ), Boolean.FALSE},
-                                 {new Integer( 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new Integer( 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Integer( 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new Integer( 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new Integer( 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Integer( 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Integer( 42 ), "==", new Integer( 42 ), Boolean.TRUE}, {new Integer( 42 ), "<", new Integer( 43 ), Boolean.TRUE}, {new Integer( 42 ), ">=", new Integer( 41 ), Boolean.TRUE},
+                {new Integer( 42 ), "!=", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), ">", new Integer( 41 ), Boolean.TRUE}, {new Integer( 42 ), "<=", new Integer( 42 ), Boolean.TRUE},
+                {new Integer( 42 ), ">", new Integer( 100 ), Boolean.FALSE}, {new Integer( 42 ), "!=", null, Boolean.TRUE}, {new Integer( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE},
+                {null, "!=", new Integer( 42 ), Boolean.TRUE}, {null, "==", new Integer( 42 ), Boolean.FALSE}, {null, "<", new Integer( 43 ), Boolean.FALSE}, {null, ">=", new Integer( -10 ), Boolean.FALSE},
+                {null, ">", new Integer( -10 ), Boolean.FALSE}, {null, "<=", new Integer( 42 ), Boolean.FALSE}, {new Integer( 42 ), "memberOf", col, Boolean.TRUE}, {new Integer( 43 ), "memberOf", col, Boolean.FALSE},
+                {null, "memberOf", col, Boolean.FALSE}, {new Integer( 42 ), "memberOf", null, Boolean.FALSE}, {new Integer( 42 ), "not memberOf", col, Boolean.FALSE}, {new Integer( 43 ), "not memberOf", col, Boolean.TRUE},
+                {null, "not memberOf", col, Boolean.TRUE}, {new Integer( 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PINTEGER_TYPE );
@@ -233,33 +134,16 @@
                     ValueType.BIG_DECIMAL_TYPE );
 
         Collection col = new ArrayList();
-        col.add( new BigDecimal(42) );
-        col.add( new BigDecimal(45) );
+        col.add( new BigDecimal( 42 ) );
+        col.add( new BigDecimal( 45 ) );
 
-        final Object[][] data = {{new BigDecimal( 42 ), "==", new BigDecimal( 42 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), "<", new BigDecimal( 43 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), ">=", new BigDecimal( 41 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), "!=", new BigDecimal( 41 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), ">", new BigDecimal( 41 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), "<=", new BigDecimal( 42 ), Boolean.TRUE},
-                                 {new BigDecimal( 42 ), ">", new BigDecimal( 100 ), Boolean.FALSE},
-                                 {new BigDecimal( 42 ), "==", null, Boolean.FALSE},
-                                 {new BigDecimal( 42 ), "!=", null, Boolean.TRUE},
-                                 {null, "==", new BigDecimal( 42 ), Boolean.FALSE},
-                                 {null, "!=", new BigDecimal( 42 ), Boolean.TRUE},
-                                 {null, "<", new BigDecimal( 43 ), Boolean.FALSE},
-                                 {null, ">=", new BigDecimal( -10 ), Boolean.FALSE},
-                                 {null, ">", new BigDecimal( -10 ), Boolean.FALSE},
-                                 {null, "<=", new BigDecimal( 42 ), Boolean.FALSE},
-                                 {new BigDecimal( 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new BigDecimal( 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new BigDecimal( 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new BigDecimal( 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new BigDecimal( 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new BigDecimal( 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new BigDecimal( 42 ), "==", new BigDecimal( 42 ), Boolean.TRUE}, {new BigDecimal( 42 ), "<", new BigDecimal( 43 ), Boolean.TRUE}, {new BigDecimal( 42 ), ">=", new BigDecimal( 41 ), Boolean.TRUE},
+                {new BigDecimal( 42 ), "!=", new BigDecimal( 41 ), Boolean.TRUE}, {new BigDecimal( 42 ), ">", new BigDecimal( 41 ), Boolean.TRUE}, {new BigDecimal( 42 ), "<=", new BigDecimal( 42 ), Boolean.TRUE},
+                {new BigDecimal( 42 ), ">", new BigDecimal( 100 ), Boolean.FALSE}, {new BigDecimal( 42 ), "==", null, Boolean.FALSE}, {new BigDecimal( 42 ), "!=", null, Boolean.TRUE}, {null, "==", new BigDecimal( 42 ), Boolean.FALSE},
+                {null, "!=", new BigDecimal( 42 ), Boolean.TRUE}, {null, "<", new BigDecimal( 43 ), Boolean.FALSE}, {null, ">=", new BigDecimal( -10 ), Boolean.FALSE}, {null, ">", new BigDecimal( -10 ), Boolean.FALSE},
+                {null, "<=", new BigDecimal( 42 ), Boolean.FALSE}, {new BigDecimal( 42 ), "memberOf", col, Boolean.TRUE}, {new BigDecimal( 43 ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {new BigDecimal( 42 ), "memberOf", null, Boolean.FALSE}, {new BigDecimal( 42 ), "not memberOf", col, Boolean.FALSE}, {new BigDecimal( 43 ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {new BigDecimal( 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.BIG_DECIMAL_TYPE );
@@ -273,33 +157,16 @@
                     ValueType.BIG_INTEGER_TYPE );
 
         Collection col = new ArrayList();
-        col.add( new BigInteger("42") );
-        col.add( new BigInteger("45") );
+        col.add( new BigInteger( "42" ) );
+        col.add( new BigInteger( "45" ) );
 
-        final Object[][] data = {{new BigInteger( "42" ), "==", new BigInteger( "42" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), "<", new BigInteger( "43" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), ">=", new BigInteger( "41" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), "!=", new BigInteger( "41" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), ">", new BigInteger( "41" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), "<=", new BigInteger( "42" ), Boolean.TRUE},
-                                 {new BigInteger( "42" ), ">", new BigInteger( "100" ), Boolean.FALSE},
-                                 {new BigInteger( "42" ), "==", null, Boolean.FALSE},
-                                 {new BigInteger( "42" ), "!=", null, Boolean.TRUE},
-                                 {null, "==", new BigInteger( "42" ), Boolean.FALSE},
-                                 {null, "!=", new BigInteger( "42" ), Boolean.TRUE},
-                                 {null, "<", new BigInteger( "43" ), Boolean.FALSE},
-                                 {null, ">=", new BigInteger( "-10" ), Boolean.FALSE},
-                                 {null, ">", new BigInteger( "-10" ), Boolean.FALSE},
-                                 {null, "<=", new BigInteger( "42" ), Boolean.FALSE},
-                                 {new BigInteger( "42" ), "memberOf", col, Boolean.TRUE},
-                                 {new BigInteger( "43" ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new BigInteger( "42" ), "memberOf", null, Boolean.FALSE},
-                                 {new BigInteger( "42" ), "not memberOf", col, Boolean.FALSE},
-                                 {new BigInteger( "43" ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new BigInteger( "42" ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new BigInteger( "42" ), "==", new BigInteger( "42" ), Boolean.TRUE}, {new BigInteger( "42" ), "<", new BigInteger( "43" ), Boolean.TRUE}, {new BigInteger( "42" ), ">=", new BigInteger( "41" ), Boolean.TRUE},
+                {new BigInteger( "42" ), "!=", new BigInteger( "41" ), Boolean.TRUE}, {new BigInteger( "42" ), ">", new BigInteger( "41" ), Boolean.TRUE}, {new BigInteger( "42" ), "<=", new BigInteger( "42" ), Boolean.TRUE},
+                {new BigInteger( "42" ), ">", new BigInteger( "100" ), Boolean.FALSE}, {new BigInteger( "42" ), "==", null, Boolean.FALSE}, {new BigInteger( "42" ), "!=", null, Boolean.TRUE}, {null, "==", new BigInteger( "42" ), Boolean.FALSE},
+                {null, "!=", new BigInteger( "42" ), Boolean.TRUE}, {null, "<", new BigInteger( "43" ), Boolean.FALSE}, {null, ">=", new BigInteger( "-10" ), Boolean.FALSE}, {null, ">", new BigInteger( "-10" ), Boolean.FALSE},
+                {null, "<=", new BigInteger( "42" ), Boolean.FALSE}, {new BigInteger( "42" ), "memberOf", col, Boolean.TRUE}, {new BigInteger( "43" ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {new BigInteger( "42" ), "memberOf", null, Boolean.FALSE}, {new BigInteger( "42" ), "not memberOf", col, Boolean.FALSE}, {new BigInteger( "43" ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {new BigInteger( "42" ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.BIG_INTEGER_TYPE );
@@ -309,32 +176,16 @@
     public void testShort() {
 
         Collection col = new ArrayList();
-        col.add( new Short( (short) 42) );
-        col.add( new Short( (short) 45) );
+        col.add( new Short( (short) 42 ) );
+        col.add( new Short( (short) 45 ) );
 
         //Test data: Obj1, Operand, Obj2
-        final Object[][] data = {{new Short( (short) 42 ), "==", new Short( (short) 42 ), Boolean.TRUE},
-                                 {new Short( (short) 42 ), "<", new Short( (short) 43 ), Boolean.TRUE},
-                                 {new Short( (short) 42 ), ">=", new Short( (short) 41 ), Boolean.TRUE},
-                                 {new Short( (short) 42 ), "!=", new Short( (short) 41 ), Boolean.TRUE},
-                                 {new Short( (short) 42 ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Short( (short) 42 ), Boolean.TRUE},
-                                 {null, "==", new Short( (short) 42 ), Boolean.FALSE},
-                                 {null, "<", new Short( (short)43 ), Boolean.FALSE},
-                                 {null, ">=", new Short( (short)-10 ), Boolean.FALSE},
-                                 {null, ">", new Short( (short)-10 ), Boolean.FALSE},
-                                 {null, "<=", new Short((short) 42 ), Boolean.FALSE},
-                                 {new Short( (short) 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new Short( (short) 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Short( (short) 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new Short( (short) 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new Short( (short) 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Short( (short) 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Short( (short) 42 ), "==", new Short( (short) 42 ), Boolean.TRUE}, {new Short( (short) 42 ), "<", new Short( (short) 43 ), Boolean.TRUE}, {new Short( (short) 42 ), ">=", new Short( (short) 41 ), Boolean.TRUE},
+                {new Short( (short) 42 ), "!=", new Short( (short) 41 ), Boolean.TRUE}, {new Short( (short) 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE},
+                {null, "!=", new Short( (short) 42 ), Boolean.TRUE}, {null, "==", new Short( (short) 42 ), Boolean.FALSE}, {null, "<", new Short( (short) 43 ), Boolean.FALSE}, {null, ">=", new Short( (short) -10 ), Boolean.FALSE},
+                {null, ">", new Short( (short) -10 ), Boolean.FALSE}, {null, "<=", new Short( (short) 42 ), Boolean.FALSE}, {new Short( (short) 42 ), "memberOf", col, Boolean.TRUE}, {new Short( (short) 43 ), "memberOf", col, Boolean.FALSE},
+                {null, "memberOf", col, Boolean.FALSE}, {new Short( (short) 42 ), "memberOf", null, Boolean.FALSE}, {new Short( (short) 42 ), "not memberOf", col, Boolean.FALSE}, {new Short( (short) 43 ), "not memberOf", col, Boolean.TRUE},
+                {null, "not memberOf", col, Boolean.TRUE}, {new Short( (short) 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PSHORT_TYPE );
@@ -347,24 +198,11 @@
         col.add( new Boolean( true ) );
 
         //Test data: Obj1, Operand, Obj2
-        final Object[][] data = {{new Boolean( true ), "==", new Boolean( true ), Boolean.TRUE},
-                                 {new Boolean( false ), "!=", new Boolean( true ), Boolean.TRUE},
-                                 {new Boolean( true ), "==", new Boolean( false ), Boolean.FALSE},
-                                 {new Boolean( true ), "!=", new Boolean( false ), Boolean.TRUE},
-                                 {new Boolean( true ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Boolean( true ), Boolean.TRUE},
-                                 {null, "==", new Boolean( true ), Boolean.FALSE},
-                                 {new Boolean( true ), "memberOf", col, Boolean.TRUE},
-                                 {new Boolean( false ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Boolean( true ), "memberOf", null, Boolean.FALSE},
-                                 {new Boolean( true ), "not memberOf", col, Boolean.FALSE},
-                                 {new Boolean( false ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Boolean( true ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Boolean( true ), "==", new Boolean( true ), Boolean.TRUE}, {new Boolean( false ), "!=", new Boolean( true ), Boolean.TRUE}, {new Boolean( true ), "==", new Boolean( false ), Boolean.FALSE},
+                {new Boolean( true ), "!=", new Boolean( false ), Boolean.TRUE}, {new Boolean( true ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", new Boolean( true ), Boolean.TRUE},
+                {null, "==", new Boolean( true ), Boolean.FALSE}, {new Boolean( true ), "memberOf", col, Boolean.TRUE}, {new Boolean( false ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {new Boolean( true ), "memberOf", null, Boolean.FALSE}, {new Boolean( true ), "not memberOf", col, Boolean.FALSE}, {new Boolean( false ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {new Boolean( true ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PBOOLEAN_TYPE );
@@ -372,36 +210,16 @@
 
     public void testDouble() {
         Collection col = new ArrayList();
-        col.add( new Double(42) );
-        col.add( new Double(45) );
+        col.add( new Double( 42 ) );
+        col.add( new Double( 45 ) );
 
-        final Object[][] data = {{new Double( 42 ), "==", new Double( 42 ), Boolean.TRUE},
-                                 {new Double( 42 ), "<", new Double( 43 ), Boolean.TRUE},
-                                 {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE},
-                                 {new Double( 42 ), "!=", new Double( 41 ), Boolean.TRUE},
-                                 {new Double( 42 ), ">", new Double( 41 ), Boolean.TRUE},
-                                 {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE},
-                                 {new Double( 42 ), ">=", new Double( 42 ), Boolean.TRUE},
-                                 {new Double( 42 ), ">=", new Double( 100 ), Boolean.FALSE},
-                                 {new Double( 42 ), "<", new Double( 1 ), Boolean.FALSE},
-                                 {new Double( 42 ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Double( 42 ), Boolean.TRUE},
-                                 {null, "==", new Double( 42 ), Boolean.FALSE},
-                                 {null, "<", new Double( 43 ), Boolean.FALSE},
-                                 {null, ">=", new Double( -10 ), Boolean.FALSE},
-                                 {null, ">", new Double( -10 ), Boolean.FALSE},
-                                 {null, "<=", new Double( 42 ), Boolean.FALSE},
-                                 {new Double( 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new Double( 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Double( 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new Double( 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new Double( 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Double( 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Double( 42 ), "==", new Double( 42 ), Boolean.TRUE}, {new Double( 42 ), "<", new Double( 43 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE},
+                {new Double( 42 ), "!=", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 41 ), Boolean.TRUE}, {new Double( 42 ), ">=", new Double( 42 ), Boolean.TRUE},
+                {new Double( 42 ), ">=", new Double( 100 ), Boolean.FALSE}, {new Double( 42 ), "<", new Double( 1 ), Boolean.FALSE}, {new Double( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE},
+                {null, "!=", new Double( 42 ), Boolean.TRUE}, {null, "==", new Double( 42 ), Boolean.FALSE}, {null, "<", new Double( 43 ), Boolean.FALSE}, {null, ">=", new Double( -10 ), Boolean.FALSE}, {null, ">", new Double( -10 ), Boolean.FALSE},
+                {null, "<=", new Double( 42 ), Boolean.FALSE}, {new Double( 42 ), "memberOf", col, Boolean.TRUE}, {new Double( 43 ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {new Double( 42 ), "memberOf", null, Boolean.FALSE}, {new Double( 42 ), "not memberOf", col, Boolean.FALSE}, {new Double( 43 ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {new Double( 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PDOUBLE_TYPE );
@@ -409,36 +227,16 @@
 
     public void testFloat() {
         Collection col = new ArrayList();
-        col.add( new Float(42) );
-        col.add( new Float(45) );
+        col.add( new Float( 42 ) );
+        col.add( new Float( 45 ) );
 
-        final Object[][] data = {{new Float( 42 ), "==", new Float( 42 ), Boolean.TRUE},
-                                 {new Float( 42 ), "<", new Float( 43 ), Boolean.TRUE},
-                                 {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE},
-                                 {new Float( 42 ), "!=", new Float( 41 ), Boolean.TRUE},
-                                 {new Float( 42 ), ">", new Float( 41 ), Boolean.TRUE},
-                                 {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE},
-                                 {new Float( 42 ), ">=", new Float( 42 ), Boolean.TRUE},
-                                 {new Float( 42 ), ">=", new Float( 100 ), Boolean.FALSE},
-                                 {new Float( 42 ), "<", new Float( 1 ), Boolean.FALSE},
-                                 {new Float( 42 ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Float( 42 ), Boolean.TRUE},
-                                 {null, "==", new Float( 42 ), Boolean.FALSE},
-                                 {null, "<", new Float( 43 ), Boolean.FALSE},
-                                 {null, ">=", new Float( -10 ), Boolean.FALSE},
-                                 {null, ">", new Float( -10 ), Boolean.FALSE},
-                                 {null, "<=", new Float( 42 ), Boolean.FALSE},
-                                 {new Float( 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new Float( 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Float( 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new Float( 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new Float( 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Float( 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Float( 42 ), "==", new Float( 42 ), Boolean.TRUE}, {new Float( 42 ), "<", new Float( 43 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE},
+                {new Float( 42 ), "!=", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 41 ), Boolean.TRUE}, {new Float( 42 ), ">=", new Float( 42 ), Boolean.TRUE},
+                {new Float( 42 ), ">=", new Float( 100 ), Boolean.FALSE}, {new Float( 42 ), "<", new Float( 1 ), Boolean.FALSE}, {new Float( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE},
+                {null, "!=", new Float( 42 ), Boolean.TRUE}, {null, "==", new Float( 42 ), Boolean.FALSE}, {null, "<", new Float( 43 ), Boolean.FALSE}, {null, ">=", new Float( -10 ), Boolean.FALSE}, {null, ">", new Float( -10 ), Boolean.FALSE},
+                {null, "<=", new Float( 42 ), Boolean.FALSE}, {new Float( 42 ), "memberOf", col, Boolean.TRUE}, {new Float( 43 ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {new Float( 42 ), "memberOf", null, Boolean.FALSE}, {new Float( 42 ), "not memberOf", col, Boolean.FALSE}, {new Float( 43 ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {new Float( 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PFLOAT_TYPE );
@@ -446,36 +244,15 @@
 
     public void testLong() {
         Collection col = new ArrayList();
-        col.add( new Long(42) );
-        col.add( new Long(45) );
+        col.add( new Long( 42 ) );
+        col.add( new Long( 45 ) );
 
-        final Object[][] data = {{new Long( 42 ), "==", new Long( 42 ), Boolean.TRUE},
-                                 {new Long( 42 ), "<", new Long( 43 ), Boolean.TRUE},
-                                 {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE},
-                                 {new Long( 42 ), "!=", new Long( 41 ), Boolean.TRUE},
-                                 {new Long( 42 ), ">", new Long( 41 ), Boolean.TRUE},
-                                 {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE},
-                                 {new Long( 42 ), ">=", new Long( 42 ), Boolean.TRUE},
-                                 {new Long( 42 ), ">=", new Long( 100 ), Boolean.FALSE},
-                                 {new Long( 42 ), "<", new Long( 1 ), Boolean.FALSE},
-                                 {new Long( 42 ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Long( 42 ), Boolean.TRUE},
-                                 {null, "==", new Long( 42 ), Boolean.FALSE},
-                                 {null, "<", new Long( 43 ), Boolean.FALSE},
-                                 {null, ">=", new Long( -10 ), Boolean.FALSE},
-                                 {null, ">", new Long( -10 ), Boolean.FALSE},
-                                 {null, "<=", new Long( 42 ), Boolean.FALSE},
-                                 {new Long( 42 ), "memberOf", col, Boolean.TRUE},
-                                 {new Long( 43 ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Long( 42 ), "memberOf", null, Boolean.FALSE},
-                                 {new Long( 42 ), "not memberOf", col, Boolean.FALSE},
-                                 {new Long( 43 ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Long( 42 ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Long( 42 ), "==", new Long( 42 ), Boolean.TRUE}, {new Long( 42 ), "<", new Long( 43 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), "!=", new Long( 41 ), Boolean.TRUE},
+                {new Long( 42 ), ">", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 41 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 42 ), Boolean.TRUE}, {new Long( 42 ), ">=", new Long( 100 ), Boolean.FALSE},
+                {new Long( 42 ), "<", new Long( 1 ), Boolean.FALSE}, {new Long( 42 ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", new Long( 42 ), Boolean.TRUE},
+                {null, "==", new Long( 42 ), Boolean.FALSE}, {null, "<", new Long( 43 ), Boolean.FALSE}, {null, ">=", new Long( -10 ), Boolean.FALSE}, {null, ">", new Long( -10 ), Boolean.FALSE}, {null, "<=", new Long( 42 ), Boolean.FALSE},
+                {new Long( 42 ), "memberOf", col, Boolean.TRUE}, {new Long( 43 ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE}, {new Long( 42 ), "memberOf", null, Boolean.FALSE},
+                {new Long( 42 ), "not memberOf", col, Boolean.FALSE}, {new Long( 43 ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE}, {new Long( 42 ), "not memberOf", null, Boolean.FALSE}};
 
         runEvaluatorTest( data,
                           ValueType.PLONG_TYPE );
@@ -486,33 +263,13 @@
         col.add( new Character( 'a' ) );
         col.add( new Character( 'b' ) );
 
-        final Object[][] data = {{new Character( 'a' ), "==", new Character( 'a' ), Boolean.TRUE},
-                                 {new Character( 'a' ), "<", new Character( 'b' ), Boolean.TRUE},
-                                 {new Character( 'a' ), ">=", new Character( 'a' ), Boolean.TRUE},
-                                 {new Character( 'a' ), "!=", new Character( 'Z' ), Boolean.TRUE},
-                                 {new Character( 'z' ), ">", new Character( 'a' ), Boolean.TRUE},
-                                 {new Character( 'z' ), ">=", new Character( 'z' ), Boolean.TRUE},
-                                 {new Character( 'z' ), ">=", new Character( 'a' ), Boolean.TRUE},
-                                 {new Character( 'a' ), ">=", new Character( 'z' ), Boolean.FALSE},
-                                 {new Character( 'z' ), "<", new Character( 'a' ), Boolean.FALSE},
-                                 {new Character( 'z' ), "==", null, Boolean.FALSE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Character( 'z' ), Boolean.TRUE},
-                                 {null, "==", new Character( 'z' ), Boolean.FALSE},
-                                 {null, "<", new Character( 'a' ), Boolean.FALSE},
-                                 {null, ">=", new Character( '\0' ), Boolean.FALSE},
-                                 {null, ">", new Character( '\0' ), Boolean.FALSE},
-                                 {null, "<=", new Character( 'a' ), Boolean.FALSE},
-                                 {new Character( 'a' ), "memberOf", col, Boolean.TRUE},
-                                 {new Character( 'z' ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Character( 'a' ), "memberOf", null, Boolean.FALSE},
-                                 {new Character( 'a' ), "not memberOf", col, Boolean.FALSE},
-                                 {new Character( 'z' ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Character( 'a' ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Character( 'a' ), "==", new Character( 'a' ), Boolean.TRUE}, {new Character( 'a' ), "<", new Character( 'b' ), Boolean.TRUE}, {new Character( 'a' ), ">=", new Character( 'a' ), Boolean.TRUE},
+                {new Character( 'a' ), "!=", new Character( 'Z' ), Boolean.TRUE}, {new Character( 'z' ), ">", new Character( 'a' ), Boolean.TRUE}, {new Character( 'z' ), ">=", new Character( 'z' ), Boolean.TRUE},
+                {new Character( 'z' ), ">=", new Character( 'a' ), Boolean.TRUE}, {new Character( 'a' ), ">=", new Character( 'z' ), Boolean.FALSE}, {new Character( 'z' ), "<", new Character( 'a' ), Boolean.FALSE},
+                {new Character( 'z' ), "==", null, Boolean.FALSE}, {null, "==", null, Boolean.TRUE}, {null, "!=", null, Boolean.FALSE}, {null, "!=", new Character( 'z' ), Boolean.TRUE}, {null, "==", new Character( 'z' ), Boolean.FALSE},
+                {null, "<", new Character( 'a' ), Boolean.FALSE}, {null, ">=", new Character( '\0' ), Boolean.FALSE}, {null, ">", new Character( '\0' ), Boolean.FALSE}, {null, "<=", new Character( 'a' ), Boolean.FALSE},
+                {new Character( 'a' ), "memberOf", col, Boolean.TRUE}, {new Character( 'z' ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE}, {new Character( 'a' ), "memberOf", null, Boolean.FALSE},
+                {new Character( 'a' ), "not memberOf", col, Boolean.FALSE}, {new Character( 'z' ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE}, {new Character( 'a' ), "not memberOf", null, Boolean.FALSE}};
         runEvaluatorTest( data,
                           ValueType.PCHAR_TYPE );
     }
@@ -526,35 +283,15 @@
         col.add( df.parse( "11-Jul-1974" ) );
 
         //note that strings are also allowed on the right
-        final Object[][] data = {{df.parse( "10-Jul-1974" ), "==", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), "!=", df.parse( "11-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-2000" ), ">", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "11-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), ">=", df.parse( "11-Jul-1974" ), Boolean.FALSE},
-                                 {df.parse( "10-Jul-2000" ), "<", df.parse( "10-Jul-1974" ), Boolean.FALSE},
-                                 {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), "==", null, Boolean.FALSE},
-                                 {df.parse( "10-Jul-1974" ), "!=", null, Boolean.TRUE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "==", df.parse( "10-Jul-1974" ), Boolean.FALSE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", df.parse( "10-Jul-1974" ), Boolean.TRUE},
-                                 {null, "<", df.parse( "10-Jul-1974" ), Boolean.FALSE},
-                                 {null, ">=", new Date(0), Boolean.FALSE},
-                                 {null, ">", new Date(0), Boolean.FALSE},
-                                 {null, "<=", df.parse( "10-Jul-1974" ), Boolean.FALSE},
-                                 {df.parse( "10-Jul-1974" ), "memberOf", col, Boolean.TRUE},
-                                 {df.parse( "15-Jul-1974" ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {df.parse( "10-Jul-1974" ), "memberOf", null, Boolean.FALSE},
-                                 {df.parse( "10-Jul-1974" ), "not memberOf", col, Boolean.FALSE},
-                                 {df.parse( "15-Jul-1974" ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {df.parse( "10-Jul-1974" ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{df.parse( "10-Jul-1974" ), "==", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE},
+                {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "!=", df.parse( "11-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-2000" ), ">", df.parse( "10-Jul-1974" ), Boolean.TRUE},
+                {df.parse( "10-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "11-Jul-1974" ), ">=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), ">=", df.parse( "11-Jul-1974" ), Boolean.FALSE},
+                {df.parse( "10-Jul-2000" ), "<", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {df.parse( "10-Jul-1974" ), "<", df.parse( "11-Jul-1974" ), Boolean.TRUE}, {df.parse( "10-Jul-1974" ), "==", null, Boolean.FALSE},
+                {df.parse( "10-Jul-1974" ), "!=", null, Boolean.TRUE}, {null, "==", null, Boolean.TRUE}, {null, "==", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {null, "!=", null, Boolean.FALSE},
+                {null, "!=", df.parse( "10-Jul-1974" ), Boolean.TRUE}, {null, "<", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {null, ">=", new Date( 0 ), Boolean.FALSE}, {null, ">", new Date( 0 ), Boolean.FALSE},
+                {null, "<=", df.parse( "10-Jul-1974" ), Boolean.FALSE}, {df.parse( "10-Jul-1974" ), "memberOf", col, Boolean.TRUE}, {df.parse( "15-Jul-1974" ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE},
+                {df.parse( "10-Jul-1974" ), "memberOf", null, Boolean.FALSE}, {df.parse( "10-Jul-1974" ), "not memberOf", col, Boolean.FALSE}, {df.parse( "15-Jul-1974" ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE},
+                {df.parse( "10-Jul-1974" ), "not memberOf", null, Boolean.FALSE}};
         runEvaluatorTest( data,
                           ValueType.DATE_TYPE );
     }
@@ -564,33 +301,13 @@
         col.add( new Byte( "1" ) );
         col.add( new Byte( "2" ) );
 
-        final Object[][] data = {{new Byte( "1" ), "==", new Byte( "1" ), Boolean.TRUE},
-                                 {new Byte( "1" ), "==", new Byte( "2" ), Boolean.FALSE},
-                                 {new Byte( "1" ), "!=", new Byte( "2" ), Boolean.TRUE},
-                                 {new Byte( "1" ), "!=", new Byte( "1" ), Boolean.FALSE},
-                                 {new Byte( "1" ), "<=", new Byte( "1" ), Boolean.TRUE},
-                                 {new Byte( "1" ), "==", null, Boolean.FALSE},
-                                 {new Byte( "1" ), "<", new Byte( "2" ), Boolean.TRUE},
-                                 {new Byte( "2" ), ">=", new Byte( "1" ), Boolean.TRUE},
-                                 {new Byte( "2" ), ">", new Byte( "1" ), Boolean.TRUE},
-                                 {new Byte( "1" ), "<=", new Byte( "2" ), Boolean.TRUE},
-                                 {null, "==", null, Boolean.TRUE},
-                                 {null, "!=", null, Boolean.FALSE},
-                                 {null, "!=", new Byte( "1" ), Boolean.TRUE},
-                                 {null, "==", new Byte( "1" ), Boolean.FALSE},
-                                 {null, "<", new Byte( Byte.MAX_VALUE), Boolean.FALSE},
-                                 {null, ">=", new Byte( Byte.MIN_VALUE ), Boolean.FALSE},
-                                 {null, ">", new Byte( Byte.MIN_VALUE ), Boolean.FALSE},
-                                 {null, "<=", new Byte( Byte.MAX_VALUE ), Boolean.FALSE},
-                                 {new Byte( "1" ), "memberOf", col, Boolean.TRUE},
-                                 {new Byte( "3" ), "memberOf", col, Boolean.FALSE},
-                                 {null, "memberOf", col, Boolean.FALSE},
-                                 {new Byte( "1" ), "memberOf", null, Boolean.FALSE},
-                                 {new Byte( "1" ), "not memberOf", col, Boolean.FALSE},
-                                 {new Byte( "3" ), "not memberOf", col, Boolean.TRUE},
-                                 {null, "not memberOf", col, Boolean.TRUE},
-                                 {new Byte( "1" ), "not memberOf", null, Boolean.FALSE}
-                                 };
+        final Object[][] data = {{new Byte( "1" ), "==", new Byte( "1" ), Boolean.TRUE}, {new Byte( "1" ), "==", new Byte( "2" ), Boolean.FALSE}, {new Byte( "1" ), "!=", new Byte( "2" ), Boolean.TRUE},
+                {new Byte( "1" ), "!=", new Byte( "1" ), Boolean.FALSE}, {new Byte( "1" ), "<=", new Byte( "1" ), Boolean.TRUE}, {new Byte( "1" ), "==", null, Boolean.FALSE}, {new Byte( "1" ), "<", new Byte( "2" ), Boolean.TRUE},
+                {new Byte( "2" ), ">=", new Byte( "1" ), Boolean.TRUE}, {new Byte( "2" ), ">", new Byte( "1" ), Boolean.TRUE}, {new Byte( "1" ), "<=", new Byte( "2" ), Boolean.TRUE}, {null, "==", null, Boolean.TRUE},
+                {null, "!=", null, Boolean.FALSE}, {null, "!=", new Byte( "1" ), Boolean.TRUE}, {null, "==", new Byte( "1" ), Boolean.FALSE}, {null, "<", new Byte( Byte.MAX_VALUE ), Boolean.FALSE},
+                {null, ">=", new Byte( Byte.MIN_VALUE ), Boolean.FALSE}, {null, ">", new Byte( Byte.MIN_VALUE ), Boolean.FALSE}, {null, "<=", new Byte( Byte.MAX_VALUE ), Boolean.FALSE}, {new Byte( "1" ), "memberOf", col, Boolean.TRUE},
+                {new Byte( "3" ), "memberOf", col, Boolean.FALSE}, {null, "memberOf", col, Boolean.FALSE}, {new Byte( "1" ), "memberOf", null, Boolean.FALSE}, {new Byte( "1" ), "not memberOf", col, Boolean.FALSE},
+                {new Byte( "3" ), "not memberOf", col, Boolean.TRUE}, {null, "not memberOf", col, Boolean.TRUE}, {new Byte( "1" ), "not memberOf", null, Boolean.FALSE}};
         runEvaluatorTest( data,
                           ValueType.PBYTE_TYPE );
 
@@ -603,12 +320,15 @@
      */
     private void runEvaluatorTest(final Object[][] data,
                                   final ValueType valueType) {
-        final Extractor extractor = new MockExtractor();
+        final InternalReadAccessor extractor = new MockExtractor();
         for ( int i = 0; i < data.length; i++ ) {
             final Object[] row = data[i];
-            boolean isNegated = ((String) row[1]).startsWith("not ");
-            String evaluatorStr =  isNegated ? ((String)row[1]).substring( 4 ) : (String)row[1];
-            final Evaluator evaluator = registry.getEvaluatorDefinition( evaluatorStr ).getEvaluator( valueType, evaluatorStr, isNegated, null );
+            boolean isNegated = ((String) row[1]).startsWith( "not " );
+            String evaluatorStr = isNegated ? ((String) row[1]).substring( 4 ) : (String) row[1];
+            final Evaluator evaluator = registry.getEvaluatorDefinition( evaluatorStr ).getEvaluator( valueType,
+                                                                                                      evaluatorStr,
+                                                                                                      isNegated,
+                                                                                                      null );
             checkEvaluatorMethodWithFieldValue( valueType,
                                                 extractor,
                                                 row,
@@ -639,13 +359,14 @@
      * @param evaluator
      */
     private void checkEvaluatorMethodWithFieldValue(final ValueType valueType,
-                                                    final Extractor extractor,
+                                                    final InternalReadAccessor extractor,
                                                     final Object[] row,
                                                     final Evaluator evaluator) {
         final FieldValue value = FieldFactory.getFieldValue( row[2] );
         final boolean result = evaluator.evaluate( null,
                                                    extractor,
-                                                   row[0], value );
+                                                   row[0],
+                                                   value );
         final String message = "The evaluator type: [" + valueType + "] with FieldValue incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -664,15 +385,16 @@
      * @param evaluator
      */
     private void checkEvaluatorMethodCachedRight(final ValueType valueType,
-                                                 final Extractor extractor,
+                                                 final InternalReadAccessor extractor,
                                                  final Object[] row,
                                                  final Evaluator evaluator) {
         final VariableContextEntry context = this.getContextEntry( evaluator,
-                                                             (FieldExtractor) extractor,
-                                                             valueType,
-                                                             row );
+                                                                   extractor,
+                                                                   valueType,
+                                                                   row );
         final boolean result = evaluator.evaluateCachedRight( null,
-                                                              context, row[2] );
+                                                              context,
+                                                              row[2] );
         final String message = "The evaluator type: [" + valueType + "] with CachedRight incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -691,15 +413,16 @@
      * @param evaluator
      */
     private void checkEvaluatorMethodCachedLeft(final ValueType valueType,
-                                                final Extractor extractor,
+                                                final InternalReadAccessor extractor,
                                                 final Object[] row,
                                                 final Evaluator evaluator) {
         final VariableContextEntry context = this.getContextEntry( evaluator,
-                                                                   (FieldExtractor) extractor,
-                                                             valueType,
-                                                             row );
+                                                                   extractor,
+                                                                   valueType,
+                                                                   row );
         final boolean result = evaluator.evaluateCachedLeft( null,
-                                                             context, row[0] );
+                                                             context,
+                                                             row[0] );
         final String message = "The evaluator type: [" + valueType + "] with CachedLeft incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -718,13 +441,14 @@
      * @param evaluator
      */
     private void checkEvaluatorMethodWith2Extractors(final ValueType valueType,
-                                                     final Extractor extractor,
+                                                     final InternalReadAccessor extractor,
                                                      final Object[] row,
                                                      final Evaluator evaluator) {
         final boolean result = evaluator.evaluate( null,
                                                    extractor,
                                                    row[0],
-                                                   extractor, row[2] );
+                                                   extractor,
+                                                   row[2] );
         final String message = "The evaluator type: [" + valueType + "] with 2 extractors incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
         if ( row[3] == Boolean.TRUE ) {
@@ -737,26 +461,26 @@
     }
 
     private VariableContextEntry getContextEntry(final Evaluator evaluator,
-                                                 final FieldExtractor extractor,
+                                                 final InternalReadAccessor extractor,
                                                  final ValueType valueType,
                                                  final Object[] row) {
         final Declaration declaration = new Declaration( "test",
-                                                   extractor,
-                                                   null );
+                                                         extractor,
+                                                         null );
         final ValueType coerced = evaluator.getCoercedValueType();
 
         if ( coerced.isIntegerNumber() ) {
             final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
-                                                                             declaration,
-                                                                             evaluator );
+                                                                                   declaration,
+                                                                                   evaluator );
 
-            if (row[2] == null) {
+            if ( row[2] == null ) {
                 context.leftNull = true;
             } else {
                 context.left = ((Number) row[2]).longValue();
             }
 
-            if (row[0] == null) {
+            if ( row[0] == null ) {
                 context.rightNull = true;
             } else {
                 context.right = ((Number) row[0]).longValue();
@@ -767,13 +491,13 @@
                                                                                    declaration,
                                                                                    evaluator );
 
-            if (row[2] == null) {
+            if ( row[2] == null ) {
                 context.leftNull = true;
             } else {
                 context.left = ((Character) row[2]).charValue();
             }
 
-            if (row[0] == null) {
+            if ( row[0] == null ) {
                 context.rightNull = true;
             } else {
                 context.right = ((Character) row[0]).charValue();
@@ -781,16 +505,16 @@
             return context;
         } else if ( coerced.isBoolean() ) {
             final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
-                                                                                   declaration,
-                                                                                   evaluator );
+                                                                                         declaration,
+                                                                                         evaluator );
 
-            if (row[2] == null) {
+            if ( row[2] == null ) {
                 context.leftNull = true;
             } else {
                 context.left = ((Boolean) row[2]).booleanValue();
             }
 
-            if (row[0] == null) {
+            if ( row[0] == null ) {
                 context.rightNull = true;
             } else {
                 context.right = ((Boolean) row[0]).booleanValue();
@@ -798,15 +522,15 @@
             return context;
         } else if ( coerced.isFloatNumber() ) {
             final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
-                                                                                 declaration,
-                                                                                 evaluator );
-            if (row[2] == null) {
+                                                                                       declaration,
+                                                                                       evaluator );
+            if ( row[2] == null ) {
                 context.leftNull = true;
             } else {
                 context.left = ((Number) row[2]).doubleValue();
             }
 
-            if (row[0] == null) {
+            if ( row[0] == null ) {
                 context.rightNull = true;
             } else {
                 context.right = ((Number) row[0]).doubleValue();
@@ -814,15 +538,15 @@
             return context;
         } else {
             final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
-                                                                                 declaration,
-                                                                                 evaluator );
-            if (row[2] == null) {
+                                                                                       declaration,
+                                                                                       evaluator );
+            if ( row[2] == null ) {
                 context.leftNull = true;
             } else {
                 context.left = row[2];
             }
 
-            if (row[0] == null) {
+            if ( row[0] == null ) {
                 context.rightNull = true;
             } else {
                 context.right = row[0];
@@ -833,28 +557,34 @@
 
     private static class MockExtractor
         implements
-        FieldExtractor {
+        InternalReadAccessor {
 
         private static final long serialVersionUID = 400L;
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
         }
-        public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
+
+        public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                       final Object object) {
             return object != null ? ((Boolean) object).booleanValue() : false;
         }
 
-        public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
+        public byte getByteValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
             return object != null ? ((Number) object).byteValue() : (byte) 0;
         }
 
-        public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
+        public char getCharValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
             return object != null ? ((Character) object).charValue() : '\0';
         }
 
-        public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
+        public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                     final Object object) {
             return object != null ? ((Number) object).doubleValue() : 0.0;
         }
 
@@ -866,19 +596,23 @@
             return null;
         }
 
-        public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
+        public float getFloatValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
             return object != null ? ((Number) object).floatValue() : (float) 0.0;
         }
 
-        public int getHashCode(InternalWorkingMemory workingMemory, final Object object) {
+        public int getHashCode(InternalWorkingMemory workingMemory,
+                               final Object object) {
             return 0;
         }
 
-        public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
+        public int getIntValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
             return object != null ? ((Number) object).intValue() : 0;
         }
 
-        public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
+        public long getLongValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
             return object != null ? ((Number) object).longValue() : 0;
         }
 
@@ -886,15 +620,18 @@
             return null;
         }
 
-        public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
+        public short getShortValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
             return object != null ? ((Number) object).shortValue() : (short) 0;
         }
 
-        public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
+        public Object getValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
             return object;
         }
 
-        public boolean isNullValue(InternalWorkingMemory workingMemory, final Object object ) {
+        public boolean isNullValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
             return object == null;
         }
 
@@ -911,6 +648,61 @@
             return false;
         }
 
+        public boolean getBooleanValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+        public byte getByteValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public char getCharValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public double getDoubleValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public float getFloatValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getHashCode(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getIntValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public long getLongValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public short getShortValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public Object getValue(Object object) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public boolean isNullValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
     }
 
     //    public void testRegexFoo() {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TemporalEvaluatorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TemporalEvaluatorFactoryTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/TemporalEvaluatorFactoryTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -16,15 +16,13 @@
  * limitations under the License.
  */
 
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
 import java.io.IOException;
+import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.ObjectInput;
+import java.lang.reflect.Method;
 
+import junit.framework.TestCase;
+
 import org.drools.RuntimeDroolsException;
 import org.drools.base.evaluators.EvaluatorDefinition;
 import org.drools.base.evaluators.EvaluatorRegistry;
@@ -38,12 +36,9 @@
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.Extractor;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 
-import junit.framework.TestCase;
-
 /**
  * Test coverage for the temporal evaluators.
  *
@@ -51,483 +46,489 @@
  */
 public class TemporalEvaluatorFactoryTest extends TestCase {
 
-	private EvaluatorRegistry registry = new EvaluatorRegistry();
+    private EvaluatorRegistry registry = new EvaluatorRegistry();
 
-	public void testAfter() {
-		registry
-				.addEvaluatorDefinition("org.drools.base.evaluators.AfterEvaluatorDefinition");
+    public void testAfter() {
+        registry.addEvaluatorDefinition( "org.drools.base.evaluators.AfterEvaluatorDefinition" );
 
-		EventFactHandle foo = new EventFactHandle(1, "foo", 1, 1, 2);
-		EventFactHandle bar = new EventFactHandle(2, "bar", 1, 4, 3);
-		EventFactHandle drool = new EventFactHandle(1, "drool", 1, 5, 2);
+        EventFactHandle foo = new EventFactHandle( 1,
+                                                   "foo",
+                                                   1,
+                                                   1,
+                                                   2 );
+        EventFactHandle bar = new EventFactHandle( 2,
+                                                   "bar",
+                                                   1,
+                                                   4,
+                                                   3 );
+        EventFactHandle drool = new EventFactHandle( 1,
+                                                     "drool",
+                                                     1,
+                                                     5,
+                                                     2 );
 
-		final Object[][] data = { { drool, "after", foo, Boolean.TRUE },
-				{ drool, "after", bar, Boolean.FALSE },
-				{ bar, "after", foo, Boolean.TRUE },
-				{ bar, "after", drool, Boolean.FALSE },
-				{ foo, "after", drool, Boolean.FALSE },
-				{ foo, "after", bar, Boolean.FALSE },
-				{ foo, "not after", bar, Boolean.TRUE },
-				{ foo, "not after", drool, Boolean.TRUE },
-				{ bar, "not after", drool, Boolean.TRUE },
-				{ bar, "not after", foo, Boolean.FALSE },
-				{ drool, "not after", foo, Boolean.FALSE },
-				{ drool, "not after", bar, Boolean.TRUE },
-				{ bar, "after[1]", foo, Boolean.TRUE },
-				{ bar, "after[0]", foo, Boolean.FALSE },
-				{ bar, "after[-3]", drool, Boolean.TRUE },
-				{ bar, "after[-4]", drool, Boolean.FALSE },
-				{ drool, "after[2]", foo, Boolean.TRUE },
-				{ drool, "after[1]", foo, Boolean.FALSE },
-				{ drool, "after[-2]", bar, Boolean.TRUE },
-				{ drool, "after[-3]", bar, Boolean.FALSE },
-				{ foo, "after[-6]", drool, Boolean.TRUE },
-				{ foo, "after[-7]", drool, Boolean.FALSE },
-				{ foo, "after[-6]", bar, Boolean.TRUE },
-				{ foo, "after[-7]", bar, Boolean.FALSE },
-				{ bar, "not after[1]", foo, Boolean.FALSE },
-				{ bar, "not after[0]", foo, Boolean.TRUE },
-				{ bar, "not after[-3]", drool, Boolean.FALSE },
-				{ bar, "not after[-4]", drool, Boolean.TRUE },
-				{ drool, "not after[2]", foo, Boolean.FALSE },
-				{ drool, "not after[1]", foo, Boolean.TRUE },
-				{ drool, "not after[-2]", bar, Boolean.FALSE },
-				{ drool, "not after[-3]", bar, Boolean.TRUE },
-				{ foo, "not after[-6]", drool, Boolean.FALSE },
-				{ foo, "not after[-7]", drool, Boolean.TRUE },
-				{ foo, "not after[-6]", bar, Boolean.FALSE },
-				{ foo, "not after[-7]", bar, Boolean.TRUE },
-				{ drool, "after[1,4]", foo, Boolean.TRUE },
-				{ drool, "after[3,6]", foo, Boolean.FALSE },
-				{ drool, "after[-3,1]", bar, Boolean.TRUE },
-				{ drool, "after[-1,3]", bar, Boolean.FALSE },
-				{ bar, "after[1,5]", foo, Boolean.TRUE },
-				{ bar, "after[2,5]", foo, Boolean.FALSE },
-				{ bar, "after[-3,0]", drool, Boolean.TRUE },
-				{ bar, "after[-2,1]", drool, Boolean.FALSE },
-				{ foo, "after[-7,-3]", bar, Boolean.TRUE },
-				{ foo, "after[-5,-1]", bar, Boolean.FALSE },
-				{ foo, "after[-6,-5]", drool, Boolean.TRUE },
-				{ foo, "after[-5,-4]", drool, Boolean.FALSE },
-				{ drool, "not after[1,4]", foo, Boolean.FALSE },
-				{ drool, "not after[3,6]", foo, Boolean.TRUE },
-				{ drool, "not after[-3,1]", bar, Boolean.FALSE },
-				{ drool, "not after[-1,3]", bar, Boolean.TRUE },
-				{ bar, "not after[1,5]", foo, Boolean.FALSE },
-				{ bar, "not after[2,5]", foo, Boolean.TRUE },
-				{ bar, "not after[-3,0]", drool, Boolean.FALSE },
-				{ bar, "not after[-2,1]", drool, Boolean.TRUE },
-				{ foo, "not after[-7,-3]", bar, Boolean.FALSE },
-				{ foo, "not after[-5,-1]", bar, Boolean.TRUE },
-				{ foo, "not after[-6,-5]", drool, Boolean.FALSE },
-				{ foo, "not after[-5,-4]", drool, Boolean.TRUE }, };
+        final Object[][] data = {{drool, "after", foo, Boolean.TRUE}, {drool, "after", bar, Boolean.FALSE}, {bar, "after", foo, Boolean.TRUE}, {bar, "after", drool, Boolean.FALSE}, {foo, "after", drool, Boolean.FALSE},
+                {foo, "after", bar, Boolean.FALSE}, {foo, "not after", bar, Boolean.TRUE}, {foo, "not after", drool, Boolean.TRUE}, {bar, "not after", drool, Boolean.TRUE}, {bar, "not after", foo, Boolean.FALSE},
+                {drool, "not after", foo, Boolean.FALSE}, {drool, "not after", bar, Boolean.TRUE}, {bar, "after[1]", foo, Boolean.TRUE}, {bar, "after[0]", foo, Boolean.FALSE}, {bar, "after[-3]", drool, Boolean.TRUE},
+                {bar, "after[-4]", drool, Boolean.FALSE}, {drool, "after[2]", foo, Boolean.TRUE}, {drool, "after[1]", foo, Boolean.FALSE}, {drool, "after[-2]", bar, Boolean.TRUE}, {drool, "after[-3]", bar, Boolean.FALSE},
+                {foo, "after[-6]", drool, Boolean.TRUE}, {foo, "after[-7]", drool, Boolean.FALSE}, {foo, "after[-6]", bar, Boolean.TRUE}, {foo, "after[-7]", bar, Boolean.FALSE}, {bar, "not after[1]", foo, Boolean.FALSE},
+                {bar, "not after[0]", foo, Boolean.TRUE}, {bar, "not after[-3]", drool, Boolean.FALSE}, {bar, "not after[-4]", drool, Boolean.TRUE}, {drool, "not after[2]", foo, Boolean.FALSE}, {drool, "not after[1]", foo, Boolean.TRUE},
+                {drool, "not after[-2]", bar, Boolean.FALSE}, {drool, "not after[-3]", bar, Boolean.TRUE}, {foo, "not after[-6]", drool, Boolean.FALSE}, {foo, "not after[-7]", drool, Boolean.TRUE}, {foo, "not after[-6]", bar, Boolean.FALSE},
+                {foo, "not after[-7]", bar, Boolean.TRUE}, {drool, "after[1,4]", foo, Boolean.TRUE}, {drool, "after[3,6]", foo, Boolean.FALSE}, {drool, "after[-3,1]", bar, Boolean.TRUE}, {drool, "after[-1,3]", bar, Boolean.FALSE},
+                {bar, "after[1,5]", foo, Boolean.TRUE}, {bar, "after[2,5]", foo, Boolean.FALSE}, {bar, "after[-3,0]", drool, Boolean.TRUE}, {bar, "after[-2,1]", drool, Boolean.FALSE}, {foo, "after[-7,-3]", bar, Boolean.TRUE},
+                {foo, "after[-5,-1]", bar, Boolean.FALSE}, {foo, "after[-6,-5]", drool, Boolean.TRUE}, {foo, "after[-5,-4]", drool, Boolean.FALSE}, {drool, "not after[1,4]", foo, Boolean.FALSE}, {drool, "not after[3,6]", foo, Boolean.TRUE},
+                {drool, "not after[-3,1]", bar, Boolean.FALSE}, {drool, "not after[-1,3]", bar, Boolean.TRUE}, {bar, "not after[1,5]", foo, Boolean.FALSE}, {bar, "not after[2,5]", foo, Boolean.TRUE}, {bar, "not after[-3,0]", drool, Boolean.FALSE},
+                {bar, "not after[-2,1]", drool, Boolean.TRUE}, {foo, "not after[-7,-3]", bar, Boolean.FALSE}, {foo, "not after[-5,-1]", bar, Boolean.TRUE}, {foo, "not after[-6,-5]", drool, Boolean.FALSE},
+                {foo, "not after[-5,-4]", drool, Boolean.TRUE},};
 
-		runEvaluatorTest(data, ValueType.OBJECT_TYPE);
-	}
+        runEvaluatorTest( data,
+                          ValueType.OBJECT_TYPE );
+    }
 
-	public void testBefore() {
-		registry
-				.addEvaluatorDefinition("org.drools.base.evaluators.BeforeEvaluatorDefinition");
+    public void testBefore() {
+        registry.addEvaluatorDefinition( "org.drools.base.evaluators.BeforeEvaluatorDefinition" );
 
-		EventFactHandle foo = new EventFactHandle(1, "foo", 1, 1, 2);
-		EventFactHandle bar = new EventFactHandle(2, "bar", 1, 2, 2);
-		EventFactHandle drool = new EventFactHandle(1, "drool", 1, 5, 3);
+        EventFactHandle foo = new EventFactHandle( 1,
+                                                   "foo",
+                                                   1,
+                                                   1,
+                                                   2 );
+        EventFactHandle bar = new EventFactHandle( 2,
+                                                   "bar",
+                                                   1,
+                                                   2,
+                                                   2 );
+        EventFactHandle drool = new EventFactHandle( 1,
+                                                     "drool",
+                                                     1,
+                                                     5,
+                                                     3 );
 
-		final Object[][] data = {
-				{ foo, "before", drool, Boolean.TRUE },
-				{ foo, "before", bar, Boolean.FALSE },
-				{ drool, "before", foo, Boolean.FALSE },
-				{ drool, "before", bar, Boolean.FALSE },
-				{ bar, "before", drool, Boolean.TRUE },
-				{ bar, "before", foo, Boolean.FALSE },
-				{ foo, "not before", drool, Boolean.FALSE },
-				{ foo, "not before", bar, Boolean.TRUE },
-				{ drool, "not before", foo, Boolean.TRUE },
-				{ drool, "not before", bar, Boolean.TRUE },
-				{ bar, "not before", drool, Boolean.FALSE },
-				{ bar, "not before", foo, Boolean.TRUE },
-				{ foo, "before[2]", drool, Boolean.TRUE },
-				{ foo, "before[3]", drool, Boolean.FALSE },
-				{ foo, "before[-1]", bar, Boolean.TRUE },
-				{ foo, "before[-2]", bar, Boolean.FALSE },
-				{ bar, "before[1]", drool, Boolean.TRUE },
-				{ bar, "before[2]", drool, Boolean.FALSE },
-				{ bar, "before[-3]", foo, Boolean.TRUE },
-				{ bar, "before[-2]", foo, Boolean.FALSE },
-				{ drool, "before[-6]", bar, Boolean.TRUE },
-				{ drool, "before[-5]", bar, Boolean.FALSE },
-				{ drool, "before[-7]", foo, Boolean.TRUE },
-				{ drool, "before[-8]", foo, Boolean.FALSE },
-				{ foo, "not before[2]", drool, Boolean.FALSE },
-				{ foo, "not before[3]", drool, Boolean.TRUE },
-				{ foo, "not before[-1]", bar, Boolean.FALSE },
-				{ foo, "not before[-2]", bar, Boolean.TRUE },
-				{ bar, "not before[1]", drool, Boolean.FALSE },
-				{ bar, "not before[2]", drool, Boolean.TRUE },
-				{ bar, "not before[-3]", foo, Boolean.FALSE },
-				{ bar, "not before[-2]", foo, Boolean.TRUE },
-				{ drool, "not before[-6]", bar, Boolean.FALSE },
-				{ drool, "not before[-5]", bar, Boolean.TRUE },
-				{ drool, "not before[-7]", foo, Boolean.FALSE },
-				{ drool, "not before[-8]", foo, Boolean.TRUE },
-				{ foo, "before[2,4]", drool, Boolean.TRUE },
-				{ foo, "before[3,4]", drool, Boolean.FALSE },
-				{ foo, "before[-1,1]", bar, Boolean.TRUE },
-				{ foo, "before[0,-2]", bar, Boolean.FALSE },
-				{ bar, "before[0,4]", drool, Boolean.TRUE },
-				{ bar, "before[2,4]", drool, Boolean.FALSE },
-				{ bar, "before[-4,0]", foo, Boolean.TRUE },
-				{ bar, "before[-2,0]", foo, Boolean.FALSE },
-				{ drool, "before[-6,-3]", bar, Boolean.TRUE },
-				{ drool, "before[-5,-3]", bar, Boolean.FALSE },
-				{ drool, "before[-7,-4]", foo, Boolean.TRUE },
-				{ drool, "before[-6,-4]", foo, Boolean.FALSE },
-				{ foo, "not before[2,4]", drool, Boolean.FALSE },
-				{ foo, "not before[3,4]", drool, Boolean.TRUE },
-				{ foo, "not before[-1,1]", bar, Boolean.FALSE },
-				{ foo, "not before[0,-2]", bar, Boolean.TRUE },
-				{ bar, "not before[0,4]", drool, Boolean.FALSE },
-				{ bar, "not before[2,4]", drool, Boolean.TRUE },
-				{ bar, "not before[-4,0]", foo, Boolean.FALSE },
-				{ bar, "not before[-2,0]", foo, Boolean.TRUE },
-				{ drool, "not before[-6,-3]", bar, Boolean.FALSE },
-				{ drool, "not before[-5,-3]", bar, Boolean.TRUE },
-				{ drool, "not before[-7,-4]", foo, Boolean.FALSE },
-				{ drool, "not before[-6,-4]", foo, Boolean.TRUE } };
+        final Object[][] data = {{foo, "before", drool, Boolean.TRUE}, {foo, "before", bar, Boolean.FALSE}, {drool, "before", foo, Boolean.FALSE}, {drool, "before", bar, Boolean.FALSE}, {bar, "before", drool, Boolean.TRUE},
+                {bar, "before", foo, Boolean.FALSE}, {foo, "not before", drool, Boolean.FALSE}, {foo, "not before", bar, Boolean.TRUE}, {drool, "not before", foo, Boolean.TRUE}, {drool, "not before", bar, Boolean.TRUE},
+                {bar, "not before", drool, Boolean.FALSE}, {bar, "not before", foo, Boolean.TRUE}, {foo, "before[2]", drool, Boolean.TRUE}, {foo, "before[3]", drool, Boolean.FALSE}, {foo, "before[-1]", bar, Boolean.TRUE},
+                {foo, "before[-2]", bar, Boolean.FALSE}, {bar, "before[1]", drool, Boolean.TRUE}, {bar, "before[2]", drool, Boolean.FALSE}, {bar, "before[-3]", foo, Boolean.TRUE}, {bar, "before[-2]", foo, Boolean.FALSE},
+                {drool, "before[-6]", bar, Boolean.TRUE}, {drool, "before[-5]", bar, Boolean.FALSE}, {drool, "before[-7]", foo, Boolean.TRUE}, {drool, "before[-8]", foo, Boolean.FALSE}, {foo, "not before[2]", drool, Boolean.FALSE},
+                {foo, "not before[3]", drool, Boolean.TRUE}, {foo, "not before[-1]", bar, Boolean.FALSE}, {foo, "not before[-2]", bar, Boolean.TRUE}, {bar, "not before[1]", drool, Boolean.FALSE}, {bar, "not before[2]", drool, Boolean.TRUE},
+                {bar, "not before[-3]", foo, Boolean.FALSE}, {bar, "not before[-2]", foo, Boolean.TRUE}, {drool, "not before[-6]", bar, Boolean.FALSE}, {drool, "not before[-5]", bar, Boolean.TRUE}, {drool, "not before[-7]", foo, Boolean.FALSE},
+                {drool, "not before[-8]", foo, Boolean.TRUE}, {foo, "before[2,4]", drool, Boolean.TRUE}, {foo, "before[3,4]", drool, Boolean.FALSE}, {foo, "before[-1,1]", bar, Boolean.TRUE}, {foo, "before[0,-2]", bar, Boolean.FALSE},
+                {bar, "before[0,4]", drool, Boolean.TRUE}, {bar, "before[2,4]", drool, Boolean.FALSE}, {bar, "before[-4,0]", foo, Boolean.TRUE}, {bar, "before[-2,0]", foo, Boolean.FALSE}, {drool, "before[-6,-3]", bar, Boolean.TRUE},
+                {drool, "before[-5,-3]", bar, Boolean.FALSE}, {drool, "before[-7,-4]", foo, Boolean.TRUE}, {drool, "before[-6,-4]", foo, Boolean.FALSE}, {foo, "not before[2,4]", drool, Boolean.FALSE}, {foo, "not before[3,4]", drool, Boolean.TRUE},
+                {foo, "not before[-1,1]", bar, Boolean.FALSE}, {foo, "not before[0,-2]", bar, Boolean.TRUE}, {bar, "not before[0,4]", drool, Boolean.FALSE}, {bar, "not before[2,4]", drool, Boolean.TRUE},
+                {bar, "not before[-4,0]", foo, Boolean.FALSE}, {bar, "not before[-2,0]", foo, Boolean.TRUE}, {drool, "not before[-6,-3]", bar, Boolean.FALSE}, {drool, "not before[-5,-3]", bar, Boolean.TRUE},
+                {drool, "not before[-7,-4]", foo, Boolean.FALSE}, {drool, "not before[-6,-4]", foo, Boolean.TRUE}};
 
-		runEvaluatorTest(data, ValueType.OBJECT_TYPE);
-	}
+        runEvaluatorTest( data,
+                          ValueType.OBJECT_TYPE );
+    }
 
-	public void testCoincides() {
-		registry
-				.addEvaluatorDefinition("org.drools.base.evaluators.CoincidesEvaluatorDefinition");
+    public void testCoincides() {
+        registry.addEvaluatorDefinition( "org.drools.base.evaluators.CoincidesEvaluatorDefinition" );
 
-		EventFactHandle foo = new EventFactHandle(1, "foo", 1, 2, 3);
-		EventFactHandle bar = new EventFactHandle(2, "bar", 1, 2, 3);
-		EventFactHandle drool = new EventFactHandle(1, "drool", 1, 2, 2);
-		EventFactHandle mole = new EventFactHandle(1, "mole", 1, 1, 2);
+        EventFactHandle foo = new EventFactHandle( 1,
+                                                   "foo",
+                                                   1,
+                                                   2,
+                                                   3 );
+        EventFactHandle bar = new EventFactHandle( 2,
+                                                   "bar",
+                                                   1,
+                                                   2,
+                                                   3 );
+        EventFactHandle drool = new EventFactHandle( 1,
+                                                     "drool",
+                                                     1,
+                                                     2,
+                                                     2 );
+        EventFactHandle mole = new EventFactHandle( 1,
+                                                    "mole",
+                                                    1,
+                                                    1,
+                                                    2 );
 
-		final Object[][] data = {
-				{ foo, "coincides", bar, Boolean.TRUE },
-				{ foo, "coincides", drool, Boolean.FALSE },
-				{ foo, "coincides", mole, Boolean.FALSE },
-				{ drool, "coincides", mole, Boolean.FALSE },
-				{ foo, "not coincides", bar, Boolean.FALSE },
-				{ foo, "not coincides", drool, Boolean.TRUE },
-				{ foo, "not coincides", mole, Boolean.TRUE },
-				{ drool, "not coincides", mole, Boolean.TRUE },
-				{ foo, "coincides[1]", bar, Boolean.TRUE },
-				{ foo, "coincides[1]", drool, Boolean.TRUE },
-				{ foo, "coincides[2]", mole, Boolean.TRUE },
-				{ foo, "coincides[1]", mole, Boolean.FALSE },
-				{ drool, "coincides[1]", mole, Boolean.TRUE },
-				{ foo, "not coincides[1]", bar, Boolean.FALSE },
-				{ foo, "not coincides[1]", drool, Boolean.FALSE },
-				{ foo, "not coincides[2]", mole, Boolean.FALSE },
-				{ foo, "not coincides[1]", mole, Boolean.TRUE },
-				{ drool, "not coincides[1]", mole, Boolean.FALSE },
-				{ foo, "coincides[1,2]", bar, Boolean.TRUE },
-				{ foo, "coincides[0,1]", drool, Boolean.TRUE },
-				{ foo, "coincides[1,0]", drool, Boolean.FALSE },
-				{ foo, "coincides[1,2]", mole, Boolean.TRUE },
-				{ foo, "coincides[1,1]", mole, Boolean.FALSE},
-				{ drool, "coincides[1,1]", mole, Boolean.TRUE },
-				{ drool, "coincides[0,1]", mole, Boolean.FALSE },
-				{ foo, "not coincides[1,2]", bar, Boolean.FALSE },
-				{ foo, "not coincides[0,1]", drool, Boolean.FALSE },
-				{ foo, "not coincides[1,0]", drool, Boolean.TRUE},
-				{ foo, "not coincides[1,2]", mole, Boolean.FALSE },
-				{ foo, "not coincides[1,1]", mole, Boolean.TRUE },
-				{ drool, "not coincides[1,1]", mole, Boolean.FALSE },
-				{ drool, "not coincides[0,1]", mole, Boolean.TRUE }
-		};
+        final Object[][] data = {{foo, "coincides", bar, Boolean.TRUE}, {foo, "coincides", drool, Boolean.FALSE}, {foo, "coincides", mole, Boolean.FALSE}, {drool, "coincides", mole, Boolean.FALSE}, {foo, "not coincides", bar, Boolean.FALSE},
+                {foo, "not coincides", drool, Boolean.TRUE}, {foo, "not coincides", mole, Boolean.TRUE}, {drool, "not coincides", mole, Boolean.TRUE}, {foo, "coincides[1]", bar, Boolean.TRUE}, {foo, "coincides[1]", drool, Boolean.TRUE},
+                {foo, "coincides[2]", mole, Boolean.TRUE}, {foo, "coincides[1]", mole, Boolean.FALSE}, {drool, "coincides[1]", mole, Boolean.TRUE}, {foo, "not coincides[1]", bar, Boolean.FALSE}, {foo, "not coincides[1]", drool, Boolean.FALSE},
+                {foo, "not coincides[2]", mole, Boolean.FALSE}, {foo, "not coincides[1]", mole, Boolean.TRUE}, {drool, "not coincides[1]", mole, Boolean.FALSE}, {foo, "coincides[1,2]", bar, Boolean.TRUE},
+                {foo, "coincides[0,1]", drool, Boolean.TRUE}, {foo, "coincides[1,0]", drool, Boolean.FALSE}, {foo, "coincides[1,2]", mole, Boolean.TRUE}, {foo, "coincides[1,1]", mole, Boolean.FALSE}, {drool, "coincides[1,1]", mole, Boolean.TRUE},
+                {drool, "coincides[0,1]", mole, Boolean.FALSE}, {foo, "not coincides[1,2]", bar, Boolean.FALSE}, {foo, "not coincides[0,1]", drool, Boolean.FALSE}, {foo, "not coincides[1,0]", drool, Boolean.TRUE},
+                {foo, "not coincides[1,2]", mole, Boolean.FALSE}, {foo, "not coincides[1,1]", mole, Boolean.TRUE}, {drool, "not coincides[1,1]", mole, Boolean.FALSE}, {drool, "not coincides[0,1]", mole, Boolean.TRUE}};
 
-		runEvaluatorTest(data, ValueType.OBJECT_TYPE);
-	}
+        runEvaluatorTest( data,
+                          ValueType.OBJECT_TYPE );
+    }
 
-	private void runEvaluatorTest(final Object[][] data,
-			final ValueType valueType) {
-		final Extractor extractor = new MockExtractor();
-		for (int i = 0; i < data.length; i++) {
-			final Object[] row = data[i];
-			boolean isNegated = ((String) row[1]).startsWith("not ");
-			System.out.println((String) row[1]);
-			String evaluatorStr = isNegated ? ((String) row[1]).substring(4)
-					: (String) row[1];
-			boolean isConstrained = evaluatorStr.endsWith("]");
-			String parameters = null;
-			if (isConstrained) {
-				parameters = evaluatorStr.split("\\[")[1];
-				evaluatorStr = evaluatorStr.split("\\[")[0];
-				parameters = parameters.split("\\]")[0];
-			}
-			EvaluatorDefinition evalDef = registry
-					.getEvaluatorDefinition(evaluatorStr);
-			assertNotNull(evalDef);
-			@SuppressWarnings("unused")
-			final Evaluator evaluator = evalDef.getEvaluator(valueType,
-					evaluatorStr, isNegated, parameters);
-			System.out.println(evaluator);
+    private void runEvaluatorTest(final Object[][] data,
+                                  final ValueType valueType) {
+        final InternalReadAccessor extractor = new MockExtractor();
+        for ( int i = 0; i < data.length; i++ ) {
+            final Object[] row = data[i];
+            boolean isNegated = ((String) row[1]).startsWith( "not " );
+            //			System.out.println((String) row[1]);
+            String evaluatorStr = isNegated ? ((String) row[1]).substring( 4 ) : (String) row[1];
+            boolean isConstrained = evaluatorStr.endsWith( "]" );
+            String parameters = null;
+            if ( isConstrained ) {
+                parameters = evaluatorStr.split( "\\[" )[1];
+                evaluatorStr = evaluatorStr.split( "\\[" )[0];
+                parameters = parameters.split( "\\]" )[0];
+            }
+            EvaluatorDefinition evalDef = registry.getEvaluatorDefinition( evaluatorStr );
+            assertNotNull( evalDef );
+            @SuppressWarnings("unused")
+            final Evaluator evaluator = evalDef.getEvaluator( valueType,
+                                                              evaluatorStr,
+                                                              isNegated,
+                                                              parameters );
+            //			System.out.println(evaluator);
 
-			checkEvaluatorMethodWith2Extractors(valueType, extractor, row,
-					evaluator);
-			checkEvaluatorMethodCachedRight(valueType, extractor, row,
-					evaluator);
-			checkEvaluatorMethodCachedLeft(valueType, extractor, row, evaluator);
-			checkEvaluatorMethodWithFieldValue(valueType, extractor, row, evaluator);
+            checkEvaluatorMethodWith2Extractors( valueType,
+                                                 extractor,
+                                                 row,
+                                                 evaluator );
+            checkEvaluatorMethodCachedRight( valueType,
+                                             extractor,
+                                             row,
+                                             evaluator );
+            checkEvaluatorMethodCachedLeft( valueType,
+                                            extractor,
+                                            row,
+                                            evaluator );
+            checkEvaluatorMethodWithFieldValue( valueType,
+                                                extractor,
+                                                row,
+                                                evaluator );
 
+            assertEquals( valueType,
+                          evaluator.getValueType() );
 
-			assertEquals(valueType, evaluator.getValueType());
+        }
+    }
 
-		}
-	}
+    private void checkEvaluatorMethodWith2Extractors(final ValueType valueType,
+                                                     final InternalReadAccessor extractor,
+                                                     final Object[] row,
+                                                     final Evaluator evaluator) {
+        final boolean result = evaluator.evaluate( null,
+                                                   extractor,
+                                                   row[0],
+                                                   extractor,
+                                                   row[2] );
+        final String message = "The evaluator type: [" + valueType + "] with 2 extractors incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
-	private void checkEvaluatorMethodWith2Extractors(final ValueType valueType,
-			final Extractor extractor, final Object[] row,
-			final Evaluator evaluator) {
-		final boolean result = evaluator.evaluate(null, extractor, row[0],
-				extractor, row[2]);
-		final String message = "The evaluator type: [" + valueType
-				+ "] with 2 extractors incorrectly returned " + result
-				+ " for [" + row[0] + " " + row[1] + " " + row[2]
-				+ "]. It was asserted to return " + row[3];
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
 
-		if (row[3] == Boolean.TRUE) {
-			assertTrue(message, result);
-		} else {
-			assertFalse(message, result);
-		}
-	}
+    private void checkEvaluatorMethodCachedRight(final ValueType valueType,
+                                                 final InternalReadAccessor extractor,
+                                                 final Object[] row,
+                                                 final Evaluator evaluator) {
+        final VariableContextEntry context = this.getContextEntry( evaluator,
+                                                                   extractor,
+                                                                   valueType,
+                                                                   row );
+        final boolean result = evaluator.evaluateCachedRight( null,
+                                                              context,
+                                                              row[2] );
+        final String message = "The evaluator type: [" + valueType + "] with CachedRight incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
-	private void checkEvaluatorMethodCachedRight(final ValueType valueType,
-			final Extractor extractor, final Object[] row,
-			final Evaluator evaluator) {
-		final VariableContextEntry context = this.getContextEntry(evaluator,
-				(FieldExtractor) extractor, valueType, row);
-		final boolean result = evaluator.evaluateCachedRight(null, context,
-				row[2]);
-		final String message = "The evaluator type: [" + valueType
-				+ "] with CachedRight incorrectly returned " + result
-				+ " for [" + row[0] + " " + row[1] + " " + row[2]
-				+ "]. It was asserted to return " + row[3];
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
 
-		if (row[3] == Boolean.TRUE) {
-			assertTrue(message, result);
-		} else {
-			assertFalse(message, result);
-		}
-	}
+    private void checkEvaluatorMethodCachedLeft(final ValueType valueType,
+                                                final InternalReadAccessor extractor,
+                                                final Object[] row,
+                                                final Evaluator evaluator) {
+        final VariableContextEntry context = this.getContextEntry( evaluator,
+                                                                   extractor,
+                                                                   valueType,
+                                                                   row );
+        final boolean result = evaluator.evaluateCachedLeft( null,
+                                                             context,
+                                                             row[0] );
+        final String message = "The evaluator type: [" + valueType + "] with CachedLeft incorrectly returned " + result + " for [" + row[0] + " " + row[1] + " " + row[2] + "]. It was asserted to return " + row[3];
 
-	private void checkEvaluatorMethodCachedLeft(final ValueType valueType,
-			final Extractor extractor, final Object[] row,
-			final Evaluator evaluator) {
-		final VariableContextEntry context = this.getContextEntry(evaluator,
-				(FieldExtractor) extractor, valueType, row);
-		final boolean result = evaluator.evaluateCachedLeft(null, context,
-				row[0]);
-		final String message = "The evaluator type: [" + valueType
-				+ "] with CachedLeft incorrectly returned " + result + " for ["
-				+ row[0] + " " + row[1] + " " + row[2]
-				+ "]. It was asserted to return " + row[3];
+        if ( row[3] == Boolean.TRUE ) {
+            assertTrue( message,
+                        result );
+        } else {
+            assertFalse( message,
+                         result );
+        }
+    }
 
-		if (row[3] == Boolean.TRUE) {
-			assertTrue(message, result);
-		} else {
-			assertFalse(message, result);
-		}
-	}
+    private void checkEvaluatorMethodWithFieldValue(final ValueType valueType,
+                                                    final InternalReadAccessor extractor,
+                                                    final Object[] row,
+                                                    final Evaluator evaluator) {
+        final FieldValue value = FieldFactory.getFieldValue( row[2] );
+        RuntimeDroolsException exc = null;
+        try {
+            final boolean result = evaluator.evaluate( null,
+                                                       extractor,
+                                                       row[0],
+                                                       value );
+        } catch ( RuntimeDroolsException e ) {
+            exc = e;
+        }
+        assertNotNull( exc );
+    }
 
-	private void checkEvaluatorMethodWithFieldValue(final ValueType valueType,
-			final Extractor extractor, final Object[] row,
-			final Evaluator evaluator) {
-		final FieldValue value = FieldFactory.getFieldValue(row[2]);
-		RuntimeDroolsException exc = null;
-		try {
-			final boolean result = evaluator.evaluate(null, extractor, row[0],
-				value);
-		} catch (RuntimeDroolsException e) {
-			exc = e;
-		}
-		assertNotNull(exc);
-	}
+    private VariableContextEntry getContextEntry(final Evaluator evaluator,
+                                                 final InternalReadAccessor extractor,
+                                                 final ValueType valueType,
+                                                 final Object[] row) {
+        final Declaration declaration = new Declaration( "test",
+                                                         extractor,
+                                                         null );
+        final ValueType coerced = evaluator.getCoercedValueType();
 
-	private VariableContextEntry getContextEntry(final Evaluator evaluator,
-			final FieldExtractor extractor, final ValueType valueType,
-			final Object[] row) {
-		final Declaration declaration = new Declaration("test", extractor, null);
-		final ValueType coerced = evaluator.getCoercedValueType();
+        if ( coerced.isIntegerNumber() ) {
+            final LongVariableContextEntry context = new LongVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
 
-		if (coerced.isIntegerNumber()) {
-			final LongVariableContextEntry context = new LongVariableContextEntry(
-					extractor, declaration, evaluator);
+            if ( row[2] == null ) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).longValue();
+            }
 
-			if (row[2] == null) {
-				context.leftNull = true;
-			} else {
-				context.left = ((Number) row[2]).longValue();
-			}
+            if ( row[0] == null ) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Number) row[0]).longValue();
+            }
+            return context;
+        } else if ( coerced.isChar() ) {
+            final CharVariableContextEntry context = new CharVariableContextEntry( extractor,
+                                                                                   declaration,
+                                                                                   evaluator );
 
-			if (row[0] == null) {
-				context.rightNull = true;
-			} else {
-				context.right = ((Number) row[0]).longValue();
-			}
-			return context;
-		} else if (coerced.isChar()) {
-			final CharVariableContextEntry context = new CharVariableContextEntry(
-					extractor, declaration, evaluator);
+            if ( row[2] == null ) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Character) row[2]).charValue();
+            }
 
-			if (row[2] == null) {
-				context.leftNull = true;
-			} else {
-				context.left = ((Character) row[2]).charValue();
-			}
+            if ( row[0] == null ) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Character) row[0]).charValue();
+            }
+            return context;
+        } else if ( coerced.isBoolean() ) {
+            final BooleanVariableContextEntry context = new BooleanVariableContextEntry( extractor,
+                                                                                         declaration,
+                                                                                         evaluator );
 
-			if (row[0] == null) {
-				context.rightNull = true;
-			} else {
-				context.right = ((Character) row[0]).charValue();
-			}
-			return context;
-		} else if (coerced.isBoolean()) {
-			final BooleanVariableContextEntry context = new BooleanVariableContextEntry(
-					extractor, declaration, evaluator);
+            if ( row[2] == null ) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Boolean) row[2]).booleanValue();
+            }
 
-			if (row[2] == null) {
-				context.leftNull = true;
-			} else {
-				context.left = ((Boolean) row[2]).booleanValue();
-			}
+            if ( row[0] == null ) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Boolean) row[0]).booleanValue();
+            }
+            return context;
+        } else if ( coerced.isFloatNumber() ) {
+            final DoubleVariableContextEntry context = new DoubleVariableContextEntry( extractor,
+                                                                                       declaration,
+                                                                                       evaluator );
+            if ( row[2] == null ) {
+                context.leftNull = true;
+            } else {
+                context.left = ((Number) row[2]).doubleValue();
+            }
 
-			if (row[0] == null) {
-				context.rightNull = true;
-			} else {
-				context.right = ((Boolean) row[0]).booleanValue();
-			}
-			return context;
-		} else if (coerced.isFloatNumber()) {
-			final DoubleVariableContextEntry context = new DoubleVariableContextEntry(
-					extractor, declaration, evaluator);
-			if (row[2] == null) {
-				context.leftNull = true;
-			} else {
-				context.left = ((Number) row[2]).doubleValue();
-			}
+            if ( row[0] == null ) {
+                context.rightNull = true;
+            } else {
+                context.right = ((Number) row[0]).doubleValue();
+            }
+            return context;
+        } else {
+            final ObjectVariableContextEntry context = new ObjectVariableContextEntry( extractor,
+                                                                                       declaration,
+                                                                                       evaluator );
+            if ( row[2] == null ) {
+                context.leftNull = true;
+            } else {
+                context.left = row[2];
+            }
 
-			if (row[0] == null) {
-				context.rightNull = true;
-			} else {
-				context.right = ((Number) row[0]).doubleValue();
-			}
-			return context;
-		} else {
-			final ObjectVariableContextEntry context = new ObjectVariableContextEntry(
-					extractor, declaration, evaluator);
-			if (row[2] == null) {
-				context.leftNull = true;
-			} else {
-				context.left = row[2];
-			}
+            if ( row[0] == null ) {
+                context.rightNull = true;
+            } else {
+                context.right = row[0];
+            }
+            return context;
+        }
+    }
 
-			if (row[0] == null) {
-				context.rightNull = true;
-			} else {
-				context.right = row[0];
-			}
-			return context;
-		}
-	}
+    public static class MockExtractor
+        implements
+        InternalReadAccessor {
 
-	public static class MockExtractor implements FieldExtractor {
+        private static final long serialVersionUID = 400L;
 
-		private static final long serialVersionUID = 400L;
-
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
         }
-		public boolean getBooleanValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Boolean) object).booleanValue() : false;
-		}
 
-		public byte getByteValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).byteValue() : (byte) 0;
-		}
+        public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+                                       final Object object) {
+            return object != null ? ((Boolean) object).booleanValue() : false;
+        }
 
-		public char getCharValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Character) object).charValue() : '\0';
-		}
+        public byte getByteValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
+            return object != null ? ((Number) object).byteValue() : (byte) 0;
+        }
 
-		public double getDoubleValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).doubleValue() : 0.0;
-		}
+        public char getCharValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
+            return object != null ? ((Character) object).charValue() : '\0';
+        }
 
-		public Class getExtractToClass() {
-			return null;
-		}
+        public double getDoubleValue(InternalWorkingMemory workingMemory,
+                                     final Object object) {
+            return object != null ? ((Number) object).doubleValue() : 0.0;
+        }
 
-		public String getExtractToClassName() {
-			return null;
-		}
+        public Class getExtractToClass() {
+            return null;
+        }
 
-		public float getFloatValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).floatValue()
-					: (float) 0.0;
-		}
+        public String getExtractToClassName() {
+            return null;
+        }
 
-		public int getHashCode(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return 0;
-		}
+        public float getFloatValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
+            return object != null ? ((Number) object).floatValue() : (float) 0.0;
+        }
 
-		public int getIntValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).intValue() : 0;
-		}
+        public int getHashCode(InternalWorkingMemory workingMemory,
+                               final Object object) {
+            return 0;
+        }
 
-		public long getLongValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).longValue() : 0;
-		}
+        public int getIntValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+            return object != null ? ((Number) object).intValue() : 0;
+        }
 
-		public Method getNativeReadMethod() {
-			return null;
-		}
+        public long getLongValue(InternalWorkingMemory workingMemory,
+                                 final Object object) {
+            return object != null ? ((Number) object).longValue() : 0;
+        }
 
-		public short getShortValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object != null ? ((Number) object).shortValue() : (short) 0;
-		}
+        public Method getNativeReadMethod() {
+            return null;
+        }
 
-		public Object getValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object;
-		}
+        public short getShortValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
+            return object != null ? ((Number) object).shortValue() : (short) 0;
+        }
 
-		public boolean isNullValue(InternalWorkingMemory workingMemory,
-				final Object object) {
-			return object == null;
-		}
+        public Object getValue(InternalWorkingMemory workingMemory,
+                               final Object object) {
+            return object;
+        }
 
-		public ValueType getValueType() {
-			// TODO Auto-generated method stub
-			return null;
-		}
+        public boolean isNullValue(InternalWorkingMemory workingMemory,
+                                   final Object object) {
+            return object == null;
+        }
 
-		public int getIndex() {
-			return 0;
-		}
+        public ValueType getValueType() {
+            // TODO Auto-generated method stub
+            return null;
+        }
 
-		public boolean isGlobal() {
-			return false;
-		}
+        public int getIndex() {
+            return 0;
+        }
 
-	}
+        public boolean isGlobal() {
+            return false;
+        }
 
+        public boolean getBooleanValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+        public byte getByteValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public char getCharValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public double getDoubleValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public float getFloatValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getHashCode(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getIntValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public long getLongValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public short getShortValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public Object getValue(Object object) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public boolean isNullValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,12 +2,12 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class BooleanClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    Extractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                "booleanAttr",
                                                                                getClass().getClassLoader() );
     TestBean  bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,12 +2,12 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class ByteClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    Extractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                "byteAttr",
                                                                                getClass().getClassLoader() );
     TestBean  bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,12 +2,12 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class CharClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    Extractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                "charAttr",
                                                                                getClass().getClassLoader() );
     TestBean  bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,14 +2,14 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class DoubleClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final double VALUE     = 7;
 
-    Extractor                   extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor                   extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                                  "doubleAttr",
                                                                                                  getClass().getClassLoader() );
     TestBean                    bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,14 +2,14 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class FloatClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final float VALUE     = 6;
 
-    Extractor                  extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor                  extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                                 "floatAttr",
                                                                                                 getClass().getClassLoader() );
     TestBean                   bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,14 +2,14 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class IntClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final int VALUE     = 4;
 
-    Extractor                extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor                extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                               "intAttr",
                                                                                               getClass().getClassLoader() );
     TestBean                 bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,14 +2,14 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class LongClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final long VALUE     = 5;
 
-    Extractor                 extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor                 extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                                "longAttr",
                                                                                                getClass().getClassLoader() );
     TestBean                  bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -7,12 +7,12 @@
 
 import org.drools.Address;
 import org.drools.Person;
-import org.drools.base.ClassFieldExtractorCache;
-import org.drools.spi.Extractor;
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.spi.InternalReadAccessor;
 
 public class MVELClassFieldExtractorTest extends TestCase {
 
-    Extractor               extractor = ClassFieldExtractorCache.getInstance().getExtractor( Person.class,
+    InternalReadAccessor               extractor = ClassFieldAccessorCache.getInstance().getReader( Person.class,
                                                                                              "addresses['home'].street",
                                                                                              getClass().getClassLoader() );
     private final Person[]  person    = new Person[2];
@@ -146,7 +146,7 @@
             Assert.assertFalse( this.extractor.isNullValue( null,
                                                             this.person[0] ) );
 
-            Extractor nullExtractor = ClassFieldExtractorCache.getInstance().getExtractor( Person.class,
+            InternalReadAccessor nullExtractor = ClassFieldAccessorCache.getInstance().getReader( Person.class,
                                                                                            "addresses['business'].phone",
                                                                                            getClass().getClassLoader() );
             Assert.assertTrue( nullExtractor.isNullValue( null,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -5,13 +5,13 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class ObjectClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
 
-    Extractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                "listAttr",
                                                                                getClass().getClassLoader() );
     TestBean  bean      = new TestBean();
@@ -117,7 +117,7 @@
             Assert.assertFalse( this.extractor.isNullValue( null,
                                                             this.bean ) );
 
-            Extractor nullExtractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+            InternalReadAccessor nullExtractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                            "nullAttr",
                                                                                            getClass().getClassLoader() );
             Assert.assertTrue( nullExtractor.isNullValue( null,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -2,14 +2,14 @@
 
 import junit.framework.Assert;
 
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.TestBean;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class ShortClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final short VALUE     = 3;
 
-    Extractor                  extractor = ClassFieldExtractorCache.getInstance().getExtractor( TestBean.class,
+    InternalReadAccessor                  extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
                                                                                                 "shortAttr",
                                                                                                 getClass().getClassLoader() );
     TestBean                   bean      = new TestBean();

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -6,7 +6,7 @@
 import junit.framework.TestCase;
 
 import org.drools.RuleBaseConfiguration;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.evaluators.ComparableEvaluatorsDefinition;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -21,18 +21,18 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.spi.BetaNodeFieldConstraint;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.util.LeftTupleIndexHashTable;
+import org.drools.util.LeftTupleList;
+import org.drools.util.LinkedList;
+import org.drools.util.LinkedListEntry;
 import org.drools.util.RightTupleIndexHashTable;
 import org.drools.util.RightTupleList;
-import org.drools.util.LinkedList;
-import org.drools.util.LinkedListEntry;
-import org.drools.util.LeftTupleList;
-import org.drools.util.LeftTupleIndexHashTable;
 import org.drools.util.AbstractHashTable.FieldIndex;
 import org.drools.util.AbstractHashTable.Index;
 
 public abstract class BaseBetaConstraintsTest extends TestCase {
-    
+
     public static EvaluatorRegistry registry = new EvaluatorRegistry();
     static {
         registry.addEvaluatorDefinition( new EqualityEvaluatorsDefinition() );
@@ -46,16 +46,16 @@
                                                     Operator operator,
                                                     String fieldName,
                                                     Class clazz) {
-        FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( clazz,
-                                                                                        fieldName,
-                                                                                        getClass().getClassLoader() );
+        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
+                                                                                          fieldName,
+                                                                                          getClass().getClassLoader() );
         Declaration declaration = new Declaration( identifier,
                                                    extractor,
                                                    new Pattern( 0,
                                                                 new ClassObjectType( clazz ) ) );
-        Evaluator evaluator = registry.getEvaluatorDefinition( operator.getOperatorString() ).getEvaluator( extractor.getValueType(), 
-                                                                                                            operator.getOperatorString(), 
-                                                                                                            operator.isNegated(), 
+        Evaluator evaluator = registry.getEvaluatorDefinition( operator.getOperatorString() ).getEvaluator( extractor.getValueType(),
+                                                                                                            operator.getOperatorString(),
+                                                                                                            operator.isNegated(),
                                                                                                             null );
         return new VariableConstraint( extractor,
                                        declaration,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -30,8 +30,8 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ShadowProxy;
@@ -81,7 +81,7 @@
         final Pattern pattern = new Pattern( 0,
                                              cheeseObjectType );
 
-        final ClassFieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+        final ClassFieldReader extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
                                                                                                    "type",
                                                                                                    getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -23,8 +23,8 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
@@ -71,7 +71,7 @@
         final Pattern pattern = new Pattern( 0,
                                              cheeseObjectType );
 
-        final ClassFieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+        final ClassFieldReader extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
                                                                                                    "type",
                                                                                                    getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -24,9 +24,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.StringWriter;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
@@ -35,7 +35,7 @@
 import junit.framework.TestCase;
 
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -57,8 +57,8 @@
 import org.drools.spi.Consequence;
 import org.drools.spi.ConsequenceException;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.KnowledgeHelper;
 import org.drools.spi.Tuple;
 
@@ -242,7 +242,7 @@
 
                     drools.modifyInsert( context );
 
-                    System.err.println( "assign first seat :  " + seating + " : " + path );
+//                    System.err.println( "assign first seat :  " + seating + " : " + path );
 
                 } catch ( Exception e ) {
                     e.printStackTrace();
@@ -533,7 +533,7 @@
                     drools.update( tuple.get( contextDeclaration ),
                                    context );
 
-                    System.err.println( "find seating : " + seating + " : " + path + " : " + chosen );
+//                    System.err.println( "find seating : " + seating + " : " + path + " : " + chosen );
 
                 } catch ( Exception e ) {
                     e.printStackTrace();
@@ -887,7 +887,7 @@
                     drools.update( tuple.get( contextDeclaration ),
                                    context );
 
-                    System.err.println( "We Are Done!!!" );
+//                    System.err.println( "We Are Done!!!" );
                 } catch ( Exception e ) {
                     throw new ConsequenceException( e );
                 }
@@ -1166,7 +1166,7 @@
                                                           final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( clazz,
+        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
                                                                                               fieldName,
                                                                                               getClass().getClassLoader() );
 
@@ -1183,7 +1183,7 @@
                                                           final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( clazz,
+        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
                                                                                               fieldName,
                                                                                               getClass().getClassLoader() );
 
@@ -1199,7 +1199,7 @@
                                      final String identifier) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( clazz,
+        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
                                                                                               fieldName,
                                                                                               getClass().getClassLoader() );
 
@@ -1213,7 +1213,7 @@
                                                                final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( clazz,
+        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
                                                                                               fieldName,
                                                                                               getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/ReteooMannersTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -76,7 +76,7 @@
 
         final long start = System.currentTimeMillis();
         workingMemory.fireAllRules();
-        System.err.println( System.currentTimeMillis() - start );
+//        System.err.println( System.currentTimeMillis() - start );
 
         //System.out.println( listener );
 

Deleted: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/FieldAccessorBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/FieldAccessorBuilderTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/FieldAccessorBuilderTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,319 +0,0 @@
-package org.drools.factmodel;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-public class FieldAccessorBuilderTest extends TestCase {
-    FieldAccessorBuilder builder;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        this.builder = new FieldAccessorBuilder();
-    }
-
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    /*
-     * Test method for 'br.com.auster.common.asm.FieldAccessorBuilder.buildFieldAccessor(ClassDefinition, FieldDefinition)'
-     */
-    public void testBuildFieldAccessor() {
-        try {
-            FieldAccessor intAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                           "intAttr" ).newInstance();
-            FieldAccessor strAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                           "strAttr" ).newInstance();
-
-            String testString1 = "TestAttr1";
-            String testString2 = "TestAttr2";
-            TestClass instance = new TestClass();
-            instance.setIntAttr( 10 );
-            instance.setStrAttr( testString1 );
-
-            Assert.assertEquals( "Error reading int attr",
-                                 10,
-                                 ((Integer) intAccessor.getValue( instance )).intValue() );
-            Assert.assertEquals( "Error reading String attr",
-                                 testString1,
-                                 strAccessor.getValue( instance ) );
-
-            intAccessor.setValue( instance,
-                                  new Integer( 50 ) );
-            strAccessor.setValue( instance,
-                                  testString2 );
-
-            Assert.assertEquals( "Error setting int attr",
-                                 50,
-                                 instance.getIntAttr() );
-            Assert.assertEquals( "Error setting String attr",
-                                 testString2,
-                                 instance.getStrAttr() );
-
-            Assert.assertEquals( "Error reading int attr",
-                                 50,
-                                 ((Integer) intAccessor.getValue( instance )).intValue() );
-            Assert.assertEquals( "Error reading String attr",
-                                 testString2,
-                                 strAccessor.getValue( instance ) );
-
-        } catch ( Exception e ) {
-            e.printStackTrace();
-            Assert.fail( "No exception is supposed to be generated when creating field accessor: " + e );
-        }
-    }
-
-    public void testNullOnPrimitives() {
-        try {
-            FieldAccessor intAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                    "intAttr" ).newInstance();
-            FieldAccessor strAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                    "strAttr" ).newInstance();
-            FieldAccessor byteAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                     "byteAttr" ).newInstance();
-            FieldAccessor booleanAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                        "booleanAttr" ).newInstance();
-            FieldAccessor charAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                     "charAttr" ).newInstance();
-            FieldAccessor doubleAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                       "doubleAttr" ).newInstance();
-            FieldAccessor floatAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                      "floatAttr" ).newInstance();
-            FieldAccessor longAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                     "longAttr" ).newInstance();
-            FieldAccessor shortAccessor = (FieldAccessor) builder.buildAndLoadFieldAccessor( TestClass.class,
-                                                                                      "shortAttr" ).newInstance();
-
-            String testString1 = "TestAttr1";
-            TestClass instance = new TestClass();
-            instance.setIntAttr( 25 );
-            instance.setStrAttr( testString1 );
-            instance.setByteAttr( (byte) 10 );
-            instance.setBooleanAttr( true );
-            instance.setCharAttr( 'x' );
-            instance.setDoubleAttr( 10.5d );
-            instance.setFloatAttr( 40.3f );
-            instance.setLongAttr( 43l );
-            instance.setShortAttr( (short) 20 );
-
-            intAccessor.setValue( instance,
-                                  null );
-            strAccessor.setValue( instance,
-                                  null );
-            byteAccessor.setValue( instance,
-                                   null );
-            booleanAccessor.setValue( instance,
-                                      null );
-            charAccessor.setValue( instance,
-                                   null );
-            doubleAccessor.setValue( instance,
-                                     null );
-            floatAccessor.setValue( instance,
-                                    null );
-            longAccessor.setValue( instance,
-                                   null );
-            shortAccessor.setValue( instance,
-                                    null );
-
-            Assert.assertEquals( "Error setting attr",
-                                 0,
-                                 instance.getIntAttr() );
-            Assert.assertNull( "Error setting attr",
-                               instance.getStrAttr() );
-            Assert.assertEquals( "Error setting attr",
-                                 0,
-                                 instance.getByteAttr() );
-            Assert.assertEquals( "Error setting attr",
-                                 false,
-                                 instance.isBooleanAttr() );
-            Assert.assertEquals( "Error setting attr",
-                                 '\0',
-                                 instance.getCharAttr() );
-            Assert.assertEquals( "Error setting attr",
-                                 0.0d,
-                                 instance.getDoubleAttr(),
-                                 0.1d );
-            Assert.assertEquals( "Error setting attr",
-                                 0.0f,
-                                 instance.getFloatAttr(),
-                                 0.1f );
-            Assert.assertEquals( "Error setting attr",
-                                 0l,
-                                 instance.getLongAttr() );
-            Assert.assertEquals( "Error setting attr",
-                                 (short) 0,
-                                 instance.getShortAttr() );
-
-            Assert.assertEquals( "Error reading int attr",
-                                 0,
-                                 ((Integer) intAccessor.getValue( instance )).intValue() );
-            Assert.assertNull( "Error reading String attr",
-                               strAccessor.getValue( instance ) );
-            Assert.assertEquals( "Error reading attr",
-                                 0,
-                                 ((Byte) byteAccessor.getValue( instance )).byteValue() );
-            Assert.assertEquals( "Error reading attr",
-                                 false,
-                                 ((Boolean) booleanAccessor.getValue( instance )).booleanValue() );
-            Assert.assertEquals( "Error reading attr",
-                                 '\0',
-                                 ((Character) charAccessor.getValue( instance )).charValue() );
-            Assert.assertEquals( "Error reading attr",
-                                 0.0d,
-                                 ((Double) doubleAccessor.getValue( instance )).doubleValue(),
-                                 0.1d );
-            Assert.assertEquals( "Error reading attr",
-                                 0.0f,
-                                 ((Float) floatAccessor.getValue( instance )).floatValue(),
-                                 0.1f );
-            Assert.assertEquals( "Error reading attr",
-                                 0l,
-                                 ((Long) longAccessor.getValue( instance )).longValue() );
-            Assert.assertEquals( "Error reading attr",
-                                 (short) 0,
-                                 ((Short) shortAccessor.getValue( instance )).shortValue() );
-
-        } catch ( Exception e ) {
-            e.printStackTrace();
-            Assert.fail( "No exception is supposed to be generated when creating field accessor: " + e );
-        }
-    }
-
-    public static class TestClass {
-        private int     intAttr;
-        private String  strAttr;
-        private byte    byteAttr;
-        private boolean booleanAttr;
-        private char    charAttr;
-        private double  doubleAttr;
-        private float   floatAttr;
-        private long    longAttr;
-        private short   shortAttr;
-
-        /**
-         * @return Returns the intAttr.
-         */
-        public int getIntAttr() {
-            return intAttr;
-        }
-
-        /**
-         * @param intAttr The intAttr to set.
-         */
-        public void setIntAttr(int intAttr) {
-            this.intAttr = intAttr;
-        }
-
-        /**
-         * @return Returns the strAttr.
-         */
-        public String getStrAttr() {
-            return strAttr;
-        }
-
-        /**
-         * @param strAttr The strAttr to set.
-         */
-        public void setStrAttr(String strAttr) {
-            this.strAttr = strAttr;
-        }
-
-        /**
-         * @return Returns the booleanAttr.
-         */
-        public boolean isBooleanAttr() {
-            return booleanAttr;
-        }
-
-        /**
-         * @param booleanAttr The booleanAttr to set.
-         */
-        public void setBooleanAttr(boolean booleanAttr) {
-            this.booleanAttr = booleanAttr;
-        }
-
-        /**
-         * @return Returns the byteAttr.
-         */
-        public byte getByteAttr() {
-            return byteAttr;
-        }
-
-        /**
-         * @param byteAttr The byteAttr to set.
-         */
-        public void setByteAttr(byte byteAttr) {
-            this.byteAttr = byteAttr;
-        }
-
-        /**
-         * @return Returns the charAttr.
-         */
-        public char getCharAttr() {
-            return charAttr;
-        }
-
-        /**
-         * @param charAttr The charAttr to set.
-         */
-        public void setCharAttr(char charAttr) {
-            this.charAttr = charAttr;
-        }
-
-        /**
-         * @return Returns the doubleAttr.
-         */
-        public double getDoubleAttr() {
-            return doubleAttr;
-        }
-
-        /**
-         * @param doubleAttr The doubleAttr to set.
-         */
-        public void setDoubleAttr(double doubleAttr) {
-            this.doubleAttr = doubleAttr;
-        }
-
-        /**
-         * @return Returns the floatAttr.
-         */
-        public float getFloatAttr() {
-            return floatAttr;
-        }
-
-        /**
-         * @param floatAttr The floatAttr to set.
-         */
-        public void setFloatAttr(float floatAttr) {
-            this.floatAttr = floatAttr;
-        }
-
-        /**
-         * @return Returns the longAttr.
-         */
-        public long getLongAttr() {
-            return longAttr;
-        }
-
-        /**
-         * @param longAttr The longAttr to set.
-         */
-        public void setLongAttr(long longAttr) {
-            this.longAttr = longAttr;
-        }
-
-        /**
-         * @return Returns the shortAttr.
-         */
-        public short getShortAttr() {
-            return shortAttr;
-        }
-
-        /**
-         * @param shortAttr The shortAttr to set.
-         */
-        public void setShortAttr(short shortAttr) {
-            this.shortAttr = shortAttr;
-        }
-    }
-}

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	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/InstancesHashcodedTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -76,15 +76,15 @@
 			cd.getField("cutDate").getFieldAccessor().setValue(o2, cut);
 			cd.getField("dueDate").getFieldAccessor().setValue(o2, d2);
 			
-			System.out.println(o1);
-			System.out.println(o1.hashCode());
-			System.out.println(o2);
-			System.out.println(o2.hashCode());
+//			System.out.println(o1);
+//			System.out.println(o1.hashCode());
+//			System.out.println(o2);
+//			System.out.println(o2.hashCode());
+//			
+//			System.out.println(o1.equals(o2));
 			
-			System.out.println(o1.equals(o2));
-			
 		} catch (Exception e) {
-			e.printStackTrace();
+//			e.printStackTrace();
 		}
 	}
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/facttemplates/FactTemplateFieldExtractorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -5,7 +5,7 @@
 import org.drools.rule.Pattern;
 import org.drools.rule.Declaration;
 import org.drools.rule.Package;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class FactTemplateFieldExtractorTest extends TestCase {
     public void testExtractor() {
@@ -22,9 +22,9 @@
                                                           "Cheese",
                                                           fields );
 
-        final Extractor extractName = new FactTemplateFieldExtractor( cheese,
+        final InternalReadAccessor extractName = new FactTemplateFieldExtractor( cheese,
                                                                       0 );
-        final Extractor extractPrice = new FactTemplateFieldExtractor( cheese,
+        final InternalReadAccessor extractPrice = new FactTemplateFieldExtractor( cheese,
                                                                        1 );
 
         final Fact stilton = cheese.createFact( 10 );
@@ -82,7 +82,7 @@
                                                           "Cheese",
                                                           fields );
 
-        final Extractor extractName = new FactTemplateFieldExtractor( cheese,
+        final InternalReadAccessor extractName = new FactTemplateFieldExtractor( cheese,
                                                                       0 );
 
         final Pattern pattern = new Pattern( 0,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -21,10 +21,9 @@
 import org.drools.Cheese;
 import org.drools.DroolsTestCase;
 import org.drools.FactException;
-import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -36,14 +35,13 @@
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Rule;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PropagationContext;
-import org.drools.util.RightTupleList;
 
 public class AlphaNodeTest extends DroolsTestCase {
 
-    ClassFieldExtractorCache     cache  = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache     cache  = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testLiteralConstraintAssertObjectWithoutMemory() throws Exception {
@@ -61,7 +59,7 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -142,7 +140,7 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -212,7 +210,7 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -1,15 +1,15 @@
 package org.drools.reteoo;
 
-import java.lang.reflect.Method;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.lang.reflect.Method;
 
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
 import org.drools.RuleBaseFactory;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
@@ -22,7 +22,7 @@
 import org.drools.rule.Behavior;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.PredicateConstraint;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PropagationContext;
 
 public class CompositeObjectSinkAdapterTest extends TestCase {
@@ -180,7 +180,7 @@
 
     public void testTripleAlpha() {
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
                                                                                         "type",
                                                                                         this.getClass().getClassLoader() );
 
@@ -242,7 +242,7 @@
 
     public void testTripleAlphaCharacterConstraint() {
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
                                                                                         "charType",
                                                                                         this.getClass().getClassLoader() );
 
@@ -326,7 +326,7 @@
     public void testPropagationWithNullValue() {
 
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        FieldExtractor extractor = ClassFieldExtractorCache.getInstance().getExtractor( Cheese.class,
+        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
                                                                                         "type",
                                                                                         this.getClass().getClassLoader() );
         final LiteralConstraint lit1 = new LiteralConstraint( extractor,
@@ -375,7 +375,7 @@
 
     public static class MockExtractor
         implements
-        FieldExtractor {
+        InternalReadAccessor {
 
         public void readExternal(ObjectInput in) throws IOException,
                                                 ClassNotFoundException {
@@ -484,6 +484,61 @@
             return false;
         }
 
+        public boolean getBooleanValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+        public byte getByteValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public char getCharValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public double getDoubleValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public float getFloatValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getHashCode(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public int getIntValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public long getLongValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public short getShortValue(Object object) {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        public Object getValue(Object object) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public boolean isNullValue(Object object) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
     }
 
     static class MockBetaNode extends BetaNode {

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -12,8 +12,8 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
@@ -38,7 +38,7 @@
 import org.drools.util.LinkedListEntry;
 
 public class FromNodeTest extends TestCase {
-    ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testAlphaNode() {
@@ -49,7 +49,7 @@
                                                                        null );
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -146,11 +146,11 @@
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
 
-        final ClassFieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
                                                                        "price",
                                                                        getClass().getClassLoader() );
 
-        final ClassFieldExtractor ageExtractor = cache.getExtractor( Person.class,
+        final ClassFieldReader ageExtractor = cache.getReader( Person.class,
                                                                      "age",
                                                                      getClass().getClassLoader() );
 
@@ -256,7 +256,7 @@
                                                                        null );
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -28,8 +28,8 @@
 import org.drools.QueryResults;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.DroolsQuery;
 import org.drools.base.FieldFactory;
@@ -49,7 +49,7 @@
     private BuildContext     buildContext;
     private EntryPointNode   entryPoint;
 
-    ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     protected void setUp() throws Exception {
@@ -70,7 +70,7 @@
                                                                        buildContext );
         queryObjectTypeNode.attach();
 
-        ClassFieldExtractor extractor = cache.getExtractor( DroolsQuery.class,
+        ClassFieldReader extractor = cache.getReader( DroolsQuery.class,
                                                             "name",
                                                             DroolsQuery.class.getClassLoader() );
 
@@ -99,7 +99,7 @@
                                                                         buildContext );
         cheeseObjectTypeNode.attach();
 
-        extractor = cache.getExtractor( Cheese.class,
+        extractor = cache.getReader( Cheese.class,
                                         "type",
                                         getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -23,16 +23,16 @@
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 
 public class DeclarationTest extends TestCase {
 
-    ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
 
     public void testDeclaration() throws IntrospectionException {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -60,7 +60,7 @@
     }
 
     public void testGetFieldValue() throws IntrospectionException {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -17,18 +17,17 @@
  */
 
 import java.beans.IntrospectionException;
+import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.IOException;
 
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
-import org.drools.FactHandle;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ShadowProxy;
@@ -44,15 +43,15 @@
 import org.drools.rule.PredicateConstraint.PredicateContextEntry;
 import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
 import org.drools.spi.Evaluator;
-import org.drools.spi.FieldExtractor;
 import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PredicateExpression;
 import org.drools.spi.ReturnValueExpression;
 import org.drools.spi.Tuple;
 
 public class FieldConstraintTest extends TestCase {
 
-    ClassFieldExtractorCache       cache       = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache       cache       = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition   equals      = new EqualityEvaluatorsDefinition();
     ComparableEvaluatorsDefinition comparables = new ComparableEvaluatorsDefinition();
 
@@ -78,7 +77,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -128,7 +127,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "price",
                                                                   getClass().getClassLoader() );
 
@@ -179,7 +178,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final FieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor priceExtractor = cache.getReader( Cheese.class,
                                                                   "price",
                                                                   getClass().getClassLoader() );
 
@@ -281,7 +280,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final FieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor priceExtractor = cache.getReader( Cheese.class,
                                                                   "price",
                                                                   getClass().getClassLoader() );
 
@@ -404,7 +403,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -417,7 +416,7 @@
                                                                      evaluator,
                                                                      field );
 
-        final ClassFieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
                                                                        "price",
                                                                        getClass().getClassLoader() );
 
@@ -482,7 +481,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -495,7 +494,7 @@
                                                                      evaluator,
                                                                      field );
 
-        final ClassFieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
                                                                        "price",
                                                                        getClass().getClassLoader() );
 
@@ -559,7 +558,7 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldExtractor typeExtractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader typeExtractor = cache.getReader( Cheese.class,
                                                                       "type",
                                                                       getClass().getClassLoader() );
 
@@ -573,7 +572,7 @@
                                                                      stringEqual,
                                                                      cheddarField );
 
-        final ClassFieldExtractor priceExtractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
                                                                        "price",
                                                                        getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PatternTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -10,7 +10,7 @@
 import org.drools.facttemplates.FactTemplateObjectType;
 import org.drools.facttemplates.FieldTemplate;
 import org.drools.facttemplates.FieldTemplateImpl;
-import org.drools.spi.Extractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
 
 public class PatternTest extends TestCase {
@@ -21,7 +21,7 @@
                                        type,
                                        "foo" );
         final Declaration dec = col.getDeclaration();
-        final Extractor ext = dec.getExtractor();
+        final InternalReadAccessor ext = dec.getExtractor();
         assertEquals( Cheese.class,
                       ext.getExtractToClass() );
 
@@ -53,7 +53,7 @@
                                        type,
                                        "foo" );
         final Declaration dec = col.getDeclaration();
-        final Extractor ext = dec.getExtractor();
+        final InternalReadAccessor ext = dec.getExtractor();
         assertEquals( Fact.class,
                       ext.getExtractToClass() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -3,8 +3,8 @@
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
-import org.drools.base.ClassFieldExtractor;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldReader;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
@@ -15,11 +15,11 @@
 import org.drools.util.AbstractHashTable.SingleIndex;
 
 public class FieldIndexEntryTest extends TestCase {
-    ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testSingleEntry() {
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -64,7 +64,7 @@
     }
 
     public void testTwoEntries() {
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
         final FieldIndex fieldIndex = new FieldIndex( extractor,
@@ -119,7 +119,7 @@
     }
 
     public void testThreeEntries() {
-        final ClassFieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final ClassFieldReader extractor = cache.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
         final FieldIndex fieldIndex = new FieldIndex( extractor,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/RightTupleIndexHashTableTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/RightTupleIndexHashTableTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/RightTupleIndexHashTableTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -7,7 +7,7 @@
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
-import org.drools.base.ClassFieldExtractorCache;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -18,15 +18,15 @@
 import org.drools.reteoo.RightTuple;
 import org.drools.rule.Declaration;
 import org.drools.rule.Pattern;
-import org.drools.spi.FieldExtractor;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.util.AbstractHashTable.FieldIndex;
 
 public class RightTupleIndexHashTableTest extends TestCase {
-    ClassFieldExtractorCache     cache  = ClassFieldExtractorCache.getInstance();
+    ClassFieldAccessorCache     cache  = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
     public void testSingleEntry() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -82,7 +82,7 @@
     }
 
     public void testTwoDifferentEntries() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -146,7 +146,7 @@
     }
 
     public void testTwoEqualEntries() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -209,7 +209,7 @@
     }
 
     public void testTwoDifferentEntriesSameHashCode() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( TestClass.class,
+        final InternalReadAccessor extractor = cache.getReader( TestClass.class,
                                                              "object",
                                                              getClass().getClassLoader() );
 
@@ -269,7 +269,7 @@
     }
 
     public void testRemove() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -343,7 +343,7 @@
     }
 
     public void testResize() throws Exception {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 
@@ -569,7 +569,7 @@
     }
 
     public void testEmptyIterator() {
-        final FieldExtractor extractor = cache.getExtractor( Cheese.class,
+        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
                                                              "type",
                                                              getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/asm/ClassFieldInspectorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/asm/ClassFieldInspectorTest.java	2008-05-16 15:22:07 UTC (rev 19970)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/asm/ClassFieldInspectorTest.java	2008-05-16 18:29:20 UTC (rev 19971)
@@ -29,24 +29,18 @@
     public void testIt() throws Exception {
         final ClassFieldInspector ext = new ClassFieldInspector( Person.class );
         assertEquals( 7,
-                      ext.getPropertyGetters().size() );
-        assertEquals( "getAge",
-                      ((Method) ext.getPropertyGetters().get( 0 )).getName() );
-        assertEquals( "isHappy",
-                      ((Method) ext.getPropertyGetters().get( 1 )).getName() );
-        assertEquals( "getName",
-                      ((Method) ext.getPropertyGetters().get( 2 )).getName() );
+                      ext.getFieldNames().size() );
+        assertEquals( "getAge" ,
+                      ext.getGetterMethods().get( "age" ).getName() );
+        assertEquals( "isHappy" ,
+                      ext.getGetterMethods().get( "happy" ).getName() );
+        assertEquals( "getName" ,
+                      ext.getGetterMethods().get( "name" ).getName() );
 
-        final Map names = ext.getFieldNames();
+        final Map<String, Integer> names = ext.getFieldNames();
         assertNotNull( names );
         assertEquals( 7,
                       names.size() );
-        assertEquals( 0,
-                      ((Integer) names.get( "age" )).intValue() );
-        assertEquals( 1,
-                      ((Integer) names.get( "happy" )).intValue() );
-        assertEquals( 2,
-                      ((Integer) names.get( "name" )).intValue() );
         assertNull( names.get( "nAme" ) );
 
     }
@@ -54,62 +48,52 @@
     public void testInterface() throws Exception {
         final ClassFieldInspector ext = new ClassFieldInspector( TestInterface.class );
         assertEquals( 2,
-                      ext.getPropertyGetters().size() );
-        assertEquals( "getSomething",
-                      ((Method) ext.getPropertyGetters().get( 0 )).getName() );
-        assertEquals( "getAnother",
-                      ((Method) ext.getPropertyGetters().get( 1 )).getName() );
+                      ext.getFieldNames().size() );
+        assertEquals( "getSomething" ,
+                      ext.getGetterMethods().get( "something" ).getName() );
+        assertEquals( "getAnother" ,
+                      ext.getGetterMethods().get( "another" ).getName() );
 
-        final Map names = ext.getFieldNames();
+        final Map<String, Integer> names = ext.getFieldNames();
         assertNotNull( names );
         assertEquals( 2,
                       names.size() );
-        assertEquals( 0,
-                      ((Integer) names.get( "something" )).intValue() );
-        assertEquals( 1,
-                      ((Integer) names.get( "another" )).intValue() );
 
     }
 
     public void testAbstract() throws Exception {
         final ClassFieldInspector ext = new ClassFieldInspector( TestAbstract.class );
         assertEquals( 5,
-                      ext.getPropertyGetters().size() );
-        assertEquals( "getSomething",
-                      ((Method) ext.getPropertyGetters().get( 0 )).getName() );
-        assertEquals( "getAnother",
-                      ((Method) ext.getPropertyGetters().get( 1 )).getName() );
+                      ext.getFieldNames().size() );
+        assertEquals( "getSomething" ,
+                      ext.getGetterMethods().get( "something" ).getName() );
+        assertEquals( "getAnother" ,
+                      ext.getGetterMethods().get( "another" ).getName() );
 
-        final Map names = ext.getFieldNames();
+        final Map<String, Integer> names = ext.getFieldNames();
         assertNotNull( names );
         assertEquals( 5,
                       names.size() );
-        assertEquals( 0,
-                      ((Integer) names.get( "something" )).intValue() );
-        assertEquals( 1,
-                      ((Integer) names.get( "another" )).intValue() );
 
     }
 
     public void testInheritedFields() throws Exception {
         ClassFieldInspector ext = new ClassFieldInspector( BeanInherit.class );
         assertEquals( 5,
-                      ext.getPropertyGetters().size() );
+                      ext.getFieldNames().size() );
 
         ext = new ClassFieldInspector( InterfaceChildImpl.class );
         assertEquals( 8,
-                      ext.getPropertyGetters().size() );
+                      ext.getFieldNames().size() );
+
         // test inheritence from abstract class
-        assertEquals( 4,
-                      ((Integer) ext.getFieldNames().get( "HTML" )).intValue() );
+        assertNotNull( ext.getFieldNames().get( "HTML" ) );
 
         // check normal field on child class
-        assertEquals( 1,
-                      ((Integer) ext.getFieldNames().get( "baz" )).intValue() );
+        assertNotNull( ext.getFieldNames().get( "baz" ) );
 
         // test inheritence from an interface
-        assertEquals( 3,
-                      ((Integer) ext.getFieldNames().get( "URI" )).intValue() );
+        assertNotNull( ext.getFieldNames().get( "URI" ) );
     }
 
     public void testIntefaceInheritance() throws Exception {




More information about the jboss-svn-commits mailing list