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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Aug 15 03:39:04 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-08-15 03:39:04 -0400 (Fri, 15 Aug 2008)
New Revision: 21562

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AccessorKey.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompileable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositeClassLoader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Acceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsReadAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsWriteAccessor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AccesptsClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Wireable.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Writable.java
Removed:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
Modified:
   labs/jbossrules/trunk/drools-compiler/.classpath
   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/compiler/PackageRegistry.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.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/ProcessBuildContext.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/RuleBuildContext.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.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/java/JavaPredicateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
   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/MVELEvalBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java
   labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.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/java/JavaAccumulateBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaReturnValueConstraintEvaluatorBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/InstrumentedBuildContent.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.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-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueConstraintEvaluatorBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeans.drl
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.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/ClassObjectType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.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/MVELClassFieldReader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELShadowFactory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELPredicateExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.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/common/DroolsObjectOutputStream.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.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/ClassObjectTypeConf.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.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/Accumulate.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.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/DialectRuntimeData.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeRegistry.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.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/MVELDialectRuntimeData.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.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/Package.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/Rule.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.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/Constraint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.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/ObjectType.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/PredicateExpression.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/RuleComponent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.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
   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/factmodel/ClassBuilderTest.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/ObjectTypeNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/OtherwiseTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooRuleBaseTest.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/PackageCompilationDataTest.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
Log:
JBRULES-1736 Dynamically generated Types 
-initial fix

Modified: labs/jbossrules/trunk/drools-compiler/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-compiler/.classpath	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/.classpath	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,18 +1,30 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
-	<classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
-	<classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
-	<classpathentry kind="src" path="/drools-core"/>
-	<classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
-	<classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
+<classpath>
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+  <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+  <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+  <classpathentry kind="output" path="target/classes"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+  <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/stringtemplate/3.1-b1/stringtemplate-3.1-b1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/gunit/1.0.1/gunit-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-model/2.0/maven-model-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8.jar"/>
+  <classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/antlr/antlr/3.0.1/antlr-3.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.7/antlr-2.7.7.jar"/>
+  <classpathentry kind="src" path="/drools-core"/>
+  <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+</classpath>
\ No newline at end of file

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/Dialect.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -48,8 +48,6 @@
 
     TypeResolver getTypeResolver();
 
-    ClassFieldAccessorCache getClassFieldExtractorCache();
-
     SalienceBuilder getSalienceBuilder();
 
     PatternBuilder getPatternBuilder();

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -31,8 +31,10 @@
 import org.drools.RuleBase;
 import org.drools.base.ClassFieldAccessor;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassFieldWriter;
+import org.drools.common.InternalRuleBase;
 import org.drools.commons.jci.problems.CompilationProblem;
 import org.drools.factmodel.ClassBuilder;
 import org.drools.factmodel.ClassDefinition;
@@ -56,11 +58,15 @@
 import org.drools.lang.descr.TypeFieldDescr;
 import org.drools.process.core.Process;
 import org.drools.reteoo.ReteooRuleBase;
+import org.drools.rule.CompositeClassLoader;
+import org.drools.rule.ImportDeclaration;
+import org.drools.rule.JavaDialectRuntimeData;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
 import org.drools.rule.TypeDeclaration;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.RuleBuilder;
+import org.drools.rule.builder.dialect.java.JavaDialect;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.xml.XmlPackageReader;
 import org.drools.xml.XmlProcessReader;
@@ -70,7 +76,7 @@
  * This is the main compiler class for parsing and compiling rules and
  * assembling or merging them into a binary Package instance. This can be done
  * by merging into existing binary packages, or totally from source.
- *
+ * 
  * If you are using the Java dialect the JavaDialectConfiguration will attempt
  * to validate that the specified compiler is in the classpath, using
  * ClassLoader.loasClass(String). If you intented to just Janino sa the compiler
@@ -88,8 +94,6 @@
 
     private PackageBuilderConfiguration  configuration;
 
-    private ClassFieldAccessorCache      classFieldExtractorCache;
-
     public static final RuleBuilder      ruleBuilder = new RuleBuilder();
 
     /**
@@ -107,6 +111,10 @@
      */
     private final String                 defaultDialect;
 
+    private CompositeClassLoader         rootClassLoader;
+    
+    private Map<String, Class>           globals;
+
     /**
      * Use this when package is starting from scratch.
      */
@@ -131,12 +139,12 @@
 
     /**
      * Pass a specific configuration for the PackageBuilder
-     *
+     * 
      * PackageBuilderConfiguration is not thread safe and it also contains
      * state. Once it is created and used in one or more PackageBuilders it
      * should be considered immutable. Do not modify its properties while it is
      * being used by a PackageBuilder.
-     *
+     * 
      * @param configuration
      */
     public PackageBuilder(final PackageBuilderConfiguration configuration) {
@@ -147,7 +155,7 @@
     //    /**
     //     * This allows you to pass in a pre existing package, and a configuration
     //     * (for instance to set the classloader).
-    //     *
+    //     * 
     //     * @param pkg
     //     *            A pre existing package (can be null if none exists)
     //     * @param configuration
@@ -192,18 +200,21 @@
         }
         this.configuration = configuration;
 
+        this.rootClassLoader = new CompositeClassLoader( this.configuration.getClassLoader() );
+
         this.defaultNamespace = pkg.getName();
         this.defaultDialect = this.configuration.getDefaultDialect();
 
         this.pkgRegistryMap = new HashMap<String, PackageRegistry>();
         this.results = new ArrayList();
-        this.classFieldExtractorCache = ClassFieldAccessorCache.getInstance();
 
         PackageRegistry pkgRegistry = new PackageRegistry( this,
                                                            pkg );
         pkgRegistry.setDialect( this.defaultDialect );
         this.pkgRegistryMap.put( pkg.getName(),
                                  pkgRegistry );
+        
+        globals = new HashMap<String, Class>();
     }
 
     public PackageBuilder(RuleBase ruleBase,
@@ -213,20 +224,27 @@
         }
         this.configuration = configuration;
 
+        if ( ruleBase != null ) {
+            this.rootClassLoader = ((InternalRuleBase) ruleBase).getRootClassLoader();
+        } else {
+            this.rootClassLoader = new CompositeClassLoader( this.configuration.getClassLoader() );
+        }
+
         // FIXME, we need to get drools to support "default" namespace.
-        //this.defaultNamespace = pkg.getName();
+        //this.defaultNamespace = pkg.getName();        
         this.defaultDialect = this.configuration.getDefaultDialect();
 
         this.pkgRegistryMap = new HashMap<String, PackageRegistry>();
         this.results = new ArrayList();
-        this.classFieldExtractorCache = ClassFieldAccessorCache.getInstance();
 
         this.ruleBase = (ReteooRuleBase) ruleBase;
+        
+        globals = new HashMap<String, Class>();
     }
 
     /**
      * Load a rule package from DRL source.
-     *
+     * 
      * @param reader
      * @throws DroolsParserException
      * @throws IOException
@@ -236,14 +254,14 @@
         final DrlParser parser = new DrlParser();
         final PackageDescr pkg = parser.parse( reader );
         this.results.addAll( parser.getErrors() );
-        if (!parser.hasErrors()){
-        	addPackage( pkg );
+        if ( !parser.hasErrors() ) {
+            addPackage( pkg );
         }
     }
 
     /**
      * Load a rule package from XML source.
-     *
+     * 
      * @param reader
      * @throws DroolsParserException
      * @throws IOException
@@ -264,7 +282,7 @@
 
     /**
      * Load a rule package from DRL source using the supplied DSL configuration.
-     *
+     * 
      * @param source
      *            The source of the rules.
      * @param dsl
@@ -279,8 +297,8 @@
         final PackageDescr pkg = parser.parse( source,
                                                dsl );
         this.results.addAll( parser.getErrors() );
-        if (!parser.hasErrors()){
-        	addPackage( pkg );
+        if ( !parser.hasErrors() ) {
+            addPackage( pkg );
         }
     }
 
@@ -435,23 +453,24 @@
             }
         }
     }
-
+    
     /**
      * This checks to see if it should all be in the one namespace.
      */
     private boolean checkNamespace(String newName) {
-    	if (this.configuration == null) return true;
-    	if (this.defaultNamespace == null) return true;
-    	if (this.defaultNamespace.equals(newName)) return true;
-    	return this.configuration.isAllowMultipleNamespaces();
-	}
+        if (this.configuration == null) return true;
+        if (this.defaultNamespace == null) return true;
+        if (this.defaultNamespace.equals(newName)) return true;
+        return this.configuration.isAllowMultipleNamespaces();
+    }
 
-	public boolean isEmpty(String string) {
+    public boolean isEmpty(String string) {
         return (string == null || string.trim().length() == 0);
     }
+    
 
     public void updateResults() {
-        // some of the rules and functions may have been redefined
+        // some of the rules and functions may have been redefined     
         this.results = getResults( this.results );
     }
 
@@ -463,7 +482,7 @@
 
     public void reloadAll() {
         for ( PackageRegistry pkgRegistry : this.pkgRegistryMap.values() ) {
-            pkgRegistry.getDialectRuntimeRegistry().reloadDirty();
+            pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
         }
     }
 
@@ -507,13 +526,16 @@
             pkg = this.ruleBase.getPackage( packageDescr.getName() );
         } else {
             // define a new package
-            pkg = new Package( packageDescr.getName(),
-                               this.configuration.getClassLoader() );
-
+            pkg = new Package( packageDescr.getName() );
+            pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( this.rootClassLoader ) );
+            
             // if there is a rulebase then add the package.
             if ( this.ruleBase != null ) {
                 this.ruleBase.addPackage( pkg );
                 pkg = this.ruleBase.getPackage( packageDescr.getName() );
+            } else {
+                // the RuleBase will also initialise the 
+                pkg.getDialectRuntimeRegistry().onAdd( this.rootClassLoader );
             }
         }
 
@@ -564,9 +586,11 @@
                 clazz = pkgRegistry.getTypeResolver().resolveType( className );
                 pkgRegistry.getPackage().addGlobal( identifier,
                                                     clazz );
+                this.globals.put( identifier, clazz );
             } catch ( final ClassNotFoundException e ) {
                 this.results.add( new GlobalError( identifier,
                                                    global.getLine() ) );
+                e.printStackTrace();
             }
         }
 
@@ -587,7 +611,7 @@
         for ( TypeDeclarationDescr typeDescr : packageDescr.getTypeDeclarations() ) {
             // make sure namespace is set on components
             if ( isEmpty( typeDescr.getNamespace() ) ) {
-                // use the default namespace
+                // use the default namespace 
                 typeDescr.setNamespace( defaultRegistry.getPackage().getName() );
                 pkgRegistry = defaultRegistry;
             } else {
@@ -656,10 +680,12 @@
             String duration = typeDescr.getMetaAttribute( TypeDeclaration.ATTR_DURATION );
             if ( duration != null ) {
                 type.setDurationAttribute( duration );
-                InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( type.getTypeClass(),
-                                                                                                  duration,
-                                                                                                  this.configuration.getClassLoader() );
-                type.setDurationExtractor( extractor );
+                ClassDefinition cd = type.getTypeClassDef();
+                ClassFieldAccessorStore store = pkgRegistry.getPackage().getClassFieldAccessorStore();
+                InternalReadAccessor extractor = store.getReader( type.getTypeName(),
+                                                                  duration,
+                                                                  type );
+                type.setReadAccessor( extractor );
             }
 
             pkgRegistry.getPackage().addTypeDeclaration( type );
@@ -667,8 +693,8 @@
     }
 
     /**
-     *
-     * @param registry
+     * 
+     * @param pkgRegistry 
      * @throws SecurityException
      * @throws IllegalArgumentException
      * @throws InstantiationException
@@ -681,36 +707,28 @@
      * @throws NoSuchFieldException
      */
     private final void buildFieldAccessors(final TypeDeclaration type,
-                                           PackageRegistry registry) throws SecurityException,
-                                                                    IllegalArgumentException,
-                                                                    InstantiationException,
-                                                                    IllegalAccessException,
-                                                                    IOException,
-                                                                    IntrospectionException,
-                                                                    ClassNotFoundException,
-                                                                    NoSuchMethodException,
-                                                                    InvocationTargetException,
-                                                                    NoSuchFieldException {
-        ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
+                                           final PackageRegistry pkgRegistry) throws SecurityException,
+                                                                             IllegalArgumentException,
+                                                                             InstantiationException,
+                                                                             IllegalAccessException,
+                                                                             IOException,
+                                                                             IntrospectionException,
+                                                                             ClassNotFoundException,
+                                                                             NoSuchMethodException,
+                                                                             InvocationTargetException,
+                                                                             NoSuchFieldException {
         ClassDefinition cd = type.getTypeClassDef();
-
+        ClassFieldAccessorStore store = pkgRegistry.getPackage().getClassFieldAccessorStore();
         for ( FieldDefinition attrDef : cd.getFieldsDefinitions() ) {
-            ClassFieldReader reader = cache.getReader( cd.getDefinedClass(),
-                                                       attrDef.getName(),
-                                                       registry.getPackage().getDialectRuntimeRegistry().getClassLoader() );
-            ClassFieldWriter writer = cache.getWriter( cd.getDefinedClass(),
-                                                       attrDef.getName(),
-                                                       registry.getPackage().getDialectRuntimeRegistry().getClassLoader() );
-            ClassFieldAccessor accessor = new ClassFieldAccessor( reader,
-                                                                  writer );
-            attrDef.setFieldAccessor( accessor );
+            ClassFieldAccessor accessor = store.getAccessor( cd.getDefinedClass().getName(), attrDef.getName() );
+            attrDef.setReadWriteAccessor( accessor );
         }
     }
 
     /**
      * Generates a bean, and adds it to the composite class loader that
      * everything is using.
-     *
+     * 
      */
     private void generateDeclaredBean(TypeDeclarationDescr typeDescr,
                                       TypeDeclaration type,
@@ -732,8 +750,12 @@
             }
 
             byte[] d = cb.buildClass( def );
-            pkgRegistry.getPackage().getPackageScopeClassLoader().addClass( fullName,
-                                                                            d );
+
+            JavaDialectRuntimeData dialect = (JavaDialectRuntimeData) pkgRegistry.getDialectRuntimeRegistry().getDialectData( "java" );
+
+            dialect.write( JavaDialectRuntimeData.convertClassToResourcePath( fullName ),
+                           d );
+
             type.setTypeClassDef( def );
         } catch ( Exception e ) {
             e.printStackTrace();
@@ -798,7 +820,7 @@
         PackageRegistry pkgRegistry = this.pkgRegistryMap.get( ruleDescr.getNamespace() );
 
         DialectCompiletimeRegistry ctr = pkgRegistry.getDialectCompiletimeRegistry();
-        RuleBuildContext context = new RuleBuildContext( this.configuration,
+        RuleBuildContext context = new RuleBuildContext( this,
                                                          ruleDescr,
                                                          ctr,
                                                          pkgRegistry.getPackage(),
@@ -824,7 +846,7 @@
      *         can report on by calling getErrors or printErrors. If you try to
      *         add an invalid package (or rule) to a RuleBase, you will get a
      *         runtime exception.
-     *
+     * 
      * Compiled packages are serializable.
      */
     public Package getPackage() {
@@ -832,7 +854,6 @@
         Package pkg = null;
         if ( pkgRegistry != null ) {
             pkg = pkgRegistry.getPackage();
-            pkgRegistry.getPackage().getDialectRuntimeRegistry().reloadDirty();
         }
         if ( hasErrors() && pkg != null ) {
             pkg.setError( getErrors().toString() );
@@ -844,14 +865,14 @@
         Package[] pkgs = new Package[this.pkgRegistryMap.size()];
         int i = 0;
         String errors = null;
-        if (!getErrors().isEmpty()) {
-        	errors = getErrors().toString();
+        if ( !getErrors().isEmpty() ) {
+            errors = getErrors().toString();
         }
         for ( PackageRegistry pkgRegistry : this.pkgRegistryMap.values() ) {
             Package pkg = pkgRegistry.getPackage();
-            pkg.getDialectRuntimeRegistry().reloadDirty();
-            if (errors != null) {
-            	pkg.setError( errors );
+            pkg.getDialectRuntimeRegistry().onBeforeExecute();
+            if ( errors != null ) {
+                pkg.setError( errors );
             }
             pkgs[i++] = pkg;
         }
@@ -861,7 +882,7 @@
 
     /**
      * Return the PackageBuilderConfiguration for this PackageBuilder session
-     *
+     * 
      * @return The PackageBuilderConfiguration
      */
     public PackageBuilderConfiguration getPackageBuilderConfiguration() {
@@ -875,15 +896,9 @@
     public Map<String, PackageRegistry> getPackageRegistry() {
         return this.pkgRegistryMap;
     }
-
-    /**
-     * Return the ClassFieldExtractorCache, this should only be used internally,
-     * and is subject to change
-     *
-     * @return the ClsasFieldExtractorCache
-     */
-    public ClassFieldAccessorCache getClassFieldExtractorCache() {
-        return this.classFieldExtractorCache;
+    
+    public Map<String, Class> getGlobals() {
+        return this.globals;
     }
 
     /**
@@ -919,6 +934,7 @@
     public String getDefaultDialect() {
         return this.defaultDialect;
     }
+
     public static class MissingPackageNameException extends IllegalArgumentException {
         private static final long serialVersionUID = 400L;
 
@@ -942,7 +958,7 @@
      * report a compile error of its type, should it happen. This is needed, as
      * the compiling is done as one hit at the end, and we need to be able to
      * work out what rule/ast element caused the error.
-     *
+     * 
      * An error handler it created for each class task that is queued to be
      * compiled. This doesn't mean an error has occurred, it just means it *may*
      * occur in the future and we need to be able to map it back to the AST
@@ -966,7 +982,7 @@
         }
 
         /**
-         *
+         * 
          * @return A DroolsError object populated as appropriate, should the
          *         unthinkable happen and this need to be reported.
          */
@@ -988,7 +1004,6 @@
         }
     }
 
-
     public static class RuleErrorHandler extends ErrorHandler {
 
         private BaseDescr descr;
@@ -1078,7 +1093,6 @@
 
     }
 
-
     public static class SrcErrorHandler extends ErrorHandler {
 
         public SrcErrorHandler(final String message) {
@@ -1097,7 +1111,8 @@
         private String message;
         private int[]  errorLines = new int[0];
 
-        public SrcError(Object object, String message) {
+        public SrcError(Object object,
+                        String message) {
             this.object = object;
             this.message = message;
         }
@@ -1131,10 +1146,13 @@
             }
             return buf.toString();
         }
-
     }
 
     private String ucFirst(final String name) {
         return name.toUpperCase().charAt( 0 ) + name.substring( 1 );
     }
+
+    public CompositeClassLoader getRootClassLoader() {
+        return this.rootClassLoader;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageRegistry.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageRegistry.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -15,25 +15,26 @@
 public class PackageRegistry {
     private Package                    pkg;
     private String                     dialect;
-    
+
     private DialectRuntimeRegistry     dialectRuntimeRegistry;
     private DialectCompiletimeRegistry dialectCompiletimeRegistry;
 
-    private TypeResolver         typeResolver;    
-    
-    public PackageRegistry(PackageBuilder packageBuilder, Package pkg) {
+    private TypeResolver               typeResolver;
+
+    public PackageRegistry(PackageBuilder packageBuilder,
+                           Package pkg) {
         this.pkg = pkg;
-        this.dialectCompiletimeRegistry = packageBuilder.getPackageBuilderConfiguration().buildDialectRegistry( packageBuilder, this, pkg );
-        this.dialectRuntimeRegistry = pkg.getDialectRuntimeRegistry();       
-        
-        ClassLoader cl = this.pkg.getDialectRuntimeRegistry().getClassLoader();
+        this.dialectCompiletimeRegistry = packageBuilder.getPackageBuilderConfiguration().buildDialectRegistry( packageBuilder,
+                                                                                                                this,
+                                                                                                                pkg );
+        this.dialectRuntimeRegistry = pkg.getDialectRuntimeRegistry();
 
         this.typeResolver = new ClassTypeResolver( new HashSet<String>( this.pkg.getImports().keySet() ),
-                                                   cl );
-        
-        this.typeResolver.addImport( pkg.getName() + ".*" );        
-    }        
+                                                   packageBuilder.getRootClassLoader() );
 
+        this.typeResolver.addImport( pkg.getName() + ".*" );
+    }
+
     public String getDialect() {
         return dialect;
     }
@@ -42,8 +43,6 @@
         this.dialect = dialect;
     }
 
-
-
     public Package getPackage() {
         return pkg;
     }
@@ -55,27 +54,27 @@
     public DialectCompiletimeRegistry getDialectCompiletimeRegistry() {
         return dialectCompiletimeRegistry;
     }
-    
+
     public void addProcess(ProcessBuildContext context) {
-        this.dialectCompiletimeRegistry.addProcess( context );    
+        this.dialectCompiletimeRegistry.addProcess( context );
     }
-    
+
     public void addImport(String importEntry) {
         this.pkg.addImport( new ImportDeclaration( importEntry ) );
         this.typeResolver.addImport( importEntry );
         this.dialectCompiletimeRegistry.addImport( importEntry );
     }
-    
+
     public void addStaticImport(String staticImport) {
         this.dialectCompiletimeRegistry.addStaticImport( staticImport );
     }
 
     public TypeResolver getTypeResolver() {
         return this.typeResolver;
-    }    
-    
+    }
+
     public void compileAll() {
         this.dialectCompiletimeRegistry.compileAll();
     }
-        
+
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/ProcessBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -105,7 +105,7 @@
                 // as the dialects are initialised when the pkg is  first created
                 PackageRegistry pkgRegistry = this.packageBuilder.getPackageRegistry( pkg.getName() );
                 pkgRegistry.compileAll();                
-                pkgRegistry.getDialectRuntimeRegistry().reloadDirty();
+                pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
             }
         }
     }
@@ -126,7 +126,7 @@
         Dialect dialect = dialectRegistry.getDialect( "java" );
         dialect.init( processDescr );
 
-        ProcessBuildContext context = new ProcessBuildContext( this.packageBuilder.getPackageBuilderConfiguration(),
+        ProcessBuildContext context = new ProcessBuildContext( this.packageBuilder,
                                                                this.packageBuilder.getPackage(),
                                                                process,
                                                                processDescr,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PackageBuildContext.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -24,6 +24,7 @@
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DialectCompiletimeRegistry;
+import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.rule.Dialectable;
@@ -37,13 +38,12 @@
 public class PackageBuildContext {
 
     // current package
-    private Package                     pkg;        
+    private Package                     pkg;
 
-    // configuration
-    private PackageBuilderConfiguration configuration;
-    
+    private PackageBuilder pkgBuilder;
+
     // the contianer descr
-    private BaseDescr                   parentDescr;    
+    private BaseDescr                   parentDescr;
 
     // errors found when building the current context
     private List                        errors;
@@ -63,26 +63,27 @@
     // a simple counter for generated names
     private int                         counter;
 
-    private DialectCompiletimeRegistry             dialectRegistry;
+    private DialectCompiletimeRegistry  dialectRegistry;
 
-    private Dialect                     dialect;    
-    
+    private Dialect                     dialect;
+
     public PackageBuildContext() {
-        
+
     }
 
     /**
      * Default constructor
      */
-    public void init(final PackageBuilderConfiguration configuration,
-                               final Package pkg,
-                               final BaseDescr parentDescr,
-                               final DialectCompiletimeRegistry dialectRegistry,
-                               final Dialect defaultDialect,
-                               final Dialectable component) {
-        this.configuration = configuration;
+    public void init(final PackageBuilder pkgBuilder,
+                     final Package pkg,
+                     final BaseDescr parentDescr,
+                     final DialectCompiletimeRegistry dialectRegistry,
+                     final Dialect defaultDialect,
+                     final Dialectable component) {
+        this.pkgBuilder = pkgBuilder;
+        
         this.pkg = pkg;
-        
+
         this.parentDescr = parentDescr;
 
         this.methods = new ArrayList();
@@ -92,14 +93,17 @@
         this.errors = new ArrayList();
 
         this.dialectRegistry = dialectRegistry;
-        
+
         this.dialect = (component != null && component.getDialect() != null) ? this.dialectRegistry.getDialect( component.getDialect() ) : defaultDialect;
-        
+
         if ( dialect == null && (component != null && component.getDialect() != null) ) {
-            this.errors.add( new DescrBuildError(null,parentDescr, component, "Unable to load Dialect '" + component.getDialect() + "'") );
+            this.errors.add( new DescrBuildError( null,
+                                                  parentDescr,
+                                                  component,
+                                                  "Unable to load Dialect '" + component.getDialect() + "'" ) );
         }
     }
-    
+
     public BaseDescr getParentDescr() {
         return this.parentDescr;
     }
@@ -118,7 +122,7 @@
     public Dialect getDialect(String dialectName) {
         return (Dialect) this.dialectRegistry.getDialect( dialectName );
     }
-    
+
     public DialectCompiletimeRegistry getDialectRegistry() {
         return this.dialectRegistry;
     }
@@ -198,9 +202,13 @@
     public int getNextId() {
         return this.counter++;
     }
-    
+
     public PackageBuilderConfiguration getConfiguration() {
-        return configuration;
+        return this.pkgBuilder.getPackageBuilderConfiguration();
     }
+    
+    public PackageBuilder getPackageBuilder() {
+        return this.pkgBuilder;
+    }
 
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,7 @@
 import java.util.Set;
 
 import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
@@ -71,11 +72,14 @@
 import org.drools.rule.VariableConstraint;
 import org.drools.rule.VariableRestriction;
 import org.drools.rule.builder.dialect.mvel.MVELDialect;
+import org.drools.spi.Acceptor;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Constraint;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldValue;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
+import org.drools.spi.PatternExtractor;
 import org.drools.spi.Restriction;
 import org.drools.spi.Constraint.ConstraintType;
 import org.mvel.ParserContext;
@@ -160,12 +164,26 @@
                                    objectType,
                                    patternDescr.getIdentifier(),
                                    patternDescr.isInternalFact() );
+            if ( objectType instanceof ClassObjectType ) {
+                // make sure PatternExtractor is wired up to correct ClassObjectType and set as a target for rewiring
+                context.getPkg().getClassFieldAccessorStore().getClassObjectType( ((ClassObjectType) objectType),
+                                                                                  (PatternExtractor) pattern.getDeclaration().getExtractor() );
+            }            
         } else {
             pattern = new Pattern( context.getNextPatternId(),
                                    0, // offset is 0 by default
                                    objectType,
                                    null );
         }
+
+        if ( objectType instanceof ClassObjectType ) {
+            // make sure the Pattern is wired up to correct ClassObjectType and set as a target for rewiring
+            context.getPkg().getClassFieldAccessorStore().getClassObjectType( ((ClassObjectType) objectType),
+                                                                              pattern );
+        }
+        
+        //context.getPkg().getClassFieldAccessorStore().get
+
         // adding the newly created pattern to the build stack
         // this is necessary in case of local declaration usage
         context.getBuildStack().push( pattern );
@@ -187,9 +205,9 @@
 
             pattern.setSource( source );
         }
-        
-        for( BehaviorDescr behaviorDescr : patternDescr.getBehaviors() ) {
-            if( Behavior.BehaviorType.TIME_WINDOW.matches( behaviorDescr.getType() ) ) {
+
+        for ( BehaviorDescr behaviorDescr : patternDescr.getBehaviors() ) {
+            if ( Behavior.BehaviorType.TIME_WINDOW.matches( behaviorDescr.getType() ) ) {
                 SlidingWindowDescr swd = (SlidingWindowDescr) behaviorDescr;
                 SlidingTimeWindow window = new SlidingTimeWindow( swd.getLength() );
                 pattern.addBehavior( window );
@@ -232,8 +250,9 @@
             if ( container == null ) {
                 pattern.addConstraint( and );
             } else {
-                if( and.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
-                    this.setConstraintType( pattern, (MutableTypeConstraint) and );
+                if ( and.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+                    this.setConstraintType( pattern,
+                                            (MutableTypeConstraint) and );
                 }
                 container.addConstraint( and );
             }
@@ -249,8 +268,9 @@
             if ( container == null ) {
                 pattern.addConstraint( or );
             } else {
-                if( or.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
-                    this.setConstraintType( pattern, (MutableTypeConstraint) or );
+                if ( or.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+                    this.setConstraintType( pattern,
+                                            (MutableTypeConstraint) or );
                 }
                 container.addConstraint( or );
             }
@@ -296,11 +316,12 @@
         }
 
         // if it is not a complex expression, just build a simple field constraint
-        final InternalReadAccessor extractor = getFieldExtractor( context,
-                                                            fieldConstraintDescr,
-                                                            pattern.getObjectType(),
-                                                            fieldName,
-                                                            false );
+        final InternalReadAccessor extractor = getFieldReadAccessor( context,
+                                                                     fieldConstraintDescr,
+                                                                     pattern.getObjectType(),
+                                                                     fieldName,
+                                                                     null,
+                                                                     false );
         if ( extractor == null ) {
             if ( fieldConstraintDescr.getFieldName().startsWith( "this." ) ) {
                 // it may still be MVEL special syntax, like map key syntax, so try eval
@@ -338,12 +359,36 @@
         } else if ( restriction instanceof LiteralRestriction ) {
             constraint = new LiteralConstraint( extractor,
                                                 (LiteralRestriction) restriction );
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  ( LiteralConstraint ) constraint );            
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  (LiteralRestriction) restriction );
         } else if ( restriction instanceof VariableRestriction ) {
             constraint = new VariableConstraint( extractor,
                                                  (VariableRestriction) restriction );
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  (VariableRestriction) restriction );            
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  (VariableRestriction) restriction );
         } else if ( restriction instanceof ReturnValueRestriction ) {
             constraint = new ReturnValueConstraint( extractor,
                                                     (ReturnValueRestriction) restriction );
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  (ReturnValueConstraint) constraint );            
+            registerReadAccessor( context,
+                                  pattern.getObjectType(),
+                                  fieldName,
+                                  (ReturnValueRestriction) restriction );
         } else {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                           fieldConstraintDescr,
@@ -354,8 +399,9 @@
         if ( container == null ) {
             pattern.addConstraint( constraint );
         } else {
-            if( constraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
-                this.setConstraintType( pattern, (MutableTypeConstraint) constraint );
+            if ( constraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+                this.setConstraintType( pattern,
+                                        (MutableTypeConstraint) constraint );
             }
             container.addConstraint( constraint );
         }
@@ -376,7 +422,7 @@
             }
         }
 
-        ConstraintType type = isAlphaConstraint ? ConstraintType.ALPHA : ConstraintType.BETA; 
+        ConstraintType type = isAlphaConstraint ? ConstraintType.ALPHA : ConstraintType.BETA;
         constraint.setType( type );
     }
 
@@ -395,10 +441,11 @@
         // analyze field type:
         Class resultType = getFieldReturnType( pattern,
                                                fieldConstraintDescr );
-        
+
         PredicateDescr predicateDescr = new PredicateDescr();
         MVELDumper dumper = new MVELDumper();
-        predicateDescr.setContent( dumper.dump( fieldConstraintDescr, Date.class.isAssignableFrom( resultType ) ) );
+        predicateDescr.setContent( dumper.dump( fieldConstraintDescr,
+                                                Date.class.isAssignableFrom( resultType ) ) );
 
         build( context,
                pattern,
@@ -418,10 +465,11 @@
     private Class getFieldReturnType(final Pattern pattern,
                                      final FieldConstraintDescr fieldConstraintDescr) {
         String dummyField = "__DUMMY__";
-        String dummyExpr = dummyField+"."+fieldConstraintDescr.getFieldName();
+        String dummyExpr = dummyField + "." + fieldConstraintDescr.getFieldName();
         ExpressionCompiler compiler = new ExpressionCompiler( dummyExpr );
         ParserContext mvelcontext = new ParserContext();
-        mvelcontext.addInput( dummyField, ((ClassObjectType) pattern.getObjectType()).getClassType() );
+        mvelcontext.addInput( dummyField,
+                              ((ClassObjectType) pattern.getObjectType()).getClassType() );
         compiler.compile( mvelcontext );
         Class resultType = compiler.getReturnType();
         return resultType;
@@ -499,17 +547,14 @@
             return;
         }
 
-        final InternalReadAccessor extractor = getFieldExtractor( context,
-                                                            fieldBindingDescr,
-                                                            pattern.getObjectType(),
-                                                            fieldBindingDescr.getFieldName(),
-                                                            true );
-        if ( extractor == null ) {
-            return;
-        }
+        Declaration declr = pattern.addDeclaration( fieldBindingDescr.getIdentifier() );
 
-        pattern.addDeclaration( fieldBindingDescr.getIdentifier(),
-                                extractor );
+        final InternalReadAccessor extractor = getFieldReadAccessor( context,
+                                                                     fieldBindingDescr,
+                                                                     pattern.getObjectType(),
+                                                                     fieldBindingDescr.getFieldName(),
+                                                                     declr,
+                                                                     true );
     }
 
     private void build(final RuleBuildContext context,
@@ -559,8 +604,9 @@
         if ( container == null ) {
             pattern.addConstraint( predicateConstraint );
         } else {
-            if( predicateConstraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
-                this.setConstraintType( pattern, (MutableTypeConstraint) predicateConstraint );
+            if ( predicateConstraint.getType().equals( Constraint.ConstraintType.UNKNOWN ) ) {
+                this.setConstraintType( pattern,
+                                        (MutableTypeConstraint) predicateConstraint );
             }
             container.addConstraint( predicateConstraint );
         }
@@ -617,19 +663,20 @@
         final FieldBindingDescr implicitBinding = new FieldBindingDescr( identifier,
                                                                          identifier );
 
-        final InternalReadAccessor extractor = getFieldExtractor( context,
-                                                            implicitBinding,
-                                                            pattern.getObjectType(),
-                                                            implicitBinding.getFieldName(),
-                                                            false );
+        final Declaration declaration = new Declaration( identifier,
+                                                         pattern );
+
+        final InternalReadAccessor extractor = getFieldReadAccessor( context,
+                                                                     implicitBinding,
+                                                                     pattern.getObjectType(),
+                                                                     implicitBinding.getFieldName(),
+                                                                     declaration,
+                                                                     false );
+
         if ( extractor == null ) {
             return null;
         }
 
-        final Declaration declaration = new Declaration( identifier,
-                                                         extractor,
-                                                         pattern );
-
         return declaration;
     }
 
@@ -804,7 +851,7 @@
             final Class staticClass = context.getDialect().getTypeResolver().resolveType( className );
             field = FieldFactory.getFieldValue( staticClass.getField( fieldName ).get( null ),
                                                 extractor.getValueType() );
-            if( field.isObjectField() ) {
+            if ( field.isObjectField() ) {
                 ((ObjectFieldImpl) field).setEnum( true );
                 ((ObjectFieldImpl) field).setEnumName( staticClass.getName() );
                 ((ObjectFieldImpl) field).setFieldName( fieldName );
@@ -895,25 +942,42 @@
         return returnValueRestriction;
     }
 
-    private InternalReadAccessor getFieldExtractor(final RuleBuildContext context,
-                                             final BaseDescr descr,
-                                             final ObjectType objectType,
-                                             final String fieldName,
-                                             final boolean reportError) {
-        InternalReadAccessor extractor = null;
+    public static void registerReadAccessor(final RuleBuildContext context,
+                                            final ObjectType objectType,
+                                            final String fieldName,
+                                            final AcceptsReadAccessor target) {
+        if ( !ValueType.FACTTEMPLATE_TYPE.equals( objectType.getValueType() ) ) {
+            InternalReadAccessor reader = context.getPkg().getClassFieldAccessorStore().getReader( ((ClassObjectType) objectType).getClassName(),
+                                                                                                   fieldName,
+                                                                                                   target );
+        }
+    }
 
-        if ( ValueType.FACTTEMPLATE_TYPE.equals(objectType.getValueType()) ) {
-            //@todo use extractor cache            
+    public static InternalReadAccessor getFieldReadAccessor(final RuleBuildContext context,
+                                                            final BaseDescr descr,
+                                                            final ObjectType objectType,
+                                                            final String fieldName,
+                                                            final AcceptsReadAccessor target,
+                                                            final boolean reportError) {
+        InternalReadAccessor reader = null;
+
+        if ( ValueType.FACTTEMPLATE_TYPE.equals( objectType.getValueType() ) ) {
+            //@todo use accessor cache            
             final FactTemplate factTemplate = ((FactTemplateObjectType) objectType).getFactTemplate();
-            extractor = new FactTemplateFieldExtractor( factTemplate,
-                                                        factTemplate.getFieldTemplateIndex( fieldName ) );
+            reader = new FactTemplateFieldExtractor( factTemplate,
+                                                     factTemplate.getFieldTemplateIndex( fieldName ) );
+            if ( target != null ) {
+                target.setReadAccessor( reader );
+            }
         } else {
             try {
-                ClassLoader classloader = context.getPkg().getDialectRuntimeRegistry().getClassLoader();
-                extractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
-                                                                                             fieldName,
-                                                                                             classloader );
-            } catch ( final RuntimeDroolsException e ) {
+                reader = context.getPkg().getClassFieldAccessorStore().getReader( ((ClassObjectType) objectType).getClassName(),
+                                                                                  fieldName,
+                                                                                  target );
+                //                extractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
+                //                                                                                          fieldName,
+                //                                                                                          classloader );
+            } catch ( final Exception e ) {
                 if ( reportError ) {
                     context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                                   descr,
@@ -923,7 +987,7 @@
             }
         }
 
-        return extractor;
+        return reader;
     }
 
     private Evaluator getEvaluator(final RuleBuildContext context,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/ProcessBuildContext.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -2,6 +2,7 @@
 
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DialectCompiletimeRegistry;
+import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.ProcessDescr;
@@ -13,7 +14,7 @@
     private Process      process;
     private ProcessDescr processDescr;
 
-    public ProcessBuildContext(final PackageBuilderConfiguration cfg,
+    public ProcessBuildContext(final PackageBuilder pkgBuilder,
                                final Package pkg,
                                final Process process,
                                final BaseDescr processDescr,
@@ -21,7 +22,7 @@
                                final Dialect defaultDialect) {
         this.process = process;
         this.processDescr = (ProcessDescr) processDescr;
-        init( cfg,
+        init( pkgBuilder,
               pkg,
               processDescr,
               dialectRegistry,

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/QueryBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -9,6 +9,7 @@
 import org.drools.base.extractors.ArrayElementReader;
 import org.drools.compiler.DescrBuildError;
 import org.drools.lang.descr.QueryDescr;
+import org.drools.rule.Declaration;
 import org.drools.rule.LiteralConstraint;
 import org.drools.rule.Pattern;
 import org.drools.spi.FieldValue;
@@ -23,10 +24,8 @@
                                              0, // offset is 0 by default
                                              objectType,
                                              null );
-        ClassLoader classloader = context.getPkg().getDialectRuntimeRegistry().getClassLoader();
-        final InternalReadAccessor extractor = context.getDialect().getClassFieldExtractorCache().getReader( DroolsQuery.class,
-                                                                                                          "name",
-                                                                                                          classloader );
+        
+        final InternalReadAccessor extractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, objectType, "name", null, true );
 
         final FieldValue field = FieldFactory.getFieldValue( queryDescr.getName(),
                                                              ValueType.STRING_TYPE );
@@ -35,30 +34,28 @@
                                                                     context.getConfiguration().getEvaluatorRegistry().getEvaluator( ValueType.STRING_TYPE,
                                                                                                                                     Operator.EQUAL ),
                                                                     field );
+        
+        PatternBuilder.registerReadAccessor( context, objectType, "name", constraint );
+
         // adds appropriate constraint to the pattern
         pattern.addConstraint( constraint );
 
-        InternalReadAccessor arrayExtractor = null;
-        try {
-            arrayExtractor = context.getDialect().getClassFieldExtractorCache().getReader( ((ClassObjectType) objectType).getClassType(),
-                                                                                              "arguments",
-                                                                                              classloader );
-        } catch ( final RuntimeDroolsException e ) {
-            context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                          queryDescr,
-                                                          e,
-                                                          "Unable to create Field Extractor for 'getArguments'" ) );
-        }
+        InternalReadAccessor arrayExtractor = PatternBuilder.getFieldReadAccessor( context, queryDescr, objectType, "arguments", null, true );
 
         String[] params = queryDescr.getParameters();
         String[] types = queryDescr.getParameterTypes();
         int i = 0;
         try {
             for ( i = 0; i < params.length; i++ ) {
-                pattern.addDeclaration( params[i],
-                                        new ArrayElementReader( arrayExtractor,
-                                                            i,
-                                                            context.getDialect().getTypeResolver().resolveType( types[i] ) ) );
+                Declaration declr = pattern.addDeclaration( params[i] );
+                
+                // this bit is different, notice its the ArrayElementReader that we wire up to, not the declaration.
+                ArrayElementReader reader = new ArrayElementReader( arrayExtractor,
+                                        i,
+                                        context.getDialect().getTypeResolver().resolveType( types[i] ) );
+                PatternBuilder.registerReadAccessor( context, objectType, "arguments", reader );
+                
+                declr.setReadAccessor( reader );
             }
         } catch ( ClassNotFoundException e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuildContext.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -17,13 +17,17 @@
 package org.drools.rule.builder;
 
 import java.util.Calendar;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
+import java.util.Map.Entry;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DialectCompiletimeRegistry;
+import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.QueryDescr;
@@ -61,14 +65,16 @@
     /**
      * Default constructor
      */
-    public RuleBuildContext(final PackageBuilderConfiguration configuration,                            
+    public RuleBuildContext(final PackageBuilder pkgBuilder,                                 
                             final RuleDescr ruleDescr,
                             final DialectCompiletimeRegistry dialectCompiletimeRegistry,
                             final Package pkg,
                             final Dialect defaultDialect) {
         this.buildStack = new Stack<RuleConditionElement>();
-        this.declarationResolver = new DeclarationScopeResolver( new Map[]{pkg.getGlobals()},
+
+        this.declarationResolver = new DeclarationScopeResolver( new Map[]{pkgBuilder.getGlobals()},
                                                                  this.buildStack );
+        this.declarationResolver.setPackage( pkg );
         this.ruleDescr = ruleDescr;
 
         if ( ruleDescr instanceof QueryDescr ) {
@@ -83,7 +89,7 @@
                        ruleDescr,
                        ruleDescr.getAttributes() );
         
-        init(configuration, pkg, ruleDescr, dialectCompiletimeRegistry, defaultDialect, this.rule );
+        init(pkgBuilder, pkg, ruleDescr, dialectCompiletimeRegistry, defaultDialect, this.rule );
         
         if ( this.rule.getDialect() == null ) {
             this.rule.setDialect( getDialect().getId() );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaProcessBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -66,7 +66,7 @@
 
         final List globalTypes = new ArrayList(globals.length);
         for (int i = 0, length = globals.length; i < length; i++) {
-            globalTypes.add(((Class) context.getPkg().getGlobals().get(globals[i])).getName().replace('$',
+            globalTypes.add(context.getPkg().getGlobals().get(globals[i]).replace('$',
                     '.'));
         }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/AbstractJavaRuleBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -99,7 +99,7 @@
 
         final List globalTypes = new ArrayList(globals.length);
         for (int i = 0, length = globals.length; i < length; i++) {
-            globalTypes.add(((Class) context.getPkg().getGlobals().get(globals[i])).getName().replace('$',
+            globalTypes.add((context.getPkg().getGlobals().get(globals[i])).replace('$',
                     '.'));
         }
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaDialect.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -132,8 +132,6 @@
 
     private PackageRegistry                          packageRegistry;
 
-    private ClassFieldAccessorCache                  classFieldExtractorCache;
-
     public JavaDialect(PackageBuilder builder,
                        PackageRegistry pkgRegistry,
                        Package pkg) {
@@ -142,7 +140,6 @@
         this.packageRegistry = pkgRegistry;
 
         this.configuration = (JavaDialectConfiguration) builder.getPackageBuilderConfiguration().getDialectConfiguration( "java" );
-        this.classFieldExtractorCache = builder.getClassFieldExtractorCache();
 
         this.errorHandlers = new HashMap();
         this.results = new ArrayList();
@@ -155,9 +152,10 @@
 
         // initialie the dialect runtime data if it doesn't already exist
         if ( pkg.getDialectRuntimeRegistry().getDialectData( ID ) == null ) {
-            data = new JavaDialectRuntimeData( this.pkg.getDialectRuntimeRegistry() );
+            data = new JavaDialectRuntimeData( );
             this.pkg.getDialectRuntimeRegistry().setDialectData( ID,
                                                                  data );
+            data.onAdd(  this.pkg.getDialectRuntimeRegistry(), this.packageBuilder.getRootClassLoader() );
         }
 
         this.packageStoreWrapper = new PackageStore( data,
@@ -284,15 +282,6 @@
     }
 
     /**
-     * Returns the cache of field extractors
-     *
-     * @return
-     */
-    public ClassFieldAccessorCache getClassFieldExtractorCache() {
-        return this.classFieldExtractorCache;
-    }
-
-    /**
      * Returns the Knowledge Helper Fixer
      *
      * @return
@@ -401,7 +390,7 @@
         final CompilationResult result = this.compiler.compile( classes,
                                                                 this.src,
                                                                 this.packageStoreWrapper,
-                                                                this.pkg.getDialectRuntimeRegistry().getClassLoader() );
+                                                                this.packageBuilder.getRootClassLoader() );
 
         //this will sort out the errors based on what class/file they happened in
         if ( result.getErrors().length > 0 ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaPredicateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaPredicateBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/java/JavaPredicateBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -19,7 +19,7 @@
                       final Declaration[] localDeclarations,
                       final PredicateConstraint predicateConstraint,
                       final PredicateDescr predicateDescr) {
-        final String className = "returnValue" + context.getNextId();
+        final String className = "predicate" + context.getNextId();
         predicateDescr.setClassMethodName( className );
 
         final Map map = createVariableContext( className,

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -29,6 +29,10 @@
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.DroolsMVELShadowFactory;
 import org.drools.base.mvel.MVELAccumulator;
+import org.drools.base.mvel.MVELCompilationUnit;
+import org.drools.base.mvel.MVELCompileable;
+import org.drools.base.mvel.MVELConsequence;
+import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.BaseDescr;
@@ -61,164 +65,199 @@
     public RuleConditionElement build(final RuleBuildContext context,
                                       final BaseDescr descr,
                                       final Pattern prefixPattern) {
+        try {
+            final AccumulateDescr accumDescr = (AccumulateDescr) descr;
 
-        final AccumulateDescr accumDescr = (AccumulateDescr) descr;
+            if ( !accumDescr.hasValidInput() ) {
+                return null;
+            }
 
-        if ( !accumDescr.hasValidInput() ) {
-            return null;
-        }
+            final RuleConditionBuilder builder = context.getDialect().getBuilder( accumDescr.getInput().getClass() );
 
-        final RuleConditionBuilder builder = context.getDialect().getBuilder( accumDescr.getInput().getClass() );
+            Declaration[] previousDeclarations = (  Declaration[] ) context.getDeclarationResolver().getDeclarations().values().toArray( new Declaration[ context.getDeclarationResolver().getDeclarations().size() ] );
+            
+            // create source CE
+            final RuleConditionElement source = builder.build( context,
+                                                               accumDescr.getInput() );
 
-        // create source CE
-        final RuleConditionElement source = builder.build( context,
-                                                           accumDescr.getInput() );
+            if ( source == null ) {
+                return null;
+            }
 
-        if ( source == null ) {
-            return null;
-        }
+            MVELDialect dialect = (MVELDialect) context.getDialect();
 
-        MVELDialect dialect = (MVELDialect) context.getDialect();
+            final Declaration[] sourceDeclArr = (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[ source.getOuterDeclarations().size() ] );
 
-        final Declaration[] sourceDeclArr = (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[0] );
+            Accumulator accumulator = null;
+            Declaration[] declarations = null;
 
-        Accumulator accumulator = null;
-        Declaration[] declarations = null;
+            if ( accumDescr.isExternalFunction() ) {
+                // build an external function executor
+                final Dialect.AnalysisResult analysis = dialect.analyzeExpression( context,
+                                                                                   accumDescr,
+                                                                                   accumDescr.getExpression(),
+                                                                                   new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
 
-        if ( accumDescr.isExternalFunction() ) {
-            // build an external function executor
-            final Dialect.AnalysisResult analysis = dialect.analyzeExpression( context,
-                                                                               accumDescr,
-                                                                               accumDescr.getExpression(),
-                                                                               new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+                //            int size = analysis.getBoundIdentifiers()[0].size();
+                //            declarations = new Declaration[size];
+                //            for ( int i = 0; i < size; i++ ) {
+                //                declarations[i] = context.getDeclarationResolver().getDeclaration( (String) analysis.getBoundIdentifiers()[0].get( i ) );
+                //            }
+                //
+                //            final Serializable expression = dialect.compile( (String) accumDescr.getExpression(),
+                //                                                             analysis,
+                //                                                             null,
+                //                                                             source.getOuterDeclarations(),
+                //                                                             null,
+                //                                                             context );
 
-            int size = analysis.getBoundIdentifiers()[0].size();
-            declarations = new Declaration[size];
-            for ( int i = 0; i < size; i++ ) {
-                declarations[i] = context.getDeclarationResolver().getDeclaration( (String) analysis.getBoundIdentifiers()[0].get( i ) );
-            }
+                MVELCompilationUnit unit = dialect.getMVELCompilationUnit( (String) accumDescr.getExpression(),
+                                                                           analysis,
+                                                                           previousDeclarations,
+                                                                           (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[source.getOuterDeclarations().size()] ),
+                                                                           null,
+                                                                           context );
 
-            final Serializable expression = dialect.compile( (String) accumDescr.getExpression(),
-                                                             analysis,
-                                                             null,
-                                                             source.getOuterDeclarations(),
-                                                             null,
-                                                             context );
+                AccumulateFunction function = context.getConfiguration().getAccumulateFunction( accumDescr.getFunctionIdentifier() );
 
-            AccumulateFunction function = context.getConfiguration().getAccumulateFunction( accumDescr.getFunctionIdentifier() );
+                accumulator = new MVELAccumulatorFunctionExecutor( unit,
+                                                                   function );
+            } else {
+                // it is a custom accumulate
+                final MVELAnalysisResult initCodeAnalysis = (MVELAnalysisResult) dialect.analyzeBlock( context,
+                                                                                                       accumDescr,
+                                                                                                       accumDescr.getInitCode(),
+                                                                                                       new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
 
-            final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                                     source.getOuterDeclarations(),
-                                                                     context.getPkg().getGlobals() );
+                final MVELAnalysisResult actionCodeAnalysis = (MVELAnalysisResult) dialect.analyzeBlock( context,
+                                                                                                         accumDescr,
+                                                                                                         null,
+                                                                                                         accumDescr.getActionCode(),
+                                                                                                         new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()},
+                                                                                                         initCodeAnalysis.getMvelVariables() );
+                final MVELAnalysisResult resultCodeAnalysis = (MVELAnalysisResult) dialect.analyzeExpression( context,
+                                                                                                              accumDescr,
+                                                                                                              accumDescr.getResultCode(),
+                                                                                                              new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()},
+                                                                                                              initCodeAnalysis.getMvelVariables() );
 
-            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
-            factory.setNextFactory( data.getFunctionFactory() );
+                Dialect.AnalysisResult reverseCodeAnalysis = null;
+                if ( accumDescr.getReverseCode() != null ) {
+                    reverseCodeAnalysis = context.getDialect().analyzeBlock( context,
+                                                                             accumDescr,
+                                                                             accumDescr.getActionCode(),
+                                                                             new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+                }
+                    
+                MVELCompilationUnit initUnit = dialect.getMVELCompilationUnit( (String) accumDescr.getInitCode(),
+                                                                               initCodeAnalysis,
+                                                                               previousDeclarations,
+                                                                               (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[source.getOuterDeclarations().size()] ),
+                                                                               null, 
+                                                                               context );
 
-            accumulator = new MVELAccumulatorFunctionExecutor( factory,
-                                                               expression,
-                                                               function );
-        } else {
-            // it is a custom accumulate
-            final MVELAnalysisResult initCodeAnalysis = (MVELAnalysisResult) dialect.analyzeBlock( context,
-                                                                                                   accumDescr,
-                                                                                                   accumDescr.getInitCode(),
-                                                                                                   new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+                //            final Serializable init = dialect.compile( (String) accumDescr.getInitCode(),
+                //                                                       initCodeAnalysis,
+                //                                                       null,
+                //                                                       source.getOuterDeclarations(),
+                //                                                       null,
+                //                                                       context );
 
-            final MVELAnalysisResult actionCodeAnalysis = (MVELAnalysisResult) dialect.analyzeBlock( context,
-                                                                                                     accumDescr,
-                                                                                                     null,
-                                                                                                     accumDescr.getActionCode(),
-                                                                                                     new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()},
-                                                                                                     initCodeAnalysis.getMvelVariables() );
-            //actionCodeAnalysis.setMvelVariables( initCodeAnalysis.getMvelVariables() );
-            final MVELAnalysisResult resultCodeAnalysis = (MVELAnalysisResult) dialect.analyzeExpression( context,
-                                                                                                          accumDescr,
-                                                                                                          accumDescr.getResultCode(),
-                                                                                                          new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()},
-                                                                                                          initCodeAnalysis.getMvelVariables() );
-            //resultCodeAnalysis.setMvelVariables( initCodeAnalysis.getMvelVariables() );
+                MVELCompilationUnit actionUnit = dialect.getMVELCompilationUnit( (String) accumDescr.getActionCode(),
+                                                                                 actionCodeAnalysis,
+                                                                                 previousDeclarations,
+                                                                                 (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[source.getOuterDeclarations().size()] ),
+                                                                                 initCodeAnalysis.getMvelVariables(),
+                                                                                 context );
 
-            final List requiredDeclarations = new ArrayList( initCodeAnalysis.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( actionCodeAnalysis.getBoundIdentifiers()[0] );
-            requiredDeclarations.addAll( resultCodeAnalysis.getBoundIdentifiers()[0] );
+                //            final Serializable action = dialect.compile( (String) accumDescr.getActionCode(),
+                //                                                         actionCodeAnalysis,
+                //                                                         null,
+                //                                                         source.getOuterDeclarations(),
+                //                                                         initCodeAnalysis.getMvelVariables(),
+                //                                                         context );
 
-            Dialect.AnalysisResult reverseCodeAnalysis = null;
-            if ( accumDescr.getReverseCode() != null ) {
-                reverseCodeAnalysis = context.getDialect().analyzeBlock( context,
-                                                                         accumDescr,
-                                                                         accumDescr.getActionCode(),
-                                                                         new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
-                requiredDeclarations.addAll( reverseCodeAnalysis.getBoundIdentifiers()[0] );
-            }
+                // Serializable reverse = null;
+                MVELCompilationUnit reverseUnit = null;
+                if ( accumDescr.getReverseCode() != null ) {
+                    reverseUnit = dialect.getMVELCompilationUnit( (String) accumDescr.getReverseCode(),
+                                                                  resultCodeAnalysis,
+                                                                  previousDeclarations,
+                                                                  (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[source.getOuterDeclarations().size()] ),
+                                                                  initCodeAnalysis.getMvelVariables(),
+                                                                  context );
 
-            declarations = new Declaration[requiredDeclarations.size()];
-            for ( int i = 0, size = requiredDeclarations.size(); i < size; i++ ) {
-                declarations[i] = context.getDeclarationResolver().getDeclaration( (String) requiredDeclarations.get( i ) );
-            }
+                    //                reverse = dialect.compile( (String) accumDescr.getReverseCode(),
+                    //                                           resultCodeAnalysis,
+                    //                                           null,
+                    //                                           source.getOuterDeclarations(),
+                    //                                           initCodeAnalysis.getMvelVariables(),
+                    //                                           context );
+                }
 
-            final Serializable init = dialect.compile( (String) accumDescr.getInitCode(),
-                                                       initCodeAnalysis,
-                                                       null,
-                                                       source.getOuterDeclarations(),
-                                                       null,
-                                                       context );
-            final Serializable action = dialect.compile( (String) accumDescr.getActionCode(),
-                                                         actionCodeAnalysis,
-                                                         null,
-                                                         source.getOuterDeclarations(),
-                                                         initCodeAnalysis.getMvelVariables(),
-                                                         context );
+                MVELCompilationUnit resultUnit = dialect.getMVELCompilationUnit( (String) accumDescr.getResultCode(),
+                                                                                 resultCodeAnalysis,
+                                                                                 previousDeclarations,
+                                                                                 (Declaration[]) source.getOuterDeclarations().values().toArray( new Declaration[source.getOuterDeclarations().size()] ),
+                                                                                 initCodeAnalysis.getMvelVariables(),
+                                                                                 context );
 
-            Serializable reverse = null;
-            if ( accumDescr.getReverseCode() != null ) {
-                reverse = dialect.compile( (String) accumDescr.getReverseCode(),
-                                           resultCodeAnalysis,
-                                           null,
-                                           source.getOuterDeclarations(),
-                                           initCodeAnalysis.getMvelVariables(),
-                                           context );
-            }
+                //            final Serializable result = dialect.compile( (String) accumDescr.getResultCode(),
+                //                                                         resultCodeAnalysis,
+                //                                                         null,
+                //                                                         source.getOuterDeclarations(),
+                //                                                         initCodeAnalysis.getMvelVariables(),
+                //                                                         context );
 
-            final Serializable result = dialect.compile( (String) accumDescr.getResultCode(),
-                                                         resultCodeAnalysis,
-                                                         null,
-                                                         source.getOuterDeclarations(),
-                                                         initCodeAnalysis.getMvelVariables(),
-                                                         context );
+                //DroolsMVELFactory factory = null;
+                if ( reverseUnit == null ) {
+                    //                // does not support reverse, so create a regular factory
+                    //                factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
+                    //                                                 source.getOuterDeclarations(),
+                    //                                                 context.getPkg().getGlobals() );
+                } else {
+                    Set<String> shadow = new HashSet<String>( source.getOuterDeclarations().keySet() );
+                    shadow.retainAll( reverseCodeAnalysis.getNotBoundedIdentifiers() );
+                    shadow.addAll( reverseCodeAnalysis.getBoundIdentifiers()[0] );
 
-            DroolsMVELFactory factory = null;
-            if ( reverse == null ) {
-                // does not support reverse, so create a regular factory
-                factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                 source.getOuterDeclarations(),
-                                                 context.getPkg().getGlobals() );
-            } else {
-                Set<String> shadow = new HashSet<String>( source.getOuterDeclarations().keySet() );
-                shadow.retainAll( reverseCodeAnalysis.getNotBoundedIdentifiers() );
-                shadow.addAll( reverseCodeAnalysis.getBoundIdentifiers()[0] );
-                
-                // supports reverse, so create a shadowing factory
-                factory = new DroolsMVELShadowFactory( context.getDeclarationResolver().getDeclarations(),
-                                                       source.getOuterDeclarations(),
-                                                       context.getPkg().getGlobals(),
-                                                       shadow );
+                    reverseUnit.setShadowIdentifiers( (String[]) shadow.toArray( new String[shadow.size()] ) );
+
+                    // supports reverse, so create a shadowing factory
+                    //                factory = new DroolsMVELShadowFactory( context.getDeclarationResolver().getDeclarations(),
+                    //                                                       source.getOuterDeclarations(),
+                    //                                                       context.getPkg().getGlobals(),
+                    //                                                       ( String[] ) shadow.toArray( new String[ shadow.size() ] ) );
+                }
+
+                //            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
+                //            factory.setNextFactory( data.getFunctionFactory() );
+
+                accumulator = new MVELAccumulator( initUnit,
+                                                   actionUnit,
+                                                   reverseUnit,
+                                                   resultUnit );
+
             }
 
+            final Accumulate accumulate = new Accumulate( source,
+                                                          declarations,
+                                                          sourceDeclArr,
+                                                          accumulator );
+
             MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
-            factory.setNextFactory( data.getFunctionFactory() );
+            data.addCompileable( accumulate,
+                                 (MVELCompileable) accumulator );
 
-            accumulator = new MVELAccumulator( factory,
-                                               init,
-                                               action,
-                                               reverse,
-                                               result );
+            ((MVELCompileable) accumulator).compile( context.getPackageBuilder().getRootClassLoader() );
 
+            return accumulate;
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            context.getErrors().add( new DescrBuildError( context.getParentDescr(),
+                                                          descr,
+                                                          e,
+                                                          "Unable to build expression for 'accumulate' : " + e.getMessage() ) );
+            return null;
         }
-
-        final Accumulate accumulate = new Accumulate( source,
-                                                      declarations,
-                                                      sourceDeclArr,
-                                                      accumulator );
-        return accumulate;
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,6 +8,7 @@
 
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.MVELAction;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.ActionDescr;
@@ -78,29 +79,27 @@
                                                                     dialect.getInterceptors(),
                                                                     text,
                                                                     new Set[]{Collections.EMPTY_SET, context.getPkg().getGlobals().keySet()},
-                                                                    null );
-
-            final Serializable expr = dialect.compile( text,
-                                                       analysis,
-                                                       dialect.getInterceptors(),
-                                                       null,
-                                                       null,
-                                                       context );
-
-            final DroolsMVELFactory factory = new DroolsMVELFactory( null,
-                                                                     null,
-                                                                     context.getPkg().getGlobals(),
-                                                                     analysis.getBoundIdentifiers() );
+                                                                    null );                       
             
-            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
-            factory.setNextFactory( data.getFunctionFactory() );            
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text,
+                                                                       analysis,
+                                                                       null,
+                                                                       null,
+                                                                       null,
+                                                                       context );              
+            MVELAction expr = new MVELAction( unit, context.getDialect().getId() );            
+            action.setMetaData("Action",  expr );
             
-            action.setMetaData("Action", new MVELAction( expr, factory )  );
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( dialect.getId() );            
+            data.addCompileable( action,
+                                  expr );  
+            
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                           actionDescr,
                                                           null,
-                                                          "Unable to build expression for 'action' '" + actionDescr.getText() + "'" ) );
+                                                          "Unable to build expression for 'action' : " + e.getMessage() + " '"+ actionDescr.getText() + "'" ) );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -6,13 +6,18 @@
 import java.util.Set;
 
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.base.mvel.MVELConsequence;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
+import org.drools.rule.Declaration;
+import org.drools.rule.MVELDialectRuntimeData;
 import org.drools.rule.builder.ConsequenceBuilder;
+import org.drools.rule.builder.PackageBuildContext;
 import org.drools.rule.builder.RuleBuildContext;
 import org.mvel.Macro;
 import org.mvel.MacroProcessor;
+import org.mvel.compiler.CompiledExpression;
 
 public class MVELConsequenceBuilder
     implements
@@ -78,28 +83,29 @@
                                                                     text,
                                                                     new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()},
                                                                     null );
+            
+            Declaration[] previousDeclarations = (Declaration[]) context.getDeclarationResolver().getDeclarations().values().toArray( new Declaration[context.getDeclarationResolver().getDeclarations().size()] );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text,
+                                                                       analysis,
+                                                                       previousDeclarations,
+                                                                       null,
+                                                                       null,
+                                                                       context );
 
-            final Serializable expr = dialect.compile( text,
-                                                       analysis,
-                                                       dialect.getInterceptors(),
-                                                       null,
-                                                       null,
-                                                       context );
-
-            final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                                     null,
-                                                                     context.getPkg().getGlobals(),
-                                                                     analysis.getBoundIdentifiers() );
+            MVELConsequence expr = new MVELConsequence( unit,
+                                                        dialect.getId() );
+            context.getRule().setConsequence( expr );
             
-
-            context.getRule().setConsequence( new MVELConsequence( expr,
-                                                                   factory,
-                                                                   dialect.getId() ) );
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( context.getDialect().getId() );            
+            data.addCompileable( context.getRule(),
+                                  expr );
+            
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    context.getRuleDescr(),
-                                                    null,
-                                                    "Unable to build expression for 'consequence': "+e.getMessage()+" '" + context.getRuleDescr().getConsequence() + "'" ) );
+                                                          context.getRuleDescr(),
+                                                          null,
+                                                          "Unable to build expression for 'consequence': " + e.getMessage() + " '" + context.getRuleDescr().getConsequence() + "'" ) );
         }
     }
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELDialect.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,17 +8,23 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ModifyInterceptor;
 import org.drools.base.TypeResolver;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.base.mvel.MVELDebugHandler;
+import org.drools.common.InternalRuleBase;
 import org.drools.commons.jci.readers.MemoryResourceReader;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
@@ -128,10 +134,10 @@
     protected Package                                      pkg;
     private MVELDialectConfiguration                       configuration;
 
+    private PackageBuilder                                 pkgBuilder;
+
     private PackageRegistry                                packageRegistry;
 
-    private ClassFieldAccessorCache                        classFieldExtractorCache;
-
     private Map                                            imports;
     private Map                                            packageImports;
 
@@ -154,11 +160,10 @@
                        String id) {
         this.id = id;
         this.pkg = pkg;
+        this.pkgBuilder = builder;
         this.packageRegistry = pkgRegistry;
-
         this.configuration = (MVELDialectConfiguration) builder.getPackageBuilderConfiguration().getDialectConfiguration( "mvel" );
         setLanguageLevel( this.configuration.getLangLevel() );
-        this.classFieldExtractorCache = builder.getClassFieldExtractorCache();
         this.strictMode = this.configuration.isStrict();
 
         MVEL.setThreadSafe( true );
@@ -181,9 +186,11 @@
         MVELDialectRuntimeData data = null;
         // initialise the dialect runtime data if it doesn't already exist
         if ( pkg.getDialectRuntimeRegistry().getDialectData( getId() ) == null ) {
-            data = new MVELDialectRuntimeData( this.pkg.getDialectRuntimeRegistry() );
+            data = new MVELDialectRuntimeData();
             this.pkg.getDialectRuntimeRegistry().setDialectData( getId(),
                                                                  data );
+            data.onAdd( this.pkg.getDialectRuntimeRegistry(),
+                        this.pkgBuilder.getRootClassLoader() );
         }
 
         this.results = new ArrayList();
@@ -201,7 +208,6 @@
         pkg = (Package) in.readObject();
         packageRegistry = (PackageRegistry) in.readObject();
         configuration = (MVELDialectConfiguration) in.readObject();
-        classFieldExtractorCache = (ClassFieldAccessorCache) in.readObject();
         imports = (Map) in.readObject();
         packageImports = (Map) in.readObject();
         strictMode = in.readBoolean();
@@ -214,7 +220,6 @@
         out.writeObject( pkg );
         out.writeObject( packageRegistry );
         out.writeObject( configuration );
-        out.writeObject( classFieldExtractorCache );
         out.writeObject( imports );
         out.writeObject( packageImports );
         out.writeBoolean( strictMode );
@@ -396,7 +401,7 @@
         String methodName = staticImportEntry.substring( index + 1 );
 
         try {
-            Class cls = this.pkg.getDialectRuntimeRegistry().getClassLoader().loadClass( className );
+            Class cls = this.pkgBuilder.getRootClassLoader().loadClass( className );
             if ( cls != null ) {
 
                 // First try and find a matching method
@@ -424,6 +429,9 @@
                                            -1 ) );
     }
 
+    //    private Map staticFieldImports = new HashMap();
+    //    private Map staticMethodImports = new HashMap();
+
     public boolean isStrictMode() {
         return strictMode;
     }
@@ -493,17 +501,10 @@
         // context.getPkg().getGlobals().keySet()}
 
         Dialect.AnalysisResult result = null;
-        try {
-            result = this.analyzer.analyzeExpression( context,
-                                                      text,
-                                                      availableIdentifiers,
-                                                      localTypes );
-        } catch ( final Exception e ) {
-            context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                          descr,
-                                                          e,
-                                                          "Unable to determine the used declarations.\n" + e.getMessage() ) );
-        }
+        result = this.analyzer.analyzeExpression( context,
+                                                  text,
+                                                  availableIdentifiers,
+                                                  localTypes );
         return result;
     }
 
@@ -526,8 +527,9 @@
 
         synchronized ( COMPILER_LOCK ) {
             ClassLoader tempClassLoader = Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader( pkg.getPackageScopeClassLoader() );
 
+            Thread.currentThread().setContextClassLoader( pkgBuilder.getRootClassLoader() );
+
             AbstractParser.setLanguageLevel( languageLevel );
             Serializable expr = compiler.compile( parserContext );
 
@@ -537,6 +539,125 @@
         }
     }
 
+    public MVELCompilationUnit getMVELCompilationUnit(final String expression,
+                                                      final Dialect.AnalysisResult analysis,
+                                                      final Declaration[] previousDeclarations,
+                                                      final Declaration[] localDeclarations,
+                                                      final Map<String, Class> otherInputVariables,
+                                                      final PackageBuildContext context) {
+        String[] pkgImports = new String[this.packageImports.size()];
+        int i = 0;
+        for ( Iterator it = this.packageImports.values().iterator(); it.hasNext(); ) {
+            pkgImports[i] = (String) it.next();
+        }
+
+        //String[] imports = new String[this.imports.size()];
+        List<String> importClasses = new ArrayList<String>();
+        List<String> importMethods = new ArrayList<String>();
+        List<String> importFields = new ArrayList<String>();
+        for ( Iterator it = this.imports.values().iterator(); it.hasNext(); ) {
+            Object object = it.next();
+            if ( object instanceof Class ) {
+                importClasses.add( ((Class) object).getName() );
+            } else if ( object instanceof Method ) {
+                Method method = (Method) object;
+                importMethods.add( method.getDeclaringClass().getName() + "." + method.getName() );
+            } else {
+                Field field = (Field) object;
+                importFields.add( field.getDeclaringClass().getName() + "." + field.getName() );
+            }
+        }
+
+        Map<String, Class> resolvedInputs = new HashMap<String, Class>();
+        String[] globalIdentifiers = new String[]{};
+        String[] otherIdentifiers = otherInputVariables == null ? new String[]{} : new String[otherInputVariables.size()];
+
+        // FIXME: analysis can be null, throws an NPE
+        if ( analysis != null ) {
+            List list[] = analysis.getBoundIdentifiers();
+
+            Map globalTypes = context.getPackageBuilder().getGlobals();
+            globalIdentifiers = new String[list[1].size()];
+            i = 0;
+            for ( Iterator it = list[1].iterator(); it.hasNext(); ) {
+                String identifier = (String) it.next();
+                globalIdentifiers[i++] = identifier;
+                resolvedInputs.put( identifier,
+                                    (Class) globalTypes.get( identifier ) );
+            }
+
+//            // @TODO yuck, we don't want conditions for configuration :(
+//            if ( context instanceof RuleBuildContext ) {
+//                DeclarationScopeResolver resolver = ((RuleBuildContext) context).getDeclarationResolver();
+//                for ( Iterator it = list[0].iterator(); it.hasNext(); ) {
+//                    String identifier = (String) it.next();
+//                    Class cls = resolver.getDeclaration( identifier ).getExtractor().getExtractToClass();
+//                    resolvedInputs.put( identifier,
+//                                        cls );
+//                }
+//            }
+
+            // Set<String> usedIdentifiers = new HashSet<String>( list[0] );
+
+            if ( previousDeclarations != null ) {
+                for ( Declaration declr : previousDeclarations ) {
+                    resolvedInputs.put( declr.getIdentifier(),
+                                        declr.getExtractor().getExtractToClass() );
+                }
+            }
+
+            if ( localDeclarations != null ) {
+                for ( Declaration declr : localDeclarations ) {
+                    resolvedInputs.put( declr.getIdentifier(),
+                                        declr.getExtractor().getExtractToClass() );
+                }
+            }
+
+            //            if ( outerDeclarations != null ) {
+            //                i = 0;
+            //                for ( Iterator it = outerDeclarations.entrySet().iterator(); it.hasNext(); ) {
+            //                    Entry entry = (Entry) it.next();
+            //                    resolvedInputs.put( (String) entry.getKey(),
+            //                                        ((Declaration) entry.getValue()).getExtractor().getExtractToClass() );
+            //                }
+            //            }
+
+            if ( otherInputVariables != null ) {
+                i = 0;
+                for ( Iterator it = otherInputVariables.entrySet().iterator(); it.hasNext(); ) {
+                    Entry entry = (Entry) it.next();
+                    otherIdentifiers[i++] = (String) entry.getKey();
+                    resolvedInputs.put( (String) entry.getKey(),
+                                        (Class) entry.getValue() );
+                }
+            }
+        }
+
+        String[] inputIdentifiers = new String[resolvedInputs.size()];
+        String[] inputTypes = new String[resolvedInputs.size()];
+        i = 0;
+        for ( Entry<String, Class> entry : resolvedInputs.entrySet() ) {
+            inputIdentifiers[i] = entry.getKey();
+            inputTypes[i++] = entry.getValue().getName();
+        }
+
+        MVELCompilationUnit compilationUnit = new MVELCompilationUnit( expression,
+                                                                       pkgImports,
+                                                                       importClasses.toArray( new String[importClasses.size()] ),
+                                                                       importMethods.toArray( new String[importMethods.size()] ),
+                                                                       importFields.toArray( new String[importFields.size()] ),
+                                                                       globalIdentifiers,
+                                                                       previousDeclarations,
+                                                                       localDeclarations,
+                                                                       otherIdentifiers,
+                                                                       inputIdentifiers,
+                                                                       inputTypes,
+                                                                       languageLevel,
+                                                                       strictMode );
+
+        return compilationUnit;
+    }
+
     public ParserContext getParserContext(final Dialect.AnalysisResult analysis,
                                           final Map outerDeclarations,
                                           final Map otherInputVariables,
@@ -573,7 +694,7 @@
                 }
             }
 
-            Map globalTypes = context.getPkg().getGlobals();
+            Map globalTypes = context.getPackageBuilder().getGlobals();
             for ( Iterator it = list[1].iterator(); it.hasNext(); ) {
                 String identifier = (String) it.next();
                 parserContext.addInput( identifier,
@@ -611,10 +732,6 @@
         return this.builders;
     }
 
-    public ClassFieldAccessorCache getClassFieldExtractorCache() {
-        return this.classFieldExtractorCache;
-    }
-
     public PatternBuilder getPatternBuilder() {
         return this.PATTERN_BUILDER;
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -21,6 +21,7 @@
 import java.util.Set;
 
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.base.mvel.MVELEvalExpression;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
@@ -66,40 +67,37 @@
         final EvalDescr evalDescr = (EvalDescr) descr;
 
         try {
-            final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                                     null,
-                                                                     context.getPkg().getGlobals() );   
+            MVELDialect dialect = (MVELDialect) context.getDialect( context.getDialect().getId() );
 
             Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                       evalDescr,
                                                                                       evalDescr.getContent(),
                                                                                       new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
-            final List[] usedIdentifiers = analysis.getBoundIdentifiers();
 
-            final Declaration[] declarations = new Declaration[usedIdentifiers[0].size()];
-            for ( int i = 0, size = usedIdentifiers[0].size(); i < size; i++ ) {
-                declarations[i] = context.getDeclarationResolver().getDeclaration( (String) usedIdentifiers[0].get( i ) );
-            }
+            Declaration[] previousDeclarations = (Declaration[]) context.getDeclarationResolver().getDeclarations().values().toArray( new Declaration[context.getDeclarationResolver().getDeclarations().size()] );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( (String) evalDescr.getContent(),
+                                                                       analysis,
+                                                                       previousDeclarations,
+                                                                       null,
+                                                                       null,
+                                                                       context );
+            final EvalCondition eval = new EvalCondition( previousDeclarations );
 
-            final EvalCondition eval = new EvalCondition( declarations );
-
-            Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) evalDescr.getContent(),
-                                                                              analysis,
-                                                                              null,
-                                                                              null,
-                                                                              null,
-                                                                              context );
-
-            eval.setEvalExpression( new MVELEvalExpression( expr,
-                                                            factory,
-                                                            context.getDialect().getId() ) );
-
+            MVELEvalExpression expr = new MVELEvalExpression( unit,
+                                                              dialect.getId() );
+            eval.setEvalExpression( expr );            
+            
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( context.getDialect().getId() );
+            data.addCompileable( eval,
+                                  expr );
+            
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
             return eval;
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
-                                                    evalDescr,
-                                                    e,
-                                                    "Unable to build expression for 'eval' node '" + evalDescr.getContent() + "'" ) );
+                                                          evalDescr,
+                                                          e,
+                                                          "Unable to build expression for 'eval':" + e.getMessage() + " '" + evalDescr.getContent() + "'" ) );
             return null;
         }
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELExprAnalyzer.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -59,7 +59,7 @@
     public MVELAnalysisResult analyzeExpression(final PackageBuildContext context,
                                                 final String expr,
                                                 final Set[] availableIdentifiers,
-                                                final Map localTypes) throws RecognitionException {
+                                                final Map localTypes) {
         MVELAnalysisResult result = null;
         if ( expr.trim().length() > 0 ) {
             ExpressionCompiler compiler = new ExpressionCompiler( expr );
@@ -111,7 +111,7 @@
      *             If an error occurs in the parser.
      */
     private MVELAnalysisResult analyze(final Set identifiers,
-                                       final Set[] availableIdentifiers) throws RecognitionException {
+                                       final Set[] availableIdentifiers) {
 
         MVELAnalysisResult result = new MVELAnalysisResult();
         result.setIdentifiers( new ArrayList( identifiers ) );

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELFromBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -21,12 +21,15 @@
 
 import org.drools.base.dataproviders.MVELDataProvider;
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.lang.descr.AccessorDescr;
 import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.FromDescr;
+import org.drools.rule.Declaration;
 import org.drools.rule.From;
+import org.drools.rule.MVELDialectRuntimeData;
 import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
 import org.drools.rule.builder.FromBuilder;
@@ -55,12 +58,8 @@
         final FromDescr fromDescr = (FromDescr) descr;
 
         final AccessorDescr accessor = (AccessorDescr) fromDescr.getDataSource();
-        DataProvider dataProvider = null;
+        From from = null;
         try {
-            final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                                     null,
-                                                                     context.getPkg().getGlobals() );
-
             // This builder is re-usable in other dialects, so specify by name
             MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
 
@@ -70,24 +69,31 @@
                                                                          text,
                                                                          new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
 
-            final Serializable expr = dialect.compile( text,
-                                                       analysis,
-                                                       null,
-                                                       null,
-                                                       null,
-                                                       context );
+            Declaration[] previousDeclarations = (Declaration[]) context.getDeclarationResolver().getDeclarations().values().toArray( new Declaration[context.getDeclarationResolver().getDeclarations().size()] );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text,
+                                                                       analysis,
+                                                                       previousDeclarations,
+                                                                       null,
+                                                                       null,
+                                                                       context );
 
-            dataProvider = new MVELDataProvider( expr,
-                                                 factory,
-                                                 context.getDialect().getId() );
+            MVELDataProvider dataProvider = new MVELDataProvider( unit,
+                                                                  context.getDialect().getId() );
+            from = new From( dataProvider );
+
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( dialect.getId() );
+            data.addCompileable( from,
+                                  dataProvider );
+            
+            dataProvider.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                           fromDescr,
                                                           null,
-                                                          "Unable to build expression for 'from' node '" + accessor + "'" ) );
+                                                          "Unable to build expression for 'from' : " + e.getMessage() + " '" + accessor + "'" ) );
             return null;
         }
 
-        return new From( dataProvider );
+        return from;
     }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,7 @@
 import java.util.Set;
 
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.base.mvel.MVELPredicateExpression;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
@@ -47,43 +48,30 @@
                       final Declaration[] localDeclarations,
                       final PredicateConstraint predicate,
                       final PredicateDescr predicateDescr) {
-        Map previousMap = new HashMap();
-        for ( int i = 0, length = previousDeclarations.length; i < length; i++ ) {
-            previousMap.put( previousDeclarations[i].getIdentifier(),
-                             previousDeclarations[i] );
-        }
+        MVELDialect dialect = (MVELDialect) context.getDialect( context.getDialect().getId() );
 
-        Map localMap = new HashMap();
-        for ( int i = 0, length = localDeclarations.length; i < length; i++ ) {
-            localMap.put( localDeclarations[i].getIdentifier(),
-                          localDeclarations[i] );
-        }
-
-        try {
-            final DroolsMVELFactory factory = new DroolsMVELFactory( previousMap,
-                                                                     localMap,
-                                                                     context.getPkg().getGlobals() );
-            
+        try {            
             Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                       predicateDescr,
                                                                                       predicateDescr.getContent(),
                                                                                       new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
 
-            final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) predicateDescr.getContent(),
-                                                                                    analysis,
-                                                                                    null,
-                                                                                    null,
-                                                                                    null,
-                                                                                    context );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit((String) predicateDescr.getContent(), analysis,  previousDeclarations, localDeclarations, null, context);
 
-            predicate.setPredicateExpression( new MVELPredicateExpression( expr,
-                                                                           factory,
-                                                                           context.getDialect().getId()) );
+            MVELPredicateExpression expr = new MVELPredicateExpression( unit,
+                                                                      context.getDialect().getId());            
+            predicate.setPredicateExpression( expr );
+            
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( context.getDialect().getId() );            
+            data.addCompileable( predicate,
+                                  expr );              
+
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                     predicateDescr,
                                                     e,
-                                                    "Unable to build expression for 'inline-eval' node '" + predicateDescr.getContent() + "'\n" + e.getMessage() ) );
+                                                    "Unable to build expression for 'inline-eval' : " + e.getMessage() + "'" + predicateDescr.getContent() + "'\n" + e.getMessage() ) );
         }
     }
 

Deleted: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,83 +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.rule.builder.dialect.mvel;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.drools.base.mvel.DroolsMVELFactory;
-import org.drools.base.mvel.MVELReturnValueExpression;
-import org.drools.compiler.Dialect;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.rule.Declaration;
-import org.drools.rule.MVELDialectRuntimeData;
-import org.drools.rule.ReturnValueRestriction;
-import org.drools.rule.builder.ReturnValueBuilder;
-import org.drools.rule.builder.RuleBuildContext;
-
-/**
- * @author etirelli
- *
- */
-public class MVELReturnValueBuilder
-    implements
-    ReturnValueBuilder {
-
-    public void build(final RuleBuildContext context,
-                      final List[] usedIdentifiers,
-                      final Declaration[] previousDeclarations,
-                      final Declaration[] localDeclarations,
-                      final ReturnValueRestriction returnValueRestriction,
-                      final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
-
-        Map previousMap = new HashMap();
-        for ( int i = 0, length = previousDeclarations.length; i < length; i++ ) {
-            previousMap.put( previousDeclarations[i].getIdentifier(),
-                             previousDeclarations[i] );
-        }
-
-        Map localMap = new HashMap();
-        for ( int i = 0, length = localDeclarations.length; i < length; i++ ) {
-            localMap.put( localDeclarations[i].getIdentifier(),
-                          localDeclarations[i] );
-        }
-
-        final DroolsMVELFactory factory = new DroolsMVELFactory( previousMap,
-                                                                 localMap,
-                                                                 context.getPkg().getGlobals() );
-
-        Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
-                                                                                  returnValueRestrictionDescr,
-                                                                                  returnValueRestrictionDescr.getContent(),
-                                                                                  new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
-
-        final Serializable expr = ((MVELDialect) context.getDialect()).compile( (String) returnValueRestrictionDescr.getContent(),
-                                                                                analysis,
-                                                                                null,
-                                                                                null,
-                                                                                null,
-                                                                                context );
-
-        returnValueRestriction.setReturnValueExpression( new MVELReturnValueExpression( expr,
-                                                                                        factory,
-                                                                                        context.getDialect().getId()) );
-    }
-
-}

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,80 @@
+/*
+ * 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.rule.builder.dialect.mvel;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
+import org.drools.base.mvel.MVELPredicateExpression;
+import org.drools.base.mvel.MVELReturnValueExpression;
+import org.drools.compiler.DescrBuildError;
+import org.drools.compiler.Dialect;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.rule.Declaration;
+import org.drools.rule.MVELDialectRuntimeData;
+import org.drools.rule.ReturnValueRestriction;
+import org.drools.rule.builder.ReturnValueBuilder;
+import org.drools.rule.builder.RuleBuildContext;
+
+/**
+ * @author etirelli
+ *
+ */
+public class MVELReturnValueBuilder
+    implements
+    ReturnValueBuilder {
+
+    public void build(final RuleBuildContext context,
+                      final List[] usedIdentifiers,
+                      final Declaration[] previousDeclarations,
+                      final Declaration[] localDeclarations,
+                      final ReturnValueRestriction returnValueRestriction,
+                      final ReturnValueRestrictionDescr returnValueRestrictionDescr) {
+
+        try {  
+            MVELDialect dialect = (MVELDialect) context.getDialect( context.getDialect().getId() );
+    
+            Dialect.AnalysisResult analysis = context.getDialect().analyzeExpression( context,
+                                                                                      returnValueRestrictionDescr,
+                                                                                      returnValueRestrictionDescr.getContent(),
+                                                                                      new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
+    
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit((String) returnValueRestrictionDescr.getContent(), analysis,  previousDeclarations, localDeclarations, null, context);
+    
+            MVELReturnValueExpression expr = new MVELReturnValueExpression( unit,
+                                                                            context.getDialect().getId() );
+            returnValueRestriction.setReturnValueExpression( expr );
+            
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( context.getDialect().getId() );
+            data.addCompileable( returnValueRestriction,
+                                  expr );
+            
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
+        } catch ( final Exception e ) {
+            context.getErrors().add( new DescrBuildError( context.getParentDescr(),
+                                                          context.getRuleDescr(),
+                                                          null,
+                                                          "Unable to build expression for 'returnValue' : " + e.getMessage() + "'" + context.getRuleDescr().getSalience() + "'" ) );
+        }            
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilder.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueEvaluatorBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -5,7 +5,9 @@
 import java.util.Set;
 
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.base.mvel.MVELReturnValueEvaluator;
+import org.drools.base.mvel.MVELReturnValueExpression;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
 import org.drools.compiler.ReturnValueDescr;
@@ -29,36 +31,36 @@
         String text = descr.getText();
 
         try {
-            MVELDialect dialect = (MVELDialect)  context.getDialect( "mvel" );
+            MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
 
             Dialect.AnalysisResult analysis = dialect.analyzeBlock( context,
                                                                     descr,
                                                                     dialect.getInterceptors(),
                                                                     text,
                                                                     new Set[]{Collections.EMPTY_SET, context.getPkg().getGlobals().keySet()},
-                                                                    null );
+                                                                    null );         
 
-            final Serializable expr = dialect.compile( text,
-                                                       analysis,
-                                                       dialect.getInterceptors(),
-                                                       null,
-                                                       null,
-                                                       context );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( text,
+                                                                       analysis,
+                                                                       null,
+                                                                       null,
+                                                                       null,
+                                                                       context );  
 
-            final DroolsMVELFactory factory = new DroolsMVELFactory( null,
-                                                                     null,
-                                                                     context.getPkg().getGlobals(),
-                                                                     analysis.getBoundIdentifiers() );
+            MVELReturnValueEvaluator expr = new MVELReturnValueEvaluator( unit,
+                                                                          dialect.getId() );
+            constraintNode.setEvaluator( expr );
             
-            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
-            factory.setNextFactory( data.getFunctionFactory() );            
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( dialect.getId() );
+            data.addCompileable( constraintNode,
+                                  expr );
             
-            constraintNode.setEvaluator( new MVELReturnValueEvaluator( expr, factory, context.getDialect().getId() ) );
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                           descr,
                                                           null,
-                                                          "Unable to build expression for 'returnValuEvaluator' '" + descr.getText() + "'" ) );
+                                                          "Unable to build expression for 'returnValuEvaluator' : " + e.getMessage() + "'" + descr.getText() + "'" ) );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -4,9 +4,12 @@
 import java.util.Set;
 
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
+import org.drools.base.mvel.MVELReturnValueEvaluator;
 import org.drools.base.mvel.MVELSalienceExpression;
 import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
+import org.drools.rule.Declaration;
 import org.drools.rule.MVELDialectRuntimeData;
 import org.drools.rule.builder.RuleBuildContext;
 import org.drools.rule.builder.SalienceBuilder;
@@ -19,14 +22,7 @@
         // pushing consequence LHS into the stack for variable resolution
         context.getBuildStack().push( context.getRule().getLhs() );
 
-        try {
-            final DroolsMVELFactory factory = new DroolsMVELFactory( context.getDeclarationResolver().getDeclarations(),
-                                                                     null,
-                                                                     context.getPkg().getGlobals() );
-            
-            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
-            factory.setNextFactory( data.getFunctionFactory() );            
-
+        try {        
             // This builder is re-usable in other dialects, so specify by name            
             MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
 
@@ -35,22 +31,28 @@
                                                                          (String) context.getRuleDescr().getSalience(),
                                                                          new Set[]{context.getDeclarationResolver().getDeclarations().keySet(), context.getPkg().getGlobals().keySet()} );
 
-            final Serializable expr = dialect.compile( (String) context.getRuleDescr().getSalience(),
-                                                       analysis,
-                                                       null,
-                                                       null,
-                                                       null,
-                                                       context );
+            Declaration[] previousDeclarations = (Declaration[]) context.getDeclarationResolver().getDeclarations().values().toArray( new Declaration[context.getDeclarationResolver().getDeclarations().size()] );
+            MVELCompilationUnit unit = dialect.getMVELCompilationUnit( (String) context.getRuleDescr().getSalience(),
+                                                                       analysis,
+                                                                       previousDeclarations,
+                                                                       null,
+                                                                       null,
+                                                                       context );
 
-            MVELSalienceExpression salience = new MVELSalienceExpression( expr,
-                                                                          factory );
-
-            context.getRule().setSalience( salience );
+            MVELSalienceExpression expr = new MVELSalienceExpression( unit,
+                                                                          dialect.getId() );
+            context.getRule().setSalience( expr );
+            
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData(dialect.getId() );
+            data.addCompileable( context.getRule(),
+                                 expr );          
+            
+            expr.compile( context.getPackageBuilder().getRootClassLoader() );
         } catch ( final Exception e ) {
             context.getErrors().add( new DescrBuildError( context.getParentDescr(),
                                                           context.getRuleDescr(),
                                                           null,
-                                                          "Unable to build expression for 'salience' node '" + context.getRuleDescr().getSalience() + "'" ) );
+                                                          "Unable to build expression for 'salience' : " + e.getMessage() + "'" + context.getRuleDescr().getSalience() + "'" ) );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -13,6 +13,7 @@
 import org.drools.RuleBase;
 import org.drools.base.ClassTypeResolver;
 import org.drools.base.TypeResolver;
+import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.guvnor.client.modeldriven.testing.ExecutionTrace;
 import org.drools.guvnor.client.modeldriven.testing.Expectation;
@@ -74,7 +75,7 @@
 		this.scenario = ScenarioXMLPersistence.getInstance().unmarshal(xml);
 		this.workingMemory = (InternalWorkingMemory) rb.newStatefulSession();
 		Package pk = rb.getPackages()[0];
-        ClassLoader cl = pk.getPackageScopeClassLoader();
+        ClassLoader cl = ((InternalRuleBase) rb).getRootClassLoader();
         HashSet<String> imports = new HashSet<String>();
         imports.add(pk.getName() + ".*");
         imports.addAll(pk.getImports().keySet());

Modified: labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/main/resources/org/drools/rule/builder/dialect/java/javaInvokers.mvel	2008-08-15 07:39:04 UTC (rev 21562)
@@ -2,7 +2,7 @@
     public java.util.List getMethodBytecode() {
         org.drools.util.asm.MethodComparator.Tracer visit = new org.drools.util.asm.MethodComparator.Tracer("@{methodName}");
 
-        java.io.InputStream is = @{ruleClassName}.class.getClassLoader().getResourceAsStream( "@{package}.@{ruleClassName}".replace( '.', '/' ) + ".class" );
+        java.io.InputStream is = getClass().getClassLoader().getResourceAsStream( "@{package}.@{ruleClassName}".replace( '.', '/' ) + ".class" );
 
         java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
         byte[] data = new byte[1024];
@@ -53,7 +53,7 @@
 @declare{"returnValueInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.ReturnValueExpression, org.drools.spi.CompiledInvoker, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.ReturnValueExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -95,19 +95,13 @@
     @includeNamed{"getMethodBytecode"}
 
     @includeNamed{"equals"}
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
 }
 @end{}
 
 @declare{"predicateInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.PredicateExpression, org.drools.spi.CompiledInvoker, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.PredicateExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -144,19 +138,13 @@
     @includeNamed{"getMethodBytecode"}
 
     @includeNamed{"equals"}
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
 }
 @end{}
 
 @declare{"evalInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.EvalExpression, org.drools.spi.CompiledInvoker, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.EvalExpression, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -186,13 +174,6 @@
     @includeNamed{"getMethodBytecode"}
 
     @includeNamed{"equals"}
-
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
 }
 @end{}
 
@@ -335,20 +316,13 @@
         }
         return Collections.singletonList( bos );
     }
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
-
 }
 @end{}
 
 @declare{"consequenceInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.Consequence, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.Consequence, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -356,8 +330,7 @@
                          org.drools.WorkingMemory workingMemory) throws Exception {
 
         org.drools.spi.Tuple tuple = knowledgeHelper.getTuple();
-        org.drools.rule.Rule rule = knowledgeHelper.getRule();
-        org.drools.rule.Declaration[] declarations = rule.getDeclarations();
+        org.drools.rule.Declaration[] declarations = knowledgeHelper.getRule().getDeclarations();
 
         @foreach{type : declarationTypes, declr : declarations, index : indexes, notPattern : notPatterns}
           org.drools.common.InternalFactHandle @{declr.identifier}__Handle__ = ( org.drools.common.InternalFactHandle ) tuple.get( knowledgeHelper.getDeclaration( declarations[@{index}].getIdentifier() ) );
@@ -375,11 +348,10 @@
 	        @foreach{identifier : globals} @{identifier}
 	        @end{","} );
     }
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
+    
+    public java.util.List getMethodBytecode() {
+        return null;
+    }    
 }
 @end{}
 
@@ -387,7 +359,7 @@
 @declare{"actionInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.Action, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.Action, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -407,19 +379,17 @@
 	        @foreach{identifier : globals} @{identifier}
 	        @end{","}, context );
     }
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
-    }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
+    
+    public java.util.List getMethodBytecode() {
+        return null;
+    }    
 }
 @end{}
 
 @declare{"returnValueEvaluatorInvoker"}
 package @{package};
 
-public class @{invokerClassName} implements org.drools.spi.ReturnValueEvaluator, java.io.Externalizable
+public class @{invokerClassName} implements org.drools.spi.ReturnValueEvaluator, org.drools.spi.CompiledInvoker
 {
     private static final long serialVersionUID  = 400L;
 
@@ -432,11 +402,9 @@
 	        @foreach{identifier : globals} @{identifier}
 	        @end{","} );
     }
-
-    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {
+    
+    public java.util.List getMethodBytecode() {
+        return null;
     }
-
-    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, java.lang.ClassNotFoundException {
-    }
 }
 @end{}
\ No newline at end of file

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderConfigurationTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -350,11 +350,6 @@
         public Map getBuilders() {
             return null;
         }
-
-        public ClassFieldAccessorCache getClassFieldExtractorCache() {
-            return null;
-        }
-
         public ConsequenceBuilder getConsequenceBuilder() {
             return new MockConsequenceBuilder();
         }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -73,6 +73,7 @@
 import org.drools.process.core.context.variable.Variable;
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.rule.Behavior;
+import org.drools.rule.CompositeClassLoader;
 import org.drools.rule.Declaration;
 import org.drools.rule.EvalCondition;
 import org.drools.rule.GroupElement;
@@ -240,10 +241,14 @@
                       builder.getErrors().getErrors() );
 
         final Package newPkg = SerializationHelper.serializeObject( pkg );
-
         final Rule newRule = newPkg.getRule( "rule-1" );
 
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
+
+        // It's been serialised so we have to simulate the re-wiring process
+        newPkg.getDialectRuntimeRegistry().onAdd( ruleBase.getRootClassLoader() );
+        newPkg.getDialectRuntimeRegistry().onBeforeExecute();
+        
         ruleBase.getGlobals().put( "map",
                                    Map.class );
         final WorkingMemory workingMemory = ruleBase.newStatefulSession();
@@ -1082,7 +1087,11 @@
         assertFalse(builder.hasErrors());
 
         Package bp = builder.getPackage();
-        Class newBean = bp.getDialectRuntimeRegistry().getClassLoader().loadClass("org.test.NewBean");
+        CompositeClassLoader rootClassloader = new CompositeClassLoader( Thread.currentThread().getContextClassLoader() );
+        JavaDialectRuntimeData dialectData = ( JavaDialectRuntimeData ) bp.getDialectRuntimeRegistry().getDialectData( "java" );
+        dialectData.onAdd( bp.getDialectRuntimeRegistry(), rootClassloader );
+        
+        Class newBean = rootClassloader.loadClass("org.test.NewBean");
         assertNotNull(newBean);
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MVELTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -89,19 +89,8 @@
     public void testDuplicateLocalVariableMVELConsequence() throws Exception {
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DuplicateLocalVariableMVELConsequence.drl" ) ) );
-
-        try {
-            final Package pkg = builder.getPackage();
-
-            RuleBase ruleBase = getRuleBase();
-            ruleBase.addPackage( pkg );
-
-            ruleBase    = SerializationHelper.serializeObject(ruleBase);
-            fail( "Should have raised exception because of the duplicate variable definition");
-        } catch (Exception e) {
-            // success
-        }
-
+        
+        assertTrue ( builder.hasErrors() );
     }
 
     public Object compiledExecute(String ex) {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -878,7 +878,13 @@
         // pre build the package
         final PackageBuilder builder = new PackageBuilder();
         builder.addPackage( packageDescr );
-        final Package pkg = builder.getPackage();
+        
+        if ( builder.hasErrors() ) {
+            System.err.println( builder.getErrors() );
+        }
+        
+        Package pkg = builder.getPackage();
+        pkg = SerializationHelper.serializeObject( pkg );
 
         // add the package to a rulebase
         RuleBase ruleBase = getRuleBase();
@@ -5480,30 +5486,5 @@
 
     }
 
-    public class SubvertedClassLoader extends URLClassLoader {
 
-        private static final long serialVersionUID = 400L;
-
-        public SubvertedClassLoader(final URL[] urls,
-                                    final ClassLoader parentClassLoader) {
-            super( urls,
-                   parentClassLoader );
-        }
-
-        protected synchronized Class loadClass(String name,
-                                               boolean resolve) throws ClassNotFoundException {
-            // First, check if the class has already been loaded
-            Class c = findLoadedClass( name );
-            if ( c == null ) {
-                try {
-                    c = findClass( name );
-                } catch ( ClassNotFoundException e ) {
-                    c = super.loadClass( name,
-                                         resolve );
-                }
-            }
-            return c;
-        }
-    }
-
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/AccumulateTemplateTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,7 @@
 import org.drools.Cheese;
 import org.drools.Person;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.rule.Declaration;
 import org.drools.spi.PatternExtractor;
@@ -23,11 +24,11 @@
 
 public class AccumulateTemplateTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
     protected void setUp() throws Exception {
-        super.setUp();
-        cache = ClassFieldAccessorCache.getInstance();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     protected void tearDown() throws Exception {
@@ -46,9 +47,9 @@
         final Declaration[] inner = new Declaration[]{new Declaration( "cheese",
                                                                        new PatternExtractor( new ClassObjectType( Cheese.class ) ),
                                                                        null ), new Declaration( "price",
-                                                                                                cache.getReader( Cheese.class,
-                                                                                                                    "price",
-                                                                                                                    getClass().getClassLoader() ),
+                                                                                                store.getReader( Cheese.class,
+                                                                                                                 "price",
+                                                                                                                 getClass().getClassLoader() ),
                                                                                                 null )};
         final String[] globals = new String[]{"aGlobal", "anotherGlobal"};
         final List globalTypes = Arrays.asList( new String[]{"String", "String"} );
@@ -108,8 +109,10 @@
 
         TemplateRegistry registry = getRuleTemplateRegistry();
 
-        Object method = TemplateRuntime.execute(registry.getNamedTemplate("accumulateInnerClass"),
-                null, new MapVariableResolverFactory(map), registry);
+        Object method = TemplateRuntime.execute( registry.getNamedTemplate( "accumulateInnerClass" ),
+                                                 null,
+                                                 new MapVariableResolverFactory( map ),
+                                                 registry );
 
         //System.out.println( method );
     }
@@ -119,20 +122,20 @@
 
         final String[] declarationTypes = new String[]{"String", "int"};
         final Declaration[] declarations = new Declaration[]{new Declaration( "name",
-                                                                              cache.getReader( Person.class,
-                                                                                                  "name",
-                                                                                                  getClass().getClassLoader() ),
+                                                                              store.getReader( Person.class,
+                                                                                               "name",
+                                                                                               getClass().getClassLoader() ),
                                                                               null ), new Declaration( "age",
-                                                                                                       cache.getReader( Person.class,
-                                                                                                                           "age",
-                                                                                                                           getClass().getClassLoader() ),
+                                                                                                       store.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.getReader( Cheese.class,
-                                                                                                                    "price",
-                                                                                                                    getClass().getClassLoader() ),
+                                                                                                store.getReader( Cheese.class,
+                                                                                                                 "price",
+                                                                                                                 getClass().getClassLoader() ),
                                                                                                 null )};
         final String[] globals = new String[]{"aGlobal", "anotherGlobal"};
         final List globalTypes = Arrays.asList( new String[]{"String", "String"} );
@@ -193,8 +196,11 @@
                  Boolean.FALSE );
 
         TemplateRegistry registry = getInvokerTemplateRegistry();
-        Object method = TemplateRuntime.execute(registry.getNamedTemplate("accumulateInvoker"), null, new MapVariableResolverFactory(map), registry);
-        
+        Object method = TemplateRuntime.execute( registry.getNamedTemplate( "accumulateInvoker" ),
+                                                 null,
+                                                 new MapVariableResolverFactory( map ),
+                                                 registry );
+
         //System.out.println( method );
     }
 
@@ -203,13 +209,13 @@
 
         final String[] declarationTypes = new String[]{"String", "int"};
         final Declaration[] declarations = new Declaration[]{new Declaration( "name",
-                                                                              cache.getReader( Person.class,
-                                                                                                  "name",
-                                                                                                  getClass().getClassLoader() ),
+                                                                              store.getReader( Person.class,
+                                                                                               "name",
+                                                                                               getClass().getClassLoader() ),
                                                                               null ), new Declaration( "age",
-                                                                                                       cache.getReader( Person.class,
-                                                                                                                           "age",
-                                                                                                                           getClass().getClassLoader() ),
+                                                                                                       store.getReader( Person.class,
+                                                                                                                        "age",
+                                                                                                                        getClass().getClassLoader() ),
                                                                                                        null )};
         final Declaration[] inner = new Declaration[]{new Declaration( "$cheese",
                                                                        new PatternExtractor( new ClassObjectType( Cheese.class ) ),
@@ -275,24 +281,33 @@
                  Boolean.TRUE );
 
         TemplateRegistry registry = getInvokerTemplateRegistry();
-        Object method = TemplateRuntime.execute(registry.getNamedTemplate("accumulateInvoker"), null, new MapVariableResolverFactory(map), registry);
+        Object method = TemplateRuntime.execute( registry.getNamedTemplate( "accumulateInvoker" ),
+                                                 null,
+                                                 new MapVariableResolverFactory( map ),
+                                                 registry );
 
         //System.out.println( method );
     }
 
     private TemplateRegistry getRuleTemplateRegistry() {
         TemplateRegistry ruleRegistry = new SimpleTemplateRegistry();
-        CompiledTemplate compiled = TemplateCompiler.compileTemplate(AbstractJavaRuleBuilder.class.getResourceAsStream( "javaRule.mvel" ), null);
-        TemplateRuntime.execute(compiled, null, ruleRegistry);
+        CompiledTemplate compiled = TemplateCompiler.compileTemplate( AbstractJavaRuleBuilder.class.getResourceAsStream( "javaRule.mvel" ),
+                                                                      null );
+        TemplateRuntime.execute( compiled,
+                                 null,
+                                 ruleRegistry );
 
         return ruleRegistry;
     }
 
     private TemplateRegistry getInvokerTemplateRegistry() {
         TemplateRegistry invokerRegistry = new SimpleTemplateRegistry();
-        CompiledTemplate compiled = TemplateCompiler.compileTemplate(AbstractJavaRuleBuilder.class.getResourceAsStream( "javaInvokers.mvel" ), null);
-        TemplateRuntime.execute(compiled, null, invokerRegistry);
-        
+        CompiledTemplate compiled = TemplateCompiler.compileTemplate( AbstractJavaRuleBuilder.class.getResourceAsStream( "javaInvokers.mvel" ),
+                                                                      null );
+        TemplateRuntime.execute( compiled,
+                                 null,
+                                 invokerRegistry );
+
         return invokerRegistry;
     }
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaAccumulateBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,12 +8,15 @@
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.PackageRegistry;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.DescrFactory;
 import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.PatternDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.rule.Accumulate;
+import org.drools.rule.Package;
 import org.drools.rule.builder.RuleBuildContext;
 
 public class JavaAccumulateBuilderTest extends TestCase {
@@ -42,18 +45,22 @@
         accumDescr.setActionCode( "x += $price;" );
         accumDescr.setResultCode( "new Integer( x )" );
         
-        org.drools.rule.Package pkg = new org.drools.rule.Package( "org.drools" );
-        final PackageBuilder pkgBuilder = new PackageBuilder(pkg);
+        //org.drools.rule.Package pkg = new org.drools.rule.Package( "org.drools" );        
+        final PackageBuilder pkgBuilder = new PackageBuilder();
+        pkgBuilder.addPackage( new PackageDescr( "org.drools" ) );
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
-        DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
+        PackageRegistry pkgReg = pkgBuilder.getPackageRegistry( "org.drools" );
+        Package pkg = pkgReg.getPackage();
+        DialectCompiletimeRegistry dialectRegistry = pkgReg.getDialectCompiletimeRegistry();
         Dialect dialect = dialectRegistry.getDialect( "java" );
-        
-        
+                
         RuleDescr ruleDescr = new RuleDescr("test rule");
-        RuleBuildContext context = new RuleBuildContext( conf, ruleDescr, dialectRegistry, pkg, dialect);
+        RuleBuildContext context = new RuleBuildContext( pkgBuilder, ruleDescr, dialectRegistry, pkg, dialect);
         
         Accumulate accumulate = (Accumulate) builder.build( context, accumDescr );
         
+        dialect.compileAll();
+        
         assertTrue( context.getErrors().toString(), context.getErrors().isEmpty() );
 //        System.out.println( context.getInvokers() );
 //        System.out.println( context.getMethods() );

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaActionBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -49,9 +49,9 @@
         process.setName( "Process1" );
         process.setPackageName( "pkg1" );
 
-        ProcessBuildContext context = new ProcessBuildContext(conf, pkgBuilder.getPackage(), null, processDescr, dialectRegistry, javaDialect);
+        ProcessBuildContext context = new ProcessBuildContext(pkgBuilder, pkgBuilder.getPackage(), null, processDescr, dialectRegistry, javaDialect);
         
-        context.init( conf, pkg, null, dialectRegistry, javaDialect, null);
+        context.init( pkgBuilder, pkg, null, dialectRegistry, javaDialect, null);
         
         pkgBuilder.addPackageFromDrl( new StringReader("package pkg1;\nglobal java.util.List list;\n") );        
         

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaConsequenceBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -43,7 +43,7 @@
 
         PackageRegistry pkgRegistry = pkgBuilder.getPackageRegistry( pkg.getName() );
         DialectCompiletimeRegistry reg = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
-        context = new RuleBuildContext( conf,
+        context = new RuleBuildContext( pkgBuilder,
                                         ruleDescr,
                                         reg,
                                         pkg,                                        

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaReturnValueConstraintEvaluatorBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaReturnValueConstraintEvaluatorBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/JavaReturnValueConstraintEvaluatorBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -43,7 +43,7 @@
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
         JavaDialect javaDialect = (JavaDialect) dialectRegistry.getDialect( "java" );
 
-        ProcessBuildContext context = new ProcessBuildContext( conf,
+        ProcessBuildContext context = new ProcessBuildContext( pkgBuilder,
                                                                pkg,
                                                                process,
                                                                processDescr,

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -69,14 +69,19 @@
      */
     public void testBuild() throws Exception {
         final DrlParser parser = new DrlParser();
+        
+        final PackageBuilder pkgBuilder = new PackageBuilder();
+        pkgBuilder.addPackage( new PackageDescr( "org.drools"  ) );
+        Package pkg = pkgBuilder.getPackage();
+        
         final PackageDescr pkgDescr = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "nestedConditionalElements.drl" ) ) );
 
         // just checking there is no parsing errors
         Assert.assertFalse( parser.getErrors().toString(),
                             parser.hasErrors() );
 
-        final Package pkg = new Package( "org.drools" );
 
+
         final RuleDescr ruleDescr = (RuleDescr) pkgDescr.getRules().get( 0 );
         final String ruleClassName = "RuleClassName.java";
         ruleDescr.setClassName( ruleClassName );
@@ -90,13 +95,12 @@
 
         final RuleBuilder builder = new RuleBuilder( );
 
-        final PackageBuilder pkgBuilder = new PackageBuilder(pkg);
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
         
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();        
         Dialect dialect = dialectRegistry.getDialect( "java" );
 
-        RuleBuildContext context = new RuleBuildContext(conf, ruleDescr, dialectRegistry, pkg, dialect);
+        RuleBuildContext context = new RuleBuildContext(pkgBuilder, ruleDescr, dialectRegistry, pkg, dialect);
 
         builder.build( context );
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/InstrumentedBuildContent.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/InstrumentedBuildContent.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/InstrumentedBuildContent.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -5,6 +5,7 @@
 
 import org.drools.compiler.Dialect;
 import org.drools.compiler.DialectCompiletimeRegistry;
+import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.rule.Package;
@@ -14,12 +15,12 @@
 public class InstrumentedBuildContent extends RuleBuildContext {
     private DeclarationScopeResolver declarationScopeResolver;
 
-    public InstrumentedBuildContent(final PackageBuilderConfiguration conf,
+    public InstrumentedBuildContent(final PackageBuilder pkgBuilder,
                                     final RuleDescr ruleDescr,
                                     final DialectCompiletimeRegistry registry,
                                     final Package pkg,                                    
                                     final Dialect dialect) {
-        super( conf, 
+        super( pkgBuilder, 
                ruleDescr,
                registry,
                pkg,               

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELAccumulateBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -9,11 +9,13 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.base.mvel.MVELCompileable;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.AccumulateDescr;
+import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.PatternDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.reteoo.InitialFactImpl;
@@ -21,6 +23,7 @@
 import org.drools.reteoo.MockLeftTupleSink;
 import org.drools.rule.Accumulate;
 import org.drools.rule.Package;
+import org.drools.rule.builder.RuleBuildContext;
 
 public class MVELAccumulateBuilderTest extends TestCase {
 
@@ -28,26 +31,22 @@
     }
 
     public void testSimpleExpression() {
-        final Package pkg = new Package( "pkg1" );
+        PackageBuilder pkgBuilder = new PackageBuilder();
+        pkgBuilder.addPackage( new PackageDescr( "pkg1" ) );
+
+        final Package pkg = pkgBuilder.getPackage();
         final RuleDescr ruleDescr = new RuleDescr( "rule 1" );
 
-        PackageBuilder pkgBuilder = new PackageBuilder( pkg );
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
         MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
-                                                                               ruleDescr,
-                                                                               dialectRegistry,
-                                                                               pkg,
-                                                                               mvelDialect );
+        final RuleBuildContext context = new RuleBuildContext( pkgBuilder,
+                                                               ruleDescr,
+                                                               dialectRegistry,
+                                                               pkg,
+                                                               mvelDialect );
 
-        final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-
-        final Map map = new HashMap();
-        declarationResolver.setDeclarations( map );
-        context.setDeclarationResolver( declarationResolver );
-
         final AccumulateDescr accDescr = new AccumulateDescr();
         final PatternDescr inputPattern = new PatternDescr( "org.drools.Cheese",
                                                             "$cheese" );
@@ -61,6 +60,8 @@
         final Accumulate acc = (Accumulate) builder.build( context,
                                                            accDescr );
 
+        ((MVELCompileable) acc.getAccumulator()).compile( Thread.currentThread().getContextClassLoader() );
+
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         final WorkingMemory wm = ruleBase.newStatefulSession();
 
@@ -78,16 +79,39 @@
 
         Object wmContext = acc.createWorkingMemoryContext();
         Object accContext = acc.createContext();
-        acc.init( wmContext, accContext, tuple, wm );
-        
-        acc.accumulate( wmContext, accContext, tuple, f1, wm );
-        acc.accumulate( wmContext, accContext, tuple, f2, wm );
+        acc.init( wmContext,
+                  accContext,
+                  tuple,
+                  wm );
 
-        assertEquals( new Integer(18), acc.getResult( wmContext, accContext, tuple, wm ) );
-        
-        acc.reverse( wmContext, accContext, tuple, f1, wm );
+        acc.accumulate( wmContext,
+                        accContext,
+                        tuple,
+                        f1,
+                        wm );
+        acc.accumulate( wmContext,
+                        accContext,
+                        tuple,
+                        f2,
+                        wm );
 
-        assertEquals( new Integer(8), acc.getResult( wmContext, accContext, tuple, wm ) );
+        assertEquals( new Integer( 18 ),
+                      acc.getResult( wmContext,
+                                     accContext,
+                                     tuple,
+                                     wm ) );
+
+        acc.reverse( wmContext,
+                     accContext,
+                     tuple,
+                     f1,
+                     wm );
+
+        assertEquals( new Integer( 8 ),
+                      acc.getResult( wmContext,
+                                     accContext,
+                                     tuple,
+                                     wm ) );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELActionBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
 import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.base.mvel.MVELAction;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
@@ -39,7 +40,7 @@
         MVELDialect mvelDialect = ( MVELDialect ) dialectRegistry.getDialect( "mvel" );
 
         PackageBuildContext context = new PackageBuildContext();
-        context.init( conf, pkg, null, dialectRegistry, mvelDialect, null);
+        context.init( pkgBuilder, pkg, null, dialectRegistry, mvelDialect, null);
         
         pkgBuilder.addPackageFromDrl( new StringReader("package pkg1;\nglobal java.util.List list;\n") );        
         
@@ -59,6 +60,8 @@
         List list = new  ArrayList();
         wm.setGlobal( "list", list );     
         
+        ((MVELAction) actionNode.getAction().getMetaData("Action")).compile( Thread.currentThread().getContextClassLoader() );
+        
         KnowledgeHelper knowledgeHelper = new DefaultKnowledgeHelper();
         ((Action) actionNode.getAction().getMetaData("Action")).execute( knowledgeHelper, wm, null );
         

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -46,12 +46,12 @@
 public class MVELConsequenceBuilderTest extends TestCase {
 
     public void setUp() {
-    }    
+    }
 
     public void testSimpleExpression() throws Exception {
         PackageDescr pkgDescr = new PackageDescr( "pkg1" );
         PackageBuilder pkgBuilder = new PackageBuilder();
-        pkgBuilder.addPackage( pkgDescr );                
+        pkgBuilder.addPackage( pkgDescr );
 
         final Package pkg = pkgBuilder.getPackageRegistry( "pkg1" ).getPackage();
         final RuleDescr ruleDescr = new RuleDescr( "rule 1" );
@@ -59,15 +59,15 @@
         ruleDescr.setConsequence( "modify (cheese) {price = 5 };\nretract (cheese)" );
 
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
-        
+
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
-        
-        MVELDialect mvelDialect = ( MVELDialect ) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
+
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                dialectRegistry,
-                                                                               pkg,                                                                               
+                                                                               pkg,
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
@@ -99,16 +99,23 @@
         final Cheese cheddar = new Cheese( "cheddar",
                                            10 );
         final InternalFactHandle f0 = (InternalFactHandle) wm.insert( cheddar );
-        final LeftTuple tuple = new LeftTuple( f0, sink, true );
+        final LeftTuple tuple = new LeftTuple( f0,
+                                               sink,
+                                               true );
 
         final AgendaItem item = new AgendaItem( 0,
                                                 tuple,
                                                 10,
-                                                new PropagationContextImpl(1, 1, null, null, null),
+                                                new PropagationContextImpl( 1,
+                                                                            1,
+                                                                            null,
+                                                                            null,
+                                                                            null ),
                                                 context.getRule(),
                                                 null );
         final DefaultKnowledgeHelper kbHelper = new DefaultKnowledgeHelper( wm );
         kbHelper.setActivation( item );
+        ((MVELConsequence) context.getRule().getConsequence()).compile( Thread.currentThread().getContextClassLoader() );
         context.getRule().getConsequence().evaluate( kbHelper,
                                                      wm );
 
@@ -129,17 +136,18 @@
         properties.setProperty( "drools.dialect.default",
                                 "mvel" );
         PackageBuilderConfiguration cfg1 = new PackageBuilderConfiguration( properties );
-        
-        PackageBuilder pkgBuilder = new PackageBuilder( pkg, cfg1 );
+
+        PackageBuilder pkgBuilder = new PackageBuilder( pkg,
+                                                        cfg1 );
         final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
         PackageRegistry pkgRegistry = pkgBuilder.getPackageRegistry( pkg.getName() );
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
-        MVELDialect mvelDialect = ( MVELDialect )dialectRegistry.getDialect( pkgRegistry.getDialect() );
+        MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( pkgRegistry.getDialect() );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                dialectRegistry,
-                                                                               pkg,                                                                               
+                                                                               pkg,
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
@@ -169,7 +177,9 @@
         final Cheese cheddar = new Cheese( "cheddar",
                                            10 );
         final InternalFactHandle f0 = (InternalFactHandle) wm.insert( cheddar );
-        final LeftTuple tuple = new LeftTuple( f0, null, true );
+        final LeftTuple tuple = new LeftTuple( f0,
+                                               null,
+                                               true );
 
         final AgendaItem item = new AgendaItem( 0,
                                                 tuple,
@@ -180,11 +190,11 @@
         final DefaultKnowledgeHelper kbHelper = new DefaultKnowledgeHelper( wm );
         kbHelper.setActivation( item );
         try {
-        context.getRule().getConsequence().evaluate( kbHelper,
-                                                     wm );
+            ((MVELConsequence) context.getRule().getConsequence()).compile( Thread.currentThread().getContextClassLoader() );
+            context.getRule().getConsequence().evaluate( kbHelper,
+                                                         wm );
             fail( "should throw an exception, as 'if' is not allowed" );
-        } catch ( Exception e) {
-
+        } catch ( Exception e ) {
         }
 
         assertEquals( 10,
@@ -223,11 +233,11 @@
                       MVELConsequenceBuilder.delimitExpressions( ex ) );
 
     }
-    
+
     public void testMVELDebugSymbols() throws DroolsParserException {
-        
+
         MVELDebugHandler.setDebugMode( true );
-        
+
         try {
             final DrlParser parser = new DrlParser();
             final PackageDescr pkgDescr = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "mvel_rule.drl" ) ) );
@@ -247,10 +257,10 @@
             DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
             Dialect dialect = dialectRegistry.getDialect( "mvel" );
 
-            RuleBuildContext context = new RuleBuildContext( conf,
+            RuleBuildContext context = new RuleBuildContext( pkgBuilder,
                                                              ruleDescr,
                                                              dialectRegistry,
-                                                             pkg,                                                             
+                                                             pkg,
                                                              dialect );
 
             builder.build( context );
@@ -261,6 +271,7 @@
             final Rule rule = context.getRule();
 
             MVELConsequence mvelCons = (MVELConsequence) rule.getConsequence();
+            mvelCons.compile( Thread.currentThread().getContextClassLoader() );
             String s = org.mvel.debug.DebugTools.decompile( mvelCons.getCompExpr() );
 
             int fromIndex = 0;
@@ -274,38 +285,37 @@
         } finally {
             MVELDebugHandler.setDebugMode( false );
         }
-        
+
     }
 
     public void testX() {
-        String expr = "System.out.println( \"a1\" );\n" + 
-                      "System.out.println( \"a2\" );\n" + 
-                      "System.out.println( \"a3\" );\n" + 
-                      "System.out.println( \"a4\" );\n";
-   
-        ExpressionCompiler compiler = new ExpressionCompiler(expr);
-   
+        String expr = "System.out.println( \"a1\" );\n" + "System.out.println( \"a2\" );\n" + "System.out.println( \"a3\" );\n" + "System.out.println( \"a4\" );\n";
+
+        ExpressionCompiler compiler = new ExpressionCompiler( expr );
+
         ParserContext context = new ParserContext();
-        context.addImport("System", System.class);
-        context.setStrictTypeEnforcement(true);
+        context.addImport( "System",
+                           System.class );
+        context.setStrictTypeEnforcement( true );
         //context.setDebugSymbols( true );
         context.setSourceFile( "mysource" );
-   
+
         compiler.setDebugSymbols( true );
-        
-        Serializable compiledExpression = compiler.compile(context);           
-   
+
+        Serializable compiledExpression = compiler.compile( context );
+
         String s = org.mvel.debug.DebugTools.decompile( compiledExpression );
-   
-        System.out.println("s "+s);
-        
-        int fromIndex=0;
+
+        System.out.println( "s " + s );
+
+        int fromIndex = 0;
         int count = 0;
-        while ((fromIndex = s.indexOf( "DEBUG_SYMBOL", fromIndex+1 )) > -1) {
+        while ( (fromIndex = s.indexOf( "DEBUG_SYMBOL",
+                                        fromIndex + 1 )) > -1 ) {
             count++;
         }
-        assertEquals(4, count);      
-   
-      }
+        assertEquals( 4,
+                      count );
+
+    }
 }
-

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELDecisionBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
 import org.drools.base.DefaultKnowledgeHelper;
+import org.drools.base.mvel.MVELAction;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.compiler.PackageRegistry;
@@ -40,7 +41,7 @@
         MVELDialect mvelDialect = ( MVELDialect ) pkgReg.getDialectCompiletimeRegistry().getDialect( "mvel" );
 
         PackageBuildContext context = new PackageBuildContext();
-        context.init( conf, pkg, null, pkgReg.getDialectCompiletimeRegistry(), mvelDialect, null);
+        context.init( pkgBuilder, pkg, null, pkgReg.getDialectCompiletimeRegistry(), mvelDialect, null);
         
         pkgBuilder.addPackageFromDrl( new StringReader("package pkg1;\nglobal java.util.List list;\n") );        
         
@@ -61,6 +62,7 @@
         wm.setGlobal( "list", list );        
         
         KnowledgeHelper knowledgeHelper = new DefaultKnowledgeHelper();
+        ((MVELAction) actionNode.getAction().getMetaData("Action")).compile( Thread.currentThread().getContextClassLoader() );
         ((Action)actionNode.getAction().getMetaData("Action")).execute( knowledgeHelper, wm, null );
         
         assertEquals("hello world", list.get(0) );

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELEvalBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,7 +10,9 @@
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
+import org.drools.base.mvel.MVELEvalExpression;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
@@ -27,10 +29,11 @@
 
 public class MVELEvalBuilderTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
-    public void setUp() {
-        cache = ClassFieldAccessorCache.getInstance();
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     public void testSimpleExpression() {
@@ -42,7 +45,7 @@
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
         MVELDialect mvelDialect = ( MVELDialect ) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                dialectRegistry,
                                                                                pkg,                                                                               
@@ -50,7 +53,7 @@
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
 
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
                                                              "price",
                                                              getClass().getClassLoader() );
 
@@ -71,6 +74,7 @@
         final MVELEvalBuilder builder = new MVELEvalBuilder();
         final EvalCondition eval = (EvalCondition) builder.build( context,
                                                                   evalDescr );
+        ((MVELEvalExpression) eval.getEvalExpression()).compile( Thread.currentThread().getContextClassLoader() );
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         final WorkingMemory wm = ruleBase.newStatefulSession();

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELPredicateBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -11,7 +11,9 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
+import org.drools.base.mvel.MVELPredicateExpression;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.compiler.PackageBuilder;
@@ -30,9 +32,12 @@
 
 public class MVELPredicateBuilderTest extends TestCase {
 
-    private ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
 
-    public void setUp() {
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     public void testSimpleExpression() {
@@ -44,14 +49,14 @@
         PackageRegistry pkgRegistry = pkgBuilder.getPackageRegistry( pkg.getName() );
         MVELDialect mvelDialect = ( MVELDialect ) pkgRegistry.getDialectCompiletimeRegistry().getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                pkgRegistry.getDialectCompiletimeRegistry(),
                                                                                pkg,                                                                               
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
                                                              "price",
                                                              getClass().getClassLoader() );
 
@@ -97,6 +102,8 @@
                        localDeclarations,
                        predicate,
                        predicateDescr );
+        
+        ( (MVELPredicateExpression) predicate.getPredicateExpression()).compile( Thread.currentThread().getContextClassLoader() );
 
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory wm = (InternalWorkingMemory) ruleBase.newStatefulSession();

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -11,9 +11,11 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.Operator;
+import org.drools.base.mvel.MVELReturnValueExpression;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.compiler.DialectCompiletimeRegistry;
@@ -32,10 +34,12 @@
 
 public class MVELReturnValueBuilderTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
 
-    public void setUp() {
-        cache = ClassFieldAccessorCache.getInstance();
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     public void testSimpleExpression() {
@@ -47,14 +51,14 @@
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
         MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                dialectRegistry,
                                                                                pkg,
                                                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
                                                                 "price",
                                                                 getClass().getClassLoader() );
 
@@ -104,6 +108,8 @@
                        localDeclarations,
                        returnValue,
                        returnValueDescr );
+        
+        ((MVELReturnValueExpression)returnValue.getExpression()).compile( Thread.currentThread().getContextClassLoader() );
 
         ContextEntry retValContext = returnValue.createContextEntry();
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueConstraintEvaluatorBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueConstraintEvaluatorBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELReturnValueConstraintEvaluatorBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -6,6 +6,7 @@
 
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
+import org.drools.base.mvel.MVELReturnValueEvaluator;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
@@ -34,7 +35,7 @@
         MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
 
         PackageBuildContext context = new PackageBuildContext();
-        context.init( conf,
+        context.init( pkgBuilder,
                       pkg,
                       null,
                       dialectRegistry,
@@ -61,6 +62,8 @@
 
         SplitInstance splitInstance = new SplitInstance();
         splitInstance.setProcessInstance( processInstance );
+        
+        ( (MVELReturnValueEvaluator) node.getReturnValueEvaluator()).compile( Thread.currentThread().getContextClassLoader() );
 
         assertTrue( node.evaluate( splitInstance,
                                    null,

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
 import org.drools.base.ClassObjectType;
+import org.drools.base.mvel.MVELSalienceExpression;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
@@ -35,7 +36,7 @@
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
         MVELDialect mvelDialect = ( MVELDialect ) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( conf,
+        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
                                                                                ruleDescr,
                                                                                dialectRegistry,
                                                                                pkg,                                                                               
@@ -68,6 +69,8 @@
 
         SalienceBuilder salienceBuilder = new MVELSalienceBuilder();
         salienceBuilder.build( context );
+        
+        ((MVELSalienceExpression)context.getRule().getSalience()).compile( Thread.currentThread().getContextClassLoader() );
                 
         assertEquals( 25, context.getRule().getSalience().getValue( tuple, wm ) );
       

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockRuleBase.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -160,4 +160,9 @@
         // TODO Auto-generated method stub
         return null;
     }
+
+    public void addPackages(Package[] pkgs) {
+        // TODO Auto-generated method stub
+        
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -15,6 +15,7 @@
 import org.drools.base.ClassTypeResolver;
 import org.drools.base.TypeResolver;
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.guvnor.client.modeldriven.testing.ExecutionTrace;
 import org.drools.guvnor.client.modeldriven.testing.Expectation;
@@ -854,8 +855,8 @@
 
         sc.fixtures.addAll( Arrays.asList( assertions ) );
 
-        WorkingMemory wm = getWorkingMemory( "test_rules3.drl" );
-        ClassLoader cl = wm.getRuleBase().getPackages()[0].getPackageScopeClassLoader();
+        WorkingMemory wm = getWorkingMemory( "test_rules3.drl" );        
+        ClassLoader cl = ((InternalRuleBase) wm.getRuleBase()).getRootClassLoader();
 
         HashSet<String> imports = new HashSet<String>();
         imports.add("foo.bar.*");

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeans.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeans.drl	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeans.drl	2008-08-15 07:39:04 UTC (rev 21562)
@@ -22,6 +22,7 @@
 end
 
 rule "another"
+    dialect "mvel"
     when
         $cheese : Cheese( type == "stilton" )
      	$person : Person( age== 7, likes == $cheese )

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/RuleBase.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -108,6 +108,8 @@
     Package[] getPackages();
 
     Package getPackage(String name);
+    
+    void addPackages(Package[] pkgs );
 
     void addPackage(Package pkg);
 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AccessorKey.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AccessorKey.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/AccessorKey.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,101 @@
+/**
+ * 
+ */
+package org.drools.base;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+public class AccessorKey
+    implements
+    Externalizable {
+    private static final long serialVersionUID = 400;
+
+    private String            className;
+    private String            fieldName;
+    private int               hashCode;
+    private AccessorType      type;
+    
+    //private 
+
+    public AccessorKey() {
+    }
+
+    public AccessorKey(String className,
+                       String fieldName,
+                       AccessorType type) {
+        super();
+        this.className = className;
+        this.fieldName = fieldName;
+
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + className.hashCode();
+        result = PRIME * result + ( (fieldName == null) ? 0 : fieldName.hashCode() );
+        result = PRIME * result + type.hashCode();
+        this.hashCode = result;
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeUTF( className );
+        out.writeObject( fieldName ); // use writeObject so it can be null
+        out.writeInt( hashCode );
+        out.writeObject( type );
+    }
+    
+    
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        className = in.readUTF();
+        fieldName = ( String ) in.readObject();  // use writeObject so it can be null
+        hashCode = in.readInt();
+        type = ( AccessorType ) in.readObject();
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+    
+    public AccessorType getType() {
+        return this.type;
+    }
+
+    public int hashCode() {
+        return hashCode;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        AccessorKey other = (AccessorKey) obj;
+        
+        if ( className == null ) {
+            if ( other.className != null ) return false;
+        } else if ( !className.equals( other.className ) ) return false;
+        
+        if ( fieldName == null ) {
+            if ( other.fieldName != null ) return false;
+        } else if ( !fieldName.equals( other.fieldName ) ) return false;
+
+        if ( type == null ) {
+            if ( other.type != null ) return false;
+        } else if ( !type.equals( other.type ) ) return false;
+        return true;
+    }
+
+    public String toString() {
+        return this.className + "-" + this.fieldName;
+    }
+    
+    public static enum AccessorType {
+        FieldAccessor, ClassObjectType; //ObjectAccessor, GlobalAccessor;
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/BaseClassFieldReader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -75,20 +75,20 @@
         }
     }
 
-    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 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 void writeExternal(ObjectOutput out) throws IOException {
-        out.writeInt( index );
-        out.writeObject( fieldType );
-        out.writeObject( valueType );
-    }
-
     public int getIndex() {
         return this.index;
     }

Modified: 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	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -22,6 +22,11 @@
 import java.io.ObjectOutput;
 import java.lang.reflect.Method;
 
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.AcceptsWriteAccessor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.WriteAccessor;
+
 /**
  * This is a wrapper for a ClassFieldExtractor that provides
  * default values and a simpler interface for non-used parameters
@@ -32,16 +37,20 @@
  */
 public class ClassFieldAccessor
     implements
-    FieldAccessor, Externalizable {
+    AcceptsReadAccessor,
+    AcceptsWriteAccessor,
+    FieldAccessor,
+    Externalizable {
 
-    private static final long   serialVersionUID = 400L;
-    private ClassFieldReader reader;
-    private ClassFieldWriter writer;
+    private static final long serialVersionUID = 400L;
+    private ClassFieldReader  reader;
+    private ClassFieldWriter  writer;
 
     public ClassFieldAccessor() {
     }
 
-    public ClassFieldAccessor(final ClassFieldReader reader, final ClassFieldWriter writer ) {
+    public ClassFieldAccessor(final ClassFieldReader reader,
+                              final ClassFieldWriter writer) {
         this.reader = reader;
         this.writer = writer;
     }
@@ -57,6 +66,14 @@
         this.writer = (ClassFieldWriter) is.readObject();
     }
 
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.reader = (ClassFieldReader) readAccessor;
+    }
+
+    public void setWriteAccessor(WriteAccessor writeAccessor) {
+        this.writer = (ClassFieldWriter) writeAccessor;
+    }
+
     public int getIndex() {
         return this.reader.getIndex();
     }
@@ -67,7 +84,7 @@
 
     public Object getValue(final Object object) {
         return this.reader.getValue( null,
-                                        object );
+                                     object );
     }
 
     public ValueType getValueType() {
@@ -86,67 +103,89 @@
         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 );
+//    }
+
+    @Override
     public int hashCode() {
-        return this.reader.hashCode();
+        return  reader.getClassName().hashCode() ^ reader.getFieldName().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 );
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( !(obj instanceof ClassFieldAccessor) ) return false;
+        ClassFieldAccessor other = (ClassFieldAccessor) obj;
+        if ( reader == null ) {
+            if ( other.reader != null ) return false;
+        } else if ( !reader.getClassName().equals( other.reader.getClassName() ) || !reader.getFieldName().equals( other.reader.getFieldName() ) ) return false;
+        if ( writer == null ) {
+            if ( other.writer != null ) return false;
+        } else if ( !writer.getClassName().equals( other.writer.getClassName() ) || !writer.getFieldName().equals( other.writer.getFieldName() )  ) return false;
+        return true;
     }
 
     public boolean getBooleanValue(final Object object) {
         return this.reader.getBooleanValue( null,
-                                               object );
+                                            object );
     }
 
     public byte getByteValue(final Object object) {
         return this.reader.getByteValue( null,
-                                            object );
+                                         object );
     }
 
     public char getCharValue(final Object object) {
         return this.reader.getCharValue( null,
-                                            object );
+                                         object );
     }
 
     public double getDoubleValue(final Object object) {
         return this.reader.getDoubleValue( null,
-                                              object );
+                                           object );
     }
 
     public float getFloatValue(final Object object) {
         return this.reader.getFloatValue( null,
-                                             object );
+                                          object );
     }
 
     public int getIntValue(final Object object) {
         return this.reader.getIntValue( null,
-                                           object );
+                                        object );
     }
 
     public long getLongValue(final Object object) {
         return this.reader.getLongValue( null,
-                                            object );
+                                         object );
     }
 
     public short getShortValue(final Object object) {
         return this.reader.getShortValue( null,
-                                             object );
+                                          object );
     }
 
     public boolean isNullValue(final Object object) {
         return this.reader.isNullValue( null,
-                                           object );
+                                        object );
     }
 
     public Method getNativeReadMethod() {
@@ -155,7 +194,7 @@
 
     public int getHashCode(final Object object) {
         return this.reader.getHashCode( null,
-                                           object );
+                                        object );
     }
 
     /**
@@ -281,5 +320,4 @@
                          value );
     }
 
-    
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorCache.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -4,172 +4,381 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.security.ProtectionDomain;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.Map.Entry;
 
-/**
- * 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
- *
- */
+import org.drools.RuntimeDroolsException;
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.AcceptsWriteAccessor;
+import org.drools.spi.Constraint;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
+import org.drools.util.asm.ClassFieldInspector;
+
 public class ClassFieldAccessorCache {
+    private static ClassFieldAccessorCache instance;
 
-    private Map<AccessorKey, ClassFieldReader>   readerCache;
-    private Map<AccessorKey, ClassFieldWriter>   writerCache;
-    private Map<AccessorKey, ClassFieldAccessor> accessorCache;
-    private ClassFieldAccessorFactory            factory;
+    private Map<ClassLoader, CacheEntry>   cacheByClassLoader;
 
-    private ClassFieldAccessorCache() {
-        this.factory = new ClassFieldAccessorFactory();
+    private ClassLoader                    classLoader;
+
+    //    private boolean                        eagerWire;
+
+    //    public static ClassFieldAccessorCache getInstance() {
+    //        if ( instance == null ) {
+    //            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+    //            if ( cl == null ) {
+    //                cl = ClassFieldAccessorCache.class.getClassLoader();
+    //            }
+    //            instance = new ClassFieldAccessorCache( cl );
+    //        }
+    //        
+    //        return instance;
+    //    }
+    //
+    //    public ClassFieldAccessorCache() {
+    //        // we don't set the classloader here, its just for Externalisable
+    //        // any using class will need to set the classloader before using
+    //        this( null );
+    //    }
+
+    public ClassFieldAccessorCache(ClassLoader classLoader) {
+        //        lookup = new HashMap<AccessorKey, LookupEntry>();
+        cacheByClassLoader = new WeakHashMap<ClassLoader, CacheEntry>();
+        this.classLoader = classLoader;
     }
 
-    public static ClassFieldAccessorCache getInstance() {
-        return new ClassFieldAccessorCache();
+    //    public void writeExternal(ObjectOutput out) throws IOException {
+    //        out.writeObject( lookup );
+    //
+    //    }
+    //
+    //    public void readExternal(ObjectInput in) throws IOException,
+    //                                            ClassNotFoundException {
+    //        lookup = ( Map<AccessorKey, LookupEntry> ) in.readObject();
+    //    }
+
+    public void setClassLoader(ClassLoader classLoader) {
+        this.classLoader = classLoader;
     }
 
-    public synchronized ClassFieldReader getReader(final Class< ? > clazz,
-                                                   final String fieldName,
-                                                   ClassLoader classLoader) {
-        if ( readerCache == null ) {
-            readerCache = new HashMap<AccessorKey, ClassFieldReader>();
-        }
+    public ClassLoader getClassLoader() {
+        return this.classLoader;
+    }
 
-        final AccessorKey key = new AccessorKey( clazz,
-                                                 fieldName );
+    //    public void setEagerWire(boolean eagerWire) {
+    //        this.eagerWire = eagerWire;
+    //    }
+    //
+    //    public ClassFieldWriter getWriter(Class cls,
+    //                                      String fieldName,
+    //                                      ClassLoader classLoader) {
+    //        //        return getReader( cls.getName(),
+    //        //                          fieldName,
+    //        //                          null );
+    //        return null;
+    //    }
+    //
+    //    public ClassFieldReader getReader(Class cls,
+    //                                      String fieldName,
+    //                                      ClassLoader classLoader) {
+    //        return getReader( cls.getName(),
+    //                          fieldName,
+    //                          null );
+    //    }
+    //
+    //    public synchronized ClassFieldReader getReader(final String className,
+    //                                                   final String fieldName,
+    //                                                   final AcceptsReadAccessor target) {
+    //        AccessorKey key = new AccessorKey( className,
+    //                                           fieldName );
+    //        LookupEntry entry = this.lookup.get( key );
+    //        if ( entry == null ) {
+    //            entry = new LookupEntry( new ClassFieldReader( className,
+    //                                                           fieldName ) );
+    //        }
+    //
+    //        if ( target != null ) {
+    //            entry.addReadAccessorTargets( target );
+    //        }
+    //
+    //        if ( this.eagerWire ) {
+    //            wire( entry.getClassFieldReader() );
+    //        }
+    //
+    //        return entry.getClassFieldReader();
+    //    }
+    //
+    //    public synchronized ClassFieldWriter getWriter(final String className,
+    //                                                   final String fieldName,
+    //                                                   final AcceptsWriteAccessor target) {
+    //        AccessorKey key = new AccessorKey( className,
+    //                                           fieldName );
+    //        LookupEntry entry = this.lookup.get( key );
+    //        if ( entry == null ) {
+    //            entry = new LookupEntry( new ClassFieldWriter( className,
+    //                                                           fieldName ) );
+    //            if ( target != null ) {
+    //                //entry.addReadAccessorTargets( target );
+    //            }
+    //        }
+    //
+    //        if ( this.eagerWire ) {
+    //            wire( entry.getClassFieldReader() );
+    //        }
+    //
+    //        return entry.getClassFieldWriter();
+    //    }
+    //
+    //    public void merge(ClassFieldAccessorCache other) {
+    //        for ( Entry<AccessorKey, LookupEntry> entry : other.lookup.entrySet() ) {
+    //            LookupEntry lookupEntry = this.lookup.get( entry.getKey() );
+    //            if ( lookupEntry == null ) {
+    //                // ClassFieldReader does not exist here, so copy in everything.
+    //                this.lookup.put( entry.getKey(),
+    //                                 entry.getValue() );
+    //            } else {
+    //                // iterate through new constraints adding them and wiring them up
+    //                // to the existing ClassFieldReader
+    //                for ( AcceptsReadAccessor target : entry.getValue().getReadAccessorTargets() ) {
+    //                    target.setReadAccessor( lookupEntry.getClassFieldReader() );
+    //                    lookupEntry.addReadAccessorTargets( target );
+    //                }
+    //            }
+    //        }
+    //    }
+    //
+    //    public void wire() {
+    //        for ( Entry<AccessorKey, LookupEntry> entry : lookup.entrySet() ) {
+    //            wire( entry.getValue().getClassFieldReader() );
+    //        }
+    //    }
+    //
+    //    public void wire(ClassFieldReader reader) {
+    //        reader.setReadAccessor( getReadAcessor( reader ) );
+    //    }
+    //
+    //    public void wire(ClassFieldWriter writer) {
+    //        writer.setWriteAccessor( getWriteAcessor( writer ) );
+    //    }
+    //
+    //    public ClassFieldAccessor getAccessor(Class cls,
+    //                                          String fieldName,
+    //                                          ClassLoader classLoader) {
+    //        return getAccessor( cls.getName(),
+    //                            fieldName,
+    //                            null );
+    //    }
+    //
+    //    public ClassFieldAccessor getAccessor(final String className,
+    //                                          final String fieldName,
+    //                                          final AcceptsReadAccessor target) {
+    //        AccessorKey key = new AccessorKey( className,
+    //                                           fieldName );
+    //        LookupEntry entry = this.lookup.get( key );
+    //        if ( entry == null ) {
+    //            entry = new LookupEntry( new ClassFieldReader( className,
+    //                                                           fieldName ),
+    //                                     new ClassFieldWriter( className,
+    //                                                           fieldName ) );
+    //            if ( target != null ) {
+    //                entry.addReadAccessorTargets( target );
+    //            }
+    //        }
+    //
+    //        if ( this.eagerWire ) {
+    //            wire( entry.getClassFieldReader() );
+    //            wire( entry.getClassFieldWriter() );
+    //        }
+    //
+    //        return new ClassFieldAccessor( entry.getClassFieldReader(),
+    //                                       entry.getClassFieldWriter() );
+    //    }
 
-        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 ClassObjectType getClassObjectType(ClassObjectType objectType) {
+        // always lookup the class, as the ClassObjectType might refer to the class from another ClassLoader
+        Class cls = getClass( objectType.getClassName() );
+        CacheEntry cache = getCacheEntry( cls );
+        return cache.getClassObjectType( cls, objectType );                
+    }
+    
+    public static class ClassObjectTypeKey {
+        private Class cls;
+        private boolean event;
+        public ClassObjectTypeKey(Class cls,
+                                  boolean event) {
+            this.cls = cls;
+            this.event = event;
         }
-    }
+        public Class getCls() {
+            return cls;
+        }
+        public boolean isEvent() {
+            return event;
+        }
 
-    public synchronized ClassFieldWriter getWriter(final Class< ? > clazz,
-                                                   final String fieldName,
-                                                   ClassLoader classLoader) {
-        if ( writerCache == null ) {
-            writerCache = new HashMap<AccessorKey, ClassFieldWriter>();
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((cls == null) ? 0 : cls.hashCode());
+            result = prime * result + (event ? 1231 : 1237);
+            return result;
         }
 
-        final AccessorKey key = new AccessorKey( clazz,
-                                                 fieldName );
+        public boolean equals(Object obj) {
+            if ( this == obj ) return true;
+            if ( obj == null ) return false;
+            if ( !(obj instanceof ClassObjectTypeKey) ) return false;
+            ClassObjectTypeKey other = (ClassObjectTypeKey) obj;
+            if ( cls == null ) {
+                if ( other.cls != null ) return false;
+            } else if ( !cls.equals( other.cls ) ) return false;
+            if ( event != other.event ) return false;
+            return true;
+        }
 
-        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>();
-        }
+    public BaseClassFieldReader getReadAcessor(ClassFieldReader reader) {
+        String className = reader.getClassName();
+        String fieldName = reader.getFieldName();
 
-        final AccessorKey key = new AccessorKey( clazz,
-                                                 fieldName );
+        Class cls = getClass( className );
+        CacheEntry cache = getCacheEntry( cls );
 
-        if ( accessorCache.containsKey( key ) ) {
-            return accessorCache.get( key );
-        } else {
-            final ClassFieldReader reader = getReader( clazz,
+        // get the ReaderAccessor for this key
+        return cache.getReadAccessor( new AccessorKey( className,
                                                        fieldName,
-                                                       classLoader );
-            final ClassFieldWriter writer = getWriter( clazz,
-                                                       fieldName,
-                                                       classLoader );
-            final ClassFieldAccessor accessor = new ClassFieldAccessor( reader,
-                                                                        writer );
-            accessorCache.put( key,
-                               accessor );
-            return accessor;
+                                                       AccessorKey.AccessorType.FieldAccessor ),
+                                      cls );
+    }
+
+    public BaseClassFieldWriter getWriteAcessor(ClassFieldWriter writer) {
+        String className = writer.getClassName();
+        String fieldName = writer.getFieldName();
+        
+        Class cls = getClass( className );
+        CacheEntry cache = getCacheEntry( cls );
+        
+        // get the ReaderAccessor for this key
+        return cache.getWriteAccessor( new AccessorKey( className,
+                                                        fieldName,
+                                                        AccessorKey.AccessorType.FieldAccessor ),
+                                       cls );
+    }
+    
+    public Class getClass(String className) { 
+        try {
+            return this.classLoader.loadClass( className );
+        } catch ( ClassNotFoundException e ) {
+            throw new RuntimeDroolsException( "Unable to resolve class '" + className + "'" );
         }
+    }    
+        
+    public CacheEntry getCacheEntry(Class cls) {
+        // System classloader classes return null on some JVMs
+        ClassLoader cl = cls.getClassLoader() != null ? cls.getClassLoader() : ClassLoader.getSystemClassLoader();
+
+        CacheEntry cache = this.cacheByClassLoader.get( cl );
+        if ( cache == null ) {
+            // setup a cache for this ClassLoader
+            cache = new CacheEntry( cl );
+            this.cacheByClassLoader.put( cl,
+                                         cache );
+        }
+        
+        return cache;
     }
 
-    private static class AccessorKey
-        implements
-        Externalizable {
-        private static final long serialVersionUID = 400;
+    public static class CacheEntry {
+        private ByteArrayClassLoader                         byteArrayClassLoader;
+        private final Map<AccessorKey, BaseClassFieldReader> readCache   = new HashMap<AccessorKey, BaseClassFieldReader>();
+        private final Map<AccessorKey, BaseClassFieldWriter> writeCache  = new HashMap<AccessorKey, BaseClassFieldWriter>();
 
-        private Class< ? >        clazz;
-        private String            fieldName;
-        private int               hashCode;
+        private final Map<Class< ? >, ClassFieldInspector>   inspectors  = new HashMap<Class< ? >, ClassFieldInspector>();
 
-        public AccessorKey() {
+        private final Map<ClassObjectTypeKey, ClassObjectType>       objectTypes = new HashMap<ClassObjectTypeKey, ClassObjectType>();
+
+        public CacheEntry(ClassLoader parentClassLoader) {
+            if ( parentClassLoader == null ) {
+                throw new RuntimeDroolsException( "ClassFieldAccessorFactory cannot have a null parent ClassLoader" );
+            }
+            this.byteArrayClassLoader = new ByteArrayClassLoader( parentClassLoader );
         }
+        
+        public ByteArrayClassLoader getByteArrayClassLoader() {
+            return byteArrayClassLoader;
+        }
 
-        public AccessorKey(Class< ? > clazz,
-                           String fieldName) {
-            super();
-            this.clazz = clazz;
-            this.fieldName = fieldName;
+        public BaseClassFieldReader getReadAccessor(AccessorKey key,
+                                                    Class cls) {
+            BaseClassFieldReader reader = this.readCache.get( key );
+            if ( reader == null ) {
+                reader = ClassFieldAccessorFactory.getInstance().getClassFieldReader( cls,
+                                                                                      key.getFieldName(),
+                                                                                      this );
+                this.readCache.put( key,
+                                    reader );
+            }
 
-            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;
+            return reader;
         }
 
-        public void readExternal(ObjectInput in) throws IOException,
-                                                ClassNotFoundException {
-            clazz = (Class< ? >) in.readObject();
-            fieldName = (String) in.readObject();
-            hashCode = in.readInt();
-        }
+        public BaseClassFieldWriter getWriteAccessor(AccessorKey key,
+                                                     Class cls) {
+            BaseClassFieldWriter reader = this.writeCache.get( key );
+            if ( reader == null ) {
+                reader = ClassFieldAccessorFactory.getInstance().getClassFieldWriter( cls,
+                                                                                      key.getFieldName(),
+                                                                                      this );
+                this.writeCache.put( key,
+                                     reader );
+            }
 
-        public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject( clazz );
-            out.writeObject( fieldName );
-            out.writeInt( hashCode );
+            return reader;
         }
 
-        public Class< ? > getClazz() {
-            return clazz;
+        public Map<Class< ? >, ClassFieldInspector> getInspectors() {
+            return inspectors;
         }
-
-        public String getFieldName() {
-            return fieldName;
+        
+        public ClassObjectType getClassObjectType(Class cls, ClassObjectType objectType) {
+            ClassObjectTypeKey key = new ClassObjectTypeKey(cls, objectType.isEvent() );            
+            ClassObjectType existing = objectTypes.get( key );
+            
+            if ( existing != null ) {
+                objectType = existing;
+            } else {
+                objectType.setClassType( cls ); // most likely set, but set anyway.
+                objectTypes.put(  key, objectType );
+            }
+            
+            return objectType;            
         }
 
-        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 static class ByteArrayClassLoader extends ClassLoader {
+        public ByteArrayClassLoader(final ClassLoader parent) {
+            super( parent );
         }
 
-        public String toString() {
-            return this.clazz + "@" + Math.abs( System.identityHashCode( this.clazz ) ) + "(" + this.fieldName + ")";
+        public Class< ? > defineClass(final String name,
+                                      final byte[] bytes,
+                                      final ProtectionDomain domain) {
+            return defineClass( name,
+                                bytes,
+                                0,
+                                bytes.length,
+                                domain );
         }
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorFactory.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -50,6 +50,8 @@
 import org.drools.base.extractors.MVELClassFieldReader;
 import org.drools.base.extractors.SelfReferenceClassFieldReader;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.base.ClassFieldAccessorCache.ByteArrayClassLoader;
+import org.drools.base.ClassFieldAccessorCache.CacheEntry;
 import org.drools.util.asm.ClassFieldInspector;
 
 /**
@@ -69,11 +71,11 @@
     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;
 
-    private final Map<Class< ? >, ClassFieldInspector> inspectors           = new HashMap<Class< ? >, ClassFieldInspector>();
-
-    private ByteArrayClassLoader                       byteArrayClassLoader;
-
     static {
         PROTECTION_DOMAIN = AccessController.doPrivileged( new PrivilegedAction<ProtectionDomain>() {
             public ProtectionDomain run() {
@@ -81,27 +83,35 @@
             }
         } );
     }
+    
+    private static ClassFieldAccessorFactory instance = new ClassFieldAccessorFactory();
+    
+    public static ClassFieldAccessorFactory getInstance() {
+        return instance;
+    }
 
     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 );
-        }
+                                                    final String fieldName,
+                                                    CacheEntry cache) {
+        ByteArrayClassLoader byteArrayClassLoader = cache.getByteArrayClassLoader();
+        Map<Class< ? >, ClassFieldInspector> inspectors = cache.getInspectors();
+//        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 );
+                                                          fieldName );
             } else if ( fieldName.indexOf( '.' ) > -1 || fieldName.indexOf( '[' ) > -1 ) {
                 // we need MVEL extractor for expressions
                 return new MVELClassFieldReader( clazz,
-                                                    fieldName,
-                                                    classLoader );
+                                                 fieldName,
+                                                 cache );
             } else {
                 // otherwise, bytecode generate a specific extractor
                 ClassFieldInspector inspector = inspectors.get( clazz );
@@ -146,13 +156,10 @@
 
     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 );
-        }
+                                                    final CacheEntry cache) {
+        ByteArrayClassLoader byteArrayClassLoader = cache.getByteArrayClassLoader();
+        Map<Class< ? >, ClassFieldInspector> inspectors = cache.getInspectors();
+        
         try {
             // otherwise, bytecode generate a specific extractor
             ClassFieldInspector inspector = inspectors.get( clazz );
@@ -439,7 +446,7 @@
             Method overridingMethod;
             try {
                 overridingMethod = superClass.getMethod( getOverridingSetMethodName( fieldType ),
-                                                         new Class[]{Object.class, fieldType.isPrimitive() ? fieldType : Object.class } );
+                                                         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 );
@@ -627,23 +634,4 @@
         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

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldAccessorStore.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,686 @@
+package org.drools.base;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.security.ProtectionDomain;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.Map.Entry;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.AccessorKey.AccessorType;
+import org.drools.rule.Declaration;
+import org.drools.spi.Acceptor;
+import org.drools.spi.AcceptsClassObjectType;
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.AcceptsWriteAccessor;
+import org.drools.spi.Constraint;
+import org.drools.spi.GlobalExtractor;
+import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ObjectType;
+import org.drools.spi.PatternExtractor;
+import org.drools.spi.ReadAccessor;
+import org.drools.util.asm.ClassFieldInspector;
+
+public class ClassFieldAccessorStore
+    implements
+    Externalizable {
+    private Map<AccessorKey, BaseLookupEntry> lookup;
+
+    private ClassFieldAccessorCache           cache;
+
+    /**
+     * This field is just there to assist in testing
+     */
+    private boolean                           eagerWire = true;
+
+    public ClassFieldAccessorStore() {
+        lookup = new HashMap<AccessorKey, BaseLookupEntry>();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( lookup );
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        lookup = (Map<AccessorKey, BaseLookupEntry>) in.readObject();
+    }
+
+    public void setEagerWire(boolean eagerWire) {
+        this.eagerWire = eagerWire;
+    }
+
+    public void setClassFieldAccessorCache(ClassFieldAccessorCache cache) {
+        this.cache = cache;
+    }
+
+    public ClassFieldWriter getWriter(Class cls,
+                                      String fieldName,
+                                      ClassLoader classLoader) {
+        return getWriter( cls.getName(),
+                          fieldName,
+                          null );
+    }
+
+    public ClassFieldReader getReader(Class cls,
+                                      String fieldName,
+                                      ClassLoader classLoader) {
+        return getReader( cls.getName(),
+                          fieldName,
+                          null,
+                          AccessorKey.AccessorType.FieldAccessor );
+    }
+
+    public ClassFieldReader getReader(final String className,
+                                      final String fieldName,
+                                      final AcceptsReadAccessor target) {
+        return getReader( className,
+                          fieldName,
+                          target,
+                          AccessorKey.AccessorType.FieldAccessor );
+    }
+
+    public synchronized ClassFieldReader getReader(final String className,
+                                                   final String fieldName,
+                                                   final AcceptsReadAccessor target,
+                                                   final AccessorKey.AccessorType accessorType) {
+        AccessorKey key = new AccessorKey( className,
+                                           fieldName,
+                                           accessorType );
+        FieldLookupEntry entry = (FieldLookupEntry) this.lookup.get( key );
+        
+        boolean exists = true;
+        if ( entry == null ) {
+            exists = false;
+            entry = new FieldLookupEntry( new ClassFieldReader( className,
+                                                                fieldName ) );
+        }
+
+        if ( this.eagerWire ) {
+            wire( entry.getClassFieldReader() );
+        }        
+        
+
+        if ( target != null ) {
+            target.setReadAccessor( entry.getClassFieldReader() );
+            entry.addAccessorTarget( target );
+        }
+        
+        if( exists == false ) {
+            // we delay the key writing as we only want to do it if the wiring was successful
+            this.lookup.put( key,
+                             entry );   
+        }
+
+        return entry.getClassFieldReader();
+    }
+
+    public synchronized ClassFieldWriter getWriter(final String className,
+                                                   final String fieldName,
+                                                   final AcceptsWriteAccessor target) {
+        AccessorKey key = new AccessorKey( className,
+                                           fieldName,
+                                           AccessorKey.AccessorType.FieldAccessor );
+        FieldLookupEntry entry = (FieldLookupEntry) this.lookup.get( key );
+        boolean exists = true;
+        if ( entry == null ) {
+            exists = false;
+            entry = new FieldLookupEntry( new ClassFieldWriter( className,
+                                                                fieldName ) );
+        }
+
+        if ( this.eagerWire ) {
+            wire( entry.getClassFieldReader() );
+        }
+
+        if ( target != null ) {
+            target.setWriteAccessor( entry.getClassFieldWriter() );
+            entry.addAccessorTarget( target );
+        }
+
+        if( exists == false ) {
+            // we delay the key writing as we only want to do it if the wiring was successful
+            this.lookup.put( key,
+                             entry );   
+        }        
+        
+        return entry.getClassFieldWriter();
+    }
+
+    public ClassFieldAccessor getAccessor(Class cls,
+                                          String fieldName,
+                                          ClassLoader classLoader) {
+        return getAccessor( cls.getName(),
+                            fieldName );
+    }
+
+    public ClassFieldAccessor getAccessor(final String className,
+                                          final String fieldName) {
+        AccessorKey key = new AccessorKey( className,
+                                           fieldName,
+                                           AccessorKey.AccessorType.FieldAccessor );
+        FieldLookupEntry entry = (FieldLookupEntry) this.lookup.get( key );
+        if ( entry == null ) {
+            entry = new FieldLookupEntry( new ClassFieldReader( className,
+                                                                fieldName ),
+                                          new ClassFieldWriter( className,
+                                                                fieldName ) );
+            this.lookup.put( key,
+                             entry );
+        }
+
+        ClassFieldAccessor accessor = new ClassFieldAccessor( entry.getClassFieldReader(),
+                                                              entry.getClassFieldWriter() );
+
+        entry.addAccessorTarget( accessor );
+
+        if ( this.eagerWire ) {
+            wire( entry.getClassFieldReader() );
+            wire( entry.getClassFieldWriter() );
+        }
+
+        return accessor;
+    }
+
+    //    public PatternExtractor getObjectAccessor(final Class cls,
+    //                                              final String identifier,
+    //                                              final Declaration declaration) {
+    //        AccessorKey key = new AccessorKey( cls.getName(),
+    //                                           identifier, // we are re-using the fieldName as a global identifier
+    //                                           AccessorKey.AccessorType.GlobalAccessor );
+    //
+    //        ObjectExtractorLookupEntry entry = (ObjectExtractorLookupEntry) this.lookup.get( key );
+    //        if ( entry == null ) {
+    //            PatternExtractor extractor = (PatternExtractor) declaration.getExtractor();
+    //            entry = new ObjectExtractorLookupEntry( extractor );
+    //            this.lookup.put( key,
+    //                             entry );
+    //        }
+    //
+    //        entry.addAccessorTarget( declaration );
+    //
+    //        // there is no wiring here as the GlobalExtractor already references the class, 
+    //        // although we will need to re-wire on serialisation 
+    //
+    //        return entry.getObjectExtractor();
+    //    }
+    //
+    //    public GlobalExtractor getGlobalAccessor(final ClassObjectType classObjectType,
+    //                                             final String identifier,
+    //                                             final Declaration declaration) {
+    //        AccessorKey key = new AccessorKey( classObjectType.getClassType().getName(),
+    //                                           identifier, // we are re-using the fieldName as a global identifier
+    //                                           AccessorKey.AccessorType.GlobalAccessor );
+    //
+    //        GlobalExtractorLookupEntry entry = (GlobalExtractorLookupEntry) this.lookup.get( key );
+    //        if ( entry == null ) {
+    //            entry = new GlobalExtractorLookupEntry( new GlobalExtractor( identifier,
+    //                                                                         classObjectType ) );
+    //            this.lookup.put( key,
+    //                             entry );
+    //        }
+    //
+    //        entry.addAccessorTarget( declaration );
+    //        declaration.setReadAccessor( entry.getGlobalExtractor() );
+    //
+    //        // there is no wiring here as the GlobalExtractor already references the class, 
+    //        // although we will need to re-wire on serialisation 
+    //
+    //        return entry.getGlobalExtractor();
+    //    }
+
+    public ClassObjectType getClassObjectType(final ClassObjectType objectType,
+                                              final AcceptsClassObjectType target) {
+        return getClassObjectType( objectType,
+                                   false,
+                                   target );
+    }
+
+    public ClassObjectType getClassObjectType(final ClassObjectType objectType,
+                                              final boolean isEvent,
+                                              final AcceptsClassObjectType target) {
+        AccessorKey key = new AccessorKey( objectType.getClassName(),
+                                           isEvent ? "$$DROOLS__isEvent__" : null,
+                                           AccessorKey.AccessorType.ClassObjectType );
+
+        ClassObjectTypeLookupEntry entry = (ClassObjectTypeLookupEntry) this.lookup.get( key );
+        if ( entry == null ) {
+            entry = new ClassObjectTypeLookupEntry(  cache.getClassObjectType( objectType ) );
+            this.lookup.put( key,
+                             entry );
+        }
+
+        if ( target != null ) {
+            entry.addAccessorTarget( target );
+            target.setClassObjectType( entry.getClassObjectType() );
+        }
+
+        return entry.getClassObjectType();
+    }
+
+    public void merge(ClassFieldAccessorStore other) {
+        for ( Entry<AccessorKey, BaseLookupEntry> entry : other.lookup.entrySet() ) {
+
+            switch ( entry.getValue().getAccessorType() ) {
+                case FieldAccessor : {
+                    FieldLookupEntry lookupEntry = (FieldLookupEntry) this.lookup.get( entry.getKey() );
+                    if ( lookupEntry == null ) {
+                        lookupEntry = (FieldLookupEntry) entry.getValue();
+                        this.lookup.put( entry.getKey(),
+                                         lookupEntry );
+                        // wire up ClassFieldReaders
+                        if ( lookupEntry.getClassFieldReader() != null ) {
+                            wire( lookupEntry.getClassFieldReader() );
+                        }
+
+                        if ( lookupEntry.getClassFieldWriter() != null ) {
+                            wire( lookupEntry.getClassFieldWriter() );
+                        }
+                    } else {
+                        // iterate through new targets adding them and wiring them up
+                        // to the existing ClassFieldReader, no need to wire generated accessor
+                        // as we know it already exists
+                        for ( Acceptor target : entry.getValue().getAccessorTargets() ) {
+                            if ( target instanceof AcceptsReadAccessor ) {
+                                ((AcceptsReadAccessor) target).setReadAccessor( lookupEntry.getClassFieldReader() );
+                            } else if ( target instanceof AcceptsWriteAccessor ) {
+                                ((AcceptsWriteAccessor) target).setWriteAccessor( lookupEntry.getClassFieldWriter() );
+                            }
+                            lookupEntry.addAccessorTarget( target );
+                        }
+                    }
+                    break;
+                }
+
+                case ClassObjectType : {
+                    ClassObjectTypeLookupEntry lookupEntry = (ClassObjectTypeLookupEntry) this.lookup.get( entry.getKey() );
+                    if ( lookupEntry == null ) {
+                                                // Create new entry with correct ClassObjectType and targets
+                        lookupEntry = new ClassObjectTypeLookupEntry(  cache.getClassObjectType( ((ClassObjectTypeLookupEntry) entry.getValue()).getClassObjectType() ) );                        
+                        
+                        this.lookup.put( entry.getKey(),
+                                         lookupEntry );
+                                               
+                    } 
+                    
+                    for ( Acceptor target : entry.getValue().getAccessorTargets() ) {
+                        ((AcceptsClassObjectType) target).setClassObjectType( lookupEntry.getClassObjectType() );                            
+                        lookupEntry.addAccessorTarget( target );
+                    }
+                }
+
+                    //                case ObjectAccessor : {
+                    //                    ObjectExtractorLookupEntry lookupEntry = ( ObjectExtractorLookupEntry ) this.lookup.get( entry.getKey() );
+                    //                    if ( lookupEntry == null ) {
+                    //                        lookupEntry = ( ObjectExtractorLookupEntry )  entry.getValue();
+                    //                        this.lookup.put( entry.getKey(),
+                    //                                         lookupEntry );
+                    //                        wire( lookupEntry.getObjectExtractor() );                       
+                    //                    } else {
+                    //                        for ( Acceptor target : entry.getValue().getAccessorTargets() ) {
+                    //                            ((Declaration)target).setReadAccessor( lookupEntry.getObjectExtractor() );
+                    //                            lookupEntry.addAccessorTarget( target );
+                    //                        }
+                    //                    }
+                    //                    break;
+                    //                }
+                    //                case GlobalAccessor : {
+                    //                    GlobalExtractorLookupEntry lookupEntry = ( GlobalExtractorLookupEntry ) this.lookup.get( entry.getKey() );
+                    //                    if ( lookupEntry == null ) {
+                    //                        lookupEntry = ( GlobalExtractorLookupEntry )  entry.getValue();
+                    //                        this.lookup.put( entry.getKey(),
+                    //                                         lookupEntry );
+                    //                        wire( lookupEntry.getGlobalExtractor() );  
+                    //                    } else {
+                    //                        for ( Acceptor target : entry.getValue().getAccessorTargets() ) {
+                    //                            ((Declaration)target).setReadAccessor( lookupEntry.getGlobalExtractor() );
+                    //                            lookupEntry.addAccessorTarget( target );
+                    //                        }                        
+                    //                    }                    
+                    //                    break;
+                    //                }
+            }
+        }
+    }
+
+    public void wire() {
+        for ( Entry<AccessorKey, BaseLookupEntry> entry : lookup.entrySet() ) {
+            switch ( entry.getValue().getAccessorType() ) {
+                case FieldAccessor : {
+                    ClassFieldReader reader = ((FieldLookupEntry) entry.getValue()).getClassFieldReader();
+                    if ( reader != null ) {
+                        wire( reader );
+                    }
+
+                    ClassFieldWriter writer = ((FieldLookupEntry) entry.getValue()).getClassFieldWriter();
+                    if ( writer != null ) {
+                        wire( writer );
+                    }
+                    break;
+                }
+                case ClassObjectType : {
+                    ClassObjectType classObjectType = ((ClassObjectTypeLookupEntry) entry.getValue()).getClassObjectType();
+                    wire( classObjectType );
+                    break;
+                }
+
+                    //                case ObjectAccessor : {
+                    //                    PatternExtractor reader = ((ObjectExtractorLookupEntry) entry.getValue()).getObjectExtractor();
+                    //                    wire( reader );
+                    //                    break;
+                    //                }
+                    //                case GlobalAccessor : {
+                    //                    GlobalExtractor reader = ((GlobalExtractorLookupEntry) entry.getValue()).getGlobalExtractor();
+                    //                    wire( reader );
+                    //                    break;
+                    //                }
+            }
+        }
+    }
+
+    public void wire(ClassFieldReader reader) {
+        reader.setReadAccessor( cache.getReadAcessor( reader ) );
+    }
+
+    public void wire(ClassFieldWriter writer) {
+        writer.setWriteAccessor( cache.getWriteAcessor( writer ) );
+    }
+
+    //    public void wire(PatternExtractor reader) {
+    //        ObjectType objectType = reader.getObjectType();
+    //
+    //        if ( objectType instanceof ClassObjectType ) {
+    //            ClassObjectType cot = (ClassObjectType) objectType;
+    //            try {
+    //                Class cls = this.cache.getClassLoader().loadClass( cot.getClassName() );
+    //                cot.setClassType( cls );
+    //            } catch ( ClassNotFoundException e ) {
+    //                throw new RuntimeDroolsException( "Unable to load ClassObjectType class '" + cot.getClassName() + "'" );
+    //            }
+    //        }
+    //    }    
+
+    public void wire(ClassObjectType objectType) {
+        try {
+            Class cls = this.cache.getClassLoader().loadClass( objectType.getClassName() );
+            objectType.setClassType( cls );
+        } catch ( ClassNotFoundException e ) {
+            throw new RuntimeDroolsException( "Unable to load ClassObjectType class '" + objectType.getClassName() + "'" );
+        }
+    }
+
+    public static abstract class BaseLookupEntry
+        implements
+        Externalizable {
+        // we use an identity hashmap to avoid hashcode/equals being called on stored targets
+        private Map<Acceptor, Object> accessorTargets = Collections.<Acceptor, Object> emptyMap();
+
+        public BaseLookupEntry() {
+
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            out.writeObject( accessorTargets );
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            accessorTargets = (Map<Acceptor, Object>) in.readObject();
+
+        }
+
+        public Set<Acceptor> getAccessorTargets() {
+            return accessorTargets.keySet();
+        }
+
+        public void addAccessorTarget(Acceptor target) {
+            if ( this.accessorTargets == Collections.EMPTY_MAP ) {
+                this.accessorTargets = new IdentityHashMap<Acceptor, Object>();
+            }
+
+            this.accessorTargets.put( target, null );
+        }
+        
+        public void addAccessorTargets(Set<Acceptor> targets) {
+            if ( this.accessorTargets == Collections.EMPTY_MAP ) {
+                this.accessorTargets = new IdentityHashMap<Acceptor, Object>( );
+            }
+            
+            for ( Acceptor target : targets ) {
+                this.accessorTargets.put( target, null );
+            }
+        }
+
+        public void removeTarget(Acceptor target) {
+            this.accessorTargets.remove( target );
+        }
+
+        public abstract AccessorKey.AccessorType getAccessorType();
+
+    }
+
+    public static class ClassObjectTypeLookupEntry extends BaseLookupEntry {
+        ClassObjectType classObjectType;
+
+        public ClassObjectTypeLookupEntry() {
+            super();
+        }
+
+        public ClassObjectTypeLookupEntry(ClassObjectType classObjectType) {
+            super();
+            this.classObjectType = classObjectType;
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            super.writeExternal( out );
+            out.writeObject( classObjectType );
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            super.readExternal( in );
+            classObjectType = (ClassObjectType) in.readObject();
+        }
+
+        public ClassObjectType getClassObjectType() {
+            return classObjectType;
+        }        
+        
+        public void setClassObjectType(ClassObjectType classObjectType) {
+            this.classObjectType = classObjectType;
+        }
+
+        public AccessorType getAccessorType() {
+            return AccessorKey.AccessorType.ClassObjectType;
+        }
+
+    }
+
+    //
+    //    public static class GlobalExtractorLookupEntry extends BaseLookupEntry {
+    //        GlobalExtractor globalExtractor;
+    //
+    //        public GlobalExtractorLookupEntry() {
+    //            super();
+    //        }
+    //
+    //        public GlobalExtractorLookupEntry(GlobalExtractor globalExtractor) {
+    //            super();
+    //            this.globalExtractor = globalExtractor;
+    //        }
+    //
+    //        public void writeExternal(ObjectOutput out) throws IOException {
+    //            super.writeExternal( out );
+    //            out.writeObject( globalExtractor );
+    //        }
+    //
+    //        public void readExternal(ObjectInput in) throws IOException,
+    //                                                ClassNotFoundException {
+    //            super.readExternal( in );
+    //            globalExtractor = (GlobalExtractor) in.readObject();
+    //        }
+    //
+    //        public GlobalExtractor getGlobalExtractor() {
+    //            return globalExtractor;
+    //        }
+    //
+    //        public AccessorType getAccessorType() {
+    //            return AccessorKey.AccessorType.GlobalAccessor;
+    //        }
+    //
+    //    }
+    //
+    //    public static class ObjectExtractorLookupEntry extends BaseLookupEntry {
+    //        PatternExtractor patternExtractor;
+    //
+    //        public ObjectExtractorLookupEntry() {
+    //            super();
+    //        }
+    //
+    //        public ObjectExtractorLookupEntry(PatternExtractor patternExtractor) {
+    //            super();
+    //            this.patternExtractor = patternExtractor;
+    //        }
+    //
+    //        public void writeExternal(ObjectOutput out) throws IOException {
+    //            super.writeExternal( out );
+    //            out.writeObject( patternExtractor );
+    //        }
+    //
+    //        public void readExternal(ObjectInput in) throws IOException,
+    //                                                ClassNotFoundException {
+    //            super.readExternal( in );
+    //            patternExtractor = (PatternExtractor) in.readObject();
+    //        }
+    //
+    //        public PatternExtractor getObjectExtractor() {
+    //            return patternExtractor;
+    //        }
+    //
+    //        public AccessorType getAccessorType() {
+    //            return AccessorKey.AccessorType.ObjectAccessor;
+    //        }
+    //    }
+    //
+    public static class FieldLookupEntry extends BaseLookupEntry {
+        private ClassFieldReader reader;
+        private ClassFieldWriter writer;
+
+        public FieldLookupEntry() {
+
+        }
+
+        public FieldLookupEntry(ClassFieldReader reader) {
+            this.reader = reader;
+        }
+
+        public FieldLookupEntry(ClassFieldWriter writer) {
+            this.writer = writer;
+        }
+
+        public FieldLookupEntry(ClassFieldReader reader,
+                                ClassFieldWriter writer) {
+            this.writer = writer;
+            this.reader = reader;
+        }
+
+        public void writeExternal(ObjectOutput out) throws IOException {
+            super.writeExternal( out );
+            out.writeObject( reader );
+            out.writeObject( writer );
+        }
+
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            super.readExternal( in );
+            reader = (ClassFieldReader) in.readObject();
+            writer = (ClassFieldWriter) in.readObject();
+        }
+
+        public ClassFieldReader getClassFieldReader() {
+            return reader;
+        }
+
+        public ClassFieldWriter getClassFieldWriter() {
+            return this.writer;
+        }
+
+        public AccessorType getAccessorType() {
+            return AccessorKey.AccessorType.FieldAccessor;
+        }
+    }
+
+    //    public static class LookupEntry
+    //        implements
+    //        Externalizable {
+    //        private ClassFieldReader     reader;
+    //        private ClassFieldWriter     writer;
+    //        private Set<AcceptsAccessor> accessorTargets = Collections.<AcceptsAccessor> emptySet();
+    //
+    //        public LookupEntry() {
+    //
+    //        }
+    //
+    //        public void writeExternal(ObjectOutput out) throws IOException {
+    //            out.writeObject( reader );
+    //            out.writeObject( writer );
+    //            out.writeObject( accessorTargets );
+    //        }
+    //
+    //        public void readExternal(ObjectInput in) throws IOException,
+    //                                                ClassNotFoundException {
+    //            reader = (ClassFieldReader) in.readObject();
+    //            writer = (ClassFieldWriter) in.readObject();
+    //            accessorTargets = (Set<AcceptsAccessor>) in.readObject();
+    //
+    //        }
+    //
+    //        public LookupEntry(ClassFieldReader reader) {
+    //            this.reader = reader;
+    //        }
+    //
+    //        public LookupEntry(ClassFieldWriter writer) {
+    //            this.writer = writer;
+    //        }
+    //
+    //        public LookupEntry(ClassFieldReader reader,
+    //                           ClassFieldWriter writer) {
+    //            this.writer = writer;
+    //            this.reader = reader;
+    //        }
+    //
+    //        public ClassFieldReader getClassFieldReader() {
+    //            return reader;
+    //        }
+    //
+    //        public ClassFieldWriter getClassFieldWriter() {
+    //            return this.writer;
+    //        }
+    //
+    //        public Set<AcceptsAccessor> getAccessorTargets() {
+    //            return accessorTargets;
+    //        }
+    //
+    //        public void addAccessorTarget(AcceptsAccessor target) {
+    //            if ( this.accessorTargets == Collections.EMPTY_SET ) {
+    //                this.accessorTargets = new HashSet<AcceptsAccessor>();
+    //            }
+    //
+    //            this.accessorTargets.add( target );
+    //        }
+    //
+    //        public void removeConstraint(Constraint constraint) {
+    //            this.accessorTargets.remove( constraint );
+    //        }
+    //    }
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldReader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -39,83 +40,49 @@
  */
 public class ClassFieldReader
     implements
+    Externalizable,
     InternalReadAccessor {
     /**
      *
      */
     private static final long              serialVersionUID = 400L;
+    private String                         className;
     private String                         fieldName;
-    private Class< ? >                     clazz;
     private transient InternalReadAccessor reader;
-
+    
+    
     public ClassFieldReader() {
-
+        
     }
-
-    public ClassFieldReader(final Class< ? > clazz,
+    
+    public ClassFieldReader(final String className,
                             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.className = className;
         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.getName() );
+        out.writeObject( className );
         out.writeObject( fieldName );
     }
 
     public void readExternal(final ObjectInput is) throws ClassNotFoundException,
                                                   IOException {
-        String clsName = (String) is.readObject();
+        className = (String) is.readObject();
         fieldName = (String) is.readObject();
-        if ( is instanceof DroolsObjectInput ) {
-            DroolsObjectInput droolsInput = (DroolsObjectInput) is;
-            this.clazz = droolsInput.getClassLoader().loadClass( clsName );
-            reader = droolsInput.getExtractorFactory().getReader( clazz,
-                                                                     fieldName,
-                                                                     droolsInput.getClassLoader() );
-        } else {
-            this.clazz = getClass().getClassLoader() .loadClass( clsName );            
-            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 void setReadAccessor(InternalReadAccessor reader) {
+        this.reader = reader;
     }
 
     public int getIndex() {
         return this.reader.getIndex();
     }
+    
+    public String getClassName() {
+        return this.className;
+    }
 
     public String getFieldName() {
         return this.fieldName;
@@ -124,7 +91,7 @@
     public Object getValue(InternalWorkingMemory workingMemory,
                            final Object object) {
         return this.reader.getValue( workingMemory,
-                                        object );
+                                     object );
     }
 
     public ValueType getValueType() {
@@ -140,79 +107,83 @@
     }
 
     public String toString() {
-        return "[ClassFieldExtractor class=" + this.clazz + " field=" + this.fieldName + "]";
+        return "[ClassFieldExtractor class=" + this.className + " field=" + this.fieldName + "]";
     }
 
     public int hashCode() {
-        return getValueType().hashCode() * 17 + getIndex();
-    }
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((className == null) ? 0 : className.hashCode());
+        result = prime * result + ((fieldName == null) ? 0 : fieldName.hashCode());
+        return result;
+    }       
 
-    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 equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( !(obj instanceof ClassFieldReader) ) return false;
+        ClassFieldReader other = (ClassFieldReader) obj;
+        if ( className == null ) {
+            if ( other.className != null ) return false;
+        } else if ( !className.equals( other.className ) ) return false;
+        if ( fieldName == null ) {
+            if ( other.fieldName != null ) return false;
+        } else if ( !fieldName.equals( other.fieldName ) ) return false;
+        return true;
     }
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory,
                                    final Object object) {
         return this.reader.getBooleanValue( workingMemory,
-                                               object );
+                                            object );
     }
 
     public byte getByteValue(InternalWorkingMemory workingMemory,
                              final Object object) {
         return this.reader.getByteValue( workingMemory,
-                                            object );
+                                         object );
     }
 
     public char getCharValue(InternalWorkingMemory workingMemory,
                              final Object object) {
         return this.reader.getCharValue( workingMemory,
-                                            object );
+                                         object );
     }
 
     public double getDoubleValue(InternalWorkingMemory workingMemory,
                                  final Object object) {
         return this.reader.getDoubleValue( workingMemory,
-                                              object );
+                                           object );
     }
 
     public float getFloatValue(InternalWorkingMemory workingMemory,
                                final Object object) {
         return this.reader.getFloatValue( workingMemory,
-                                             object );
+                                          object );
     }
 
     public int getIntValue(InternalWorkingMemory workingMemory,
                            final Object object) {
         return this.reader.getIntValue( workingMemory,
-                                           object );
+                                        object );
     }
 
     public long getLongValue(InternalWorkingMemory workingMemory,
                              final Object object) {
         return this.reader.getLongValue( workingMemory,
-                                            object );
+                                         object );
     }
 
     public short getShortValue(InternalWorkingMemory workingMemory,
                                final Object object) {
         return this.reader.getShortValue( workingMemory,
-                                             object );
+                                          object );
     }
 
     public boolean isNullValue(InternalWorkingMemory workingMemory,
                                final Object object) {
         return this.reader.isNullValue( workingMemory,
-                                           object );
+                                        object );
     }
 
     public Method getNativeReadMethod() {
@@ -222,7 +193,7 @@
     public int getHashCode(InternalWorkingMemory workingMemory,
                            final Object object) {
         return this.reader.getHashCode( workingMemory,
-                                           object );
+                                        object );
     }
 
     public boolean isGlobal() {
@@ -327,6 +298,5 @@
     public boolean isNullValue(Object object) {
         return reader.isNullValue( object );
     }
-    
-    
+
 }
\ No newline at end of file

Modified: 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	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldWriter.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.common.DroolsObjectInput;
+import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.WriteAccessor;
 
 /**
@@ -37,95 +38,88 @@
     WriteAccessor {
 
     private static final long       serialVersionUID = 400L;
+    private String                  className;
     private String                  fieldName;
-    private Class< ? >              clazz;
     private transient WriteAccessor writer;
 
     public ClassFieldWriter() {
 
     }
-
-    public ClassFieldWriter(final Class< ? > clazz,
+    
+    public ClassFieldWriter(final String className,
                             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.className = className;
         this.fieldName = fieldName;
-        init( findClassLoader( classLoader ),
-              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 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( className );
         out.writeObject( fieldName );
     }
 
     public void readExternal(final ObjectInput is) throws ClassNotFoundException,
                                                   IOException {
-        clazz = (Class< ? >) is.readObject();
+        className = (String) 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 void setWriteAccessor(WriteAccessor writer) {
+        this.writer = writer;
+    }    
 
-    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 getClassName() {
+        return this.className;
+    }    
 
     public String getFieldName() {
         return this.fieldName;
     }
 
     public String toString() {
-        return "[ClassFieldWriter class=" + this.clazz + " field=" + this.fieldName + "]";
+        return "[ClassFieldWriter class=" + this.className + " field=" + this.fieldName + "]";
     }
 
     public int hashCode() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+import org.drools.RuntimeDroolsException;
+import org.drools.common.DroolsObjectInputStream;
 import org.drools.spi.ObjectType;
 
 import java.io.ObjectInput;
@@ -32,7 +34,8 @@
  */
 public class ClassObjectType
     implements
-    ObjectType, Externalizable {
+    ObjectType,
+    Externalizable {
 
     /**
      *
@@ -40,8 +43,10 @@
     private static final long serialVersionUID = 400L;
 
     /** Java object class. */
-    protected Class           objectTypeClass;
+    protected Class           cls;
 
+    protected String          clsName;
+
     protected ValueType       valueType;
 
     private boolean           isEvent;
@@ -51,8 +56,8 @@
     // ------------------------------------------------------------
 
     public ClassObjectType() {
-        this(null);
     }
+
     /**
      * Creates a new class object type with shadow disabled.
      *
@@ -60,7 +65,8 @@
      *            Java object class.
      */
     public ClassObjectType(final Class objectTypeClass) {
-        this( objectTypeClass, false );
+        this( objectTypeClass,
+              false );
     }
 
     /**
@@ -69,81 +75,104 @@
      * @param objectTypeClass the class represented by this class object type
      * @param isEvent true if it is an event class, false otherwise
      */
-    public ClassObjectType(final Class objectTypeClass, final boolean isEvent) {
-        this.objectTypeClass = objectTypeClass;
+    public ClassObjectType(final Class objectTypeClass,
+                           final boolean isEvent) {
+        this.cls = objectTypeClass;
         this.isEvent = isEvent;
-        if (objectTypeClass != null)
-            this.valueType = ValueType.determineValueType( objectTypeClass );
+        //if (objectTypeClass != null)
+        this.clsName = this.cls.getName();
+        this.valueType = ValueType.determineValueType( objectTypeClass );
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        objectTypeClass = (Class)in.readObject();
-        valueType       = (ValueType)in.readObject();
-        if (valueType != null)
-            valueType   = ValueType.determineValueType(valueType.getClassType());
-        isEvent         = in.readBoolean();
+    public ClassObjectType(final String className,
+                           final boolean isEvent) {
+        this.isEvent = isEvent;
+        this.clsName = this.cls.getName();
+        //        if (objectTypeClass != null)
+        //
+        //            this.valueType = ValueType.determineValueType( objectTypeClass );        
     }
 
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        this.clsName = in.readUTF();
+        if ( clsName.equals( "org.drools.InitialFact" ) || clsName.equals( "org.drools.base.DroolsQuery" ) ) {
+            // we handle this one especially as it never gets written to the packagestore for rewiring
+            try {
+                setClassType( getClass().getClassLoader().loadClass( clsName ) );
+            } catch ( ClassNotFoundException e ) {
+                throw new RuntimeDroolsException( "Unable to resolve class '" + clsName + "'" );
+            }
+        }        
+//        this.valueType = (ValueType) in.readObject();
+        this.isEvent = in.readBoolean();
+    }
+
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(objectTypeClass);
-        out.writeObject(valueType);
-        out.writeBoolean(isEvent);
+        out.writeUTF( clsName );
+//        out.writeObject( valueType );
+        out.writeBoolean( isEvent );
     }
 
-    // ------------------------------------------------------------
-    // Instance methods
-    // ------------------------------------------------------------
-
     /**
      * Return the Java object class.
      *
      * @return The Java object class.
      */
     public Class getClassType() {
-        return this.objectTypeClass;
+        return this.cls;
     }
 
+    public String getClassName() {
+        return this.clsName;
+    }
+
+    public void setClassType(Class cls) {
+        this.cls = cls;
+        this.valueType = ValueType.determineValueType( cls );
+    }
+
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     // org.drools.spi.ObjectType
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
-    /**
-     * Determine if the passed <code>Class</code> matches to the object type
-     * defined by this <code>objectType</code> instance.
-     *
-     * @param clazz
-     *            The <code>Class</code> to test.
-     *
-     * @return <code>true</code> if the <code>Class</code> matches this
-     *         object type, else <code>false</code>.
-     */
-    public boolean matchesClass(final Class clazz) {
-        return getClassType().isAssignableFrom( clazz );
-    }
+    //    /**
+    //     * Determine if the passed <code>Class</code> matches to the object type
+    //     * defined by this <code>objectType</code> instance.
+    //     *
+    //     * @param clazz
+    //     *            The <code>Class</code> to test.
+    //     *
+    //     * @return <code>true</code> if the <code>Class</code> matches this
+    //     *         object type, else <code>false</code>.
+    //     */
+    //    public boolean matchesClass(final Class clazz) {
+    //        return getClassType().isAssignableFrom( clazz );
+    //    }
+    //
+    //    /**
+    //     * Determine if the passed <code>Object</code> belongs to the object type
+    //     * defined by this <code>objectType</code> instance.
+    //     *
+    //     * @param object
+    //     *            The <code>Object</code> to test.
+    //     *
+    //     * @return <code>true</code> if the <code>Object</code> matches this
+    //     *         object type, else <code>false</code>.
+    //     */
+    //    public boolean matches(final Object object) {
+    //        return getClassType().isInstance( object );
+    //    }
+    //
+    //    public boolean isAssignableFrom(Object object) {
+    //        return this.objectTypeClass.isAssignableFrom( (Class) object );
+    //    }
 
-    /**
-     * Determine if the passed <code>Object</code> belongs to the object type
-     * defined by this <code>objectType</code> instance.
-     *
-     * @param object
-     *            The <code>Object</code> to test.
-     *
-     * @return <code>true</code> if the <code>Object</code> matches this
-     *         object type, else <code>false</code>.
-     */
-    public boolean matches(final Object object) {
-        return getClassType().isInstance( object );
-    }
-
-    public boolean isAssignableFrom(Object object) {
-        return this.objectTypeClass.isAssignableFrom( (Class) object );
-    }
-
     public boolean isAssignableFrom(ObjectType objectType) {
         if ( !(objectType instanceof ClassObjectType) ) {
             return false;
         } else {
-            return this.objectTypeClass.isAssignableFrom( ((ClassObjectType) objectType).getClassType() );
+            return this.cls.isAssignableFrom( ((ClassObjectType) objectType).getClassType() );
         }
     }
 
@@ -160,7 +189,7 @@
     }
 
     public String toString() {
-        return "[ClassObjectType "+( this.isEvent ? "event=" : "class=" )+ getClassType().getName() + "]";
+        return "[ClassObjectType " + (this.isEvent ? "event=" : "class=") + getClassType().getName() + "]";
     }
 
     /**
@@ -181,11 +210,11 @@
             return false;
         }
 
-        return this.objectTypeClass == ((ClassObjectType) object).objectTypeClass;
+        return this.clsName.equals( ((ClassObjectType) object).clsName );
     }
 
     public int hashCode() {
-        return this.objectTypeClass.hashCode();
+        return this.clsName.hashCode();
     }
 
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ValueType.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -120,6 +120,7 @@
         out.writeObject(classType);
         out.writeInt(simpleType);
     }
+    
     private Object readResolve() throws java.io.ObjectStreamException {
         return determineValueType( this.classType );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -17,19 +17,25 @@
  */
 package org.drools.base.accumulators;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
 import org.drools.rule.Declaration;
+import org.drools.rule.PredicateConstraint;
 import org.drools.spi.Accumulator;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.ReturnValueExpression;
 import org.drools.spi.Tuple;
+import org.drools.spi.Wireable;
 
 /**
  * An MVEL accumulator function executor implementation
@@ -38,12 +44,14 @@
  */
 public class JavaAccumulatorFunctionExecutor
     implements
-    Accumulator {
+    Accumulator,
+    Externalizable,
+    Wireable {
 
     private static final long     serialVersionUID = 400L;
 
     private ReturnValueExpression expression;
-    private AccumulateFunction    function;
+    private AccumulateFunction    function;    
 
     public JavaAccumulatorFunctionExecutor() {
 
@@ -61,7 +69,11 @@
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject( expression );
+        if ( this.expression instanceof CompiledInvoker ) {
+            out.writeObject(  null );
+        } else {
+            out.writeObject(this.expression);   
+        }
         out.writeObject( function );
     }
 
@@ -143,6 +155,10 @@
     public ReturnValueExpression getExpression() {
         return expression;
     }
+    
+    public void wire(Object object) {
+        setExpression( (ReturnValueExpression) object);
+    }
 
     public void setExpression(ReturnValueExpression expression) {
         this.expression = expression;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/MVELAccumulatorFunctionExecutor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -17,6 +17,7 @@
  */
 package org.drools.base.accumulators;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -27,6 +28,8 @@
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompilationUnit;
+import org.drools.base.mvel.MVELCompileable;
 import org.drools.common.InternalFactHandle;
 import org.drools.rule.Declaration;
 import org.drools.spi.Accumulator;
@@ -40,40 +43,47 @@
  */
 public class MVELAccumulatorFunctionExecutor
     implements
+    MVELCompileable,
+    Externalizable,
     Accumulator {
 
     private static final long  serialVersionUID = 400L;
 
     private final Object       dummy            = new Object();
+    
+    private MVELCompilationUnit unit;
+    private AccumulateFunction function;
+    
     private DroolsMVELFactory  model;
     private Serializable       expression;
-    private AccumulateFunction function;
+    
 
     public MVELAccumulatorFunctionExecutor() {
 
     }
 
-    public MVELAccumulatorFunctionExecutor(final DroolsMVELFactory factory,
-                                           final Serializable expression,
+    public MVELAccumulatorFunctionExecutor(MVELCompilationUnit unit,
                                            final AccumulateFunction function) {
         super();
-        this.model = factory;
-        this.expression = expression;
+        this.unit = unit;
         this.function = function;
     }
 
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
-        model = (DroolsMVELFactory) in.readObject();
-        expression = (Serializable) in.readObject();
+        unit = (MVELCompilationUnit) in.readObject();
         function = (AccumulateFunction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject( model );
-        out.writeObject( expression );
+        out.writeObject( unit );
         out.writeObject( function );
     }
+    
+    public void compile(ClassLoader classLoader) {
+        expression = unit.getCompiledExpression( classLoader );
+        model = unit.getFactory( );
+    }     
 
     /* (non-Javadoc)
      * @see org.drools.spi.Accumulator#createContext()

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/dataproviders/MVELDataProvider.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -11,6 +11,8 @@
 
 import org.drools.WorkingMemory;
 import org.drools.base.mvel.DroolsMVELFactory;
+import org.drools.base.mvel.MVELCompileable;
+import org.drools.base.mvel.MVELCompilationUnit;
 import org.drools.rule.Declaration;
 import org.drools.spi.DataProvider;
 import org.drools.spi.PropagationContext;
@@ -21,36 +23,46 @@
 public class MVELDataProvider
     implements
     DataProvider,
+    MVELCompileable,
     Externalizable  {
 
     private static final long serialVersionUID = 1901006343031798173L;
 
-    private Serializable      expression;
+    private MVELCompilationUnit unit;
+    private String id;
+    
+    private Serializable      expr;
     private DroolsMVELFactory prototype;
-    private String id;
 
     public MVELDataProvider() {
 
     }
 
-    public MVELDataProvider(final Serializable expression,
-                            final DroolsMVELFactory factory,
-                            final String id) {
-        this.expression = expression;
-        this.prototype = factory;
+    public MVELDataProvider(final MVELCompilationUnit unit,
+                              final String id) {
+        this.unit = unit;
         this.id = id;
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expression  = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
+        id = in.readUTF();
+        unit = ( MVELCompilationUnit ) in.readObject();
+//        expr    = (Serializable)in.readObject();
+//        prototype   = (DroolsMVELFactory)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expression);
-        out.writeObject(prototype);
+        out.writeUTF( id );
+        out.writeObject( unit );
+//        out.writeObject(expr);
+//        out.writeObject(prototype);
     }
     
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    }   
+    
     public Declaration[] getRequiredDeclarations() {
         return new Declaration[]{};
         //return factory.getRequiredDeclarations();
@@ -73,7 +85,7 @@
                                  null );
 
         //this.expression.
-        final Object result = MVEL.executeExpression( this.expression,
+        final Object result = MVEL.executeExpression( this.expr,
                                                       factory );                
         
         if ( result == null ) {

Modified: 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/ArrayElementReader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/ArrayElementReader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,17 +1,19 @@
 package org.drools.base.extractors;
 
 import java.lang.reflect.Method;
+import java.io.Externalizable;
 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.AcceptsReadAccessor;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.util.ClassUtils;
 
-public class ArrayElementReader implements InternalReadAccessor {
-    private InternalReadAccessor arrayExtractor;
+public class ArrayElementReader implements AcceptsReadAccessor, InternalReadAccessor, Externalizable  {
+    private InternalReadAccessor arrayReadAccessor;
     private int index;
     private Class<?> type;
 
@@ -20,7 +22,7 @@
     }
 
     public ArrayElementReader(InternalReadAccessor arrayExtractor, int index, Class<?> type) {
-        this.arrayExtractor = arrayExtractor;
+        this.arrayReadAccessor = arrayExtractor;
         this.index = index;
         this.type = type;
     }
@@ -30,79 +32,83 @@
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        arrayExtractor  = (InternalReadAccessor)in.readObject();
+        arrayReadAccessor  = (InternalReadAccessor)in.readObject();
         index           = in.readInt();
         type            = (Class<?>)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(arrayExtractor);
+        out.writeObject(arrayReadAccessor);
         out.writeInt(index);
         out.writeObject(type);
     }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.arrayReadAccessor = readAccessor;
+    }    
 
     public String getExtractToClassName() {
         return ClassUtils.canonicalName( type );
     }
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Boolean)array[ this.index ]).booleanValue();
     }
     public byte getByteValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Number)array[ this.index ]).byteValue();
     }
     public char getCharValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Character)array[ this.index ]).charValue();
     }
     public double getDoubleValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Number)array[ this.index ]).doubleValue();
     }
 
     public float getFloatValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Number)array[ this.index ]).floatValue();
     }
 
     public int getIntValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Number)array[ this.index ]).intValue();
     }
     public long getLongValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.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 );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return ( (Number)array[ this.index ]).shortValue();
     }
     public Object getValue(InternalWorkingMemory workingMemory, Object object) {
-        Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.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 );
+        Object[] array = ( Object[] ) this.arrayReadAccessor.getValue( workingMemory, object );
         return array[ this.index ] == null;
     }
 
   public int getHashCode(InternalWorkingMemory workingMemory, Object object) {
-      Object[] array = ( Object[] ) this.arrayExtractor.getValue( workingMemory, object );
+      Object[] array = ( Object[] ) this.arrayReadAccessor.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 + ((arrayReadAccessor == null) ? 0 : arrayReadAccessor.hashCode());
         result = PRIME * result + index;
         return result;
     }
@@ -112,9 +118,9 @@
         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 ( arrayReadAccessor == null ) {
+            if ( other.arrayReadAccessor != null ) return false;
+        } else if ( !arrayReadAccessor.equals( other.arrayReadAccessor ) ) return false;
         if ( index != other.index ) return false;
         return true;
     }

Modified: 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/MVELClassFieldReader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/extractors/MVELClassFieldReader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -25,9 +25,11 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.drools.base.AccessorKey;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.base.ClassFieldAccessorCache.CacheEntry;
 import org.drools.spi.InternalReadAccessor;
 import org.mvel.MVEL;
 import org.mvel.compiler.CompiledExpression;
@@ -48,9 +50,9 @@
 
     public MVELClassFieldReader() {
     }
-    public MVELClassFieldReader(Class clazz,
-                                   String fieldName,
-                                   ClassLoader classLoader) {
+    public MVELClassFieldReader(Class cls,
+                                String fieldName,
+                                CacheEntry cache) {
         super( -1, // index
                Object.class, // fieldType
                ValueType.determineValueType( Object.class ) ); // value type
@@ -58,28 +60,29 @@
 
         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 );
+                                    
+            InternalReadAccessor extr = cache.getReadAccessor( new AccessorKey( cls.getName(), basefield, AccessorKey.AccessorType.FieldAccessor), cls );
             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 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);
+//    }
 
-    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)
      */

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELFactory.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -76,17 +76,14 @@
     public DroolsMVELFactory(final Map previousDeclarations,
                              final Map localDeclarations,
                              final Map globals,
-                             final List[] externals) {
+                             final String[] inputIdentifiers) {
         this.previousDeclarations = previousDeclarations;
         this.localDeclarations = localDeclarations;
         this.globals = globals;
 
-        if ( externals != null && MVELDebugHandler.isDebugMode() ) {
-            for ( int i = 0; i < externals.length; i++ ) {
-                for ( Iterator it = externals[i].iterator(); it.hasNext(); ) {
-                    String identifier = (String) it.next();
-                    isResolveable( identifier );
-                }
+        if ( inputIdentifiers != null && MVELDebugHandler.isDebugMode() ) {
+            for ( int i = 0; i < inputIdentifiers.length; i++ ) {
+                isResolveable( inputIdentifiers[i] );
             }
         }
     }
@@ -258,7 +255,7 @@
     }
 
     public void addResolver(String name,
-                             VariableResolver vr) {
+                            VariableResolver vr) {
         if ( this.variableResolvers == null ) {
             this.variableResolvers = new HashMap();
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELShadowFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELShadowFactory.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/DroolsMVELShadowFactory.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -33,12 +33,12 @@
     public DroolsMVELShadowFactory(final Map previousDeclarations,
                                    final Map localDeclarations,
                                    final Map globals,
-                                   final List[] externals,
+                                   final String[] inputIdentifiers,
                                    final Set<String> shadowVariables) {
         super( previousDeclarations,
                localDeclarations,
                globals,
-               externals );
+               inputIdentifiers );
         this.shadowVariables = shadowVariables;
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAccumulator.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -17,6 +17,7 @@
  */
 package org.drools.base.mvel;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -40,10 +41,17 @@
  */
 public class MVELAccumulator
     implements
-    Accumulator {
+    MVELCompileable,
+    Accumulator,
+    Externalizable  {
 
     private static final long serialVersionUID = 400L;
 
+    MVELCompilationUnit initUnit;
+    MVELCompilationUnit actionUnit;
+    MVELCompilationUnit reverseUnit;
+    MVELCompilationUnit resultUnit;
+    
     private DroolsMVELFactory prototype;
     private Serializable      init;
     private Serializable      action;
@@ -53,35 +61,43 @@
     public MVELAccumulator() {
     }
 
-    public MVELAccumulator(final DroolsMVELFactory factory,
-                           final Serializable init,
-                           final Serializable action,
-                           final Serializable reverse,
-                           final Serializable result) {
+    public MVELAccumulator(final MVELCompilationUnit initUnit,
+                           final MVELCompilationUnit actionUnit,
+                           final MVELCompilationUnit reverseUnit,
+                           final MVELCompilationUnit resultUnit) {
         super();
-        this.prototype = factory;
-        this.init = init;
-        this.action = action;
-        this.reverse = reverse;
-        this.result = result;
+        this.initUnit = initUnit;
+        this.actionUnit = actionUnit;
+        this.reverseUnit = reverseUnit;
+        this.resultUnit = resultUnit;
     }
 
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
-        prototype = (DroolsMVELFactory) in.readObject();
-        init = (Serializable) in.readObject();
-        action = (Serializable) in.readObject();
-        reverse = (Serializable) in.readObject();
-        result = (Serializable) in.readObject();
+        initUnit = (MVELCompilationUnit) in.readObject();
+        actionUnit = (MVELCompilationUnit) in.readObject();
+        reverseUnit = (MVELCompilationUnit) in.readObject();
+        resultUnit = (MVELCompilationUnit) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject( prototype );
-        out.writeObject( init );
-        out.writeObject( action );
-        out.writeObject( reverse );
-        out.writeObject( result );
+        out.writeObject( initUnit );
+        out.writeObject( actionUnit );
+        out.writeObject( reverseUnit );
+        out.writeObject( resultUnit );
     }
+    
+    public void compile(ClassLoader classLoader) {
+        init = initUnit.getCompiledExpression( classLoader );
+        action = actionUnit.getCompiledExpression( classLoader );
+        result = resultUnit.getCompiledExpression( classLoader );
+        if ( reverseUnit != null ) {
+            reverse = reverseUnit.getCompiledExpression( classLoader );
+            prototype = reverseUnit.getFactory();
+        } else {
+            prototype = resultUnit.getFactory();
+        }      
+    }        
 
     /* (non-Javadoc)
      * @see org.drools.spi.Accumulator#createContext()

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELAction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -20,8 +20,12 @@
 public class MVELAction
     implements
     Action,
+    MVELCompileable,
     Externalizable {
     private static final long       serialVersionUID = 400L;
+    
+    private MVELCompilationUnit unit;
+    private String id;        
 
     private Serializable      expr;
     private DroolsMVELFactory prototype;
@@ -29,24 +33,33 @@
     public MVELAction() {
     }
 
-    public MVELAction(final Serializable expr,
-                      final DroolsMVELFactory factory) {
-        this.expr = expr;
-        this.prototype = factory;
-    }
+    public MVELAction(final MVELCompilationUnit unit,
+                              final String id) {
+        this.unit = unit;
+        this.id = id;
+    }    
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
+        id = in.readUTF();
+        unit = ( MVELCompilationUnit ) in.readObject();
+//        expr    = (Serializable)in.readObject();
+//        prototype   = (DroolsMVELFactory)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
+        out.writeUTF( id );
+        out.writeObject( unit );
+//        out.writeObject(expr);
+//        out.writeObject(prototype);
     }
+    
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    } 
 
     public String getDialect() {
-        return "mvel";
+        return id;
     }
     
     public void execute(final KnowledgeHelper knowledgeHelper, final WorkingMemory workingMemory, ProcessContext context) throws Exception {
@@ -63,7 +76,7 @@
         
         Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" );
         if ( pkg != null ) {
-            MVELDialectRuntimeData data = ( MVELDialectRuntimeData ) pkg.getDialectRuntimeRegistry().getDialectData( "mvel" );
+            MVELDialectRuntimeData data = ( MVELDialectRuntimeData ) pkg.getDialectRuntimeRegistry().getDialectData( id );
             factory.setNextFactory( data.getFunctionFactory() );
         }        
         

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompilationUnit.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,345 @@
+package org.drools.base.mvel;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ModifyInterceptor;
+import org.drools.rule.Declaration;
+import org.drools.spi.KnowledgeHelper;
+import org.mvel.Macro;
+import org.mvel.ParserContext;
+import org.mvel.compiler.AbstractParser;
+import org.mvel.compiler.ExpressionCompiler;
+
+public class MVELCompilationUnit
+    implements
+    Externalizable {
+    private String                          expression;
+
+    private String[]                        pkgImports;
+    private String[]                        importClasses;
+    private String[]                        importMethods;
+    private String[]                        importFields;
+    private String[]                        globalIdentifiers;
+
+    private Declaration[]                   previousDeclarations;
+    private Declaration[]                   localDeclarations;
+    private String[]                        otherIdentifiers;
+
+    private String[]                        inputIdentifiers;
+    private String[]                        inputTypes;
+
+    private String[]                        shadowIdentifiers;
+
+    private int                             languageLevel;
+    private boolean                         strictMode;
+
+    private Map<String, Class>              resolvedInputs;
+
+    private static Map                      interceptors  = new HashMap( 1 );
+    static {
+        interceptors.put( "Modify",
+                          new ModifyInterceptor() );
+    }
+
+    private static final Map<String, Class> primitivesMap = new HashMap<String, Class>();
+    static {
+        primitivesMap.put( "int",
+                           int.class );
+        primitivesMap.put( "boolean",
+                           boolean.class );
+        primitivesMap.put( "float",
+                           float.class );
+        primitivesMap.put( "long",
+                           long.class );
+        primitivesMap.put( "short",
+                           short.class );
+        primitivesMap.put( "byte",
+                           byte.class );
+        primitivesMap.put( "double",
+                           double.class );
+        primitivesMap.put( "char",
+                           char.class );
+    }
+
+    public static final Object              COMPILER_LOCK = new Object();
+
+    public MVELCompilationUnit() {
+    }
+
+    public MVELCompilationUnit(String expression,
+                               String[] pkgImports,
+                               String[] importClasses,
+                               String[] importMethods,
+                               String[] importFields,
+                               String[] globalIdentifiers,
+                               Declaration[] previousDeclarations,
+                               Declaration[] localDeclarations,
+                               String[] otherIdentifiers,
+                               String[] inputIdentifiers,
+                               String[] inputTypes,
+                               int languageLevel,
+                               boolean strictMode) {
+        this.expression = expression;
+
+        this.pkgImports = pkgImports;
+        this.importClasses = importClasses;
+        this.importMethods = importMethods;
+        this.importFields = importFields;
+        this.globalIdentifiers = globalIdentifiers;
+
+        this.previousDeclarations = previousDeclarations;
+        this.localDeclarations = localDeclarations;
+        this.otherIdentifiers = otherIdentifiers;
+
+        this.inputIdentifiers = inputIdentifiers;
+        this.inputTypes = inputTypes;
+
+        this.languageLevel = languageLevel;
+        this.strictMode = strictMode;
+    }
+
+    public void setShadowIdentifiers(String[] shadowIdentifiers) {
+        this.shadowIdentifiers = shadowIdentifiers;
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+
+        out.writeUTF( expression );
+
+        out.writeObject( pkgImports );
+        out.writeObject( importClasses );
+        out.writeObject( importMethods );
+        out.writeObject( importFields );
+        out.writeObject( globalIdentifiers );
+
+        out.writeObject( previousDeclarations );
+        out.writeObject( localDeclarations );
+        out.writeObject( otherIdentifiers );
+
+        out.writeObject( inputIdentifiers );
+        out.writeObject( inputTypes );
+
+        out.writeObject( shadowIdentifiers );
+
+        out.writeInt( languageLevel );
+        out.writeBoolean( strictMode );
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        expression = in.readUTF();
+
+        pkgImports = (String[]) in.readObject();
+        importClasses = (String[]) in.readObject();
+        importMethods = (String[]) in.readObject();
+        importFields = (String[]) in.readObject();
+        globalIdentifiers = (String[]) in.readObject();
+
+        previousDeclarations = (Declaration[]) in.readObject();
+        localDeclarations = (Declaration[]) in.readObject();
+        otherIdentifiers = (String[]) in.readObject();
+
+        inputIdentifiers = (String[]) in.readObject();
+        inputTypes = (String[]) in.readObject();
+
+        shadowIdentifiers = (String[]) in.readObject();
+
+        languageLevel = in.readInt();
+        strictMode = in.readBoolean();
+    }
+
+    public Serializable getCompiledExpression(ClassLoader classLoader) {
+        Map<String, Object> resolvedImports = new HashMap<String, Object>( importClasses.length + importMethods.length + importFields.length );
+        String lastName = null;
+        try {
+            for ( String name : importClasses ) {
+                lastName = name;
+                Class cls = loadClass( classLoader,
+                                       name );
+                resolvedImports.put( cls.getSimpleName(),
+                                     cls );
+            }
+
+            for ( String name : importMethods ) {
+                lastName = name;
+                int lastDot = name.lastIndexOf( '.' );
+                String className = name.substring( 0,
+                                                   lastDot );
+                Class cls = loadClass( classLoader,
+                                       className );
+
+                String methodName = name.substring( lastDot + 1 );
+                Method method = null;
+                for ( Method item : cls.getMethods() ) {
+                    if ( methodName.equals( item.getName() ) ) {
+                        method = item;
+                    }
+                }
+                resolvedImports.put( method.getName(),
+                                     method );
+            }
+
+            for ( String name : importFields ) {
+                int lastDot = name.lastIndexOf( '.' );
+                String className = name.substring( 0,
+                                                   lastDot );
+                Class cls = loadClass( classLoader,
+                                       className );
+
+                String fieldName = name.substring( lastDot + 1 );
+                Field field = cls.getField( fieldName );
+
+                resolvedImports.put( field.getName(),
+                                     field );
+            }
+        } catch ( ClassNotFoundException e ) {
+            e.printStackTrace();
+            throw new RuntimeDroolsException( "Unable to resolve import '" + lastName + "'" );
+        } catch ( SecurityException e ) {
+            e.printStackTrace();
+            throw new RuntimeDroolsException( "Unable to resolve import '" + lastName + "'" );
+        } catch ( NoSuchFieldException e ) {
+            e.printStackTrace();
+            throw new RuntimeDroolsException( "Unable to resolve import '" + lastName + "'" );
+        }
+
+        final ParserContext parserContext = new ParserContext( resolvedImports,
+                                                               null,
+                                                               "xxx" );// context.getPkg().getName()+"."+context.
+
+        for ( String pkgImport : this.pkgImports ) {
+            parserContext.addPackageImport( pkgImport );
+        }
+
+        parserContext.setInterceptors( interceptors );
+        parserContext.setStrictTypeEnforcement( strictMode );
+
+        resolvedInputs = new HashMap<String, Class>( inputIdentifiers.length );
+        String lastIdentifier = null;
+        String lastType = null;
+        try {
+            for ( int i = 0, length = inputIdentifiers.length; i < length; i++ ) {
+                lastIdentifier = inputIdentifiers[i];
+                lastType = inputTypes[i];
+                Class cls = loadClass( classLoader,
+                                       inputTypes[i] );
+                resolvedInputs.put( inputIdentifiers[i],
+                                    cls );
+                parserContext.addInput( inputIdentifiers[i],
+                                        cls );
+            }
+        } catch ( ClassNotFoundException e ) {
+            e.printStackTrace();
+            throw new RuntimeDroolsException( "Unable to resolve class '" + lastType + "' for identifier '" + lastIdentifier );
+        }
+
+        parserContext.addInput( "drools",
+                                KnowledgeHelper.class );
+
+        resolvedInputs.put( "drools",
+                            KnowledgeHelper.class );
+
+        return compile( expression,
+                        classLoader,
+                        parserContext,
+                        languageLevel );
+    }
+
+    public DroolsMVELFactory getFactory() {
+        Map<String, Class> resolvedGlobals = null;
+        if ( inputIdentifiers != null ) {
+            resolvedGlobals = new HashMap<String, Class>( inputIdentifiers.length );
+            for ( int i = 0, length = globalIdentifiers.length; i < length; i++ ) {
+                String identifier = globalIdentifiers[i];
+                resolvedGlobals.put( identifier,
+                                     resolvedInputs.get( identifier ) );
+            }
+        }
+
+        Map<String, Declaration> previousDeclarationsMap = null;
+        if ( previousDeclarations != null ) {
+            previousDeclarationsMap = new HashMap<String, Declaration>( previousDeclarations.length );
+            for ( Declaration declr : previousDeclarations ) {
+                previousDeclarationsMap.put( declr.getIdentifier(),
+                                             declr );
+            }
+        }
+
+        Map<String, Declaration> localDeclarationsMap = null;
+        if ( localDeclarations != null ) {
+            localDeclarationsMap = new HashMap<String, Declaration>( localDeclarations.length );
+            for ( Declaration declr : localDeclarations ) {
+                localDeclarationsMap.put( declr.getIdentifier(),
+                                          declr );
+            }
+        }
+
+        DroolsMVELFactory factory = null;
+        if ( shadowIdentifiers == null ) {
+
+            factory = new DroolsMVELFactory( previousDeclarationsMap,
+                                             localDeclarationsMap,
+                                             resolvedGlobals,
+                                             inputIdentifiers );
+        } else {
+            Set<String> set = new HashSet<String>( shadowIdentifiers.length );
+            for ( String string  : shadowIdentifiers ) {
+                set.add( string );
+            }
+            factory = new DroolsMVELShadowFactory( previousDeclarationsMap,
+                                                   localDeclarationsMap,
+                                                   resolvedGlobals,
+                                                   inputIdentifiers,
+                                                   set );
+        }
+
+        return factory;
+    }
+
+    public Serializable compile(final String text,
+                                final ClassLoader classLoader,
+                                final ParserContext parserContext,
+                                final int languageLevel) {
+        ExpressionCompiler compiler = new ExpressionCompiler( text.trim() );
+
+        if ( MVELDebugHandler.isDebugMode() ) {
+            compiler.setDebugSymbols( true );
+        }
+
+        synchronized ( COMPILER_LOCK ) {
+            ClassLoader tempClassLoader = Thread.currentThread().getContextClassLoader();
+
+            Thread.currentThread().setContextClassLoader( classLoader );
+
+            AbstractParser.setLanguageLevel( languageLevel );
+            Serializable expr = compiler.compile( parserContext );
+
+            Thread.currentThread().setContextClassLoader( tempClassLoader );
+
+            return expr;
+        }
+    }
+
+    private Class loadClass(ClassLoader classLoader,
+                            String className) throws ClassNotFoundException {
+        Class cls = primitivesMap.get( className );
+        if ( cls == null ) {
+            cls = classLoader.loadClass( className );
+        }
+        return cls;
+
+    }
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompileable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompileable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELCompileable.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,5 @@
+package org.drools.base.mvel;
+
+public interface MVELCompileable {    
+    public void compile(ClassLoader classLoader);
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELConsequence.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,6 +1,7 @@
 package org.drools.base.mvel;
 
 import org.drools.WorkingMemory;
+import org.drools.common.InternalRuleBase;
 import org.drools.rule.MVELDialectRuntimeData;
 import org.drools.rule.Package;
 import org.drools.spi.Consequence;
@@ -14,37 +15,48 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 
 public class MVELConsequence
     implements
     Consequence,
+    MVELCompileable,
     Externalizable {
     private static final long       serialVersionUID = 400L;
 
-    private Serializable      expr;
+    private MVELCompilationUnit unit;
+    private String id;    
+    
+    private Serializable expr;
     private DroolsMVELFactory prototype;
-    private String id;
+
     
     public MVELConsequence() {
     }    
 
-    public MVELConsequence(final Serializable expr,
-                           final DroolsMVELFactory factory,
+    public MVELConsequence(final MVELCompilationUnit unit,
                            final String id) {
-        this.expr = expr;
-        this.prototype = factory;
+        this.unit = unit;
         this.id = id;
     }
+    
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype    = (DroolsMVELFactory)in.readObject();
+        unit    = (MVELCompilationUnit)in.readObject();
+        id = in.readUTF();
     }
 
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
+    public void writeExternal(ObjectOutput out) throws IOException {        
+        out.writeObject(unit);        
+        out.writeUTF( id );
     }
+    
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    }
 
     public void evaluate(final KnowledgeHelper knowledgeHelper,
                          final WorkingMemory workingMemory) throws Exception {
@@ -71,7 +83,7 @@
         pkg = knowledgeHelper.getWorkingMemory().getRuleBase().getPackage( knowledgeHelper.getRule().getPackage() );
         
         ClassLoader tempClassLoader = Thread.currentThread().getContextClassLoader();
-        Thread.currentThread().setContextClassLoader( pkg.getPackageScopeClassLoader() );
+        Thread.currentThread().setContextClassLoader( ((InternalRuleBase) workingMemory.getRuleBase()).getRootClassLoader() );
 
         if ( MVELDebugHandler.isDebugMode() ) {
             if ( MVELDebugHandler.verbose ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEvalExpression.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -17,35 +17,46 @@
 public class MVELEvalExpression
     implements
     EvalExpression,
+    MVELCompileable,
     Externalizable  {
 
 
     private static final long       serialVersionUID = 400L;
 
+    private MVELCompilationUnit unit;
+    private String id;
+    
     private Serializable      expr;
     private DroolsMVELFactory prototype;
-    private String id;
 
+
     public MVELEvalExpression() {
     }
 
-    public MVELEvalExpression(final Serializable expr,
-                              final DroolsMVELFactory factory,
+    public MVELEvalExpression(final MVELCompilationUnit unit,
                               final String id) {
-        this.expr = expr;
-        this.prototype = factory;
+        this.unit = unit;
         this.id = id;
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
+        id = in.readUTF();
+        unit = ( MVELCompilationUnit ) in.readObject();
+//        expr    = (Serializable)in.readObject();
+//        prototype   = (DroolsMVELFactory)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
+        out.writeUTF( id );
+        out.writeObject( unit );
+//        out.writeObject(expr);
+//        out.writeObject(prototype);
     }
+    
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    }    
 
     public Object createContext() {
         return this.prototype.clone();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELPredicateExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELPredicateExpression.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELPredicateExpression.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,38 +8,44 @@
 import org.drools.spi.Tuple;
 import org.mvel.MVEL;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
 
-public class MVELPredicateExpression implements PredicateExpression {
+public class MVELPredicateExpression implements PredicateExpression, MVELCompileable, Externalizable {
     private static final long       serialVersionUID = 400L;
-
+    
+    private MVELCompilationUnit unit;
+    private String id;
+    
     private Serializable      expr;
     private DroolsMVELFactory prototype;
-    private String id;
 
     public MVELPredicateExpression() {
     }
 
-    public MVELPredicateExpression(final Serializable expr,
-                                   final DroolsMVELFactory factory,
+    public MVELPredicateExpression(final MVELCompilationUnit unit,
                                    final String id) {
-        this.expr = expr;
-        this.prototype = factory;
+        this.unit = unit;
         this.id = id;
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
+        id = in.readUTF();
+        unit = ( MVELCompilationUnit ) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
+        out.writeUTF( id );
+        out.writeObject( unit );
     }
+    
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    }      
 
     public Object createContext() {
         return this.prototype.clone();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueEvaluator.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -18,53 +18,65 @@
 public class MVELReturnValueEvaluator
     implements
     ReturnValueEvaluator,
+    MVELCompileable,
     Externalizable {
-    private static final long       serialVersionUID = 400L;
+    private static final long   serialVersionUID = 400L;
 
-    private Serializable      expr;
-    private DroolsMVELFactory prototype;
-    private String id;
+    private MVELCompilationUnit unit;
+    private String              id;
 
+    private Serializable        expr;
+    private DroolsMVELFactory   prototype;
+
     public MVELReturnValueEvaluator() {
     }
 
-    public MVELReturnValueEvaluator(final Serializable expr,
-                                    final DroolsMVELFactory factory,
+    public MVELReturnValueEvaluator(final MVELCompilationUnit unit,
                                     final String id) {
-        this.expr = expr;
-        this.prototype = factory;
+        this.unit = unit;
         this.id = id;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        id = in.readUTF();
+        unit = (MVELCompilationUnit) in.readObject();
+        //        expr    = (Serializable)in.readObject();
+        //        prototype   = (DroolsMVELFactory)in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
+        out.writeUTF( id );
+        out.writeObject( unit );
+        //        out.writeObject(expr);
+        //        out.writeObject(prototype);
     }
 
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory();
+    }
+
     public String getDialect() {
         return this.id;
     }
 
-    public Object evaluate(final WorkingMemory workingMemory, ProcessContext context) throws Exception {
+    public Object evaluate(final WorkingMemory workingMemory,
+                           ProcessContext context) throws Exception {
         DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
         factory.setContext( null,
                             null,
                             null,
                             workingMemory,
                             null );
-        
+
         // do we have any functions for this namespace?
         Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" );
         if ( pkg != null ) {
-            MVELDialectRuntimeData data = ( MVELDialectRuntimeData ) pkg.getDialectRuntimeRegistry().getDialectData( this.id );
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData( this.id );
             factory.setNextFactory( data.getFunctionFactory() );
         }
-        
+
         CompiledExpression compexpr = (CompiledExpression) this.expr;
 
         //Receive breakpoints from debugger

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueExpression.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELReturnValueExpression.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -18,24 +18,45 @@
 public class MVELReturnValueExpression
     implements
     ReturnValueExpression,
+    MVELCompileable,
     Externalizable  {
     private static final long       serialVersionUID = 400L;
 
+    private MVELCompilationUnit unit;
+    private String id;
+    
     private Serializable      expr;
     private DroolsMVELFactory prototype;
-    private String id;
     
     public MVELReturnValueExpression() {
     }
 
-    public MVELReturnValueExpression(final Serializable expr,
-                                     final DroolsMVELFactory factory,
-                                     final String id) {
-        this.expr = expr;
-        this.prototype = factory;
+    public MVELReturnValueExpression(final MVELCompilationUnit unit,
+                              final String id) {
+        this.unit = unit;
         this.id = id;
+    }    
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        id = in.readUTF();
+        unit = ( MVELCompilationUnit ) in.readObject();
+//        expr    = (Serializable)in.readObject();
+//        prototype   = (DroolsMVELFactory)in.readObject();
     }
 
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeUTF( id );
+        out.writeObject( unit );
+//        out.writeObject(expr);
+//        out.writeObject(prototype);
+    }
+    
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory( );
+    }     
+      
+
     public FieldValue evaluate(final Object object,
                                final Tuple tuple,
                                final Declaration[] previousDeclarations,
@@ -61,15 +82,6 @@
                                                                                    factory ) );
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        prototype   = (DroolsMVELFactory)in.readObject();
-    }
-
-    public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(prototype);
-    }
     public Object createContext() {
         return this.prototype.clone();
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -7,6 +7,8 @@
 import java.io.ObjectInput;
 
 import org.drools.WorkingMemory;
+import org.drools.rule.MVELDialectRuntimeData;
+import org.drools.rule.Package;
 import org.drools.spi.Salience;
 import org.drools.spi.Tuple;
 import org.mvel.MVEL;
@@ -14,32 +16,43 @@
 public class MVELSalienceExpression
     implements
     Salience,
+    MVELCompileable,
     Externalizable {
 
-    private static final long       serialVersionUID = 400L;
+    private static final long   serialVersionUID = 400L;
 
-    private Serializable      expr;
-    private DroolsMVELFactory factory;
+    private MVELCompilationUnit unit;
+    private String              id;
 
+    private Serializable        expr;
+    // @FIXME this factory is not threadsave for rulebases
+    private DroolsMVELFactory   factory;
+
     public MVELSalienceExpression() {
     }
 
-    public MVELSalienceExpression(final Serializable expr,
-                                  final DroolsMVELFactory factory) {
-        this.expr = expr;
-        this.factory = factory;
+    public MVELSalienceExpression(final MVELCompilationUnit unit,
+                                  final String id) {
+        this.unit = unit;
+        this.id = id;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expr    = (Serializable)in.readObject();
-        factory = (DroolsMVELFactory)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        unit = (MVELCompilationUnit) in.readObject();
+        id = in.readUTF();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expr);
-        out.writeObject(factory);
+        out.writeObject( unit );
+        out.writeUTF( id );
     }
 
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        factory = unit.getFactory();
+    }
+
     public int getValue(final Tuple tuple,
                         final WorkingMemory workingMemory) {
         this.factory.setContext( tuple,
@@ -47,8 +60,16 @@
                                  null,
                                  workingMemory,
                                  null );
+
+        // do we have any functions for this namespace?
+        Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" );
+        if ( pkg != null ) {
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData( this.id );
+            factory.setNextFactory( data.getFunctionFactory() );
+        }
+
         return ((Number) MVEL.executeExpression( this.expr,
-                                                  this.factory )).intValue();
+                                                 this.factory )).intValue();
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInput;
+import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -37,13 +38,15 @@
 import org.drools.PackageIntegrationException;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
+import org.drools.RuntimeDroolsException;
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.event.RuleBaseEventListener;
 import org.drools.event.RuleBaseEventSupport;
 import org.drools.marshalling.Marshaller;
 import org.drools.process.core.Process;
-import org.drools.rule.CompositePackageClassLoader;
+import org.drools.rule.CompositeClassLoader;
 import org.drools.rule.DialectRuntimeRegistry;
 import org.drools.rule.FactType;
 import org.drools.rule.Function;
@@ -83,10 +86,8 @@
 
     protected Map                                      agendaGroupRuleTotals;
 
-    protected transient CompositePackageClassLoader    packageClassLoader;
+    protected transient CompositeClassLoader           rootClassLoader;
 
-    protected transient MapBackedClassLoader           classLoader;
-
     /** The fact handle factory. */
     protected FactHandleFactory                        factHandleFactory;
 
@@ -118,6 +119,8 @@
 
     private List<RuleBasePartitionId>                  partitionIDs;
 
+    private ClassFieldAccessorCache classFieldAccessorCache;
+
     /**
      * Default constructor - for Externalizable. This should never be used by a user, as it
      * will result in an invalid state for the instance.
@@ -152,9 +155,7 @@
             this.agendaGroupRuleTotals = new HashMap();
         }
 
-        this.packageClassLoader = new CompositePackageClassLoader( this.config.getClassLoader() );
-        this.classLoader = new MapBackedClassLoader( this.config.getClassLoader() );
-        this.packageClassLoader.addClassLoader( this.classLoader );
+        this.rootClassLoader = new CompositeClassLoader( this.config.getClassLoader() );
         this.pkgs = new HashMap<String, Package>();
         this.processes = new HashMap();
         this.globals = new HashMap();
@@ -162,6 +163,8 @@
 
         this.classTypeDeclaration = new HashMap<Class< ? >, TypeDeclaration>();
         this.partitionIDs = new ArrayList<RuleBasePartitionId>();
+        
+        this.classFieldAccessorCache = new ClassFieldAccessorCache( this.rootClassLoader );
     }
 
     // ------------------------------------------------------------
@@ -186,27 +189,20 @@
             droolsStream = new DroolsObjectOutputStream( bytes );
         }
 
+        droolsStream.writeObject( this.config );
         droolsStream.writeObject( this.pkgs );
-        droolsStream.writeObject( this.config );
-        droolsStream.writeObject( this.classLoader.getStore() );
 
         // Rules must be restored by an ObjectInputStream that can resolve using a given ClassLoader to handle seaprately by storing as
         // a byte[]
         droolsStream.writeObject( this.id );
-        droolsStream.writeInt( workingMemoryCounter );
+        droolsStream.writeInt( this.workingMemoryCounter );
         droolsStream.writeObject( this.processes );
         droolsStream.writeObject( this.agendaGroupRuleTotals );
         droolsStream.writeUTF( this.factHandleFactory.getClass().getName() );
         droolsStream.writeObject( this.globals );
-        droolsStream.writeObject( reloadPackageCompilationData );
 
         this.eventSupport.removeEventListener( RuleBaseEventListener.class );
         droolsStream.writeObject( this.eventSupport );
-        droolsStream.writeObject( wms );
-        droolsStream.writeInt( lastAquiredLock );
-        droolsStream.writeObject( lock );
-        droolsStream.writeInt( additionsSinceLock );
-        droolsStream.writeInt( removalsSinceLock );
         if ( !isDrools ) {
             bytes.close();
             out.writeObject( bytes.toByteArray() );
@@ -228,34 +224,35 @@
         if ( isDrools ) {
             droolsStream = (DroolsObjectInput) in;
         } else {
-            byte[] bytes = (byte[]) in.readObject();
+            droolsStream = new DroolsObjectInputStream( (ObjectInputStream) in );
 
-            droolsStream = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ) );
         }
+
+        this.rootClassLoader = new CompositeClassLoader( droolsStream.getParentClassLoader() );
+        droolsStream.setClassLoader( this.rootClassLoader  );
+        droolsStream.setRuleBase( this );
+        
+        this.classFieldAccessorCache = new ClassFieldAccessorCache( this.rootClassLoader );
+        
+        this.config = (RuleBaseConfiguration) droolsStream.readObject();
+        this.config.setClassLoader( droolsStream.getParentClassLoader() );
+        
         this.pkgs = (Map) droolsStream.readObject();
-        this.config = (RuleBaseConfiguration) droolsStream.readObject();
 
-        Map store = (Map) droolsStream.readObject();
-        this.packageClassLoader = new CompositePackageClassLoader( droolsStream.getClassLoader() );
-        droolsStream.setClassLoader( packageClassLoader );
-        this.classLoader = new MapBackedClassLoader( this.packageClassLoader,
-                                                     store );
-        this.packageClassLoader.addClassLoader( this.classLoader );
 
         for ( final Object object : this.pkgs.values() ) {
-            this.packageClassLoader.addClassLoader( ((Package) object).getDialectRuntimeRegistry().getClassLoader() );
+            ((Package) object).getDialectRuntimeRegistry().onAdd( this.rootClassLoader );
         }
+        
         // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
         this.id = (String) droolsStream.readObject();
         this.workingMemoryCounter = droolsStream.readInt();
 
-        this.config.setClassLoader( droolsStream.getClassLoader() );
-
         this.processes = (Map) droolsStream.readObject();
         this.agendaGroupRuleTotals = (Map) droolsStream.readObject();
         Class cls = null;
         try {
-            cls = droolsStream.getClassLoader().loadClass( droolsStream.readUTF() );
+            cls = droolsStream.getParentClassLoader().loadClass( droolsStream.readUTF() );
             this.factHandleFactory = (FactHandleFactory) cls.newInstance();
         } catch ( InstantiationException e ) {
             DroolsObjectInputStream.newInvalidClassException( cls,
@@ -263,31 +260,32 @@
         } catch ( IllegalAccessException e ) {
             DroolsObjectInputStream.newInvalidClassException( cls,
                                                               e );
+        }                       
+        
+        for ( final Object object : this.pkgs.values() ) {
+            ((Package) object).getDialectRuntimeRegistry().onBeforeExecute( );
+            ((Package) object).getClassFieldAccessorStore().setClassFieldAccessorCache( this.classFieldAccessorCache );
+            ((Package) object).getClassFieldAccessorStore().wire();
         }
-        this.globals = (Map) droolsStream.readObject();
-        this.reloadPackageCompilationData = (ReloadPackageCompilationData) droolsStream.readObject();
-
+        
+        this.populateTypeDeclarationMaps(); 
+        
+        this.globals = (Map) droolsStream.readObject();                       
+        
         this.eventSupport = (RuleBaseEventSupport) droolsStream.readObject();
         this.eventSupport.setRuleBase( this );
         this.statefulSessions = new ObjectHashSet();
 
-        wms = (InternalWorkingMemory[]) droolsStream.readObject();
-        lastAquiredLock = droolsStream.readInt();
-        lock = (ReentrantLock) droolsStream.readObject();
-        additionsSinceLock = droolsStream.readInt();
-        removalsSinceLock = droolsStream.readInt();
-
         if ( !isDrools ) {
             droolsStream.close();
-        }
-
-        this.populateTypeDeclarationMaps();
+        }                      
     }
 
-    private void populateTypeDeclarationMaps() {
+    private void populateTypeDeclarationMaps() throws ClassNotFoundException {
         this.classTypeDeclaration = new HashMap<Class< ? >, TypeDeclaration>();
         for ( Package pkg : this.pkgs.values() ) {
             for ( TypeDeclaration type : pkg.getTypeDeclarations().values() ) {
+                type.setTypeClass( this.rootClassLoader.loadClass( pkg.getName() + "." + type.getTypeName() ) );
                 this.classTypeDeclaration.put( type.getTypeClass(),
                                                type );
             }
@@ -445,33 +443,49 @@
             //            }
 
             if ( pkg == null ) {
-                pkg = new Package( newPkg.getName(),
-                                   newPkg.getPackageScopeClassLoader() );
+                pkg = new Package( newPkg.getName() );
+                
+                // @TODO we really should have a single root cache
+                pkg.setClassFieldAccessorCache( this.classFieldAccessorCache );
                 pkgs.put( pkg.getName(),
                           pkg );
-                this.packageClassLoader.addClassLoader( pkg.getDialectRuntimeRegistry().getClassLoader() );
-            } else {
-                pkg.getPackageScopeClassLoader().getStore().putAll( newPkg.getPackageScopeClassLoader().getStore() );
-                this.packageClassLoader.addClassLoader( newPkg.getDialectRuntimeRegistry().getClassLoader() );
-            }
+            }       
+            
+            // first merge anything related to classloader re-wiring
+            pkg.getDialectRuntimeRegistry().merge( newPkg.getDialectRuntimeRegistry(), this.rootClassLoader );
+            if ( newPkg.getFunctions() != null ) {
+                for ( Map.Entry<String, Function> entry : newPkg.getFunctions().entrySet() ) {
+                    pkg.addFunction( entry.getValue() );
+                }
+            }            
+            pkg.getClassFieldAccessorStore().merge( newPkg.getClassFieldAccessorStore() );
+            pkg.getDialectRuntimeRegistry().onBeforeExecute();
+            
+            // we have to do this before the merging, as it does some classloader resolving
+            TypeDeclaration lastType = null;
+            try {
+                // Add the type declarations to the RuleBase
+                if ( newPkg.getTypeDeclarations() != null ) {
+                    // add type declarations
+                    for ( TypeDeclaration type : newPkg.getTypeDeclarations().values() ) {
+                        lastType = type;
+                        type.setTypeClass( this.rootClassLoader.loadClass( pkg.getName() + "." + type.getTypeName() ) );
+                        // @TODO should we allow overrides? only if the class is not in use.
+                        if ( !this.classTypeDeclaration.containsKey( type.getTypeClass() ) ) {
+                            // add to rulebase list of type declarations                        
+                            this.classTypeDeclaration.put( type.getTypeClass(),
+                                                           type );
+                        }
+                    }
+                }
+            } catch ( ClassNotFoundException e ) {
+                throw new RuntimeDroolsException( "unable to resolve Type Declaration class '" + lastType.getTypeName() );            
+            }            
 
             // now merge the new package into the existing one
             mergePackage( pkg,
                           newPkg );
 
-            // Add the type declarations to the RuleBase
-            if ( newPkg.getTypeDeclarations() != null ) {
-                // add type declarations
-                for ( TypeDeclaration type : newPkg.getTypeDeclarations().values() ) {
-                    // @TODO should we allow overrides? only if the class is not in use.
-                    if ( !this.classTypeDeclaration.containsKey( type.getTypeClass() ) ) {
-                        // add to rulebase list of type declarations                        
-                        this.classTypeDeclaration.put( type.getTypeClass(),
-                                                       type );
-                    }
-                }
-            }
-
             // add the rules to the RuleBase
             final Rule[] rules = newPkg.getRules();
             for ( int i = 0; i < rules.length; ++i ) {
@@ -511,23 +525,29 @@
         final Map<String, ImportDeclaration> imports = pkg.getImports();
         imports.putAll( newPkg.getImports() );
 
-        // merge globals
-        if ( newPkg.getGlobals() != null && newPkg.getGlobals() != Collections.EMPTY_MAP ) {
-            Map<String, Class> globals = pkg.getGlobals();
-            // Add globals
-            for ( final Map.Entry<String, Class> entry : newPkg.getGlobals().entrySet() ) {
-                final String identifier = entry.getKey();
-                final Class type = entry.getValue();
-                if ( globals.containsKey( identifier ) && !globals.get( identifier ).equals( type ) ) {
-                    throw new PackageIntegrationException( pkg );
-                } else {
-                    pkg.addGlobal( identifier,
-                                   type );
-                    // this isn't a package merge, it's adding to the rulebase, but I've put it here for convienience
-                    this.globals.put( identifier,
-                                      type );
+        String lastType = null;
+        try {
+            // merge globals
+            if ( newPkg.getGlobals() != null && newPkg.getGlobals() != Collections.EMPTY_MAP ) {
+                Map<String, String> globals = pkg.getGlobals();
+                // Add globals
+                for ( final Map.Entry<String, String> entry : newPkg.getGlobals().entrySet() ) {
+                    final String identifier = entry.getKey();
+                    final String type = entry.getValue();
+                    lastType = type;
+                    if ( globals.containsKey( identifier ) && !globals.get( identifier ).equals( type ) ) {
+                        throw new PackageIntegrationException( pkg );
+                    } else {
+                        pkg.addGlobal( identifier,
+                                       this.rootClassLoader.loadClass( type ) );
+                        // this isn't a package merge, it's adding to the rulebase, but I've put it here for convienience
+                        this.globals.put( identifier,
+                                          this.rootClassLoader.loadClass( type ) );
+                    }
                 }
             }
+        } catch ( ClassNotFoundException e ) {
+            throw new RuntimeDroolsException( "Unable to resolve class '" + lastType + "'" );
         }
 
         // merge the type declarations
@@ -542,9 +562,6 @@
             }
         }
 
-        // merge the contents of the MapBackedClassloader, that is the root of the dialect registry's composite classloader.
-        pkg.getPackageScopeClassLoader().getStore().putAll( newPkg.getPackageScopeClassLoader().getStore() );
-
         //Merge rules into the RuleBase package
         //as this is needed for individual rule removal later on
         final Rule[] newRules = newPkg.getRules();
@@ -567,22 +584,14 @@
                 final Process flow = (Process) iter.next();
                 pkg.addProcess( flow );
             }
-        }
-
-        pkg.getDialectRuntimeRegistry().merge( newPkg.getDialectRuntimeRegistry() );
-
-        if ( newPkg.getFunctions() != null ) {
-            for ( Map.Entry<String, Function> entry : newPkg.getFunctions().entrySet() ) {
-                pkg.addFunction( entry.getValue() );
-            }
-        }
-
-        // this handles re-wiring any dirty Packages, it's done lazily to allow incremental 
-        // additions without incurring the repeated cost.
-        if ( this.reloadPackageCompilationData == null ) {
-            this.reloadPackageCompilationData = new ReloadPackageCompilationData();
-        }
-        this.reloadPackageCompilationData.addDialectDatas( pkg.getDialectRuntimeRegistry() );
+        }     
+        
+//        // this handles re-wiring any dirty Packages, it's done lazily to allow incremental 
+//        // additions without incurring the repeated cost.
+//        if ( this.reloadPackageCompilationData == null ) {
+//            this.reloadPackageCompilationData = new ReloadPackageCompilationData();
+//        }
+//        this.reloadPackageCompilationData.addDialectDatas( pkg.getDialectRuntimeRegistry() );
     }
 
     public TypeDeclaration getTypeDeclaration(Class< ? > clazz) {
@@ -593,9 +602,9 @@
                                      final Rule rule) throws InvalidPatternException {
         this.eventSupport.fireBeforeRuleAdded( pkg,
                                                rule );
-        if ( !rule.isValid() ) {
-            throw new IllegalArgumentException( "The rule called " + rule.getName() + " is not valid. Check for compile errors reported." );
-        }
+//        if ( !rule.isValid() ) {
+//            throw new IllegalArgumentException( "The rule called " + rule.getName() + " is not valid. Check for compile errors reported." );
+//        }
         addRule( rule );
         this.eventSupport.fireAfterRuleAdded( pkg,
                                               rule );
@@ -628,8 +637,6 @@
                                 rules[i] );
                 }
 
-                this.packageClassLoader.removeClassLoader( pkg.getDialectRuntimeRegistry().getClassLoader() );
-
                 // getting the list of referenced globals
                 final Set referencedGlobals = new HashSet();
                 for ( final Iterator it = this.pkgs.values().iterator(); it.hasNext(); ) {
@@ -652,6 +659,8 @@
                 }
                 // removing the package itself from the list
                 this.pkgs.remove( pkg.getName() );
+                
+                pkg.getDialectRuntimeRegistry().onRemove();
 
                 //clear all members of the pkg
                 pkg.clear();
@@ -783,20 +792,10 @@
         return this.config;
     }
 
-    public void addClass(final String className,
-                         final byte[] bytes) {
-        this.classLoader.addClass( className,
-                                   bytes );
+    public CompositeClassLoader getRootClassLoader() {
+        return this.rootClassLoader;
     }
 
-    public CompositePackageClassLoader getCompositePackageClassLoader() {
-        return this.packageClassLoader;
-    }
-
-    public MapBackedClassLoader getMapBackedClassLoader() {
-        return this.classLoader;
-    }
-
     public void executeQueuedActions() {
         synchronized ( this.pkgs ) {
             if ( this.reloadPackageCompilationData != null ) {
@@ -874,7 +873,7 @@
 
         public void execute(final InternalRuleBase ruleBase) {
             for ( final DialectRuntimeRegistry registry : this.set ) {
-                registry.reloadDirty();
+                registry.onBeforeExecute();
             }
         }
     }
@@ -884,4 +883,8 @@
         Externalizable {
         public void execute(InternalRuleBase ruleBase);
     }
+    
+    public ClassFieldAccessorCache getClassFieldAccessorCache() { 
+        return this.classFieldAccessorCache;
+    }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInput.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,26 +1,20 @@
 package org.drools.common;
 
-import org.drools.rule.*;
-import org.drools.rule.Package;
-import org.drools.base.ClassFieldAccessorCache;
-
 import java.io.ObjectInput;
 
-/**
- * Created by IntelliJ IDEA. User: SG0521861 Date: Mar 4, 2008 Time: 7:24:07 AM To change this template use File |
- * Settings | File Templates.
- */
+import org.drools.rule.Package;
+
 public interface DroolsObjectInput extends ObjectInput {
-    ClassLoader getClassLoader();
+    ClassLoader getParentClassLoader(); 
+    ClassLoader getClassLoader(); 
     void setClassLoader(ClassLoader classLoader);
-    InternalRuleBase getRuleBase();
+    
+    InternalRuleBase getRuleBase();    
     void setRuleBase(InternalRuleBase ruleBase);
+    
     void setWorkingMemory(InternalWorkingMemory workingMemory);
     InternalWorkingMemory getWorkingMemory();
+    
     Package getPackage();
     void setPackage(Package pkg);
-    DialectRuntimeRegistry getDialectRuntimeRegistry();
-    void setDialectRuntimeRegistry(DialectRuntimeRegistry dialectDatas);
-    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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectInputStream.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,13 +26,11 @@
 import org.drools.rule.DialectRuntimeRegistry;
 import org.drools.rule.Package;
 
-public class DroolsObjectInputStream
-        implements DroolsObjectInput, DroolsObjectStreamConstants {
-
-    private final Map<Integer, Object> objectsByHandle = new HashMap<Integer, Object>();
-    private DroolsObjectInput dataInput;
-
-    private static final Map<String, Class>     primClasses = new HashMap<String, Class>( 8, 1.0F );
+public class DroolsObjectInputStream extends ObjectInputStream
+    implements
+    DroolsObjectInput {
+    private static final Map<String, Class> primClasses = new HashMap<String, Class>( 8,
+                                                                                      1.0F );
     static {
         primClasses.put( "boolean",
                          boolean.class );
@@ -54,486 +52,107 @@
                          void.class );
     }
 
-    private ClassLoader classLoader;
-    private InternalRuleBase         ruleBase;
-    private InternalWorkingMemory    workingMemory;
-    private Package                  pkg;
-    private DialectRuntimeRegistry             dialectRegistry;
-    private ClassFieldAccessorCache extractorFactory;
+    private ClassLoader                     parentClassLoader;
+    private ClassLoader                     classLoader;
+    private InternalRuleBase                ruleBase;
+    private InternalWorkingMemory           workingMemory;
+    private Package                         pkg;
 
-    /**
-     * Created this inner class to handle un-Externalizable objects just in case.
-     */
-    private class DroolsInternalInputStream
-            extends ObjectInputStream
-            implements DroolsObjectInput {
+    public DroolsObjectInputStream(InputStream inputStream) throws IOException {
+        this( inputStream,
+              null );
+    }
 
-        private DroolsInternalInputStream(InputStream in, ClassLoader classLoader) throws IOException {
-            super(in);
-            setClassLoader(classLoader);
+    public DroolsObjectInputStream(InputStream inputStream,
+                                   ClassLoader classLoader) throws IOException {
+        super( inputStream );
+        if ( classLoader == null ) {
+            classLoader = Thread.currentThread().getContextClassLoader();
+            if ( classLoader == null ) {
+                classLoader = getClass().getClassLoader();
+            }
         }
 
-        public ClassLoader getClassLoader() {
-            return DroolsObjectInputStream.this.getClassLoader();
-        }
+        this.classLoader = classLoader;
+        this.parentClassLoader = classLoader;
 
-        public void setClassLoader(ClassLoader classLoader) {
-            DroolsObjectInputStream.this.setClassLoader(classLoader);
-        }
+    }
 
-        public InternalRuleBase getRuleBase() {
-            return DroolsObjectInputStream.this.getRuleBase();
-        }
-        public void setRuleBase(InternalRuleBase ruleBase) {
-            DroolsObjectInputStream.this.setRuleBase(ruleBase);
-        }
-
-        public InternalWorkingMemory getWorkingMemory() {
-            return DroolsObjectInputStream.this.getWorkingMemory();
-        }
-        public void setWorkingMemory(InternalWorkingMemory workingMemory) {
-            DroolsObjectInputStream.this.setWorkingMemory(workingMemory);
-        }
-
-        public Package getPackage() {
-            return DroolsObjectInputStream.this.getPackage();
-        }
-        public void setPackage(Package pkg) {
-            DroolsObjectInputStream.this.setPackage(pkg);
-        }
-
-        public DialectRuntimeRegistry getDialectRuntimeRegistry() {
-            return DroolsObjectInputStream.this.getDialectRuntimeRegistry();
-        }
-        public void setDialectRuntimeRegistry(DialectRuntimeRegistry dialectRuntimeRegistry) {
-            DroolsObjectInputStream.this.setDialectRuntimeRegistry(dialectRuntimeRegistry);
-        }
-
-        public ClassFieldAccessorCache getExtractorFactory() {
-            return DroolsObjectInputStream.this.getExtractorFactory();
-        }
-
-        public void setExtractorFactory(ClassFieldAccessorCache extractorFactory) {
-            DroolsObjectInputStream.this.setExtractorFactory(extractorFactory);
-        }
-
-        protected Class resolveClass(ObjectStreamClass desc) throws IOException,
-                                                                    ClassNotFoundException {
-            if ( getClassLoader() == null ) {
-                return super.resolveClass( desc );
-            } else {
-                try {
-                    return DroolsObjectInputStream.this.resolveClass(desc.getName());
-                }
-                catch (ClassNotFoundException cnf) {
-                    return  super.resolveClass( desc );
-                }
+    protected Class resolveClass(String className) throws ClassNotFoundException {
+        try {
+            Class clazz = primClasses.get( className );
+            if ( clazz == null ) {
+                clazz = Class.forName( className,
+                                       true,
+                                       this.classLoader );
             }
+            return clazz;
+        } catch ( ClassNotFoundException e ) {
+            throw e;
         }
     }
 
-    public DroolsObjectInputStream(InputStream inputStream) throws IOException {
-        this(inputStream, null);
+    protected Class< ? > resolveClass(ObjectStreamClass desc) throws IOException,
+                                                             ClassNotFoundException {
+        return resolveClass( desc.getName() );
     }
 
-    public DroolsObjectInputStream(InputStream inputStream, ClassLoader classLoader) throws IOException {
-        dataInput    = new DroolsInternalInputStream(inputStream, classLoader);
-        extractorFactory = ClassFieldAccessorCache.getInstance();
-        readStreamHeader();
+    public static InvalidClassException newInvalidClassException(Class clazz,
+                                                                 Throwable cause) {
+        InvalidClassException exception = new InvalidClassException( clazz.getName() );
+        exception.initCause( cause );
+        return exception;
     }
 
-    public DroolsObjectInputStream(ObjectInput inputStream) throws IOException {
-        this(inputStream, null);
+    public ClassLoader getClassLoader() {
+        return this.classLoader;
     }
 
-    public DroolsObjectInputStream(ObjectInput inputStream, ClassLoader classLoader) throws IOException {
-        this((InputStream)inputStream, classLoader);
-    }
-
     public InternalRuleBase getRuleBase() {
         return ruleBase;
     }
+
     public void setRuleBase(InternalRuleBase ruleBase) {
-        this.ruleBase   = ruleBase;
+        this.ruleBase = ruleBase;
+        this.classLoader = this.ruleBase.getRootClassLoader();
     }
 
     public InternalWorkingMemory getWorkingMemory() {
         return workingMemory;
     }
+
     public void setWorkingMemory(InternalWorkingMemory workingMemory) {
-        this.workingMemory  = workingMemory;
+        this.workingMemory = workingMemory;
     }
 
     public Package getPackage() {
         return pkg;
     }
+
     public void setPackage(Package pkg) {
-        this.pkg    = pkg;
+        this.pkg = pkg;
     }
 
-    public DialectRuntimeRegistry getDialectRuntimeRegistry() {
-        return this.dialectRegistry;
-    }
-    public void setDialectRuntimeRegistry(DialectRuntimeRegistry dialectRegistry) {
-        this.dialectRegistry   = dialectRegistry;
-    }
+    //    public ClassFieldAccessorCache getExtractorFactory() {
+    //        return extractorFactory;
+    //    }
+    //
+    //    public void setExtractorFactory(ClassFieldAccessorCache extractorFactory) {
+    //        this.extractorFactory = extractorFactory;
+    //    }
 
-    public ClassFieldAccessorCache getExtractorFactory() {
-        return extractorFactory;
-    }
-
-    public void setExtractorFactory(ClassFieldAccessorCache extractorFactory) {
-        this.extractorFactory   = extractorFactory;
-    }
-
-    public ClassLoader getClassLoader() {
+    public ClassLoader getParentClassLoader() {
         return classLoader;
     }
 
     public void setClassLoader(ClassLoader classLoader) {
-        if (classLoader == null) {
+        if ( classLoader == null ) {
             classLoader = Thread.currentThread().getContextClassLoader();
             if ( classLoader == null ) {
                 classLoader = getClass().getClassLoader();
             }
         }
-        this.classLoader    = classLoader;
+        this.classLoader = classLoader;
     }
 
-    protected void readStreamHeader() throws IOException {
-        int magic   = readInt();
-        short version = readShort();
-        if (magic != STREAM_MAGIC || version != STREAM_VERSION) {
-            throw new StreamCorruptedException("Invalid stream header: "+magic+'|'+version);
-        }
-    }
-
-    public Object readObject() throws ClassNotFoundException, IOException {
-        byte type = readRecordType();
-
-        switch (type) {
-            case RT_REFERENCE:
-                return objectsByHandle.get(dataInput.readInt());
-            case RT_NULL:
-                return null;
-            case RT_EXTERNALIZABLE: {
-                int handle = dataInput.readInt();
-                Class clazz = (Class) readObject();
-                Externalizable externalizable;
-                try {
-                    externalizable = (Externalizable) clazz.newInstance();
-                } catch (InstantiationException e) {
-                    throw newInvalidClassException(clazz, e);
-                } catch (IllegalAccessException e) {
-                    throw newInvalidClassException(clazz, e);
-                }
-                registerObject(handle, externalizable);
-                externalizable.readExternal(this);
-                return externalizable;
-            }
-            case RT_MAP: {
-                int handle = dataInput.readInt();
-                Class clazz = (Class) readObject();
-                int size = dataInput.readInt();
-                Map<Object, Object> map = (Map<Object, Object>) newCollection(handle, clazz, size);
-                while (size-- > 0) {
-                    Object key = readObject();
-                    Object value = readObject();
-                    map.put(key, value);
-                }
-                return map;
-            }
-            case RT_ARRAY: {
-                int handle = dataInput.readInt();
-                Class clazz = (Class) readObject();
-                int length = dataInput.readInt();
-                Class componentType = clazz.getComponentType();
-                Object array = Array.newInstance(componentType, length);
-                registerObject(handle, array);
-                if (componentType.isPrimitive()) {
-                    readPrimitiveArray(array, length, componentType);
-                } else {
-                    Object[] objects    = (Object[])array;
-                    for (int i = 0; i < length; ++i) {
-                        objects[i] = readObject();
-                    }
-                }
-                return array;
-            }
-            case RT_COLLECTION: {
-                int handle = dataInput.readInt();
-                Class clazz = (Class) readObject();
-                int size = dataInput.readInt();
-                Collection<Object> collection = (Collection<Object>) newCollection(handle, clazz, size);
-                while (size-- > 0) {
-                    collection.add(readObject());
-                }
-                return collection;
-            }
-            case RT_STRING:
-                return readString(dataInput.readInt());
-            case RT_CLASS:
-                return readClass(dataInput.readInt());
-            case RT_EMPTY_SET:
-                return readEmptySet();
-            case RT_EMPTY_LIST:
-                return readEmptyList();
-            case RT_EMPTY_MAP:
-                return readEmptyMap();
-            default:
-                int handle = dataInput.readInt();
-
-                switch (type) {
-                    case RT_ATOMICREFERENCEARRAY: {
-                        int length  = dataInput.readInt();
-                        AtomicReferenceArray<Object>    array   = new AtomicReferenceArray<Object>(length);
-                        registerObject(handle, array);
-                        for (int i = 0; i < length; ++i) {
-                            array.set(i, readObject());
-                        }
-                        return array;
-                    }
-                    case RT_SERIALIZABLE: {
-                        Object  object  =  dataInput.readObject();
-                        registerObject(handle, object);
-                        return object;
-                    }
-                    default:
-                        throw new StreamCorruptedException("Unsupported object type: " + type);
-                }
-        }
-    }
-
-    private void readPrimitiveArray(Object array, int length, Class clazz) throws IOException {
-        if (clazz == Integer.TYPE) {
-            readIntArray((int[]) array, length);
-        } else if (clazz == Byte.TYPE) {
-            readByteArray((byte[]) array, length);
-        } else if (clazz == Long.TYPE) {
-            readLongArray((long[]) array, length);
-        } else if (clazz == Float.TYPE) {
-            readFloatArray((float[]) array, length);
-        } else if (clazz == Double.TYPE) {
-            readDoubleArray((double[]) array, length);
-        } else if (clazz == Short.TYPE) {
-            readShortArray((short[]) array, length);
-        } else if (clazz == Character.TYPE) {
-            readCharArray((char[]) array, length);
-        } else if (clazz == Boolean.TYPE) {
-            readBooleanArray((boolean[]) array, length);
-        } else {
-            throw new StreamCorruptedException("Unsupported array type: " + clazz);
-        }
-    }
-
-    private void readIntArray(int[] ints, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            ints[i] = dataInput.readInt();
-        }
-    }
-
-    private void readByteArray(byte[] bytes, int length) throws IOException {
-        dataInput.readFully(bytes, 0, length);
-    }
-
-    private void readLongArray(long[] longs, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            longs[i] = dataInput.readLong();
-        }
-    }
-
-    private void readFloatArray(float[] floats, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            floats[i] = dataInput.readFloat();
-        }
-    }
-
-    private void readDoubleArray(double[] doubles, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            doubles[i] = dataInput.readDouble();
-        }
-    }
-
-    private void readShortArray(short[] shorts, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            shorts[i] = dataInput.readShort();
-        }
-    }
-
-    private void readCharArray(char[] chars, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            chars[i] = dataInput.readChar();
-        }
-    }
-
-    private void readBooleanArray(boolean[] booleans, int length) throws IOException {
-        for (int i = 0; i < length; ++i) {
-            booleans[i] = dataInput.readBoolean();
-        }
-    }
-
-    private static Set readEmptySet() {
-        return Collections.EMPTY_SET;
-    }
-
-    private static List readEmptyList() {
-        return Collections.EMPTY_LIST;
-    }
-
-    private static Map readEmptyMap() {
-        return Collections.EMPTY_MAP;
-    }
-
-    private String readString(int handle) throws IOException {
-        String string = dataInput.readUTF();
-        registerObject(handle, string);
-        return string;
-    }
-
-    private Object newCollection(int handle, Class clazz, int size) throws IOException {
-        Object collection;
-        try {
-            Constructor constructor = clazz.getConstructor(Integer.TYPE);
-            collection = constructor.newInstance(size);
-        } catch (InstantiationException e) {
-            throw newInvalidClassException(clazz, e);
-        } catch (IllegalAccessException e) {
-            throw newInvalidClassException(clazz, e);
-        } catch (InvocationTargetException e) {
-            throw newInvalidClassException(clazz, e);
-        } catch (NoSuchMethodException e) {
-            try {
-                Constructor constructor = clazz.getConstructor();
-                collection  = constructor.newInstance();
-            } catch (Exception e2) {
-                throw newInvalidClassException(clazz, e2);
-            }
-        }
-        registerObject(handle, collection);
-        return collection;
-    }
-
-    private Class readClass(int handle) throws IOException, ClassNotFoundException {
-        String className = (String) readObject();
-        Class clazz = resolveClass(className);
-        registerObject(handle, clazz);
-        return clazz;
-    }
-
-    private byte readRecordType() throws IOException {
-        return dataInput.readByte();
-    }
-
-    private void registerObject(int handle, Object object) {
-        objectsByHandle.put(handle, object);
-    }
-
-    public static InvalidClassException newInvalidClassException(Class clazz, Throwable cause) {
-        InvalidClassException exception = new InvalidClassException(clazz.getName());
-        exception.initCause(cause);
-        return exception;
-    }
-
-    protected Class resolveClass(String className) throws ClassNotFoundException{
-        try {
-            Class clazz = primClasses.get( className );
-            if ( clazz == null ) {
-                clazz = Class.forName(className, true, getClassLoader());
-                if (clazz == null) {
-                  clazz = Class.forName(className, true, getClass().getClassLoader());
-                }
-            }
-            return clazz;
-        }
-        catch (ClassNotFoundException e) {
-            return Class.forName(className, true, getClass().getClassLoader());
-        }
-    }
-
-    /*=================================================================================
-    ObjectInput implementations
-    =================================================================================*/
-    public int read() throws IOException {
-        return dataInput.read();
-    }
-
-    public int read(byte b[]) throws IOException {
-        return dataInput.read(b);
-    }
-
-    public int read(byte b[], int off, int len) throws IOException {
-        return dataInput.read(b, off, len);
-    }
-
-    public long skip(long n) throws IOException {
-        return dataInput.skip(n);
-    }
-
-    public int available() throws IOException {
-        return dataInput.available();
-    }
-
-    public void close() throws IOException {
-        dataInput.close();
-    }
-
-    public void readFully(byte b[]) throws IOException {
-        dataInput.readFully(b);
-    }
-
-    public void readFully(byte b[], int off, int len) throws IOException {
-        dataInput.readFully(b, off, len);
-    }
-
-    public int skipBytes(int n) throws IOException {
-        return dataInput.skipBytes(n);
-    }
-
-    public boolean readBoolean() throws IOException {
-        return dataInput.readBoolean();
-    }
-
-    public byte readByte() throws IOException {
-        return dataInput.readByte();
-    }
-
-    public int readUnsignedByte() throws IOException {
-        return dataInput.readUnsignedByte();
-    }
-
-    public short readShort() throws IOException {
-        return dataInput.readShort();
-    }
-
-    public int readUnsignedShort() throws IOException {
-        return dataInput.readUnsignedShort();
-    }
-
-    public char readChar() throws IOException {
-        return dataInput.readChar();
-    }
-
-    public int readInt() throws IOException {
-        return dataInput.readInt();
-    }
-
-    public long readLong() throws IOException {
-        return dataInput.readLong();
-    }
-
-    public float readFloat() throws IOException {
-        return dataInput.readFloat();
-    }
-
-    public double readDouble() throws IOException {
-        return dataInput.readDouble();
-    }
-
-    public String readLine() throws IOException {
-        return dataInput.readLine();
-    }
-
-    public String readUTF() throws IOException {
-        return dataInput.readUTF();
-    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DroolsObjectOutputStream.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,290 +16,8 @@
 /**
  *
  */
-public class DroolsObjectOutputStream implements ObjectOutput, DroolsObjectStreamConstants {
-    private static final Class EMPTY_SET_CLASS = Collections.EMPTY_SET.getClass();
-    private static final Class EMPTY_MAP_CLASS = Collections.EMPTY_MAP.getClass();
-    private static final Class EMPTY_LIST_CLASS = Collections.EMPTY_LIST.getClass();
-
-    private final Map<Object, Integer> handlesByObject = new IdentityHashMap<Object, Integer>();
-    private final ObjectOutput    dataOutput;
-
-    public DroolsObjectOutputStream(OutputStream outputStream) throws IOException {
-        this((ObjectOutput)new ObjectOutputStream(outputStream));
+public class DroolsObjectOutputStream extends ObjectOutputStream {
+    public DroolsObjectOutputStream(OutputStream out) throws IOException {
+        super(out);
     }
-    public DroolsObjectOutputStream(ObjectOutput dataOutput) throws IOException {
-        this.dataOutput   = dataOutput;
-        writeStreamHeader();
-    }
-
-    private void writePrimitiveArray(Object array, Class clazz) throws IOException {
-        if (clazz == Integer.TYPE) {
-            writeIntArray(array);
-        } else if (clazz == Byte.TYPE) {
-            writeByteArray(array);
-        } else if (clazz == Long.TYPE) {
-            writeLongArray(array);
-        } else if (clazz == Float.TYPE) {
-            writeFloatArray(array);
-        } else if (clazz == Double.TYPE) {
-            writeDoubleArray(array);
-        } else if (clazz == Short.TYPE) {
-            writeShortArray(array);
-        } else if (clazz == Character.TYPE) {
-            writeCharArray(array);
-        } else if (clazz == Boolean.TYPE) {
-            writeBooleanArray(array);
-        } else {
-            throw new NotSerializableException("Unsupported array type: " + clazz);
-        }
-    }
-
-    private void writeIntArray(Object array) throws IOException {
-        int[] ints = (int[]) array;
-        int length = ints.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            dataOutput.writeInt(ints[i]);
-        }
-    }
-
-    private void writeByteArray(Object array) throws IOException {
-        byte[] bytes = (byte[]) array;
-        int length = bytes.length;
-        dataOutput.writeInt(length);
-        write(bytes, 0, length);
-    }
-
-    private void writeLongArray(Object array) throws IOException {
-        long[] longs = (long[]) array;
-        int length = longs.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeLong(longs[i]);
-        }
-    }
-
-    private void writeFloatArray(Object array) throws IOException {
-        float[] floats = (float[]) array;
-        int length = floats.length;
-        writeFloat(length);
-        for (int i = 0; i < length; ++i) {
-            writeFloat(floats[i]);
-        }
-    }
-
-    private void writeDoubleArray(Object array) throws IOException {
-        double[] doubles = (double[]) array;
-        int length = doubles.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeDouble(doubles[i]);
-        }
-    }
-
-    private void writeShortArray(Object array) throws IOException {
-        short[] shorts = (short[]) array;
-        int length = shorts.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeShort(shorts[i]);
-        }
-    }
-
-    private void writeCharArray(Object array) throws IOException {
-        char[] chars = (char[]) array;
-        int length = chars.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeChar(chars[i]);
-        }
-    }
-
-    private void writeBooleanArray(Object array) throws IOException {
-        boolean[] booleans = (boolean[]) array;
-        int length = booleans.length;
-        dataOutput.writeInt(length);
-        for (int i = 0; i < length; ++i) {
-            writeBoolean(booleans[i]);
-        }
-    }
-
-    private void writeClass(Class clazz, int handle) throws IOException {
-        dataOutput.writeByte(RT_CLASS);
-        dataOutput.writeInt(handle);
-        writeObject(clazz.getName());
-    }
-
-    private void writeString(String string, int handle) throws IOException {
-        dataOutput.writeByte(RT_STRING);
-        dataOutput.writeInt(handle);
-        writeUTF(string);
-    }
-
-    private void writeStreamHeader() throws IOException {
-        writeInt(STREAM_MAGIC);
-        writeShort(STREAM_VERSION);
-    }
-
-    private int registerObject(Object object) {
-        Integer handle = handlesByObject.get(object);
-        if (handle == null) {
-            handle = handlesByObject.size() + 1;
-            handlesByObject.put(object, handle);
-            handle = -handle;
-        }
-        return handle;
-    }
-
-    /*==========================================================================
-      Implementations of ObjectOutput
-    ==========================================================================*/
-    public void writeObject(Object object) throws IOException {
-        if (object == null) {
-            dataOutput.writeByte(RT_NULL);
-        } else {
-            Class clazz = object.getClass();
-
-            if (clazz == EMPTY_SET_CLASS) {
-                dataOutput.writeByte(RT_EMPTY_SET);
-            } else if (clazz == EMPTY_LIST_CLASS) {
-                dataOutput.writeByte(RT_EMPTY_LIST);
-            } else if (clazz == EMPTY_MAP_CLASS) {
-                dataOutput.writeByte(RT_EMPTY_MAP);
-            } else {
-                if (clazz == String.class)
-                    object  = ((String)object).intern();
-                int handle = registerObject(object);
-                if (handle < 0) {
-                    handle  = -handle;
-                    if (Externalizable.class.isAssignableFrom(clazz)) {
-                        dataOutput.writeByte(RT_EXTERNALIZABLE);
-                        dataOutput.writeInt(handle);
-                        writeObject(clazz);
-                        ((Externalizable)object).writeExternal(this);
-                    } else if (Map.class.isAssignableFrom(clazz)) {
-                        Map map = (Map)object;
-                        dataOutput.writeByte(RT_MAP);
-                        dataOutput.writeInt(handle);
-                        writeObject(clazz);
-                        dataOutput.writeInt(map.size());
-                        for (Object obj : map.entrySet()) {
-                            Map.Entry entry = (Map.Entry) obj;
-                            writeObject(entry.getKey());
-                            writeObject(entry.getValue());
-                        }
-                    } else if (clazz.isArray()) {
-                        dataOutput.writeByte(RT_ARRAY);
-                        dataOutput.writeInt(handle);
-                        writeObject(clazz);
-                        Class componentType = clazz.getComponentType();
-                        if (componentType.isPrimitive()) {
-                            writePrimitiveArray(object, componentType);
-                        } else {
-                            Object[]    array = (Object[])object;
-                            int length = array.length;
-                            dataOutput.writeInt(length);
-                            for (int i = 0; i < length; ++i) {
-                                writeObject(array[i]);
-                            }
-                        }
-                    } else if (Collection.class.isAssignableFrom(clazz)) {
-                        Collection collection   = (Collection)object;
-                        dataOutput.writeByte(RT_COLLECTION);
-                        dataOutput.writeInt(handle);
-                        writeObject(clazz);
-                        dataOutput.writeInt(collection.size());
-                        for (Object obj : collection) {
-                            writeObject(obj);
-                        }
-                    } else if (String.class.isAssignableFrom(clazz)) {
-                        writeString((String) object, handle);
-                    } else if (clazz == Class.class) {
-                        writeClass((Class) object, handle);
-                    } else if (AtomicReferenceArray.class.isAssignableFrom(clazz)) {
-                        AtomicReferenceArray array  = (AtomicReferenceArray)object;
-                        dataOutput.writeByte(RT_ATOMICREFERENCEARRAY);
-                        dataOutput.writeInt(handle);
-                        dataOutput.writeInt(array.length());
-                        for (int i = 0; i < array.length(); i++)
-                            writeObject(array.get(i));
-                    } else if (Serializable.class.isAssignableFrom(clazz)) {
-                        dataOutput.writeByte(RT_SERIALIZABLE);
-                        dataOutput.writeInt(handle);
-                        dataOutput.writeObject(object);
-                    } else {
-                        throw new NotSerializableException("Unsupported class: " + clazz);
-                    }
-                } else {
-                    dataOutput.writeByte(RT_REFERENCE);
-                    dataOutput.writeInt(handle);
-                }
-            }
-        }
-        dataOutput.flush();
-    }
-
-    public void write(int b) throws IOException {
-        dataOutput.write(b);
-    }
-
-    public void write(byte b[]) throws IOException {
-        dataOutput.write(b);
-    }
-
-    public void write(byte b[], int off, int len) throws IOException {
-        dataOutput.write(b, off, len);
-    }
-
-    public void flush() throws IOException {
-        dataOutput.flush();
-    }
-
-    public void close() throws IOException {
-       dataOutput.close();
-    }
-
-    public void writeBoolean(boolean v) throws IOException {
-        dataOutput.writeBoolean(v);
-    }
-
-    public void writeByte(int v) throws IOException {
-        dataOutput.writeByte(v);
-    }
-
-    public void writeShort(int v) throws IOException {
-        dataOutput.writeShort(v);
-    }
-
-    public void writeChar(int v) throws IOException {
-        dataOutput.writeChar(v);
-    }
-
-    public void writeInt(int v) throws IOException {
-        dataOutput.writeInt(v);
-    }
-
-    public void writeLong(long v) throws IOException {
-        dataOutput.writeLong(v);
-    }
-
-    public void writeFloat(float v) throws IOException {
-        dataOutput.writeFloat(v);
-    }
-
-    public void writeDouble(double v) throws IOException {
-        dataOutput.writeDouble(v);
-    }
-
-    public void writeBytes(String s) throws IOException {
-        dataOutput.writeBytes(s);
-    }
-
-    public void writeChars(String s) throws IOException {
-        dataOutput.writeChars(s);
-    }
-
-    public void writeUTF(String str) throws IOException {
-        dataOutput.writeUTF(str);
-    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleBase.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -27,7 +27,7 @@
 import org.drools.process.core.Process;
 import org.drools.reteoo.Rete;
 import org.drools.reteoo.ReteooWorkingMemory;
-import org.drools.rule.CompositePackageClassLoader;
+import org.drools.rule.CompositeClassLoader;
 import org.drools.rule.MapBackedClassLoader;
 import org.drools.rule.Package;
 import org.drools.rule.TypeDeclaration;
@@ -95,13 +95,9 @@
     public void retractObject(FactHandle handle,
                               PropagationContext context,
                               ReteooWorkingMemory workingMemory) throws FactException;
+ 
+    public CompositeClassLoader getRootClassLoader();   
     
-    public void addClass(String className, byte[] bytes);
-    
-    public CompositePackageClassLoader getCompositePackageClassLoader();
-    
-    public MapBackedClassLoader getMapBackedClassLoader();
-    
     public Rete getRete();
     
     public InternalWorkingMemory[] getWorkingMemories();

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/ClassDefinition.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -50,7 +50,7 @@
     private String                       className;
     private String                       superClass;
     private String[]                     interfaces;
-    private Class< ? >                   definedClass;
+    private transient Class< ? >         definedClass;
 
     private Map<String, FieldDefinition> fields = new LinkedHashMap<String, FieldDefinition>();
 
@@ -93,7 +93,7 @@
         this.className = (String) in.readObject();
         this.superClass = (String) in.readObject();
         this.interfaces = (String[]) in.readObject();
-        this.definedClass = (Class<?>) in.readObject();
+        //this.definedClass = (Class<?>) in.readObject();
         this.fields = (Map<String, FieldDefinition>) in.readObject();
     }
 
@@ -101,7 +101,7 @@
         out.writeObject( this.className );
         out.writeObject( this.superClass );
         out.writeObject( this.interfaces );
-        out.writeObject( this.definedClass );
+        //out.writeObject( this.definedClass );
         out.writeObject( this.fields );
     }
 
@@ -161,45 +161,6 @@
     }
 
     /**
-     * @param beanInfo The beanInfo to set.
-     * @throws NoSuchFieldException
-     * @throws InvocationTargetException
-     * @throws NoSuchMethodException
-     * @throws ClassNotFoundException
-     * @throws IntrospectionException
-     * @throws IOException
-     * @throws IllegalAccessException
-     * @throws InstantiationException
-     * @throws IllegalArgumentException
-     * @throws SecurityException
-     * @throws IntrospectionException
-     */
-    public final void buildFieldAccessors() throws SecurityException,
-                                           IllegalArgumentException,
-                                           InstantiationException,
-                                           IllegalAccessException,
-                                           IOException,
-                                           IntrospectionException,
-                                           ClassNotFoundException,
-                                           NoSuchMethodException,
-                                           InvocationTargetException,
-                                           NoSuchFieldException {
-        ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
-
-        for ( FieldDefinition attrDef : this.fields.values() ) {
-            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 );
-        }
-    }
-
-    /**
      * @return Returns the interfaces.
      */
     public final String[] getInterfaces() {
@@ -244,29 +205,37 @@
         return new ArrayList<FactField>( fields.values() );
     }
 
-	public Object get(Object bean, String field) {
-		return this.getField(field).getFieldAccessor().getValue(bean);
-	}
+    public Object get(Object bean,
+                      String field) {
+        return this.getField( field ).getFieldAccessor().getValue( bean );
+    }
 
-	public void set(Object bean, String field, Object value) {
-		this.getField(field).getFieldAccessor().setValue(bean, value);
-	}
+    public void set(Object bean,
+                    String field,
+                    Object value) {
+        this.getField( field ).getFieldAccessor().setValue( bean,
+                                                            value );
+    }
 
-	public Map<String, Object> getAsMap(Object bean) {
-		Map<String, Object> m = new HashMap<String, Object>(fields.size());
-		for (Iterator<Map.Entry<String, FieldDefinition>> iterator = this.fields.entrySet().iterator(); iterator.hasNext();) {
-			Map.Entry<String, FieldDefinition> ent = iterator.next();
-			Object val = ent.getValue().getFieldAccessor().getValue(bean);
-			m.put(ent.getKey(), val);
-		}
-		return m;
-	}
+    public Map<String, Object> getAsMap(Object bean) {
+        Map<String, Object> m = new HashMap<String, Object>( fields.size() );
+        for ( Iterator<Map.Entry<String, FieldDefinition>> iterator = this.fields.entrySet().iterator(); iterator.hasNext(); ) {
+            Map.Entry<String, FieldDefinition> ent = iterator.next();
+            Object val = ent.getValue().getFieldAccessor().getValue( bean );
+            m.put( ent.getKey(),
+                   val );
+        }
+        return m;
+    }
 
-	public void setFromMap(Object bean, Map<String, Object> data) {
-		for (Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); iterator.hasNext();) {
-			Map.Entry<String, Object> ent = iterator.next();
-			set(bean, ent.getKey(), ent.getValue());
-		}
-	}
+    public void setFromMap(Object bean,
+                           Map<String, Object> data) {
+        for ( Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); iterator.hasNext(); ) {
+            Map.Entry<String, Object> ent = iterator.next();
+            set( bean,
+                 ent.getKey(),
+                 ent.getValue() );
+        }
+    }
 
 }
\ No newline at end of file

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/factmodel/FieldDefinition.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,8 @@
 
 import org.drools.base.ClassFieldAccessor;
 import org.drools.rule.FactField;
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.InternalReadAccessor;
 
 /**
  * Declares a field to be dynamically generated.
@@ -67,7 +69,12 @@
         this.type = type;
         this.key = key;
     }
+    
 
+    public void setReadWriteAccessor(ClassFieldAccessor accessor) {
+        this.accessor = accessor;
+    }    
+
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
         this.name = (String) in.readObject();
@@ -173,13 +180,6 @@
     }
 
     /**
-     * @param property The property descriptor to set.
-     */
-    public void setFieldAccessor(ClassFieldAccessor accessor) {
-        this.accessor = accessor;
-    }
-
-    /**
      * @inheritDoc
      */
     public int hashCode() {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/facttemplates/FactTemplateFieldExtractor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,5 +1,6 @@
 package org.drools.facttemplates;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -12,6 +13,7 @@
 
 public class FactTemplateFieldExtractor
     implements
+    Externalizable,
     org.drools.spi.InternalReadAccessor {
 
     private static final long serialVersionUID = 400L;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ClassObjectTypeConf.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -32,6 +32,7 @@
 import org.drools.base.ClassObjectType;
 import org.drools.base.DroolsQuery;
 import org.drools.base.ShadowProxy;
+import org.drools.common.AbstractRuleBase;
 import org.drools.common.InternalRuleBase;
 import org.drools.reteoo.builder.BuildContext;
 import org.drools.reteoo.builder.PatternBuilder;
@@ -44,19 +45,19 @@
     ObjectTypeConf,
     Externalizable {
 
-    private static final long              serialVersionUID = 8218802585428841926L;
+    private static final long          serialVersionUID = 8218802585428841926L;
 
-    private Class< ? >                     cls;
-    private transient InternalRuleBase     ruleBase;
-    private ObjectTypeNode[]               objectTypeNodes;
+    private Class< ? >                 cls;
+    private transient InternalRuleBase ruleBase;
+    private ObjectTypeNode[]           objectTypeNodes;
 
-    protected boolean                      shadowEnabled;
+    protected boolean                  shadowEnabled;
 
-    private ObjectTypeNode                 concreteObjectTypeNode;
-    private EntryPoint                     entryPoint;
-    
-    private TypeDeclaration                typeDecl;
+    private ObjectTypeNode             concreteObjectTypeNode;
+    private EntryPoint                 entryPoint;
 
+    private TypeDeclaration            typeDecl;
+
     public ClassObjectTypeConf() {
 
     }
@@ -70,8 +71,9 @@
         this.typeDecl = ruleBase.getTypeDeclaration( clazz );
         final boolean isEvent = typeDecl != null && typeDecl.getRole() == TypeDeclaration.Role.EVENT;
 
-        ObjectType objectType = new ClassObjectType( clazz,
-                                                     isEvent );
+        ObjectType objectType = ((AbstractRuleBase) ruleBase).getClassFieldAccessorCache().getClassObjectType( new ClassObjectType( clazz,
+                                                                                                                                    isEvent ) );
+
         this.concreteObjectTypeNode = (ObjectTypeNode) ruleBase.getRete().getObjectTypeNodes( entryPoint ).get( objectType );
         if ( this.concreteObjectTypeNode == null ) {
             BuildContext context = new BuildContext( ruleBase,
@@ -171,7 +173,7 @@
         final List<ObjectTypeNode> cache = new ArrayList<ObjectTypeNode>();
 
         for ( ObjectTypeNode node : ruleBase.getRete().getObjectTypeNodes( this.entryPoint ).values() ) {
-            if ( node.isAssignableFrom( clazz ) ) {
+            if ( node.isAssignableFrom( new ClassObjectType( clazz ) ) ) {
                 cache.add( node );
             }
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -133,7 +133,7 @@
 
         final CollectMemory memory = (CollectMemory) workingMemory.getNodeMemory( this );
 
-        final Collection result = this.collect.instantiateResultObject();
+        final Collection result = this.collect.instantiateResultObject( workingMemory );
         final InternalFactHandle resultHandle = workingMemory.getFactHandleFactory().newFactHandle( result,
                                                                                                     workingMemory.getObjectTypeConfigurationRegistry().getObjectTypeConf( context.getEntryPoint(),
                                                                                                                                                                           result ),

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,7 +23,10 @@
 import java.io.ObjectInput;
 
 import org.drools.RuleBaseConfiguration;
+import org.drools.base.ClassObjectType;
+import org.drools.common.AbstractRuleBase;
 import org.drools.common.BaseNode;
+import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
@@ -111,6 +114,13 @@
                                             ClassNotFoundException {
         super.readExternal( in );
         objectType = (ObjectType) in.readObject();
+        
+        // this is here as not all objectTypeNodes used ClassObjectTypes in packages (i.e. rules with those nodes did not exist yet)
+        // and thus have no wiring targets
+        if ( objectType instanceof ClassObjectType ) {
+            objectType = ((AbstractRuleBase) ((DroolsObjectInputStream)in).getRuleBase()).getClassFieldAccessorCache().getClassObjectType( (ClassObjectType ) objectType );
+        }
+        
         skipOnModify = in.readBoolean();
         objectMemoryEnabled = in.readBoolean();
     }
@@ -132,20 +142,20 @@
         return this.objectType;
     }
 
-    /**
-     * Tests the provided object to see if this <code>ObjectTypeNode</code> can receive the object
-     * for assertion and retraction propagations.
-     *
-     * @param object
-     * @return
-     *      boolean value indicating whether the <code>ObjectTypeNode</code> can receive the object.
-     */
-    public boolean matches(final Object object) {
-        return this.objectType.matches( object );
-    }
+//    /**
+//     * Tests the provided object to see if this <code>ObjectTypeNode</code> can receive the object
+//     * for assertion and retraction propagations.
+//     *
+//     * @param object
+//     * @return
+//     *      boolean value indicating whether the <code>ObjectTypeNode</code> can receive the object.
+//     */
+//    public boolean matches(final Object object) {
+//        return this.objectType.matches( object );
+//    }
 
-    public boolean isAssignableFrom(final Object object) {
-        return this.objectType.isAssignableFrom( object );
+    public boolean isAssignableFrom(final ObjectType objectType) {
+        return this.objectType.isAssignableFrom( objectType );
     }
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -369,6 +369,12 @@
         // may start in 0
         return this.reteooBuilder.getIdGenerator().getLastId() + 1;
     }
+    
+    public void addPackages(Package[] pkgs ) {
+        for (Package pkg : pkgs) {
+            addPackage( pkg );
+        }
+    }
 
     public synchronized void addPackage(final Package newPkg) {
         super.addPackage( newPkg );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/CollectBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -20,6 +20,8 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassObjectType;
 import org.drools.common.BetaConstraints;
 import org.drools.common.TupleStartEqualsConstraint;
 import org.drools.reteoo.CollectNode;
@@ -31,6 +33,7 @@
 import org.drools.rule.Pattern;
 import org.drools.rule.RuleConditionElement;
 import org.drools.spi.AlphaNodeFieldConstraint;
+import org.drools.spi.ObjectType;
 
 /**
  * @author etirelli
@@ -55,7 +58,8 @@
         final List resultBehaviors = context.getBehaviors();
 
         final Pattern sourcePattern = collect.getSourcePattern();
-
+        final Pattern resultPattern = collect.getResultPattern();      
+        
         // get builder for the pattern
         final ReteooComponentBuilder builder = utils.getBuilderFor( sourcePattern );
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/ReteooRuleBuilder.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -137,20 +137,12 @@
         TerminalNode terminal = null;
 
         if ( !(rule instanceof Query) ) {
-            // Check a consequence is set
-            if ( rule.getConsequence() == null ) {
-                throw new InvalidPatternException( "Rule '" + rule.getName() + "' has no Consequence" );
-            }
             terminal = new RuleTerminalNode( context.getNextId(),
                                              context.getTupleSource(),
                                              rule,
                                              subrule,
                                              context );
         } else {
-            // Check there is no consequence
-            if ( rule.getConsequence() != null ) {
-                throw new InvalidPatternException( "Query '" + rule.getName() + "' should have no Consequence" );
-            }
             terminal = new QueryTerminalNode( context.getNextId(),
                                               context.getTupleSource(),
                                               rule,
@@ -206,7 +198,7 @@
     private void addInitialFactPattern(final BuildContext context,
                                        final GroupElement subrule,
                                        final Rule rule) {
-
+        
         // creates a pattern for initial fact
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( InitialFact.class ) );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Accumulate.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,7 @@
 
 package org.drools.rule;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -27,13 +28,16 @@
 import org.drools.WorkingMemory;
 import org.drools.common.InternalFactHandle;
 import org.drools.spi.Accumulator;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.Tuple;
+import org.drools.spi.Wireable;
 
 /**
  * A class to represent the Accumulate CE
  */
 public class Accumulate extends ConditionalElement
     implements
+    Wireable,
     PatternSource {
 
     private static final long    serialVersionUID = 400L;
@@ -42,6 +46,8 @@
     private RuleConditionElement source;
     private Declaration[]        requiredDeclarations;
     private Declaration[]        innerDeclarations;
+    
+    private List<Accumulate> cloned = Collections.<Accumulate>emptyList();
 
     public Accumulate() {
 
@@ -81,18 +87,31 @@
         source = (RuleConditionElement)in.readObject();
         requiredDeclarations = (Declaration[])in.readObject();
         innerDeclarations = (Declaration[])in.readObject();
+        this.cloned = (List<Accumulate>) in.readObject();        
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(accumulator);
-        out.writeObject(source);
-        out.writeObject(requiredDeclarations);
-        out.writeObject(innerDeclarations);
+        if ( this.accumulator instanceof CompiledInvoker ) {
+            out.writeObject(  null );
+        } else {
+            out.writeObject(this.accumulator);   
+        }
+        out.writeObject(this.source);
+        out.writeObject(this.requiredDeclarations);
+        out.writeObject(this.innerDeclarations);
+        out.writeObject( this.cloned );
     }
 
     public Accumulator getAccumulator() {
         return this.accumulator;
     }
+    
+    public void wire(Object object) {
+        setAccumulator( (Accumulator) object );
+        for ( Accumulate clone : this.cloned ) {
+            clone.wire( object );
+        }        
+    }
 
     public void setAccumulator(final Accumulator accumulator) {
         this.accumulator = accumulator;
@@ -214,10 +233,18 @@
     }
 
     public Object clone() {
-        return new Accumulate( this.source,
+        Accumulate clone = new Accumulate( this.source,
                                this.requiredDeclarations,
                                this.innerDeclarations,
                                this.accumulator );
+        
+        if ( this.cloned == Collections.EMPTY_LIST ) {
+            this.cloned = new ArrayList<Accumulate>(1);
+        }
+        
+        this.cloned.add( clone );
+        
+        return clone;
     }
 
     public RuleConditionElement getSource() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Collect.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,6 +26,8 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassObjectType;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
 
 /**
  * @author etirelli
@@ -39,6 +41,8 @@
 
     private Pattern           sourcePattern;
     private Pattern           resultPattern;
+    
+    private Class             cls;
 
     public Collect() {
     }
@@ -73,11 +77,15 @@
         return this.sourcePattern;
     }
 
-    public Collection instantiateResultObject() throws RuntimeDroolsException {
+    public Collection instantiateResultObject(InternalWorkingMemory wm) throws RuntimeDroolsException {
         try {
             // Collect can only be used with a Collection implementation, so
             // FactTemplateObject type is not allowed
-            return (Collection) ((ClassObjectType) this.resultPattern.getObjectType()).getClassType().newInstance();
+            if ( this.cls == null ) {
+                ClassObjectType objType = ((ClassObjectType) this.resultPattern.getObjectType());
+                this.cls = ((InternalRuleBase)wm.getRuleBase()).getRootClassLoader().loadClass( objType.getClassName() );
+            }
+            return (Collection) this.cls.newInstance();
         } catch ( final ClassCastException cce ) {
             throw new RuntimeDroolsException( "Collect CE requires a Collection implementation as return type",
                                               cce );
@@ -87,6 +95,9 @@
         } catch ( final IllegalAccessException e ) {
             throw new RuntimeDroolsException( "Collect CE requires an accessible constructor for the return type",
                                               e );
+        } catch ( final ClassNotFoundException  e) {
+            throw new RuntimeDroolsException( "Collect CE could not resolve return result class '" + ((ClassObjectType) this.resultPattern.getObjectType()).getClassName() + "'",
+                                              e );            
         }
     }
 

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositeClassLoader.java (from rev 21124, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositeClassLoader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositeClassLoader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,105 @@
+package org.drools.rule;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CompositeClassLoader extends ClassLoader
+    implements
+    DroolsClassLoader {
+    
+
+    private final List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
+    private boolean hasParent = false;
+    
+    public CompositeClassLoader(final ClassLoader parentClassLoader) {
+        super( parentClassLoader );
+        if ( parentClassLoader != null ) {
+            this.hasParent = true;
+        }
+    }
+
+    public void addClassLoader(final ClassLoader classLoader) {
+        // don't add duplicate ClasslLaders;
+        for ( final ClassLoader cl : this.classLoaders ) {
+            if ( cl == classLoader ) {
+                return;
+            }
+        }
+        this.classLoaders.add( classLoader );
+
+    }
+
+    public void removeClassLoader(final ClassLoader classLoader) {
+        classLoaders.remove( classLoader );
+    }
+
+    /**
+     * Search the list of child ClassLoaders
+     */
+    public Class fastFindClass(final String name) {
+        for ( final ClassLoader classLoader : this.classLoaders ) {
+            final Class cls = ((DroolsClassLoader) classLoader).fastFindClass( name );
+            if ( cls != null ) {
+                return cls;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * This ClassLoader never has classes of it's own, so only search the child ClassLoaders
+     * and the parent ClassLoader if one is provided
+     */ 
+    public synchronized Class loadClass(final String name,
+                                        final boolean resolve) throws ClassNotFoundException {
+        // search the child ClassLoaders
+        Class cls = fastFindClass( name );
+        
+        // still not found so search the parent ClassLoader
+        if ( this.hasParent && cls == null ) {
+            cls = getParent().loadClass( name );
+        }        
+
+        if ( resolve ) {
+            resolveClass( cls );
+        }
+
+        return cls;
+    }
+
+    /**
+     * This ClassLoader never has classes of it's own, so only search the child ClassLoaders
+     * and the parent ClassLoader if one is provided
+     */    
+    public InputStream getResourceAsStream(final String name) {        
+        for ( final ClassLoader classLoader : this.classLoaders ) {
+            InputStream stream = classLoader.getResourceAsStream( name );
+            if ( stream != null ) {
+                return stream;
+            }
+        }
+        
+        if ( this.hasParent ) {
+            return getParent().getResourceAsStream( name );            
+        }
+        
+        return null;
+
+    }
+    
+
+    /**
+     * This ClassLoader never has classes of it's own, so only search the child ClassLoaders
+     */    
+    protected Class findClass(final String name) throws ClassNotFoundException {
+        final Class cls = fastFindClass( name );
+        
+        
+        if ( cls == null ) {
+            throw new ClassNotFoundException( name );
+        }
+        return cls;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositeClassLoader.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/CompositePackageClassLoader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,116 +0,0 @@
-package org.drools.rule;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-public class CompositePackageClassLoader extends ClassLoader
-    implements
-    DroolsClassLoader {
-
-    private final List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
-    private final List<ClassLoader> parents      = new ArrayList<ClassLoader>();
-
-    public CompositePackageClassLoader(final ClassLoader parentClassLoader) {
-        super( parentClassLoader );
-        this.parents.add( getParent() );
-    }
-
-    public void addClassLoader(final ClassLoader classLoader) {
-        // don't add duplicate classloaders;
-        for ( final ClassLoader cl : this.classLoaders ) {
-            if ( cl == classLoader ) {
-                return;
-            }
-        }
-        this.classLoaders.add( classLoader );
-
-        // we need to record parents for fast finding in a unique list
-        ClassLoader parent = classLoader.getParent();
-        for ( final ClassLoader cl : this.parents ) {
-            if ( cl == parent ) {
-                return;
-            }
-        }
-        this.parents.add( parent );
-
-    }
-
-    public void removeClassLoader(final ClassLoader classLoader) {
-        classLoaders.remove( classLoader );
-    }
-
-    public Class fastFindClass(final String name) {
-        for ( final ClassLoader classLoader : this.classLoaders ) {
-            final Class clazz = ((DroolsClassLoader) classLoader).fastFindClass( name );
-            if ( clazz != null ) {
-                return clazz;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Javadocs recommend that this method not be overloaded. We overload this so that we can prioritise the fastFindClass
-     * over method calls to parent.loadClass(name, false); and c = findBootstrapClass0(name); which the default implementation
-     * would first - hence why we call it "fastFindClass" instead of standard findClass, this indicates that we give it a
-     * higher priority than normal.
-     *
-     */
-    protected synchronized Class loadClass(final String name,
-                                           final boolean resolve) throws ClassNotFoundException {
-        Class cls = findLoadedClass( name );
-
-        if ( cls == null ) {
-            cls = fastFindClass( name );
-
-            if ( cls == null ) {
-                // now check all parents
-                for ( final ClassLoader parent : this.parents ) {
-                    try {
-                        // due to this bug http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=2a9a78e4393c5e678a2c80f90c1?bug_id=6434149
-                        cls = Class.forName( name,
-                                             true,
-                                             parent );
-                    } catch ( ClassNotFoundException e ) {
-                        // swallow
-                    }
-                    if ( cls != null ) {
-                        break;
-                    }
-                }
-
-                if ( cls == null ) {
-                    return null;
-                }
-            }
-        }
-
-        if ( resolve ) {
-            resolveClass( cls );
-        }
-
-        return cls;
-    }
-
-    public InputStream getResourceAsStream(final String name) {
-        InputStream stream = super.getResourceAsStream( name );
-
-        for ( final ClassLoader classLoader : this.classLoaders ) {
-            stream = classLoader.getResourceAsStream( name );
-            if ( stream != null ) {
-                return stream;
-            }
-        }
-        return stream;
-    }
-
-    protected Class findClass(final String name) throws ClassNotFoundException {
-        final Class clazz = fastFindClass( name );
-        if ( clazz == null ) {
-            throw new ClassNotFoundException( name );
-        }
-        return clazz;
-    }
-
-}

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Declaration.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -50,9 +50,12 @@
 import java.util.Iterator;
 
 import org.drools.RuntimeDroolsException;
+import org.drools.base.ClassFieldReader;
 import org.drools.base.ShadowProxy;
 import org.drools.base.ValueType;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.AcceptsClassObjectType;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.InternalReadAccessor;
 
 /*
@@ -80,6 +83,7 @@
 public class Declaration
     implements
     Externalizable,
+    AcceptsReadAccessor,
     Cloneable {
     // ------------------------------------------------------------
     // Instance members
@@ -88,22 +92,24 @@
     /**
      *
      */
-    private static final long serialVersionUID = 400L;
+    private static final long    serialVersionUID = 400L;
 
     /** The identifier for the variable. */
-    private String      identifier;
+    private String               identifier;
 
-    private InternalReadAccessor   extractor;
+    private InternalReadAccessor readAccessor;
 
-    private Pattern           pattern;
+    private Pattern              pattern;
 
-    private boolean     internalFact;
+    private boolean              internalFact;
 
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
     public Declaration() {
-        this(null, null, null);
+        this( null,
+              null,
+              null );
     }
 
     /**
@@ -117,6 +123,24 @@
      *            The index within a rule.
      */
     public Declaration(final String identifier,
+                       final Pattern pattern) {
+        this( identifier,
+              null,
+              pattern,
+              false );
+    }
+
+    /**
+     * Construct.
+     *
+     * @param identifier
+     *            The name of the variable.
+     * @param objectType
+     *            The type of this variable declaration.
+     * @param order
+     *            The index within a rule.
+     */
+    public Declaration(final String identifier,
                        final InternalReadAccessor extractor,
                        final Pattern pattern) {
         this( identifier,
@@ -143,24 +167,30 @@
                        final Pattern pattern,
                        final boolean internalFact) {
         this.identifier = identifier;
-        this.extractor = extractor;
+        this.readAccessor = extractor;
         this.pattern = pattern;
         this.internalFact = internalFact;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        identifier  = (String)in.readObject();
-        extractor   = (InternalReadAccessor)in.readObject();
-        pattern     = (Pattern)in.readObject();
-        internalFact    = in.readBoolean();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        identifier = (String) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
+        pattern = (Pattern) in.readObject();
+        internalFact = in.readBoolean();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(identifier);
-        out.writeObject(extractor);
-        out.writeObject(pattern);
-        out.writeBoolean(internalFact);
+        out.writeObject( identifier );
+        out.writeObject( readAccessor );
+        out.writeObject( pattern );
+        out.writeBoolean( internalFact );
     }
+
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }
+
     // ------------------------------------------------------------
     // Instance methods
     // ------------------------------------------------------------
@@ -180,7 +210,7 @@
      * @return The ValueType.
      */
     public ValueType getValueType() {
-        return this.extractor.getValueType();
+        return this.readAccessor.getValueType();
     }
 
     /**
@@ -210,19 +240,19 @@
      * @return
      */
     public InternalReadAccessor getExtractor() {
-        return this.extractor;
+        return this.readAccessor;
     }
 
     public Object getValue(InternalWorkingMemory workingMemory,
                            final Object object) {
-        return this.extractor.getValue( workingMemory,
-                                        object );
+        return this.readAccessor.getValue( workingMemory,
+                                           object );
     }
 
     public Object getNonShadowedValue(InternalWorkingMemory workingMemory,
                                       final Object object) {
-        Object result = this.extractor.getValue( workingMemory,
-                                                 object );
+        Object result = this.readAccessor.getValue( workingMemory,
+                                                    object );
         if ( this.isInternalFact() && result instanceof Collection ) {
             try {
                 Collection newCol = (Collection) result.getClass().newInstance();
@@ -242,60 +272,60 @@
 
     public char getCharValue(InternalWorkingMemory workingMemory,
                              final Object object) {
-        return this.extractor.getCharValue( workingMemory,
-                                            object );
+        return this.readAccessor.getCharValue( workingMemory,
+                                               object );
     }
 
     public int getIntValue(InternalWorkingMemory workingMemory,
                            final Object object) {
-        return this.extractor.getIntValue( workingMemory,
-                                           object );
+        return this.readAccessor.getIntValue( workingMemory,
+                                              object );
     }
 
     public byte getByteValue(InternalWorkingMemory workingMemory,
                              final Object object) {
-        return this.extractor.getByteValue( workingMemory,
-                                            object );
+        return this.readAccessor.getByteValue( workingMemory,
+                                               object );
     }
 
     public short getShortValue(InternalWorkingMemory workingMemory,
                                final Object object) {
-        return this.extractor.getShortValue( workingMemory,
-                                             object );
+        return this.readAccessor.getShortValue( workingMemory,
+                                                object );
     }
 
     public long getLongValue(InternalWorkingMemory workingMemory,
                              final Object object) {
-        return this.extractor.getLongValue( workingMemory,
-                                            object );
+        return this.readAccessor.getLongValue( workingMemory,
+                                               object );
     }
 
     public float getFloatValue(InternalWorkingMemory workingMemory,
                                final Object object) {
-        return this.extractor.getFloatValue( workingMemory,
-                                             object );
+        return this.readAccessor.getFloatValue( workingMemory,
+                                                object );
     }
 
     public double getDoubleValue(InternalWorkingMemory workingMemory,
                                  final Object object) {
-        return this.extractor.getDoubleValue( workingMemory,
-                                              object );
+        return this.readAccessor.getDoubleValue( workingMemory,
+                                                 object );
     }
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory,
                                    final Object object) {
-        return this.extractor.getBooleanValue( workingMemory,
-                                               object );
+        return this.readAccessor.getBooleanValue( workingMemory,
+                                                  object );
     }
 
     public int getHashCode(InternalWorkingMemory workingMemory,
                            final Object object) {
-        return this.extractor.getHashCode( workingMemory,
-                                           object );
+        return this.readAccessor.getHashCode( workingMemory,
+                                              object );
     }
 
     public boolean isGlobal() {
-        return this.extractor.isGlobal();
+        return this.readAccessor.isGlobal();
     }
 
     public Method getNativeReadMethod() {
@@ -308,20 +338,20 @@
                                                   e );
             }
         }
-        return this.extractor.getNativeReadMethod();
+        return this.readAccessor.getNativeReadMethod();
     }
 
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
     public String toString() {
-        return "[Declaration: type=" + this.extractor.getValueType() + " identifier=" + this.identifier + "]";
+        return "[Declaration: type=" + this.readAccessor.getValueType() + " identifier=" + this.identifier + "]";
     }
 
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
         result = PRIME * this.pattern.getOffset();
-        result = PRIME * this.extractor.hashCode();
+        result = PRIME * this.readAccessor.hashCode();
         result = PRIME * this.identifier.hashCode();
         return result;
     }
@@ -337,7 +367,7 @@
 
         final Declaration other = (Declaration) object;
 
-        return this.pattern.getOffset() == other.pattern.getOffset() && this.identifier.equals( other.identifier ) && this.extractor.equals( other.extractor );
+        return this.pattern.getOffset() == other.pattern.getOffset() && this.identifier.equals( other.identifier ) && this.readAccessor.equals( other.readAccessor );
     }
 
     protected boolean isInternalFact() {
@@ -345,7 +375,9 @@
     }
 
     public Object clone() {
-        return new Declaration( this.identifier, this.extractor, this.pattern );
+        return new Declaration( this.identifier,
+                                this.readAccessor,
+                                this.pattern );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeData.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeData.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,5 +1,8 @@
 package org.drools.rule;
 
+import org.drools.RuntimeDroolsException;
+import org.drools.rule.JavaDialectRuntimeData.PackageClassLoader;
+
 public interface DialectRuntimeData extends Cloneable {
     public void removeRule(Package pkg, Rule rule);
 
@@ -13,5 +16,12 @@
 
     public void reload();
 
-    public DialectRuntimeData clone(DialectRuntimeRegistry registry);
+    public DialectRuntimeData clone(DialectRuntimeRegistry registry, CompositeClassLoader rootClassLoader);
+
+    public void onAdd(DialectRuntimeRegistry dialectRuntimeRegistry,
+                     CompositeClassLoader rootClassLoader);
+    
+    public void onRemove();
+    
+    public void onBeforeExecute();
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeRegistry.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectRuntimeRegistry.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -14,24 +14,11 @@
 public class DialectRuntimeRegistry
     implements
     Externalizable {
-    private transient ClassLoader           parentClassLoader;
-    private CompositePackageClassLoader     classLoader;
-
     private Map<String, DialectRuntimeData> dialects;
 
     private Map                             lineMappings;
 
-    /**
-     * Default constructor - for Externalizable. This should never be used by a user, as it
-     * will result in an invalid state for the instance.
-     */
     public DialectRuntimeRegistry() {
-        this( null );
-    }
-
-    public DialectRuntimeRegistry(ClassLoader classLoader) {
-        setParentClassLoader( classLoader );
-        this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
         this.dialects = new HashMap<String, DialectRuntimeData>();
     }
 
@@ -53,17 +40,26 @@
      */
     public void readExternal(final ObjectInput stream) throws IOException,
                                                       ClassNotFoundException {
-        DroolsObjectInput droolsStream = (DroolsObjectInput) stream;
-
-        setParentClassLoader( droolsStream.getClassLoader() );
-        this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
-        droolsStream.setDialectRuntimeRegistry( this );
-        droolsStream.setClassLoader( this.classLoader );
-
-        this.dialects = (Map<String, DialectRuntimeData>) droolsStream.readObject();
+        this.dialects = (Map<String, DialectRuntimeData>) stream.readObject();
         this.lineMappings = (Map) stream.readObject();
     }
 
+    public void onAdd(CompositeClassLoader rootClassLoader) {
+        //this.classLoader = rootClassLoader;
+        for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+            DialectRuntimeData data = (DialectRuntimeData) it.next();
+            data.onAdd( this,
+                            rootClassLoader );
+        }
+    }
+    
+    public void onRemove() {
+        for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+            DialectRuntimeData data = (DialectRuntimeData) it.next();
+            data.onRemove( );
+        }
+    }    
+
     public void setDialectData(String name,
                                DialectRuntimeData data) {
         this.dialects.put( name,
@@ -90,16 +86,19 @@
         return dialect;
     }
 
-    public void merge(DialectRuntimeRegistry newDatas) {
+    public void merge(DialectRuntimeRegistry newDatas,
+                      CompositeClassLoader rootClassLoader) {
         for ( Entry<String, DialectRuntimeData> entry : newDatas.dialects.entrySet() ) {
             DialectRuntimeData data = this.dialects.get( entry.getKey() );
             if ( data == null ) {
-                DialectRuntimeData dialectData = entry.getValue().clone( this );
+                DialectRuntimeData dialectData = entry.getValue().clone( this,
+                                                                         rootClassLoader );
                 //dialectData.setDialectRuntimeRegistry( this );
                 this.dialects.put( entry.getKey(),
                                    dialectData );
             } else {
-                data.merge( null, entry.getValue() );
+                data.merge( this,
+                            entry.getValue() );
             }
         }
 
@@ -110,54 +109,30 @@
         return true;
     }
 
-    public void reloadDirty() {
-        // detect if any dialect is dirty, if so reload() them all
-        boolean isDirty = false;
+    public void onBeforeExecute() {
         for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
             DialectRuntimeData data = (DialectRuntimeData) it.next();
-            if ( data.isDirty() ) {
-                isDirty = true;
-                break;
-            }
+            data.onBeforeExecute();
         }
-
-        if ( isDirty ) {
-            this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
-            for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
-                DialectRuntimeData data = (DialectRuntimeData) it.next();
-                data.reload();
-            }
-        }
+        //        // detect if any dialect is dirty, if so reload() them all
+        //        boolean isDirty = false;
+        //        for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+        //            DialectRuntimeData data = (DialectRuntimeData) it.next();
+        //            if ( data.isDirty() ) {
+        //                isDirty = true;
+        //                break;
+        //            }
+        //        }
+        //
+        //        //if ( isDirty ) {
+        //        this.classLoader = new CompositeClassLoader();
+        //        for ( Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+        //            DialectRuntimeData data = (DialectRuntimeData) it.next();
+        //            data.reload();
+        //        }
+        //        //}
     }
 
-    public ClassLoader getParentClassLoader() {
-        return this.parentClassLoader;
-    }
-
-    public void setParentClassLoader(ClassLoader classLoader) {
-        if ( classLoader == null ) {
-            classLoader = Thread.currentThread().getContextClassLoader();
-            if ( classLoader == null ) {
-                classLoader = getClass().getClassLoader();
-            }
-        }
-        this.parentClassLoader = classLoader;
-    }
-
-    public ClassLoader getClassLoader() {
-        return this.classLoader;
-    }
-
-    public void addClassLoader(ClassLoader classLoader) {
-        this.classLoader.addClassLoader( classLoader );
-    }
-
-    public void removeClassLoader(ClassLoader classLoader) {
-        if ( classLoader != null ) {
-            this.classLoader.removeClassLoader( classLoader );
-        }
-    }
-
     public void clear() {
         this.dialects.clear();
     }
@@ -172,4 +147,6 @@
         }
         return this.lineMappings;
     }
+
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DroolsClassLoader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -5,7 +5,10 @@
 
 public interface DroolsClassLoader {
 
-    InputStream getResourceAsStream(final String name);
+    public InputStream getResourceAsStream(final String name);
 
-    public Class fastFindClass(final String name);
+    public Class<?> fastFindClass(final String name);
+    
+    public Class<?> loadClass(final String name,
+                           final boolean resolve) throws ClassNotFoundException;
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -26,23 +27,30 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.WorkingMemory;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.EvalExpression;
 import org.drools.spi.Tuple;
+import org.drools.spi.Wireable;
 
-public class EvalCondition extends ConditionalElement implements Externalizable {
+public class EvalCondition extends ConditionalElement
+    implements
+    Externalizable,
+    Wireable {
     /**
      *
      */
-    private static final long          serialVersionUID = 400L;
+    private static final long          serialVersionUID   = 400L;
 
     private EvalExpression             expression;
 
-    private Declaration[]        requiredDeclarations;
+    private Declaration[]              requiredDeclarations;
 
     private static final Declaration[] EMPTY_DECLARATIONS = new Declaration[0];
 
+    private List<EvalCondition>        cloned             = Collections.<EvalCondition> emptyList();
+
     public EvalCondition() {
-        this(null);
+        this( null );
     }
 
     public EvalCondition(final Declaration[] requiredDeclarations) {
@@ -62,20 +70,34 @@
         }
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expression  = (EvalExpression)in.readObject();
-        requiredDeclarations    = (Declaration[])in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        expression = (EvalExpression) in.readObject();
+        requiredDeclarations = (Declaration[]) in.readObject();
+        this.cloned = (List<EvalCondition>) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expression);
-        out.writeObject(requiredDeclarations);
+        if ( this.expression instanceof CompiledInvoker ) {
+            out.writeObject( null );
+        } else {
+            out.writeObject( this.expression );
+        }
+        out.writeObject( requiredDeclarations );
+        out.writeObject( this.cloned );
     }
 
     public EvalExpression getEvalExpression() {
         return this.expression;
     }
 
+    public void wire(Object object) {
+        setEvalExpression( (EvalExpression) object );
+        for ( EvalCondition clone : this.cloned ) {
+            clone.wire( object );
+        }
+    }
+
     public void setEvalExpression(final EvalExpression expression) {
         this.expression = expression;
     }
@@ -90,21 +112,29 @@
 
     public boolean isAllowed(final Tuple tuple,
                              final WorkingMemory workingMemory,
-                             final Object context ) {
+                             final Object context) {
         try {
             return this.expression.evaluate( tuple,
                                              this.requiredDeclarations,
                                              workingMemory,
                                              context );
         } catch ( final Exception e ) {
-        	throw new RuntimeDroolsException( this.getEvalExpression() + " : " + e, e );
+            throw new RuntimeDroolsException( this.getEvalExpression() + " : " + e,
+                                              e );
         }
     }
 
     public Object clone() {
-        final EvalCondition eval = new EvalCondition( this.expression,
-                                                      (Declaration[]) this.requiredDeclarations.clone() );
-        return eval;
+        final EvalCondition clone = new EvalCondition( this.expression,
+                                                       (Declaration[]) this.requiredDeclarations.clone() );
+
+        if ( this.cloned == Collections.EMPTY_LIST ) {
+            this.cloned = new ArrayList<EvalCondition>( 1 );
+        }
+
+        this.cloned.add( clone );
+
+        return clone;
     }
 
     public int hashCode() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/From.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,15 +10,18 @@
 import java.util.Map;
 
 import org.drools.spi.DataProvider;
+import org.drools.spi.ReturnValueExpression;
+import org.drools.spi.Wireable;
 
 public class From extends ConditionalElement
     implements
     Externalizable,
+    Wireable,
     PatternSource {
 
     private static final long serialVersionUID = 400L;
 
-    private DataProvider      dataProvider;
+    private DataProvider      dataProvider;      
 
     public From() {
     }
@@ -34,6 +37,10 @@
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeObject(dataProvider);
     }
+    
+    public void wire(Object object) {
+        this.dataProvider = ( DataProvider ) dataProvider;
+    }    
 
     public DataProvider getDataProvider() {
         return this.dataProvider;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/JavaDialectRuntimeData.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -25,8 +25,11 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -39,6 +42,7 @@
 import org.drools.spi.PredicateExpression;
 import org.drools.spi.ReturnValueEvaluator;
 import org.drools.spi.ReturnValueExpression;
+import org.drools.spi.Wireable;
 import org.drools.util.StringUtils;
 import org.drools.workflow.core.DroolsAction;
 import org.drools.workflow.instance.impl.ReturnValueConstraintEvaluator;
@@ -51,22 +55,24 @@
     /**
      *
      */
-    private static final long             serialVersionUID = 400L;
+    private static final long              serialVersionUID = 400L;
 
-    private static final ProtectionDomain PROTECTION_DOMAIN;
+    private static final ProtectionDomain  PROTECTION_DOMAIN;
 
-    private Map                           invokerLookups;
+    private Map                            invokerLookups;
 
-    private Object                        AST;
+    private Map                            store;
 
-    private Map                           store;
+    private DialectRuntimeRegistry         registry;
 
-    private DialectRuntimeRegistry        datas;
+    private transient PackageClassLoader   classLoader;
 
-    private transient PackageClassLoader  classLoader;
+    private transient CompositeClassLoader rootClassLoader;
 
-    private boolean                       dirty;
+    private boolean                        dirty;
 
+    private List<String>                   wireList         = Collections.<String> emptyList();
+
     static {
         PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
             public Object run() {
@@ -75,47 +81,31 @@
         } );
     }
 
-    /**
-     * Default constructor - for Externalizable. This should never be used by a user, as it
-     * will result in an invalid state for the instance.
-     */
     public JavaDialectRuntimeData() {
-    }
-
-    public JavaDialectRuntimeData(final DialectRuntimeRegistry datas) {
-        this.datas = datas;
-        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader(), this );
-        this.datas.addClassLoader( this.classLoader );
         this.invokerLookups = new HashMap();
         this.store = new HashMap();
         this.dirty = false;
     }
 
-    public DialectRuntimeData clone(DialectRuntimeRegistry registry) {
-        DialectRuntimeData cloneOne = new JavaDialectRuntimeData(registry);
-
-        cloneOne.merge(registry, this);
-        return cloneOne;
-    }
-
-    public boolean isDirty() {
-        return this.dirty;
-    }
-
-    public void setDirty(boolean dirty) {
-        this.dirty = dirty;
-    }
-
     /**
      * Handles the write serialization of the PackageCompilationData. Patterns in Rules may reference generated data which cannot be serialized by
      * default methods. The PackageCompilationData holds a reference to the generated bytecode. The generated bytecode must be restored before any Rules.
      *
      */
     public void writeExternal(ObjectOutput stream) throws IOException {
-        stream.writeObject( this.store );
-        stream.writeObject( this.AST );
-        stream.writeObject( this.invokerLookups );
-        stream.writeBoolean( this.dirty );
+        stream.writeInt( this.store.size() );
+        for ( Iterator it = this.store.entrySet().iterator(); it.hasNext(); ) {
+            Entry entry = (Entry) it.next();
+            stream.writeObject( entry.getKey() );
+            stream.writeObject( entry.getValue() );
+        }
+
+        stream.writeInt( this.invokerLookups.size() );
+        for ( Iterator it = this.invokerLookups.entrySet().iterator(); it.hasNext(); ) {
+            Entry entry = (Entry) it.next();
+            stream.writeObject( entry.getKey() );
+            stream.writeObject( entry.getValue() );
+        }
     }
 
     /**
@@ -125,21 +115,103 @@
      *
      */
     public void readExternal(ObjectInput stream) throws IOException,
-                                                      ClassNotFoundException {
-        DroolsObjectInput droolsStream = (DroolsObjectInput)stream;
+                                                ClassNotFoundException {
+        DroolsObjectInput droolsStream = (DroolsObjectInput) stream;
+        for ( int i = 0, length = stream.readInt(); i < length; i++ ) {
+            this.store.put( stream.readObject(),
+                            stream.readObject() );
+        }
+        for ( int i = 0, length = stream.readInt(); i < length; i++ ) {
+            this.invokerLookups.put( stream.readObject(),
+                                     stream.readObject() );
+        }
+        // mark it as dirty, so that it reloads everything.
+        this.dirty = true;
+    }
 
-        this.datas          = droolsStream.getDialectRuntimeRegistry();
-        this.classLoader    = new PackageClassLoader( this.datas.getParentClassLoader(), this );
-        this.datas.addClassLoader( this.classLoader );
+    public void onAdd(DialectRuntimeRegistry registry,
+                      CompositeClassLoader rootClassLoader) {
+        this.registry = registry;
+        this.rootClassLoader = rootClassLoader;
+        this.classLoader = new PackageClassLoader( this,
+                                                   this.rootClassLoader );
+        this.rootClassLoader.addClassLoader( this.classLoader );
+    }
+    
+    public void onRemove() {
+        this.rootClassLoader.removeClassLoader( this.classLoader );
+    }
 
-        this.store = (Map) stream.readObject();
-        this.AST = stream.readObject();
-        this.invokerLookups = (Map) droolsStream.readObject();
-        this.dirty  = droolsStream.readBoolean();
+    public void onBeforeExecute() {
+        if ( isDirty() ) {
+            reload();
+        } else if ( !this.wireList.isEmpty() ) {
+            try {
+                // wire all remaining resources
+                for ( String resourceName : this.wireList ) {
+                    wire( convertResourceToClassName( resourceName ) );
+                }
+            } catch ( Exception e ) {
+                throw new RuntimeDroolsException( "Unable to wire up JavaDialect",
+                                                  e );
+            }
+        }
+
+        this.wireList.clear();
     }
 
+    public DialectRuntimeData clone(DialectRuntimeRegistry registry,
+                                    CompositeClassLoader rootClassLoader) {
+        DialectRuntimeData cloneOne = new JavaDialectRuntimeData();
+        cloneOne.merge( registry,
+                        this );
+        cloneOne.onAdd( registry,
+                        rootClassLoader );
+        return cloneOne;
+    }
+
+    public void merge(DialectRuntimeRegistry registry,
+                      DialectRuntimeData newData) {
+        this.registry = registry;
+        JavaDialectRuntimeData newJavaData = (JavaDialectRuntimeData) newData;
+
+        // First update the binary files
+        // @todo: this probably has issues if you add classes in the incorrect order - functions, rules, invokers.
+        for ( String resourceName : newJavaData.list() ) {
+            write( resourceName,
+                   newJavaData.read( resourceName ) );
+            //            // no need to wire, as we already know this is done in a merge
+            //            if ( getStore().put( resourceName,
+            //                                 newJavaData.read( resourceName ) ) != null ) {
+            //                // we are updating an existing class so reload();
+            //                this.dirty = true;
+            //            }
+            //            if ( this.dirty == false ) {
+            //                // only build up the wireList if we aren't going to reload
+            //                this.wireList.add( resourceName );
+            //            }
+        }
+
+        //        if ( this.dirty ) {
+        //            // no need to keep wireList if we are going to reload;
+        //            this.wireList.clear();
+        //        }
+
+        // Add invokers
+        putAllInvokers( newJavaData.getInvokers() );
+
+    }
+
+    public boolean isDirty() {
+        return this.dirty;
+    }
+
+    public void setDirty(boolean dirty) {
+        this.dirty = dirty;
+    }
+
     protected Map getStore() {
-        if (store == null) {
+        if ( store == null ) {
             store = new HashMap();
         }
         return store;
@@ -168,24 +240,6 @@
         remove( pkg.getName() + "." + StringUtils.ucFirst( function.getName() ) );
     }
 
-    public void merge(DialectRuntimeRegistry registry, DialectRuntimeData newData) {
-        JavaDialectRuntimeData newJavaData = (JavaDialectRuntimeData) newData;        
-
-        // First update the binary files
-        // @todo: this probably has issues if you add classes in the incorrect order - functions, rules, invokers.
-        for ( String file : newJavaData.list()) {
-            // no need to wire, as we already know this is done in a merge
-            if (getStore().put( file,
-                                newJavaData.read( file ) ) != null ) {
-                // we are updating an existing class so reload();
-                this.dirty = true;
-            }
-        }
-
-        // Add invokers
-        putAllInvokers( newJavaData.getInvokers() );
-    }
-
     private void removeClasses(final ConditionalElement ce) {
         if ( ce instanceof GroupElement ) {
             final GroupElement group = (GroupElement) ce;
@@ -216,8 +270,8 @@
     public byte[] read(final String resourceName) {
         byte[] bytes = null;
 
-        if ( !getStore().isEmpty()) {
-            bytes = (byte[])getStore().get( resourceName );
+        if ( !getStore().isEmpty() ) {
+            bytes = (byte[]) getStore().get( resourceName );
         }
         return bytes;
     }
@@ -226,23 +280,70 @@
                       final byte[] clazzData) throws RuntimeDroolsException {
         if ( getStore().put( resourceName,
                              clazzData ) != null ) {
-            // we are updating an existing class so reload();
-            //reload();
             this.dirty = true;
-        } else {
+
+            if ( !this.wireList.isEmpty() ) {
+                this.wireList.clear();
+            }
+        } else if ( !this.dirty ) {
             try {
-                wire( convertResourceToClassName( resourceName ) );
+                if ( this.wireList == Collections.<String> emptyList() ) {
+                    this.wireList = new ArrayList<String>();
+                }
+                this.wireList.add( resourceName );
             } catch ( final Exception e ) {
                 e.printStackTrace();
                 throw new RuntimeDroolsException( e );
             }
         }
+    }
 
+    public void wire(final String className) throws ClassNotFoundException,
+                                            InstantiationException,
+                                            IllegalAccessException {
+        final Object invoker = getInvokers().get( className );
+        wire( className,
+              invoker );
     }
 
+    public void wire(final String className,
+                     final Object invoker) throws ClassNotFoundException,
+                                          InstantiationException,
+                                          IllegalAccessException {
+        final Class clazz = this.rootClassLoader.loadClass( className );
+
+        if ( clazz != null ) {
+            if ( invoker instanceof Wireable ) {
+                ((Wireable) invoker).wire( clazz.newInstance() );
+            }
+            //
+            //if ( invoker instanceof ReturnValueRestriction ) {
+            //((ReturnValueRestriction) invoker).setReturnValueExpression( (ReturnValueExpression) clazz.newInstance() );
+            //} else if ( invoker instanceof PredicateConstraint ) {
+            //((PredicateConstraint) invoker).setPredicateExpression( (PredicateExpression) clazz.newInstance() );
+            //} else if ( invoker instanceof EvalCondition ) {
+            //((EvalCondition) invoker).setEvalExpression( (EvalExpression) clazz.newInstance() );
+            //} else if ( invoker instanceof Accumulate ) {
+            //((Accumulate) invoker).setAccumulator( (Accumulator) clazz.newInstance() );
+            //} else if ( invoker instanceof Rule ) {
+            //((Rule) invoker).setConsequence( (Consequence) clazz.newInstance() );
+            //} else if ( invoker instanceof JavaAccumulatorFunctionExecutor ) {
+            //((JavaAccumulatorFunctionExecutor) invoker).setExpression( (ReturnValueExpression) clazz.newInstance() );
+            //} else if ( invoker instanceof DroolsAction ) {
+            //((DroolsAction) invoker).setMetaData( "Action",
+            //              clazz.newInstance() );
+            //} else if ( invoker instanceof ReturnValueConstraintEvaluator ) {
+            //((ReturnValueConstraintEvaluator) invoker).setEvaluator( (ReturnValueEvaluator) clazz.newInstance() );
+            //}
+        } else {
+            throw new ClassNotFoundException( className );
+        }
+    }
+
     public boolean remove(final String resourceName) throws RuntimeDroolsException {
         getInvokers().remove( resourceName );
-        if (getStore().remove( convertClassToResourcePath( resourceName ) ) != null ) {
+        if ( getStore().remove( convertClassToResourcePath( resourceName ) ) != null ) {
+            this.wireList.remove( resourceName );
             // we need to make sure the class is removed from the classLoader
             // reload();
             this.dirty = true;
@@ -255,8 +356,8 @@
         String[] names = new String[getStore().size()];
         int i = 0;
 
-        for ( Object object : getStore().keySet()) {
-            names[i++] = (String)object;
+        for ( Object object : getStore().keySet() ) {
+            names[i++] = (String) object;
         }
         return names;
     }
@@ -267,9 +368,10 @@
      */
     public void reload() throws RuntimeDroolsException {
         // drops the classLoader and adds a new one
-        this.datas.removeClassLoader( this.classLoader );
-        this.classLoader = new PackageClassLoader( this.datas.getParentClassLoader(), this );
-        this.datas.addClassLoader( this.classLoader );
+        this.rootClassLoader.removeClassLoader( this.classLoader );
+        this.classLoader = new PackageClassLoader( this,
+                                                   this.rootClassLoader );
+        this.rootClassLoader.addClassLoader( this.classLoader );
 
         // Wire up invokers
         try {
@@ -286,64 +388,25 @@
             throw new RuntimeDroolsException( e );
         } catch ( final InstantiationException e ) {
             throw new RuntimeDroolsException( e );
-        } finally {
-            this.dirty = false;
-        }
+        } 
+        
+        this.dirty = false;
     }
 
     public void clear() {
         getStore().clear();
         getInvokers().clear();
-        this.AST = null;
         reload();
     }
 
-    public void wire(final String className) throws ClassNotFoundException,
-                                            InstantiationException,
-                                            IllegalAccessException {
-        final Object invoker = getInvokers().get( className );
-        wire( className,
-              invoker );
-    }
-
-    public void wire(final String className,
-                     final Object invoker) throws ClassNotFoundException,
-                                          InstantiationException,
-                                          IllegalAccessException {
-        final Class clazz = ((CompositePackageClassLoader)this.datas.getClassLoader()).findClass( className );
-
-        if (clazz != null) {
-            if ( invoker instanceof ReturnValueRestriction ) {
-                ((ReturnValueRestriction) invoker).setReturnValueExpression( (ReturnValueExpression) clazz.newInstance() );
-            } else if ( invoker instanceof PredicateConstraint ) {
-                ((PredicateConstraint) invoker).setPredicateExpression( (PredicateExpression) clazz.newInstance() );
-            } else if ( invoker instanceof EvalCondition ) {
-                ((EvalCondition) invoker).setEvalExpression( (EvalExpression) clazz.newInstance() );
-            } else if ( invoker instanceof Accumulate ) {
-                ((Accumulate) invoker).setAccumulator( (Accumulator) clazz.newInstance() );
-            } else if ( invoker instanceof Rule ) {
-                ((Rule) invoker).setConsequence( (Consequence) clazz.newInstance() );
-            } else if ( invoker instanceof JavaAccumulatorFunctionExecutor ) {
-                ((JavaAccumulatorFunctionExecutor) invoker).setExpression( (ReturnValueExpression) clazz.newInstance() );
-            } else if ( invoker instanceof DroolsAction ) {
-            	((DroolsAction) invoker).setMetaData( "Action", clazz.newInstance() );
-            } else if ( invoker instanceof ReturnValueConstraintEvaluator ) {
-                ((ReturnValueConstraintEvaluator) invoker).setEvaluator( (ReturnValueEvaluator) clazz.newInstance() );
-            }
-        }
-        else {
-            throw new ClassNotFoundException(className);
-        }
-    }
-
     public String toString() {
-        return this.getClass().getName() +getStore().toString();
+        return this.getClass().getName() + getStore().toString();
     }
 
     public void putInvoker(final String className,
                            final Object invoker) {
         getInvokers().put( className,
-                                 invoker );
+                           invoker );
     }
 
     public void putAllInvokers(final Map invokers) {
@@ -352,7 +415,7 @@
     }
 
     public Map getInvokers() {
-        if (this.invokerLookups == null) {
+        if ( this.invokerLookups == null ) {
             this.invokerLookups = new HashMap();
         }
         return this.invokerLookups;
@@ -362,75 +425,54 @@
         getInvokers().remove( className );
     }
 
-    public Object getAST() {
-        return this.AST;
-    }
-
-    public void setAST(final Object ast) {
-        this.AST = ast;
-    }
-
-    /**
-     * Lifted and adapted from Jakarta commons-jci
-     *
-     * @author mproctor
-     *
-     */
     public static class PackageClassLoader extends ClassLoader
         implements
         DroolsClassLoader {
-        private JavaDialectRuntimeData parent;
+        private JavaDialectRuntimeData store;
+        CompositeClassLoader           rootClassLoader;
 
-        public PackageClassLoader() {
+        public PackageClassLoader(JavaDialectRuntimeData store,
+                                  CompositeClassLoader rootClassLoader) {
+            super( rootClassLoader );
+            this.rootClassLoader = rootClassLoader;
+            this.store = store;
         }
 
-        public PackageClassLoader(final ClassLoader parentClassLoader, JavaDialectRuntimeData parent) {
-            super( parentClassLoader );
-            this.parent = parent;
-        }
-
         public Class fastFindClass(final String name) {
-            final Class clazz = findLoadedClass( name );
+            Class cls = findLoadedClass( name );
 
-            if ( clazz == null && parent != null) {
-                final byte[] clazzBytes = parent.read( convertClassToResourcePath( name ) );
+            if ( cls == null ) {
+                final byte[] clazzBytes = this.store.read( convertClassToResourcePath( name ) );
                 if ( clazzBytes != null ) {
-                    return defineClass( name,
-                                        clazzBytes,
-                                        0,
-                                        clazzBytes.length,
-                                        PROTECTION_DOMAIN );
+                    cls = defineClass( name,
+                                       clazzBytes,
+                                       0,
+                                       clazzBytes.length,
+                                       PROTECTION_DOMAIN );
                 }
             }
 
-            return clazz;
+            return cls;
         }
 
-        /**
-         * Javadocs recommend that this method not be overloaded. We overload this so that we can prioritise the fastFindClass
-         * over method calls to parent.loadClass(name, false); and c = findBootstrapClass0(name); which the default implementation
-         * would first - hence why we call it "fastFindClass" instead of standard findClass, this indicates that we give it a
-         * higher priority than normal.
-         *
-         */
-        protected synchronized Class loadClass(final String name,
-                                               final boolean resolve) throws ClassNotFoundException {
-            Class clazz = fastFindClass( name );
+        public synchronized Class loadClass(final String name,
+                                            final boolean resolve) throws ClassNotFoundException {
+            Class cls = fastFindClass( name );
 
-            if ( clazz == null ) {
+            if ( cls == null ) {
                 final ClassLoader parent = getParent();
                 if ( parent != null ) {
-                    clazz = Class.forName( name,
-                                           true,
-                                           parent );
+                    cls = Class.forName( name,
+                                         true,
+                                         parent );
                 }
             }
 
-            if ( resolve && clazz != null) {
-                resolveClass( clazz );
+            if ( resolve && cls != null ) {
+                resolveClass( cls );
             }
 
-            return clazz;
+            return cls;
         }
 
         protected Class findClass(final String name) throws ClassNotFoundException {
@@ -438,16 +480,11 @@
         }
 
         public InputStream getResourceAsStream(final String name) {
-            final byte[] bytes = (byte[]) parent.store.get( name );
-            if ( bytes != null ) {
-                return new ByteArrayInputStream( bytes );
-            } else {
-                InputStream input = this.getParent().getResourceAsStream( name );
-                if ( input == null ) {
-                    input = super.getResourceAsStream( name );
-                }
-                return input;
+            final byte[] clsBytes = this.store.read( name );
+            if ( clsBytes != null ) {
+                return new ByteArrayInputStream( clsBytes );
             }
+            return null;
         }
     }
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,29 +23,34 @@
 
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.AlphaNodeFieldConstraint;
 import org.drools.spi.Constraint;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldValue;
 import org.drools.spi.InternalReadAccessor;
+import org.drools.spi.ReadAccessor;
 
 public class LiteralConstraint
     implements
-    AlphaNodeFieldConstraint, Externalizable {
+    AlphaNodeFieldConstraint,
+    AcceptsReadAccessor,
+    Externalizable {
 
-    private static final long        serialVersionUID = 400L;
+    private static final long    serialVersionUID = 400L;
 
-    private InternalReadAccessor     extractor;
-    private LiteralRestriction restriction;
+    private InternalReadAccessor readAccesor;
+    private LiteralRestriction   restriction;
 
     public LiteralConstraint() {
-        this(null, null);
+        this( null,
+              null );
     }
 
     public LiteralConstraint(final InternalReadAccessor extractor,
                              final Evaluator evaluator,
                              final FieldValue field) {
-        this.extractor = extractor;
+        this.readAccesor = extractor;
         this.restriction = new LiteralRestriction( field,
                                                    evaluator,
                                                    extractor );
@@ -53,20 +58,25 @@
 
     public LiteralConstraint(final InternalReadAccessor extractor,
                              final LiteralRestriction restriction) {
-        this.extractor = extractor;
+        this.readAccesor = extractor;
         this.restriction = restriction;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        extractor   = (InternalReadAccessor)in.readObject();
-        restriction = (LiteralRestriction)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        readAccesor = (InternalReadAccessor) in.readObject();
+        restriction = (LiteralRestriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(extractor);
-        out.writeObject(restriction);
+        out.writeObject( readAccesor );
+        out.writeObject( restriction );
     }
 
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccesor = readAccessor;
+    }
+
     public Evaluator getEvaluator() {
         return this.restriction.getEvaluator();
     }
@@ -76,7 +86,7 @@
     }
 
     public InternalReadAccessor getFieldExtractor() {
-        return this.extractor;
+        return this.readAccesor;
     }
 
     /**
@@ -96,21 +106,21 @@
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
-                             final ContextEntry ctx ) {
-        return this.restriction.isAllowed( this.extractor,
+                             final ContextEntry ctx) {
+        return this.restriction.isAllowed( this.readAccesor,
                                            handle,
                                            workingMemory,
                                            ctx );
     }
 
     public String toString() {
-        return "[LiteralConstraint fieldExtractor=" + this.extractor + " evaluator=" + getEvaluator() + " value=" + getField() + "]";
+        return "[LiteralConstraint fieldExtractor=" + this.readAccesor + " evaluator=" + getEvaluator() + " value=" + getField() + "]";
     }
 
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
-        result = PRIME * result + this.extractor.hashCode();
+        result = PRIME * result + this.readAccesor.hashCode();
         result = PRIME * result + this.restriction.hashCode();
         return result;
     }
@@ -124,11 +134,11 @@
         }
         final LiteralConstraint other = (LiteralConstraint) object;
 
-        return this.extractor.equals( other.extractor ) && this.restriction.equals( other.restriction );
+        return this.readAccesor.equals( other.readAccesor ) && this.restriction.equals( other.restriction );
     }
 
     public Object clone() {
-        return new LiteralConstraint( this.extractor,
+        return new LiteralConstraint( this.readAccesor,
                                       this.getEvaluator(),
                                       this.getField() );
     }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralRestriction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -24,6 +24,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.FieldValue;
 import org.drools.spi.InternalReadAccessor;
@@ -31,20 +32,24 @@
 
 public class LiteralRestriction
     implements
-    Restriction, Externalizable {
+    Restriction,
+    AcceptsReadAccessor,    
+    Externalizable {
 
     private static final long          serialVersionUID     = 400L;
 
-    private FieldValue           field;
+    private FieldValue                 field;
 
-    private Evaluator            evaluator;
+    private Evaluator                  evaluator;
 
-    private InternalReadAccessor       extractor;
+    private InternalReadAccessor       readAccessor;
 
     private static final Declaration[] requiredDeclarations = new Declaration[0];
 
     public LiteralRestriction() {
-        this(null, null, null);
+        this( null,
+              null,
+              null );
     }
 
     public LiteralRestriction(final FieldValue field,
@@ -52,20 +57,26 @@
                               final InternalReadAccessor fieldExtractor) {
         this.field = field;
         this.evaluator = evaluator;
-        this.extractor = fieldExtractor;
+        this.readAccessor = fieldExtractor;
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        field   = (FieldValue)in.readObject();
-        evaluator   = (Evaluator)in.readObject();
-        extractor   = (InternalReadAccessor)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        field = (FieldValue) in.readObject();
+        evaluator = (Evaluator) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(field);
-        out.writeObject(evaluator);
-        out.writeObject(extractor);
+        out.writeObject( field );
+        out.writeObject( evaluator );
+        out.writeObject( readAccessor );
     }
+
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }    
+    
     public Evaluator getEvaluator() {
         return this.evaluator;
     }
@@ -74,12 +85,12 @@
         return this.field;
     }
 
-    public boolean isAllowed(final InternalReadAccessor extractor,
+    public boolean isAllowed(final InternalReadAccessor readAccessor,
                              final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemoiry,
-                             final ContextEntry context ) {
+                             final ContextEntry context) {
         return this.evaluator.evaluate( null,
-                                        extractor,
+                                        this.readAccessor,
                                         handle.getObject(),
                                         this.field );
     }
@@ -138,23 +149,23 @@
     }
 
     public ContextEntry createContextEntry() {
-        return new LiteralContextEntry( this.extractor );
+        return new LiteralContextEntry( this.readAccessor );
     }
 
     public Object clone() {
         return new LiteralRestriction( this.field,
                                        this.evaluator,
-                                       this.extractor );
+                                       this.readAccessor );
     }
 
     private static class LiteralContextEntry
         implements
         ContextEntry {
 
-        private static final long serialVersionUID = 2621864784428098347L;
-        public InternalReadAccessor     extractor;
-        public Object             object;
-        public ContextEntry       next;
+        private static final long   serialVersionUID = 2621864784428098347L;
+        public InternalReadAccessor extractor;
+        public Object               object;
+        public ContextEntry         next;
 
         public LiteralContextEntry() {
         }
@@ -163,16 +174,17 @@
             this.extractor = extractor;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            extractor   = (InternalReadAccessor)in.readObject();
-            object      = in.readObject();
-            next        = (ContextEntry)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            extractor = (InternalReadAccessor) in.readObject();
+            object = in.readObject();
+            next = (ContextEntry) in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(extractor);
-            out.writeObject(object);
-            out.writeObject(next);
+            out.writeObject( extractor );
+            out.writeObject( object );
+            out.writeObject( next );
         }
 
         public InternalReadAccessor getFieldExtractor() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectRuntimeData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectRuntimeData.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectRuntimeData.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -5,101 +5,191 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
+import org.drools.base.mvel.MVELCompilationUnit;
+import org.drools.base.mvel.MVELCompileable;
+import org.drools.spi.Wireable;
 import org.mvel.ast.Function;
 import org.mvel.integration.VariableResolver;
 import org.mvel.integration.impl.MapVariableResolverFactory;
 
-public class MVELDialectRuntimeData implements DialectRuntimeData, Externalizable {
-	private MapFunctionResolverFactory functionFactory;
+public class MVELDialectRuntimeData
+    implements
+    DialectRuntimeData,
+    Externalizable {
+    private MapFunctionResolverFactory     functionFactory;
 
-	/**
-	 * Default constructor - for Externalizable. This should never be used by a
-	 * user, as it will result in an invalid state for the instance.
-	 */
-	public MVELDialectRuntimeData() {
-	}
+    private Map<Wireable, MVELCompileable> invokerLookups;
 
-	public MVELDialectRuntimeData(final DialectRuntimeRegistry datas) {
-		this.functionFactory = new MapFunctionResolverFactory();
-	}
+    private CompositeClassLoader           rootClassLoader;
 
-    public DialectRuntimeData clone(DialectRuntimeRegistry registry) {
-        DialectRuntimeData clone = new MVELDialectRuntimeData(registry);
-        clone.merge(registry, this);
+    private List<Wireable>                 wireList = Collections.<Wireable> emptyList();
+
+    public MVELDialectRuntimeData() {
+        this.functionFactory = new MapFunctionResolverFactory();
+        invokerLookups = new HashMap<Wireable, MVELCompileable>();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( invokerLookups );
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        invokerLookups = (Map<Wireable, MVELCompileable>) in.readObject();
+        if ( !invokerLookups.isEmpty() ) {
+            // we need a wireList for serialisation
+            wireList = new ArrayList<Wireable>( invokerLookups.keySet() );          
+        }
+    }
+
+    public void merge(DialectRuntimeRegistry registry,
+                      DialectRuntimeData newData) {
+        MVELDialectRuntimeData other = (MVELDialectRuntimeData) newData;
+        for ( Entry<Wireable, MVELCompileable> entry : other.invokerLookups.entrySet() ) {
+            invokerLookups.put( entry.getKey(),
+                                entry.getValue() );
+
+            if ( this.wireList == Collections.<Wireable> emptyList() ) {
+                this.wireList = new ArrayList<Wireable>();
+            }
+            wireList.add( entry.getKey() );
+            //            // first make sure the MVELCompilationUnit is compiled            
+            //            MVELCompilable component = entry.getValue();
+            //            component.compile( rootClassLoader );
+            //            
+            //            // now wire up the target
+            //            Wireable target = entry.getKey();
+            //            target.wire( component );   
+            //            System.out.println( component );
+        }
+    }
+
+    public DialectRuntimeData clone(DialectRuntimeRegistry registry,
+                                    CompositeClassLoader rootClassLoader) {
+        DialectRuntimeData clone = new MVELDialectRuntimeData();
+        clone.merge( registry,
+                     this );
+        clone.onAdd( registry,
+                     rootClassLoader );
         return clone;
     }
 
-	public MapFunctionResolverFactory getFunctionFactory() {
-		return this.functionFactory;
-	}
+    public void onAdd(DialectRuntimeRegistry registry,
+                      CompositeClassLoader rootClassLoader) {
+        this.rootClassLoader = rootClassLoader;
 
-	public void removeRule(Package pkg, Rule rule) {
-	}
+        //        for (Entry<Wireable, MVELCompilable> entry : this.invokerLookups.entrySet() ) {
+        //            // first make sure the MVELCompilationUnit is compiled            
+        //            MVELCompilable component = entry.getValue();
+        //            component.compile( rootClassLoader );
+        //            
+        //            // now wire up the target
+        //            Wireable target = entry.getKey();
+        //            target.wire( component );
+        //        }
+    }
 
-	public void addFunction(Function function) {
-		this.functionFactory.addFunction(function);
-	}
+    public void onRemove() {
 
-	public void removeFunction(Package pkg, org.drools.rule.Function function) {
-		this.functionFactory.removeFunction(function.getName());
+    }
 
-	}
+    public void onBeforeExecute() {
+        for ( Wireable target : wireList ) {
+            MVELCompileable compileable = invokerLookups.get( target );
+            compileable.compile( rootClassLoader );
 
-	public boolean isDirty() {
-		return false;
-	}
+            // now wire up the target
+            target.wire( compileable );
+        }
+        wireList.clear();
+    }
 
-    public void setDirty(boolean dirty) {
+    public MapFunctionResolverFactory getFunctionFactory() {
+        return this.functionFactory;
     }
 
-    public void merge(DialectRuntimeRegistry registry, DialectRuntimeData newData) {
-	}
+    public void removeRule(Package pkg,
+                           Rule rule) {
+    }
 
-	public void reload() {
-	}
+    public void addFunction(Function function) {
+        this.functionFactory.addFunction( function );
+    }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+    public void removeFunction(Package pkg,
+                               org.drools.rule.Function function) {
+        this.functionFactory.removeFunction( function.getName() );
+
     }
 
-    public void writeExternal(ObjectOutput out) throws IOException {
+    public boolean isDirty() {
+        return false;
     }
 
-    public static class MapFunctionResolverFactory extends
-                                                   MapVariableResolverFactory implements Externalizable {
+    public void setDirty(boolean dirty) {
+    }
 
+    public void reload() {
+    }
+
+    public static class MapFunctionResolverFactory extends MapVariableResolverFactory
+        implements
+        Externalizable {
+
         public MapFunctionResolverFactory() {
-            super(new HashMap<String, Object>());
+            super( new HashMap<String, Object>() );
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
             out.writeObject( this.variables );
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            this.variables = ( Map ) in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            this.variables = (Map) in.readObject();
         }
 
         public void addFunction(Function function) {
-            this.variables.put(function.getName(), function);
+            this.variables.put( function.getName(),
+                                function );
         }
 
         public void removeFunction(String functionName) {
-            this.variables.remove(functionName);
-            this.variableResolvers.remove(functionName);
+            this.variables.remove( functionName );
+            this.variableResolvers.remove( functionName );
         }
 
-        public VariableResolver createVariable(String name, Object value) {
-            throw new RuntimeException(
-                    "variable is a read-only function pointer");
+        public VariableResolver createVariable(String name,
+                                               Object value) {
+            throw new RuntimeException( "variable is a read-only function pointer" );
         }
 
-        public VariableResolver createIndexedVariable(int index, String name,
-                                                      Object value, Class<?> type) {
-            throw new RuntimeException(
-                    "variable is a read-only function pointer");
+        public VariableResolver createIndexedVariable(int index,
+                                                      String name,
+                                                      Object value,
+                                                      Class< ? > type) {
+            throw new RuntimeException( "variable is a read-only function pointer" );
         }
     }
+
+    public void addCompileable(Wireable wireable,
+                              MVELCompileable compilable) {
+//        if ( this.wireList == Collections.<Wireable> emptyList() ) {
+//            this.wireList = new ArrayList<Wireable>();
+//        }
+//        wireList.add( wireable );
+        invokerLookups.put( wireable,
+                            compilable );
+    }
+
+    public Map<Wireable, MVELCompileable> getLookup() {
+        return this.invokerLookups;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -84,8 +84,8 @@
      * higher priority than normal.
      *
      */
-    protected synchronized Class loadClass(final String name,
-                                           final boolean resolve) throws ClassNotFoundException {
+    public synchronized Class loadClass(final String name,
+                                        final boolean resolve) throws ClassNotFoundException {
         Class clazz = fastFindClass( name );
 
         if ( clazz == null ) {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -7,15 +7,18 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ReadAccessor;
 import org.drools.spi.Restriction;
 
-public class MultiRestrictionFieldConstraint extends MutableTypeConstraint {
+public class MultiRestrictionFieldConstraint extends MutableTypeConstraint
+    implements
+    AcceptsReadAccessor {
 
     private static final long    serialVersionUID = 400L;
 
-    private InternalReadAccessor extractor;
+    private InternalReadAccessor readAccessor;
 
     private Restriction          restrictions;
 
@@ -25,25 +28,29 @@
 
     public MultiRestrictionFieldConstraint(final InternalReadAccessor extractor,
                                            final Restriction restrictions) {
-        this.extractor = extractor;
+        this.readAccessor = extractor;
         this.restrictions = restrictions;
     }
 
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
         super.readExternal( in );
-        extractor = (InternalReadAccessor) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
         restrictions = (Restriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
         super.writeExternal( out );
-        out.writeObject( extractor );
+        out.writeObject( readAccessor );
         out.writeObject( restrictions );
     }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }        
 
     public ReadAccessor getFieldExtractor() {
-        return this.extractor;
+        return this.readAccessor;
     }
 
     public Declaration[] getRequiredDeclarations() {
@@ -57,13 +64,13 @@
     }
 
     public String toString() {
-        return "[MultiRestrictionConstraint fieldExtractor=" + this.extractor + " restrictions =" + this.restrictions + "]";
+        return "[MultiRestrictionConstraint fieldExtractor=" + this.readAccessor + " restrictions =" + this.restrictions + "]";
     }
 
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
-        result = PRIME * this.extractor.hashCode();
+        result = PRIME * this.readAccessor.hashCode();
         result = PRIME * this.restrictions.hashCode();
         return result;
     }
@@ -77,13 +84,13 @@
         }
         final MultiRestrictionFieldConstraint other = (MultiRestrictionFieldConstraint) object;
 
-        return this.extractor.equals( other.extractor ) && this.restrictions.equals( other.restrictions );
+        return this.readAccessor.equals( other.readAccessor ) && this.restrictions.equals( other.restrictions );
     }
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context) {
-        return this.restrictions.isAllowed( this.extractor,
+        return this.restrictions.isAllowed( this.readAccessor,
                                             handle,
                                             workingMemory,
                                             context );
@@ -106,7 +113,7 @@
     }
 
     public Object clone() {
-        return new MultiRestrictionFieldConstraint( this.extractor,
+        return new MultiRestrictionFieldConstraint( this.readAccessor,
                                                     (Restriction) this.restrictions.clone() );
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,9 +26,13 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
+import org.drools.base.ClassObjectType;
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.DroolsObjectOutputStream;
 import org.drools.facttemplates.FactTemplate;
@@ -71,7 +75,7 @@
 
     private Set                            staticImports;
 
-    private Map<String, Class>             globals;
+    private Map<String, String>            globals;
 
     private Map                            factTemplates;
 
@@ -81,6 +85,8 @@
     private DialectRuntimeRegistry         dialectRuntimeRegistry;
 
     private Map<String, TypeDeclaration>   typeDeclarations;
+    
+    private ClassFieldAccessorStore       classFieldAccessorStore;
 
     /**
      * This is to indicate the the package has no errors during the
@@ -94,11 +100,6 @@
      */
     private String                         errorSummary;
 
-    /**
-     * A class loader for package scoped artifacts
-     */
-    private transient MapBackedClassLoader packageScopeClassLoader;
-
     // ------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------
@@ -118,18 +119,6 @@
      *            The name of this <code>Package</code>.
      */
     public Package(final String name) {
-        this( name,
-              null );
-    }
-
-    /**
-     * Construct.
-     * 
-     * @param name
-     *            The name of this <code>Package</code>.
-     */
-    public Package(final String name,
-                   ClassLoader parentClassLoader) {
         this.name = name;
         this.imports = new HashMap<String, ImportDeclaration>();
         this.typeDeclarations = new HashMap<String, TypeDeclaration>();
@@ -138,56 +127,12 @@
         this.ruleFlows = Collections.EMPTY_MAP;
         this.globals = Collections.EMPTY_MAP;
         this.factTemplates = Collections.EMPTY_MAP;
-        this.functions = Collections.EMPTY_MAP;
+        this.functions = Collections.EMPTY_MAP;     
+        this.dialectRuntimeRegistry = new DialectRuntimeRegistry( );
+        this.classFieldAccessorStore = new ClassFieldAccessorStore();
+    }   
 
-        // This classloader test should only be here for unit testing, too much
-        // legacy api to want to change by hand at the moment
-        if ( parentClassLoader == null ) {
-            parentClassLoader = Thread.currentThread().getContextClassLoader();
-            if ( parentClassLoader == null ) {
-                parentClassLoader = getClass().getClassLoader();
-            }
-        }
-        this.packageScopeClassLoader = new MapBackedClassLoader( parentClassLoader );
-        this.dialectRuntimeRegistry = new DialectRuntimeRegistry( this.packageScopeClassLoader );
-    }
-
     /**
-     * Construct.
-     * 
-     * @param name
-     *            The name of this <code>Package</code>.
-     */
-    public Package(final String name,
-                   final MapBackedClassLoader packageClassLoader) {
-        this.name = name;
-        this.imports = new HashMap<String, ImportDeclaration>();
-        this.typeDeclarations = new HashMap<String, TypeDeclaration>();
-        this.staticImports = Collections.EMPTY_SET;
-        this.rules = new LinkedHashMap();
-        this.ruleFlows = Collections.EMPTY_MAP;
-        this.globals = Collections.EMPTY_MAP;
-        this.factTemplates = Collections.EMPTY_MAP;
-        this.functions = Collections.EMPTY_MAP;
-
-        if ( packageClassLoader == null ) {
-            ClassLoader parentClassLoader = null;
-            // This classloader test should only be here for unit testing, too much
-            // legacy api to want to change by hand at the moment
-            if ( parentClassLoader == null ) {
-                parentClassLoader = Thread.currentThread().getContextClassLoader();
-                if ( parentClassLoader == null ) {
-                    parentClassLoader = getClass().getClassLoader();
-                }
-            }
-            this.packageScopeClassLoader = new MapBackedClassLoader( parentClassLoader );
-        } else {
-            this.packageScopeClassLoader = packageClassLoader;
-        }
-        this.dialectRuntimeRegistry = new DialectRuntimeRegistry( this.packageScopeClassLoader );
-    }
-
-    /**
      * Handles the write serialization of the Package. Patterns in Rules may
      * reference generated data which cannot be serialized by default methods.
      * The Package uses PackageCompilationData to hold a reference to the
@@ -210,7 +155,6 @@
             bytes = new ByteArrayOutputStream();
             out = new DroolsObjectOutputStream( bytes );
         }
-        out.writeObject( this.packageScopeClassLoader.getStore() );
         out.writeObject( this.dialectRuntimeRegistry );
         out.writeObject( this.typeDeclarations );
         out.writeObject( this.name );
@@ -222,6 +166,7 @@
         out.writeObject( this.globals );
         out.writeBoolean( this.valid );
         out.writeObject( this.rules );
+        out.writeObject( this.classFieldAccessorStore );
         // writing the whole stream as a byte array
         if ( !isDroolsStream ) {
             bytes.flush();
@@ -249,13 +194,7 @@
         boolean isDroolsStream = stream instanceof DroolsObjectInputStream;
         DroolsObjectInputStream in = isDroolsStream ? (DroolsObjectInputStream) stream : new DroolsObjectInputStream( new ByteArrayInputStream( (byte[]) stream.readObject() ) );
 
-        // creating package scoped classloader
-        Map store = (Map) in.readObject();
-        this.packageScopeClassLoader = new MapBackedClassLoader( in.getClassLoader(),
-                                                                 store );
-
         // setting parent classloader for dialect datas
-        in.setClassLoader( this.packageScopeClassLoader );
         this.dialectRuntimeRegistry = (DialectRuntimeRegistry) in.readObject();
 
         this.typeDeclarations = (Map) in.readObject();
@@ -265,13 +204,10 @@
         this.functions = (Map<String, Function>) in.readObject();
         this.factTemplates = (Map) in.readObject();
         this.ruleFlows = (Map) in.readObject();
-        this.globals = (Map<String, Class>) in.readObject();
+        this.globals = (Map<String, String>) in.readObject();
         this.valid = in.readBoolean();
         this.rules = (Map) in.readObject();
-
-        // restoring original parent classloader
-        in.setClassLoader( this.packageScopeClassLoader.getParent() );
-
+        this.classFieldAccessorStore = ( ClassFieldAccessorStore ) in.readObject();
         if ( !isDroolsStream ) {
             in.close();
         }
@@ -355,18 +291,24 @@
 
     public void addGlobal(final String identifier,
                           final Class clazz) {
+        addGlobal( identifier,
+                   clazz.getName() );
+    }
+    
+    public void addGlobal(final String identifier,
+                          final String className) {
         if ( this.globals == Collections.EMPTY_MAP ) {
-            this.globals = new HashMap<String, Class>( 1 );
+            this.globals = new HashMap<String, String>( 1 );
         }
         this.globals.put( identifier,
-                          clazz );
-    }
+                          className );
+    }    
 
     public void removeGlobal(final String identifier) {
         this.globals.remove( identifier );
     }
 
-    public Map<String, Class> getGlobals() {
+    public Map<String, String> getGlobals() {
         return this.globals;
     }
 
@@ -612,7 +554,12 @@
         return decl != null ? decl.getTypeClassDef() : null;
     }
 
-    public MapBackedClassLoader getPackageScopeClassLoader() {
-        return packageScopeClassLoader;
+    public ClassFieldAccessorStore getClassFieldAccessorStore() {
+        return classFieldAccessorStore;
     }
+
+    public void setClassFieldAccessorCache(ClassFieldAccessorCache classFieldAccessorCache) {
+        this.classFieldAccessorStore.setClassFieldAccessorCache( classFieldAccessorCache );
+    }
+        
 }
\ No newline at end of file

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Pattern.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,19 +16,20 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.io.Externalizable;
-import java.io.ObjectOutput;
-import java.io.ObjectInput;
-import java.io.IOException;
 
+import org.drools.base.ClassObjectType;
+import org.drools.spi.AcceptsClassObjectType;
 import org.drools.spi.Constraint;
-import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PatternExtractor;
 import org.drools.spi.Constraint.ConstraintType;
@@ -36,6 +37,7 @@
 public class Pattern
     implements
     RuleConditionElement,
+    AcceptsClassObjectType,
     Externalizable {
     /**
      *
@@ -129,6 +131,10 @@
         out.writeObject( source );
         out.writeInt( offset );
     }
+    
+    public void setClassObjectType(ClassObjectType objectType) {
+        this.objectType = objectType;
+    }
 
     public Object clone() {
         final String identifier = (this.declaration != null) ? this.declaration.getIdentifier() : null;
@@ -145,8 +151,7 @@
             final Object constr = it.next();
             if ( constr instanceof Declaration ) {
                 final Declaration decl = (Declaration) constr;
-                clone.addDeclaration( decl.getIdentifier(),
-                                      decl.getExtractor() );
+                clone.addDeclaration( decl.getIdentifier() ).setReadAccessor( decl.getExtractor() );
             } else {
                 Constraint constraint = (Constraint) ((Constraint) constr).clone();
 
@@ -177,6 +182,10 @@
     public ObjectType getObjectType() {
         return this.objectType;
     }
+    
+    public void setObjectType(ObjectType objectType) {
+        this.objectType = objectType;
+    }
 
     public PatternSource getSource() {
         return source;
@@ -200,8 +209,7 @@
         this.constraints.add( constraint );
     }
 
-    public Declaration addDeclaration(final String identifier,
-                                      final InternalReadAccessor extractor) {
+    public Declaration addDeclaration(final String identifier) {
         if ( this.constraints == Collections.EMPTY_LIST ) {
             this.constraints = new ArrayList( 1 );
         }
@@ -209,7 +217,6 @@
         Declaration declaration = this.declarations != null ? (Declaration) this.declarations.get( identifier ) : null;
         if ( declaration == null ) {
             declaration = new Declaration( identifier,
-                                           extractor,
                                            this );
             this.constraints.add( declaration );
             if ( this.declarations == null ) {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,7 +16,10 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.io.Externalizable;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -26,9 +29,11 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.PredicateExpression;
 import org.drools.spi.Restriction;
+import org.drools.spi.Wireable;
 
 /**
  * A predicate can be written as a top level constraint or be nested
@@ -39,7 +44,9 @@
  */
 public class PredicateConstraint extends MutableTypeConstraint
     implements
-    Restriction, Externalizable {
+    Restriction,
+    Wireable,
+    Externalizable {
 
     /**
      *
@@ -48,19 +55,21 @@
 
     private PredicateExpression        expression;
 
-    private Declaration[]        requiredDeclarations;
+    private Declaration[]              requiredDeclarations;
 
-    private Declaration[]        previousDeclarations;
+    private Declaration[]              previousDeclarations;
 
-    private Declaration[]        localDeclarations;
+    private Declaration[]              localDeclarations;
 
-    private String[]             requiredGlobals;
+    private String[]                   requiredGlobals;
 
+    private List<PredicateConstraint>  cloned             = Collections.<PredicateConstraint> emptyList();
+
     private static final Declaration[] EMPTY_DECLARATIONS = new Declaration[0];
     private static final String[]      EMPTY_GLOBALS      = new String[0];
 
     public PredicateConstraint() {
-        this(null);
+        this( null );
     }
 
     public PredicateConstraint(final PredicateExpression evaluator) {
@@ -116,21 +125,29 @@
                           this.localDeclarations.length );
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        super.readExternal(in);
-        expression  = (PredicateExpression)in.readObject();
-        requiredDeclarations  = (Declaration[])in.readObject();
-        previousDeclarations  = (Declaration[])in.readObject();
-        localDeclarations  = (Declaration[])in.readObject();
-        requiredGlobals  = (String[])in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        super.readExternal( in );
+        this.expression = (PredicateExpression) in.readObject();
+        this.requiredDeclarations = (Declaration[]) in.readObject();
+        this.previousDeclarations = (Declaration[]) in.readObject();
+        this.localDeclarations = (Declaration[]) in.readObject();
+        this.requiredGlobals = (String[]) in.readObject();
+        this.cloned = (List<PredicateConstraint>) in.readObject();
     }
+
     public void writeExternal(ObjectOutput out) throws IOException {
-        super.writeExternal(out);
-        out.writeObject(expression);
-        out.writeObject(requiredDeclarations);
-        out.writeObject(previousDeclarations);
-        out.writeObject(localDeclarations);
-        out.writeObject(requiredGlobals);
+        super.writeExternal( out );
+        if ( this.expression instanceof CompiledInvoker ) {
+            out.writeObject( null );
+        } else {
+            out.writeObject( this.expression );
+        }
+        out.writeObject( this.requiredDeclarations );
+        out.writeObject( this.previousDeclarations );
+        out.writeObject( this.localDeclarations );
+        out.writeObject( this.requiredGlobals );
+        out.writeObject( this.cloned );
     }
 
     public Declaration[] getRequiredDeclarations() {
@@ -164,6 +181,13 @@
         }
     }
 
+    public void wire(Object object) {
+        setPredicateExpression( (PredicateExpression) object );
+        for ( PredicateConstraint clone : this.cloned ) {
+            clone.wire( object );
+        }
+    }
+
     public void setPredicateExpression(final PredicateExpression expression) {
         this.expression = expression;
     }
@@ -239,7 +263,7 @@
 
     public boolean isAllowed(final InternalFactHandle handle,
                              final InternalWorkingMemory workingMemory,
-                             final ContextEntry ctx ) {
+                             final ContextEntry ctx) {
         try {
             return this.expression.evaluate( handle.getObject(),
                                              null,
@@ -256,8 +280,8 @@
     public boolean isAllowed(InternalReadAccessor extractor,
                              InternalFactHandle handle,
                              InternalWorkingMemory workingMemory,
-                             ContextEntry context ) {
-        throw new UnsupportedOperationException("Method not supported. Please contact development team.");
+                             ContextEntry context) {
+        throw new UnsupportedOperationException( "Method not supported. Please contact development team." );
     }
 
     public boolean isAllowedCachedLeft(final ContextEntry context,
@@ -303,10 +327,19 @@
             local[i] = (Declaration) this.localDeclarations[i].clone();
         }
 
-        return new PredicateConstraint( this.expression,
-                                        previous,
-                                        local,
-                                        this.requiredGlobals );
+        PredicateConstraint clone = new PredicateConstraint( this.expression,
+                                                             previous,
+                                                             local,
+                                                             this.requiredGlobals );
+
+        if ( this.cloned == Collections.EMPTY_LIST ) {
+            this.cloned = new ArrayList<PredicateConstraint>( 1 );
+        }
+
+        this.cloned.add( clone );
+
+        return clone;
+
     }
 
     public static class PredicateContextEntry
@@ -326,22 +359,23 @@
         public PredicateContextEntry() {
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            leftTuple   = (LeftTuple)in.readObject();
-            rightObject   = in.readObject();
-            workingMemory   = (InternalWorkingMemory)in.readObject();
-            dialectContext   = in.readObject();
-            entry   = (ContextEntry)in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            leftTuple = (LeftTuple) in.readObject();
+            rightObject = in.readObject();
+            workingMemory = (InternalWorkingMemory) in.readObject();
+            dialectContext = in.readObject();
+            entry = (ContextEntry) in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(leftTuple);
-            out.writeObject(rightObject);
-            out.writeObject(workingMemory);
-            out.writeObject(dialectContext);
-            out.writeObject(entry);
+            out.writeObject( leftTuple );
+            out.writeObject( rightObject );
+            out.writeObject( workingMemory );
+            out.writeObject( dialectContext );
+            out.writeObject( entry );
         }
-        
+
         public ContextEntry getNext() {
             return this.entry;
         }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,17 +26,19 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
 import org.drools.rule.ReturnValueRestriction.ReturnValueContextEntry;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ReturnValueExpression;
 
 public class ReturnValueConstraint extends MutableTypeConstraint
     implements
+    AcceptsReadAccessor,
     Externalizable {
 
     private static final long      serialVersionUID = 400L;
 
-    private InternalReadAccessor   fieldExtractor;
+    private InternalReadAccessor   readAccessor;
     private ReturnValueRestriction restriction;
 
     public ReturnValueConstraint() {
@@ -46,22 +48,26 @@
 
     public ReturnValueConstraint(final InternalReadAccessor fieldExtractor,
                                  final ReturnValueRestriction restriction) {
-        this.fieldExtractor = fieldExtractor;
+        this.readAccessor = fieldExtractor;
         this.restriction = restriction;
     }
 
     public void readExternal(ObjectInput in) throws IOException,
                                             ClassNotFoundException {
         super.readExternal( in );
-        fieldExtractor = (InternalReadAccessor) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
         restriction = (ReturnValueRestriction) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
         super.writeExternal( out );
-        out.writeObject( fieldExtractor );
+        out.writeObject( readAccessor );
         out.writeObject( restriction );
     }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }    
 
     public Declaration[] getRequiredDeclarations() {
         return this.restriction.getRequiredDeclarations();
@@ -86,13 +92,13 @@
     }
 
     public String toString() {
-        return "[ReturnValueConstraint fieldExtractor=" + this.fieldExtractor + " evaluator=" + getEvaluator() + " declarations=" + getRequiredDeclarations() + "]";
+        return "[ReturnValueConstraint fieldExtractor=" + this.readAccessor + " evaluator=" + getEvaluator() + " declarations=" + getRequiredDeclarations() + "]";
     }
 
     public int hashCode() {
         final int PRIME = 31;
         int result = 1;
-        result = PRIME * result + this.fieldExtractor.hashCode();
+        result = PRIME * result + this.readAccessor.hashCode();
         result = PRIME * result + this.restriction.hashCode();
         return result;
     }
@@ -108,7 +114,7 @@
 
         final ReturnValueConstraint other = (ReturnValueConstraint) object;
 
-        return this.fieldExtractor.equals( other.fieldExtractor ) && this.restriction.equals( other.restriction );
+        return this.readAccessor.equals( other.readAccessor ) && this.restriction.equals( other.restriction );
     }
 
     public ContextEntry createContextEntry() {
@@ -119,7 +125,7 @@
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context) {
         try {
-            return this.restriction.isAllowed( this.fieldExtractor,
+            return this.restriction.isAllowed( this.readAccessor,
                                                handle,
                                                null,
                                                workingMemory,
@@ -134,7 +140,7 @@
                                        final InternalFactHandle handle) {
         try {
             final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
-            return this.restriction.isAllowed( this.fieldExtractor,
+            return this.restriction.isAllowed( this.readAccessor,
                                                handle,
                                                ctx.getTuple(),
                                                ctx.getWorkingMemory(),
@@ -149,7 +155,7 @@
                                         final ContextEntry context) {
         try {
             final ReturnValueContextEntry ctx = (ReturnValueContextEntry) context;
-            return this.restriction.isAllowed( this.fieldExtractor,
+            return this.restriction.isAllowed( this.readAccessor,
                                                ctx.getHandle(),
                                                tuple,
                                                ctx.getWorkingMemory(),
@@ -161,7 +167,7 @@
     }
 
     public Object clone() {
-        return new ReturnValueConstraint( this.fieldExtractor,
+        return new ReturnValueConstraint( this.readAccessor,
                                           (ReturnValueRestriction) this.restriction.clone() );
     }
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueRestriction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,7 +16,10 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.io.Externalizable;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -27,42 +30,49 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.AcceptsReadAccessor;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.Evaluator;
 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;
+import org.drools.spi.Wireable;
 
 public class ReturnValueRestriction
     implements
-    Restriction {
+    Restriction,
+    AcceptsReadAccessor,
+    Wireable {
 
-    private static final long          serialVersionUID       = 400L;
+    private static final long            serialVersionUID       = 400L;
 
-    private ReturnValueExpression      expression;
+    private ReturnValueExpression        expression;
 
-    private Declaration[]        requiredDeclarations;
+    private Declaration[]                requiredDeclarations;
 
-    private String[]             requiredGlobals;
+    private String[]                     requiredGlobals;
 
-    private Declaration[]        previousDeclarations;
+    private Declaration[]                previousDeclarations;
 
-    private Declaration[]        localDeclarations;
+    private Declaration[]                localDeclarations;
 
-    private Evaluator            evaluator;
+    private Evaluator                    evaluator;
 
-    private ReadAccessor       extractor;
+    private InternalReadAccessor         readAccessor;
 
-    private static final Declaration[] noRequiredDeclarations = new Declaration[]{};
+    private static final Declaration[]   noRequiredDeclarations = new Declaration[]{};
 
-    private static final String[]      noRequiredGlobals      = new String[]{};
+    private static final String[]        noRequiredGlobals      = new String[]{};
 
+    private List<ReturnValueRestriction> cloned                 = Collections.<ReturnValueRestriction> emptyList();
+
     public ReturnValueRestriction() {
 
     }
 
-    public ReturnValueRestriction(final ReadAccessor fieldExtractor,
+    public ReturnValueRestriction(final InternalReadAccessor fieldExtractor,
                                   final Declaration[] previousDeclarations,
                                   final Declaration[] localDeclarations,
                                   final String[] requiredGlobals,
@@ -75,14 +85,14 @@
               evaluator );
     }
 
-    public ReturnValueRestriction(final ReadAccessor fieldExtractor,
+    public ReturnValueRestriction(final InternalReadAccessor fieldExtractor,
                                   final ReturnValueExpression returnValueExpression,
                                   final Declaration[] previousDeclarations,
                                   final Declaration[] localDeclarations,
                                   final String[] requiredGlobals,
                                   final Evaluator evaluator) {
         this.expression = returnValueExpression;
-        this.extractor = fieldExtractor;
+        this.readAccessor = fieldExtractor;
 
         if ( previousDeclarations != null ) {
             this.previousDeclarations = previousDeclarations;
@@ -117,24 +127,35 @@
                           this.localDeclarations.length );
     }
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        expression  = (ReturnValueExpression)in.readObject();
-        requiredDeclarations  = (Declaration[])in.readObject();
-        previousDeclarations  = (Declaration[])in.readObject();
-        localDeclarations  = ( Declaration[])in.readObject();
-        evaluator  = (Evaluator)in.readObject();
-        extractor  = (ReadAccessor)in.readObject();
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        expression = (ReturnValueExpression) in.readObject();
+        requiredDeclarations = (Declaration[]) in.readObject();
+        previousDeclarations = (Declaration[]) in.readObject();
+        localDeclarations = (Declaration[]) in.readObject();
+        evaluator = (Evaluator) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
+        this.cloned = (List<ReturnValueRestriction>) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(expression);
-        out.writeObject(requiredDeclarations);
-        out.writeObject(previousDeclarations);
-        out.writeObject(localDeclarations);
-        out.writeObject(evaluator);
-        out.writeObject(extractor);
+        if ( this.expression instanceof CompiledInvoker ) {
+            out.writeObject( null );
+        } else {
+            out.writeObject( this.expression );
+        }
+        out.writeObject( requiredDeclarations );
+        out.writeObject( previousDeclarations );
+        out.writeObject( localDeclarations );
+        out.writeObject( evaluator );
+        out.writeObject( readAccessor );
+        out.writeObject( this.cloned );
     }
 
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }
+
     public Declaration[] getRequiredDeclarations() {
         return this.requiredDeclarations;
     }
@@ -170,6 +191,13 @@
         }
     }
 
+    public void wire(Object object) {
+        setReturnValueExpression( (ReturnValueExpression) object );
+        for ( ReturnValueRestriction clone : this.cloned ) {
+            clone.wire( object );
+        }
+    }
+
     public void setReturnValueExpression(final ReturnValueExpression expression) {
         this.expression = expression;
     }
@@ -182,21 +210,21 @@
         return this.evaluator;
     }
 
-    public boolean isAllowed(final InternalReadAccessor extractor,
+    public boolean isAllowed(final InternalReadAccessor readAccessor,
                              final InternalFactHandle handle,
                              final Tuple tuple,
                              final WorkingMemory workingMemory,
                              final ContextEntry context) {
         try {
             return this.evaluator.evaluate( null,
-                                            extractor,
+                                            this.readAccessor,
                                             handle.getObject(),
                                             this.expression.evaluate( handle.getObject(),
                                                                       tuple,
                                                                       this.previousDeclarations,
                                                                       this.localDeclarations,
                                                                       workingMemory,
-                                                                      ((ReturnValueContextEntry)context).dialectContext) );
+                                                                      ((ReturnValueContextEntry) context).dialectContext ) );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException( e );
         }
@@ -284,9 +312,9 @@
     }
 
     public ContextEntry createContextEntry() {
-        ReturnValueContextEntry ctx =  new ReturnValueContextEntry( this.extractor,
-                                            this.previousDeclarations,
-                                            this.localDeclarations );
+        ReturnValueContextEntry ctx = new ReturnValueContextEntry( this.readAccessor,
+                                                                   this.previousDeclarations,
+                                                                   this.localDeclarations );
         ctx.dialectContext = this.expression.createContext();
         return ctx;
     }
@@ -302,11 +330,19 @@
             local[i] = (Declaration) this.localDeclarations[i].clone();
         }
 
-        return new ReturnValueRestriction( this.extractor,
-                                           previous,
-                                           local,
-                                           this.requiredGlobals,
-                                           this.evaluator );
+        ReturnValueRestriction clone = new ReturnValueRestriction( this.readAccessor,
+                                                                   previous,
+                                                                   local,
+                                                                   this.requiredGlobals,
+                                                                   this.evaluator );
+
+        if ( this.cloned == Collections.EMPTY_LIST ) {
+            this.cloned = new ArrayList<ReturnValueRestriction>( 1 );
+        }
+
+        this.cloned.add( clone );
+
+        return clone;
     }
 
     public static class ReturnValueContextEntry
@@ -315,7 +351,7 @@
 
         private static final long    serialVersionUID = 400L;
 
-        public ReadAccessor        fieldExtractor;
+        public ReadAccessor          fieldExtractor;
         public InternalFactHandle    handle;
         public LeftTuple             leftTuple;
         public InternalWorkingMemory workingMemory;
@@ -337,26 +373,27 @@
             this.localDeclarations = localDeclarations;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            fieldExtractor  = (ReadAccessor)in.readObject();
-            handle  = (InternalFactHandle)in.readObject();
-            leftTuple  = (LeftTuple)in.readObject();
-            workingMemory  = (InternalWorkingMemory)in.readObject();
-            previousDeclarations  = (Declaration[])in.readObject();
-            localDeclarations  = (Declaration[])in.readObject();
-            entry  = (ContextEntry)in.readObject();
-            dialectContext  = in.readObject();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            fieldExtractor = (ReadAccessor) in.readObject();
+            handle = (InternalFactHandle) in.readObject();
+            leftTuple = (LeftTuple) in.readObject();
+            workingMemory = (InternalWorkingMemory) in.readObject();
+            previousDeclarations = (Declaration[]) in.readObject();
+            localDeclarations = (Declaration[]) in.readObject();
+            entry = (ContextEntry) in.readObject();
+            dialectContext = in.readObject();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(fieldExtractor);
-            out.writeObject(handle);
-            out.writeObject(leftTuple);
-            out.writeObject(workingMemory);
-            out.writeObject(previousDeclarations);
-            out.writeObject(localDeclarations);
-            out.writeObject(entry);
-            out.writeObject(dialectContext);
+            out.writeObject( fieldExtractor );
+            out.writeObject( handle );
+            out.writeObject( leftTuple );
+            out.writeObject( workingMemory );
+            out.writeObject( previousDeclarations );
+            out.writeObject( localDeclarations );
+            out.writeObject( entry );
+            out.writeObject( dialectContext );
         }
 
         public ContextEntry getNext() {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,9 +26,11 @@
 
 import org.drools.base.SalienceInteger;
 import org.drools.spi.AgendaGroup;
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.Consequence;
 import org.drools.spi.Duration;
 import org.drools.spi.Salience;
+import org.drools.spi.Wireable;
 
 /**
  * A <code>Rule</code> contains a set of <code>Test</code>s and a
@@ -45,6 +47,7 @@
 public class Rule
     implements
     Externalizable,
+    Wireable,
     Dialectable {
     /**
      *
@@ -117,7 +120,13 @@
         out.writeObject(lhsRoot);
         out.writeObject(dialect);
         out.writeObject(agendaGroup);
-        out.writeObject(consequence);
+        
+        if ( this.consequence instanceof CompiledInvoker ) {
+            out.writeObject(  null );
+        } else {
+            out.writeObject(this.consequence);   
+        } 
+        
         out.writeObject(duration);
         out.writeLong(loadOrder);
         out.writeBoolean(noLoop);
@@ -507,6 +516,14 @@
 
         return specificity;
     }
+    
+    public void wire(Object object) {
+        if ( object instanceof Salience ) {
+            setSalience( (Salience ) object );
+        } else {
+            setConsequence( (Consequence) object );
+        }
+    }
 
     /**
      * Set the <code>Consequence</code> that is associated with the successful

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/RuleConditionElement.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,7 @@
 
 package org.drools.rule;
 
+import java.io.Externalizable;
 import java.util.List;
 import java.util.Map;
 
@@ -28,6 +29,7 @@
 public interface RuleConditionElement
     extends
     RuleComponent,
+    Externalizable,
     Cloneable {
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -18,6 +18,7 @@
 
 package org.drools.rule;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -44,6 +45,7 @@
  */
 public class SlidingTimeWindow
     implements
+    Externalizable,
     Behavior {
 
     private long size;

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/TypeDeclaration.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -26,6 +26,7 @@
 import org.drools.common.DroolsObjectInputStream;
 import org.drools.factmodel.ClassDefinition;
 import org.drools.facttemplates.FactTemplate;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.InternalReadAccessor;
 
 /**
@@ -36,6 +37,7 @@
  */
 public class TypeDeclaration
     implements
+    AcceptsReadAccessor,
     Externalizable {
 
     public static final String ATTR_CLASS     = "class";
@@ -78,8 +80,8 @@
     private Format                         format;
     private String                         timestampAttribute;
     private String                         durationAttribute;
-    private transient InternalReadAccessor durationExtractor;
-    private Class< ? >                     typeClass;
+    private InternalReadAccessor durationExtractor;
+    private transient Class< ? >                     typeClass;
     private FactTemplate                   typeTemplate;
     private ClassDefinition                typeClassDef;
 
@@ -92,7 +94,7 @@
         this.format = Format.POJO;
         this.durationAttribute = null;
         this.timestampAttribute = null;
-        this.typeClass = null;
+        //this.typeClass = null;
         this.typeTemplate = null;
     }
 
@@ -103,17 +105,10 @@
         this.format = (Format) in.readObject();
         this.durationAttribute = (String) in.readObject();
         this.timestampAttribute = (String) in.readObject();
-        this.typeClass = (Class< ? >) in.readObject();
+        //this.typeClass = (Class< ? >) in.readObject();
         this.typeTemplate = (FactTemplate) in.readObject();
         this.typeClassDef = (ClassDefinition) in.readObject();
-
-        if ( this.durationAttribute != null ) {
-            // generate the extractor
-            DroolsObjectInputStream dois = (DroolsObjectInputStream) in;
-            this.durationExtractor = dois.getExtractorFactory().getReader( this.typeClass,
-                                                                           this.durationAttribute,
-                                                                           dois.getClassLoader() );
-        }
+        this.durationExtractor = (InternalReadAccessor) in.readObject();
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -122,10 +117,15 @@
         out.writeObject( format );
         out.writeObject( durationAttribute );
         out.writeObject( timestampAttribute );
-        out.writeObject( typeClass );
+        //out.writeObject( typeClass );
         out.writeObject( typeTemplate );
         out.writeObject( typeClassDef );
+        out.writeObject( durationExtractor );
     }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.durationExtractor = readAccessor;
+    }    
 
     /**
      * @return the type

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableConstraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -24,11 +24,13 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.InternalReadAccessor;
 
 public class VariableConstraint extends MutableTypeConstraint
     implements
+    AcceptsReadAccessor,    
     Externalizable {
 
     private static final long    serialVersionUID = 400L;
@@ -66,6 +68,10 @@
         out.writeObject( fieldExtractor );
         out.writeObject( restriction );
     }
+    
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.fieldExtractor = readAccessor;
+    }     
 
     public Declaration[] getRequiredDeclarations() {
         return this.restriction.getRequiredDeclarations();

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -25,6 +25,7 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.LeftTuple;
+import org.drools.spi.AcceptsReadAccessor;
 import org.drools.spi.Evaluator;
 import org.drools.spi.InternalReadAccessor;
 import org.drools.spi.ReadAccessor;
@@ -32,6 +33,7 @@
 
 public class VariableRestriction
     implements
+    AcceptsReadAccessor,
     Restriction {
 
     private static final long    serialVersionUID = 400L;
@@ -42,7 +44,7 @@
 
     private Evaluator      evaluator;
 
-    private InternalReadAccessor extractor;
+    private InternalReadAccessor readAccessor;
 
     public VariableRestriction() {
     }
@@ -53,23 +55,27 @@
         this.declaration = declaration;
         this.requiredDeclarations = new Declaration[]{declaration};
         this.evaluator = evaluator;
-        this.extractor = fieldExtractor;
+        this.readAccessor = fieldExtractor;
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeObject(declaration);
         out.writeObject(requiredDeclarations);
         out.writeObject(evaluator);
-        out.writeObject(extractor);
+        out.writeObject(readAccessor);
     }
 
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         declaration = (Declaration) in.readObject();
         requiredDeclarations = (Declaration[]) in.readObject();
         evaluator = (Evaluator) in.readObject();
-        extractor = (InternalReadAccessor) in.readObject();
+        readAccessor = (InternalReadAccessor) in.readObject();
     }
 
+    public void setReadAccessor(InternalReadAccessor readAccessor) {
+        this.readAccessor = readAccessor;
+    }    
+    
     public Declaration[] getRequiredDeclarations() {
         return this.requiredDeclarations;
     }
@@ -91,7 +97,7 @@
                              final InternalWorkingMemory workingMemory,
                              final ContextEntry context ) {
         return this.evaluator.evaluate( workingMemory,
-                                        this.extractor,
+                                        this.readAccessor,
                                         this.evaluator.prepareObject( handle ),
                                         this.declaration.getExtractor(),
                                         this.evaluator.prepareObject( handle ) );
@@ -171,11 +177,11 @@
 
     public ContextEntry createContextEntry() {
         return this.createContextEntry( this.evaluator,
-                                        this.extractor );
+                                        this.readAccessor );
     }
 
     public Object clone() {
-        return new VariableRestriction( this.extractor,
+        return new VariableRestriction( this.readAccessor,
                                         (Declaration) this.declaration.clone(),
                                         this.evaluator );
     }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Acceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Acceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Acceptor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,5 @@
+package org.drools.spi;
+
+public interface Acceptor {
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsClassObjectType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsClassObjectType.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,9 @@
+package org.drools.spi;
+
+import org.drools.base.ClassObjectType;
+
+public interface AcceptsClassObjectType
+    extends
+    Acceptor {
+    public void setClassObjectType(ClassObjectType classObjectType);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsReadAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsReadAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsReadAccessor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,7 @@
+package org.drools.spi;
+
+public interface AcceptsReadAccessor
+    extends
+    Acceptor {
+    void setReadAccessor(InternalReadAccessor readAccessor);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsWriteAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsWriteAccessor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AcceptsWriteAccessor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,7 @@
+package org.drools.spi;
+
+public interface AcceptsWriteAccessor
+    extends
+    Acceptor {
+    void setWriteAccessor(WriteAccessor writeAccessor);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AccesptsClassObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AccesptsClassObjectType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/AccesptsClassObjectType.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,7 @@
+package org.drools.spi;
+
+import org.drools.base.ClassObjectType;
+
+public interface AccesptsClassObjectType {
+    public void setClassObjectType(ClassObjectType objectType);
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Constraint.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -27,6 +27,7 @@
 public interface Constraint
     extends
     RuleComponent,
+    Externalizable,
     Cloneable {
 
     /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/DeclarationScopeResolver.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -5,10 +5,12 @@
 import java.util.Map;
 import java.util.Stack;
 
+import org.drools.base.ClassObjectType;
 import org.drools.rule.Pattern;
 import org.drools.rule.Declaration;
 import org.drools.rule.GroupElement;
 import org.drools.rule.RuleConditionElement;
+import org.drools.rule.Package;
 
 /**
  * A class capable of resolving a declaration in the current build context
@@ -19,6 +21,7 @@
     private static final Stack EMPTY_STACK = new Stack();
     private Map[]              maps;
     private Stack              buildStack;
+    private Package            pkg;
 
     public DeclarationScopeResolver(final Map[] maps) {
         this( maps,
@@ -35,45 +38,66 @@
         }
     }
 
-    public Class getType(final String name) {
-        for ( int i = this.buildStack.size() - 1; i >= 0; i-- ) {
-            final Declaration declaration = (Declaration) ((RuleConditionElement) this.buildStack.get( i )).getInnerDeclarations().get( name );
-            if ( declaration != null ) {
-                return declaration.getExtractor().getExtractToClass();
-            }
-        }
-        for ( int i = 0, length = this.maps.length; i < length; i++ ) {
-            final Object object = this.maps[i].get( name );
-            if ( object != null ) {
-                if ( object instanceof Declaration ) {
-                    return ((Declaration) object).getExtractor().getExtractToClass();
-                } else {
-                    return (Class) object;
-                }
-            }
-        }
-        return null;
+    public void setPackage(Package pkg) {
+        this.pkg = pkg;
     }
 
-    public Declaration getDeclaration(final String name) {
+    // @ TODO I don't think this is needed any more, no references to it
+    //  public Class getType(final String name) {
+    //      for ( int i = this.buildStack.size() - 1; i >= 0; i-- ) {
+    //          final Declaration declaration = (Declaration) ((RuleConditionElement) this.buildStack.get( i )).getInnerDeclarations().get( name );
+    //          if ( declaration != null ) {
+    //              return declaration.getExtractor().getExtractToClass();
+    //          }
+    //      }
+    //      for ( int i = 0, length = this.maps.length; i < length; i++ ) {
+    //          final Object object = this.maps[i].get( name );
+    //          if ( object != null ) {
+    //              if ( object instanceof Declaration ) {
+    //                  return ((Declaration) object).getExtractor().getExtractToClass();
+    //              } else {
+    //                  return (Class) object;
+    //              }
+    //          }
+    //      }
+    //      return null;
+    //  }
+
+    public Declaration getDeclaration(final String identifier) {
         // it may be a local bound variable
         for ( int i = this.buildStack.size() - 1; i >= 0; i-- ) {
-            final Declaration declaration = (Declaration) ((RuleConditionElement) this.buildStack.get( i )).getInnerDeclarations().get( name );
+            final Declaration declaration = (Declaration) ((RuleConditionElement) this.buildStack.get( i )).getInnerDeclarations().get( identifier );
             if ( declaration != null ) {
                 return declaration;
             }
         }
         // it may be a global or something
         for ( int i = 0, length = this.maps.length; i < length; i++ ) {
-            if ( this.maps[i].containsKey( (name) ) ) {
-                final GlobalExtractor global = new GlobalExtractor( name,
-                                                              this.maps[i] );
-                final Pattern dummy = new Pattern( 0,
-                                           global.getObjectType() );
-                final Declaration declaration = new Declaration( name,
-                                                           global,
-                                                           dummy );
-                return declaration;
+            if ( this.maps[i].containsKey( (identifier) ) ) {
+                if ( pkg != null ) {
+                    Class cls = (Class) this.maps[i].get( identifier );
+                    ClassObjectType classObjectType = new ClassObjectType( cls );
+                                        
+                    Declaration declaration = null;
+                    final Pattern dummy = new Pattern( 0,
+                                                       classObjectType );
+                    
+                    GlobalExtractor globalExtractor = new GlobalExtractor(identifier, classObjectType);
+                    declaration = new Declaration( identifier,
+                                                   globalExtractor,
+                                                   dummy );
+                    
+                    // make sure dummy and globalExtractor are wired up to correct ClassObjectType
+                    // and set as targets for rewiring
+                    pkg.getClassFieldAccessorStore().getClassObjectType( classObjectType, 
+                                                                         dummy );
+                    pkg.getClassFieldAccessorStore().getClassObjectType( classObjectType, 
+                                                                         globalExtractor );
+                    
+                    return declaration;
+                } else {
+                    throw new UnsupportedOperationException( "This shoudln't happen outside of PackageBuilder" );
+                }
             }
         }
         return null;
@@ -132,22 +156,25 @@
     }
 
     public Pattern findPatternByIndex(int index) {
-        if ( ! this.buildStack.isEmpty() ) {
-            return findPatternInNestedElements( index, (RuleConditionElement) this.buildStack.get( 0 ) );
+        if ( !this.buildStack.isEmpty() ) {
+            return findPatternInNestedElements( index,
+                                                (RuleConditionElement) this.buildStack.get( 0 ) );
         }
         return null;
     }
-    
-    private Pattern findPatternInNestedElements( final int index, final RuleConditionElement rce ) {
-        for( RuleConditionElement element : rce.getNestedElements() ) {
-            if( element instanceof Pattern ) {
+
+    private Pattern findPatternInNestedElements(final int index,
+                                                final RuleConditionElement rce) {
+        for ( RuleConditionElement element : rce.getNestedElements() ) {
+            if ( element instanceof Pattern ) {
                 Pattern p = (Pattern) element;
-                if( p.getIndex() == index ) {
+                if ( p.getIndex() == index ) {
                     return p;
                 }
-            } else if( ! element.isPatternScopeDelimiter() ) {
-                Pattern p = findPatternInNestedElements( index, element );
-                if( p != null ) {
+            } else if ( !element.isPatternScopeDelimiter() ) {
+                Pattern p = findPatternInNestedElements( index,
+                                                         element );
+                if ( p != null ) {
                     return p;
                 }
             }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/GlobalExtractor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,7 @@
 
 package org.drools.spi;
 
+import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -35,105 +36,122 @@
  */
 public class GlobalExtractor
     implements
+    Externalizable,
+    AcceptsClassObjectType,
     InternalReadAccessor {
 
     private static final long serialVersionUID = 400L;
-    private String            key;
+    private String            identifier;
+    private ValueType         valueType;
     private ObjectType        objectType;
 
     public GlobalExtractor() {
 
     }
-    public GlobalExtractor(final String key,
-                           final Map map) {
-        this.key = key;
-        this.objectType = new ClassObjectType( (Class) map.get( this.key ));
-    }
+    
+    public GlobalExtractor(final String identifier,
+                           final ObjectType objectType) {
+        this.identifier = identifier;
+        this.objectType = objectType;
+        this.valueType = objectType.getValueType();
+    }    
 
     public Object getValue(InternalWorkingMemory workingMemory, final Object object) {
-        return workingMemory.getGlobal( key );
+        return workingMemory.getGlobal( identifier );
     }
+    
 
-    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-        key = (String)in.readObject();
-        objectType  = (ObjectType)in.readObject();
-    }
-
     public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeObject(key);
-        out.writeObject(objectType);
+        out.writeUTF(identifier);
+        out.writeObject( objectType );
     }
 
-    public ObjectType getObjectType() {
-        return this.objectType;
+
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        identifier = in.readUTF();
+        objectType = ( ObjectType) in.readObject();
+        valueType = objectType.getValueType();
     }
+    
+    public void setClassObjectType(ClassObjectType objectType) {
+        this.objectType = objectType;
+    }
 
+
     public Class getExtractToClass() {
-        return this.objectType.getValueType().getClassType();
+        if ( objectType instanceof ClassObjectType ) {
+            return ((ClassObjectType)objectType).getClassType();
+        } else {
+            return valueType.getClassType();
+        }
     }
 
     public String getExtractToClassName() {
-        return ClassUtils.canonicalName( this.objectType.getValueType().getClassType() );
+        if ( objectType instanceof ClassObjectType ) {
+            return ((ClassObjectType)objectType).getClassName();
+        } else {
+            return valueType.getClassType().getName();
+        }                
     }
 
     public ValueType getValueType() {
-        return this.objectType.getValueType();
+        return valueType;
     }
 
     public boolean getBooleanValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isBoolean() ) {
-            return ((Boolean) workingMemory.getGlobal( key )).booleanValue();
+        if( this.valueType.isBoolean() ) {
+            return ((Boolean) workingMemory.getGlobal( identifier )).booleanValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a boolean.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a boolean.");
     }
 
     public byte getByteValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).byteValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).byteValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a byte.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a byte.");
     }
 
     public char getCharValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isChar() ) {
-            return ((Character) workingMemory.getGlobal( key )).charValue();
+        if( this.valueType.isChar() ) {
+            return ((Character) workingMemory.getGlobal( identifier )).charValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a char.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a char.");
     }
 
     public double getDoubleValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).doubleValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).doubleValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a double.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a double.");
     }
 
     public float getFloatValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).floatValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).floatValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a float.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a float.");
     }
 
     public int getIntValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).intValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).intValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into an int.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into an int.");
     }
 
     public long getLongValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).longValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).longValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a long.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a long.");
     }
 
     public short getShortValue(InternalWorkingMemory workingMemory, final Object object) {
-        if( this.objectType.getValueType().isNumber() ) {
-            return ((Number) workingMemory.getGlobal( key )).shortValue();
+        if( this.valueType.isNumber() ) {
+            return ((Number) workingMemory.getGlobal( identifier )).shortValue();
         }
-        throw new ClassCastException("Not possible to convert global '"+key+"' into a short.");
+        throw new ClassCastException("Not possible to convert global '"+identifier+"' into a short.");
     }
 
     public Method getNativeReadMethod() {
@@ -152,19 +170,25 @@
     }
 
     public int hashCode() {
-        return this.objectType.hashCode();
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
+        result = prime * result + ((objectType == null) ? 0 : objectType.hashCode());        
+        return result;
     }
 
-    public boolean equals(final Object obj) {
-        if ( this == obj ) {
-            return true;
-        }
-        if ( !(obj instanceof GlobalExtractor) ) {
-            return false;
-        }
-        final GlobalExtractor other = (GlobalExtractor) obj;
-        return ( key == null ? other.key == null : key.equals( other.key ) ) &&
-               ( this.objectType == null ? other.objectType == null : this.objectType.equals( other.objectType ));
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        GlobalExtractor other = (GlobalExtractor) obj;
+        if ( objectType == null ) {
+            if ( other.objectType != null ) return false;
+        } else if ( !objectType.equals( other.objectType ) ) return false;
+        if ( identifier == null ) {
+            if ( other.identifier != null ) return false;
+        } else if ( !identifier.equals( other.identifier ) ) return false;
+        return true;
     }
 
     public boolean isNullValue( InternalWorkingMemory workingMemory, Object object ) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ObjectType.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -29,19 +29,19 @@
 public interface ObjectType
     extends
     Externalizable {
-    /**
-     * Determine if the passed <code>Object</code> belongs to the object type
-     * defined by this <code>objectType</code> instance.
-     *
-     * @param object
-     *            The <code>Object</code> to test.
-     *
-     * @return <code>true</code> if the <code>Object</code> matches this
-     *         object type, else <code>false</code>.
-     */
-    boolean matches(Object object);
+//    /**
+//     * Determine if the passed <code>Object</code> belongs to the object type
+//     * defined by this <code>objectType</code> instance.
+//     *
+//     * @param object
+//     *            The <code>Object</code> to test.
+//     *
+//     * @return <code>true</code> if the <code>Object</code> matches this
+//     *         object type, else <code>false</code>.
+//     */
+//    boolean matches(Object object);
 
-    boolean isAssignableFrom(Object object);
+//    boolean isAssignableFrom(Object object);
 
     boolean isAssignableFrom(ObjectType objectType);
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PatternExtractor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -33,6 +33,7 @@
 public class PatternExtractor
     implements
     InternalReadAccessor,
+    AcceptsClassObjectType,
     Externalizable {
 
     /**
@@ -57,6 +58,10 @@
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeObject( objectType );
     }
+    
+    public void setClassObjectType(ClassObjectType objectType) {
+        this.objectType = objectType;
+    }    
 
     public Object getValue(InternalWorkingMemory workingMemory,
                            final Object object) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PredicateExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PredicateExpression.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/PredicateExpression.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,7 +23,7 @@
 
 public interface PredicateExpression
     extends
-    Invoker, Externalizable {
+    Invoker {
 
     public Object createContext();
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/ReadAccessor.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -24,9 +24,7 @@
 /**
  * A public interface for Read accessors
  */
-public interface ReadAccessor
-    extends
-    Externalizable {
+public interface ReadAccessor {
 
     public Object getValue(Object object);
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/RuleComponent.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -25,8 +25,6 @@
  *
  * @version $Id$
  */
-public interface RuleComponent
-    extends
-    Externalizable {
+public interface RuleComponent {
 
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Wireable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Wireable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Wireable.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,5 @@
+package org.drools.spi;
+
+public interface Wireable {
+    public void wire(Object object);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Writable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Writable.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/Writable.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -0,0 +1,5 @@
+package org.drools.spi;
+
+public interface Writable {
+    void setWriteAccessor(WriteAccessor writeAccessor);
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -182,6 +182,6 @@
             throws IOException, ClassNotFoundException {
         if (compressed)
             in  = new GZIPInputStream(in);
-        return new DroolsObjectInputStream(in, classLoader).readObject();
+        return new DroolsObjectInputStream(in).readObject();
      }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/DroolsAction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,16 +1,28 @@
 package org.drools.workflow.core;
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 
-public class DroolsAction implements Serializable {
+import org.drools.spi.CompiledInvoker;
+import org.drools.spi.Wireable;
+
+public class DroolsAction implements Externalizable, Wireable {
 	
 	private static final long serialVersionUID = 1L;
 	
 	private String name;
     private Map<String, Object> metaData = new HashMap<String, Object>();
 
+    public void wire(Object object) {
+        setMetaData( "Action",
+                     object );
+    }
+    
     public void setMetaData(String name, Object value) {
         this.metaData.put(name, value);
     }
@@ -26,5 +38,25 @@
 	public void setName(String name) {
 		this.name = name;
 	}
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        this.name = (String) in.readObject();
+        this.metaData = (Map<String, Object>)in.readObject();
+        Object action = in.readObject();
+        setMetaData( "Action", action );
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( name );
+        Object action = this.metaData.remove( "Action" );
+        out.writeObject( this.metaData );
+        if ( action instanceof CompiledInvoker ) {
+            out.writeObject(  null );
+        } else {
+            out.writeObject(action);   
+        } 
+        setMetaData( "Action", action );
+    }
     
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/impl/DroolsConsequenceAction.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -1,6 +1,10 @@
 package org.drools.workflow.core.impl;
 
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Serializable;
+import java.util.Map;
 
 import org.drools.workflow.core.DroolsAction;
 
@@ -10,6 +14,23 @@
     
     private String dialect = "mvel";
     private String consequence;
+    
+    public DroolsConsequenceAction() {
+        
+    }
+    
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal( out );
+        out.writeObject( dialect );
+        out.writeObject(  consequence );
+    }
+    
+    public void readExternal(ObjectInput in) throws IOException,
+    ClassNotFoundException {
+        super.readExternal( in );
+        dialect = (String) in.readObject();
+        consequence = (String) in.readObject();
+    }    
 	
 	public DroolsConsequenceAction(String dialect, String consequence) {
 	    this.dialect = dialect;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/core/node/Split.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashMap;
@@ -70,7 +73,7 @@
 
     public Split(final int type) {
         this.type = type;
-    }
+    }    
 
     public void setType(final int type) {
         this.type = type;

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/ReturnValueConstraintEvaluator.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -16,10 +16,16 @@
  * limitations under the License.
  */
 
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
 import java.io.Serializable;
 
+import org.drools.spi.CompiledInvoker;
 import org.drools.spi.ProcessContext;
 import org.drools.spi.ReturnValueEvaluator;
+import org.drools.spi.Wireable;
 import org.drools.workflow.core.Connection;
 import org.drools.workflow.core.Constraint;
 import org.drools.workflow.instance.node.SplitInstance;
@@ -30,18 +36,25 @@
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
 public class ReturnValueConstraintEvaluator
-    implements Constraint, ConstraintEvaluator, Serializable {
+    implements
+    Constraint,
+    ConstraintEvaluator,
+    Wireable,
+    Externalizable {
 
-    private static final long  serialVersionUID = 400L;
+    private static final long serialVersionUID = 400L;
 
-    private String             name;
-    private String             constraint;
-    private int                priority;
-    private String             dialect;
-    private String             type;       
-    
+    private String            name;
+    private String            constraint;
+    private int               priority;
+    private String            dialect;
+    private String            type;
+
+    public ReturnValueConstraintEvaluator() {
+    }
+
     private ReturnValueEvaluator evaluator;
-    
+
     public String getConstraint() {
         return this.constraint;
     }
@@ -85,27 +98,60 @@
     public void setType(String type) {
         this.type = type;
     }
-    
+
+    public void wire(Object object) {
+        setEvaluator( (ReturnValueEvaluator) object );
+    }
+
     public void setEvaluator(ReturnValueEvaluator evaluator) {
         this.evaluator = evaluator;
     }
 
+    public ReturnValueEvaluator getReturnValueEvaluator() {
+        return this.evaluator;
+    }
+
     public boolean evaluate(SplitInstance instance,
                             Connection connection,
                             Constraint constraint) {
         Object value;
         try {
-        	ProcessContext context = new ProcessContext();
-        	context.setNodeInstance(instance);
-            value = this.evaluator.evaluate(
-        		instance.getProcessInstance().getWorkingMemory(), context );
+            ProcessContext context = new ProcessContext();
+            context.setNodeInstance( instance );
+            value = this.evaluator.evaluate( instance.getProcessInstance().getWorkingMemory(),
+                                             context );
         } catch ( Exception e ) {
-            throw  new RuntimeException("unable to execute ReturnValueEvaluator", e);
+            throw new RuntimeException( "unable to execute ReturnValueEvaluator",
+                                        e );
         }
         if ( !(value instanceof Boolean) ) {
-            throw new RuntimeException("Constraints must return boolean values" );
+            throw new RuntimeException( "Constraints must return boolean values" );
         }
-        return ((Boolean)value).booleanValue();
-    }    
+        return ((Boolean) value).booleanValue();
+    }
 
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        this.evaluator = (ReturnValueEvaluator) in.readObject();
+        this.name = in.readUTF();
+        this.constraint = (String) in.readObject();
+        this.priority = in.readInt();
+        this.dialect = in.readUTF();
+        this.type = (String) in.readObject();
+
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        if ( this.evaluator instanceof CompiledInvoker ) {
+            out.writeObject( null );
+        } else {
+            out.writeObject( this.evaluator );
+        }
+        out.writeUTF( this.name );
+        out.writeObject( this.constraint );
+        out.writeInt( this.priority );
+        out.writeUTF( dialect );
+        out.writeObject( type );
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/agent/RuleBaseAssemblerTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -11,6 +11,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.util.DroolsStreamUtils;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.rule.Package;
 
 import junit.framework.TestCase;
@@ -22,10 +23,13 @@
 
     public void testAssemblePackages() throws Exception {
         RuleBase rb = RuleBaseFactory.newRuleBase();
-        rb.addPackage( new Package("goober") );
+        Package pkg = new Package("goober");
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        rb.addPackage( pkg );
 
         Package p1 = new Package("p1");
-
+        p1.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        
         File f = getTempDirectory();
 
         File p1file = new File(f, "p1.pkg");

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/BaseClassFieldAccessorFactoryTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -27,25 +27,27 @@
 
 public class BaseClassFieldAccessorFactoryTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
     protected void setUp() throws Exception {
-        super.setUp();
-        cache = ClassFieldAccessorCache.getInstance();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     public void testIt() throws Exception {
         ClassFieldAccessorFactory factory = new ClassFieldAccessorFactory();
+        
+        ClassFieldAccessorCache.CacheEntry cachEntry = new ClassFieldAccessorCache.CacheEntry( Thread.currentThread().getContextClassLoader()  );
 
         InternalReadAccessor ex = factory.getClassFieldReader( TestBean.class,
-                                                            "name",
-                                                            Thread.currentThread().getContextClassLoader() );
+                                                               "name",
+                                                               cachEntry );
         assertEquals( "michael",
                       ex.getValue( null,
                                    new TestBean() ) );
         ex = factory.getClassFieldReader( TestBean.class,
-                                             "age",
-                                             Thread.currentThread().getContextClassLoader() );
+                                          "age",
+                                          cachEntry );
         assertEquals( 42,
                       ((Number) ex.getValue( null,
                                              new TestBean() )).intValue() );
@@ -53,9 +55,9 @@
     }
 
     public void testInterface() throws Exception {
-        final InternalReadAccessor ex = cache.getReader( TestInterface.class,
-                                                      "something",
-                                                      getClass().getClassLoader() );
+        final InternalReadAccessor ex = store.getReader( TestInterface.class,
+                                                         "something",
+                                                         getClass().getClassLoader() );
         assertEquals( 0,
                       ex.getIndex() );
         assertEquals( "foo",
@@ -64,9 +66,9 @@
     }
 
     public void testAbstract() throws Exception {
-        final InternalReadAccessor ex = cache.getReader( TestAbstract.class,
-                                                      "something",
-                                                      getClass().getClassLoader() );
+        final InternalReadAccessor ex = store.getReader( TestAbstract.class,
+                                                         "something",
+                                                         getClass().getClassLoader() );
         assertEquals( 0,
                       ex.getIndex() );
         assertEquals( "foo",
@@ -75,18 +77,18 @@
     }
 
     public void testInherited() throws Exception {
-        final InternalReadAccessor ex = cache.getReader( BeanInherit.class,
-                                                      "text",
-                                                      getClass().getClassLoader() );
+        final InternalReadAccessor ex = store.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 InternalReadAccessor ex = store.getReader( BeanInherit.class,
+                                                         "this",
+                                                         getClass().getClassLoader() );
         final TestBean bean = new TestBean();
         assertEquals( bean,
                       ex.getValue( null,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/ClassFieldAccessorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -30,11 +30,11 @@
 
 public class ClassFieldAccessorTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
     protected void setUp() throws Exception {
-        super.setUp();
-        cache = ClassFieldAccessorCache.getInstance();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
     }
 
     public void testBasic() throws Exception {
@@ -45,21 +45,21 @@
         obj.setSomething( "no" );
         obj.setObjArray( objArray );
 
-        final ClassFieldReader ext = cache.getReader( TestBean.class,
+        final ClassFieldReader ext = store.getReader( TestBean.class,
                                                       "blah",
                                                       getClass().getClassLoader() );
         assertEquals( false,
                       ((Boolean) ext.getValue( null,
                                                obj )).booleanValue() );
 
-        final ClassFieldReader ext2 = cache.getReader( TestBean.class,
+        final ClassFieldReader ext2 = store.getReader( TestBean.class,
                                                        "fooBar",
                                                        getClass().getClassLoader() );
         assertEquals( "fooBar",
                       ext2.getValue( null,
                                      obj ) );
 
-        final ClassFieldReader ext3 = cache.getReader( TestBean.class,
+        final ClassFieldReader ext3 = store.getReader( TestBean.class,
                                                        "objArray",
                                                        getClass().getClassLoader() );
         assertEquals( objArray,
@@ -71,7 +71,7 @@
     public void testInterface() throws Exception {
 
         final TestInterface obj = new TestInterfaceImpl();
-        final ClassFieldReader ext = cache.getReader( TestInterface.class,
+        final ClassFieldReader ext = store.getReader( TestInterface.class,
                                                       "something",
                                                       getClass().getClassLoader() );
 
@@ -83,7 +83,7 @@
 
     public void testAbstract() throws Exception {
 
-        final ClassFieldReader ext = cache.getReader( TestAbstract.class,
+        final ClassFieldReader ext = store.getReader( TestAbstract.class,
                                                       "something",
                                                       getClass().getClassLoader() );
         final TestAbstract obj = new TestAbstractImpl();
@@ -94,7 +94,7 @@
     }
 
     public void testInherited() throws Exception {
-        final ClassFieldReader ext = cache.getReader( BeanInherit.class,
+        final ClassFieldReader ext = store.getReader( BeanInherit.class,
                                                       "text",
                                                       getClass().getClassLoader() );
         final BeanInherit obj = new BeanInherit();
@@ -106,7 +106,7 @@
 
     public void testMultipleInterfaces() throws Exception {
         final ConcreteChild obj = new ConcreteChild();
-        final ClassFieldReader ext = cache.getReader( InterfaceChild.class,
+        final ClassFieldReader ext = store.getReader( InterfaceChild.class,
                                                       "foo",
                                                       getClass().getClassLoader() );
         assertEquals( 42,
@@ -115,7 +115,7 @@
     }
 
     public void testLong() throws Exception {
-        final ClassFieldReader ext = cache.getReader( TestBean.class,
+        final ClassFieldReader ext = store.getReader( TestBean.class,
                                                       "longField",
                                                       getClass().getClassLoader() );
         final TestBean bean = new TestBean();
@@ -133,7 +133,7 @@
         obj.setObjArray( objArray );
 
         try {
-            final ClassFieldReader ext = cache.getReader( TestBean.class,
+            final ClassFieldReader ext = store.getReader( TestBean.class,
                                                           "xyz",
                                                           getClass().getClassLoader() );
             fail( "A RuntimeDroolsException should have been raised" );
@@ -148,10 +148,10 @@
 
     public void testBuildFieldAccessor() {
         try {
-            ClassFieldAccessor intAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor intAccessor = store.getAccessor( TestClass.class,
                                                                 "intAttr",
                                                                 getClass().getClassLoader() );
-            ClassFieldAccessor strAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor strAccessor = store.getAccessor( TestClass.class,
                                                                 "strAttr",
                                                                 getClass().getClassLoader() );
 
@@ -200,31 +200,31 @@
 
     public void testNullOnPrimitives() {
         try {
-            ClassFieldAccessor intAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor intAccessor = store.getAccessor( TestClass.class,
                                                                 "intAttr",
                                                                 getClass().getClassLoader() );
-            ClassFieldAccessor strAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor strAccessor = store.getAccessor( TestClass.class,
                                                                 "strAttr",
                                                                 getClass().getClassLoader() );
-            ClassFieldAccessor byteAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor byteAccessor = store.getAccessor( TestClass.class,
                                                                  "byteAttr",
                                                                  getClass().getClassLoader() );
-            ClassFieldAccessor booleanAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor booleanAccessor = store.getAccessor( TestClass.class,
                                                                     "booleanAttr",
                                                                     getClass().getClassLoader() );
-            ClassFieldAccessor charAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor charAccessor = store.getAccessor( TestClass.class,
                                                                  "charAttr",
                                                                  getClass().getClassLoader() );
-            ClassFieldAccessor doubleAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor doubleAccessor = store.getAccessor( TestClass.class,
                                                                    "doubleAttr",
                                                                    getClass().getClassLoader() );
-            ClassFieldAccessor floatAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor floatAccessor = store.getAccessor( TestClass.class,
                                                                   "floatAttr",
                                                                   getClass().getClassLoader() );
-            ClassFieldAccessor longAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor longAccessor = store.getAccessor( TestClass.class,
                                                                  "longAttr",
                                                                  getClass().getClassLoader() );
-            ClassFieldAccessor shortAccessor = cache.getAccessor( TestClass.class,
+            ClassFieldAccessor shortAccessor = store.getAccessor( TestClass.class,
                                                                   "shortAttr",
                                                                   getClass().getClassLoader() );
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/BooleanClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,31 +3,31 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class BooleanClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                               "booleanAttr",
-                                                                               getClass().getClassLoader() );
+    InternalReadAccessor reader;
     TestBean  bean      = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                              "booleanAttr",
+                                              getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
-        try {
-            Assert.assertTrue( this.extractor.getBooleanValue( null,
+            Assert.assertTrue( this.reader.getBooleanValue( null,
                                                                this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetByteValue() {
         try {
-            this.extractor.getByteValue( null,
+            this.reader.getByteValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -37,7 +37,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
+            this.reader.getCharValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -47,7 +47,7 @@
 
     public void testGetDoubleValue() {
         try {
-            this.extractor.getDoubleValue( null,
+            this.reader.getDoubleValue( null,
                                            this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -57,7 +57,7 @@
 
     public void testGetFloatValue() {
         try {
-            this.extractor.getFloatValue( null,
+            this.reader.getFloatValue( null,
                                           this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -67,7 +67,7 @@
 
     public void testGetIntValue() {
         try {
-            this.extractor.getIntValue( null,
+            this.reader.getIntValue( null,
                                         this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -77,7 +77,7 @@
 
     public void testGetLongValue() {
         try {
-            this.extractor.getLongValue( null,
+            this.reader.getLongValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -87,7 +87,7 @@
 
     public void testGetShortValue() {
         try {
-            this.extractor.getShortValue( null,
+            this.reader.getShortValue( null,
                                           this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -96,21 +96,13 @@
     }
 
     public void testGetValue() {
-        try {
             Assert.assertSame( Boolean.TRUE,
-                               this.extractor.getValue( null,
+                               this.reader.getValue( null,
                                                         this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
+            Assert.assertFalse( this.reader.isNullValue( null,
                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ByteClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,22 +3,26 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class ByteClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                               "byteAttr",
-                                                                               getClass().getClassLoader() );
-    TestBean  bean      = new TestBean();
+    InternalReadAccessor reader;
+    TestBean             bean = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                          "byteAttr",
+                                          getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
+            this.reader.getBooleanValue( null,
                                             this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -27,18 +31,14 @@
     }
 
     public void testGetByteValue() {
-        try {
-            Assert.assertEquals( 1,
-                                 this.extractor.getByteValue( null,
-                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1,
+                             this.reader.getByteValue( null,
+                                                          this.bean ) );
     }
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
+            this.reader.getCharValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -47,73 +47,45 @@
     }
 
     public void testGetDoubleValue() {
-        try {
-            Assert.assertEquals( 1.0,
-                                 this.extractor.getDoubleValue( null,
-                                                                this.bean ),
-                                 0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1.0,
+                             this.reader.getDoubleValue( null,
+                                                            this.bean ),
+                             0.01 );
     }
 
     public void testGetFloatValue() {
-        try {
-            Assert.assertEquals( 1.0f,
-                                 this.extractor.getFloatValue( null,
-                                                               this.bean ),
-                                 0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1.0f,
+                             this.reader.getFloatValue( null,
+                                                           this.bean ),
+                             0.01 );
     }
 
     public void testGetIntValue() {
-        try {
-            Assert.assertEquals( 1,
-                                 this.extractor.getIntValue( null,
-                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1,
+                             this.reader.getIntValue( null,
+                                                         this.bean ) );
     }
 
     public void testGetLongValue() {
-        try {
-            Assert.assertEquals( 1,
-                                 this.extractor.getLongValue( null,
-                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1,
+                             this.reader.getLongValue( null,
+                                                          this.bean ) );
     }
 
     public void testGetShortValue() {
-        try {
-            Assert.assertEquals( 1,
-                                 this.extractor.getShortValue( null,
-                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1,
+                             this.reader.getShortValue( null,
+                                                           this.bean ) );
     }
 
     public void testGetValue() {
-        try {
-            Assert.assertEquals( 1,
-                                 ((Number) this.extractor.getValue( null,
-                                                                    this.bean )).byteValue() );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( 1,
+                             ((Number) this.reader.getValue( null,
+                                                                this.bean )).byteValue() );
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
-                                                            this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertFalse( this.reader.isNullValue( null,
+                                                        this.bean ) );
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/CharClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,22 +3,26 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class CharClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                               "charAttr",
-                                                                               getClass().getClassLoader() );
+    InternalReadAccessor reader;
     TestBean  bean      = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                              "charAttr",
+                                              getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
+            this.reader.getBooleanValue( null,
                                             this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -27,91 +31,56 @@
     }
 
     public void testGetByteValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getByteValue( null,
+                                 this.reader.getByteValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetCharValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getCharValue( null,
+                                 this.reader.getCharValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetDoubleValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getDoubleValue( null,
+                                 (int) this.reader.getDoubleValue( null,
                                                                       this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetFloatValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getFloatValue( null,
+                                 (int) this.reader.getFloatValue( null,
                                                                      this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetIntValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getIntValue( null,
+                                 this.reader.getIntValue( null,
                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetLongValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 (int) this.extractor.getLongValue( null,
+                                 (int) this.reader.getLongValue( null,
                                                                     this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
     }
 
     public void testGetShortValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 this.extractor.getShortValue( null,
+                                 this.reader.getShortValue( null,
                                                                this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw exception" );
-        }
+
     }
 
     public void testGetValue() {
-        try {
             Assert.assertEquals( 'a',
-                                 ((Character) this.extractor.getValue( null,
+                                 ((Character) this.reader.getValue( null,
                                                                        this.bean )).charValue() );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
+            Assert.assertFalse( this.reader.isNullValue( null,
                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/DoubleClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,24 +3,28 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class DoubleClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    private static final double VALUE     = 7;
+    private static final double VALUE = 7;
 
-    InternalReadAccessor                   extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                                 "doubleAttr",
-                                                                                                 getClass().getClassLoader() );
-    TestBean                    bean      = new TestBean();
+    InternalReadAccessor        reader;
+    TestBean                    bean  = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                          "doubleAttr",
+                                          getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
+            this.reader.getBooleanValue( null,
                                             this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -29,18 +33,14 @@
     }
 
     public void testGetByteValue() {
-        try {
             Assert.assertEquals( (byte) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( null,
+                                 this.reader.getByteValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
+            this.reader.getCharValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -49,75 +49,47 @@
     }
 
     public void testGetDoubleValue() {
-        try {
             Assert.assertEquals( DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( null,
+                                 this.reader.getDoubleValue( null,
                                                                 this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetFloatValue() {
-        try {
             Assert.assertEquals( DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( null,
+                                 this.reader.getFloatValue( null,
                                                                this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetIntValue() {
-        try {
             Assert.assertEquals( (int) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( null,
+                                 this.reader.getIntValue( null,
                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetLongValue() {
-        try {
             Assert.assertEquals( (long) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( null,
+                                 this.reader.getLongValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetShortValue() {
-        try {
             Assert.assertEquals( (short) DoubleClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( null,
+                                 this.reader.getShortValue( null,
                                                                this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetValue() {
-        try {
             Assert.assertEquals( new Double( DoubleClassFieldExtractorTest.VALUE ),
-                                 this.extractor.getValue( null,
+                                 this.reader.getValue( null,
                                                           this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( null,
+            Assert.assertTrue( this.reader.getValue( null,
                                                         this.bean ) instanceof Double );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
+            Assert.assertFalse( this.reader.isNullValue( null,
                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/FloatClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,24 +3,28 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class FloatClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final float VALUE     = 6;
 
-    InternalReadAccessor                  extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                                "floatAttr",
-                                                                                                getClass().getClassLoader() );
+    InternalReadAccessor                  reader;;
     TestBean                   bean      = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                          "floatAttr",
+                                          getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
+            this.reader.getBooleanValue( null,
                                             this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -29,18 +33,14 @@
     }
 
     public void testGetByteValue() {
-        try {
             Assert.assertEquals( (byte) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( null,
+                                 this.reader.getByteValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
+            this.reader.getCharValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -49,75 +49,47 @@
     }
 
     public void testGetDoubleValue() {
-        try {
             Assert.assertEquals( FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( null,
+                                 this.reader.getDoubleValue( null,
                                                                 this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetFloatValue() {
-        try {
             Assert.assertEquals( FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( null,
+                                 this.reader.getFloatValue( null,
                                                                this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetIntValue() {
-        try {
             Assert.assertEquals( (int) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( null,
+                                 this.reader.getIntValue( null,
                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetLongValue() {
-        try {
             Assert.assertEquals( (long) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( null,
+                                 this.reader.getLongValue( null,
                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetShortValue() {
-        try {
             Assert.assertEquals( (short) FloatClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( null,
+                                 this.reader.getShortValue( null,
                                                                this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetValue() {
-        try {
             Assert.assertEquals( new Float( FloatClassFieldExtractorTest.VALUE ),
-                                 this.extractor.getValue( null,
+                                 this.reader.getValue( null,
                                                           this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( null,
+            Assert.assertTrue( this.reader.getValue( null,
                                                         this.bean ) instanceof Float );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
+            Assert.assertFalse( this.reader.isNullValue( null,
                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/IntClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,25 +3,29 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class IntClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    private static final int VALUE     = 4;
+    private static final int VALUE = 4;
 
-    InternalReadAccessor                extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                              "intAttr",
-                                                                                              getClass().getClassLoader() );
-    TestBean                 bean      = new TestBean();
+    InternalReadAccessor     reader;
+    TestBean                 bean  = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                       "intAttr",
+                                       getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
-                                            this.bean );
+            this.reader.getBooleanValue( null,
+                                         this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -29,19 +33,15 @@
     }
 
     public void testGetByteValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( null,
-                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getByteValue( null,
+                                                       this.bean ) );
     }
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
-                                         this.bean );
+            this.reader.getCharValue( null,
+                                      this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -49,73 +49,45 @@
     }
 
     public void testGetDoubleValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( null,
-                                                                this.bean ),
-                                 0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getDoubleValue( null,
+                                                         this.bean ),
+                             0.01 );
     }
 
     public void testGetFloatValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( null,
-                                                               this.bean ),
-                                 0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getFloatValue( null,
+                                                        this.bean ),
+                             0.01 );
     }
 
     public void testGetIntValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( null,
-                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getIntValue( null,
+                                                      this.bean ) );
     }
 
     public void testGetLongValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( null,
-                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getLongValue( null,
+                                                       this.bean ) );
     }
 
     public void testGetShortValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( null,
-                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             this.reader.getShortValue( null,
+                                                        this.bean ) );
     }
 
     public void testGetValue() {
-        try {
-            Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
-                                 ((Number) this.extractor.getValue( null,
-                                                                    this.bean )).intValue() );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( IntClassFieldExtractorTest.VALUE,
+                             ((Number) this.reader.getValue( null,
+                                                             this.bean )).intValue() );
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
-                                                            this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertFalse( this.reader.isNullValue( null,
+                                                     this.bean ) );
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/LongClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,19 +3,23 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class LongClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
     private static final long VALUE     = 5;
 
-    InternalReadAccessor                 extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                               "longAttr",
-                                                                                               getClass().getClassLoader() );
+    InternalReadAccessor                 extractor;
     TestBean                  bean      = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        extractor = store.getReader( TestBean.class,
+                                "longAttr",
+                                getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/MVELClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,19 +8,24 @@
 import org.drools.Address;
 import org.drools.Person;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.spi.InternalReadAccessor;
 
 public class MVELClassFieldExtractorTest extends TestCase {
 
-    InternalReadAccessor               extractor = ClassFieldAccessorCache.getInstance().getReader( Person.class,
-                                                                                             "addresses['home'].street",
-                                                                                             getClass().getClassLoader() );
-    private final Person[]  person    = new Person[2];
-    private final Address[] business  = new Address[2];
-    private final Address[] home      = new Address[2];
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+    InternalReadAccessor    extractor;
+    private final Person[]  person   = new Person[2];
+    private final Address[] business = new Address[2];
+    private final Address[] home     = new Address[2];
 
     protected void setUp() throws Exception {
-        super.setUp();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+
+        extractor = store.getReader( Person.class,
+                                     "addresses['home'].street",
+                                     getClass().getClassLoader() );
         person[0] = new Person( "bob",
                                 30 );
         business[0] = new Address( "Business Street",
@@ -146,9 +151,9 @@
             Assert.assertFalse( this.extractor.isNullValue( null,
                                                             this.person[0] ) );
 
-            InternalReadAccessor nullExtractor = ClassFieldAccessorCache.getInstance().getReader( Person.class,
-                                                                                           "addresses['business'].phone",
-                                                                                           getClass().getClassLoader() );
+            InternalReadAccessor nullExtractor = store.getReader( Person.class,
+                                                                  "addresses['business'].phone",
+                                                                  getClass().getClassLoader() );
             Assert.assertTrue( nullExtractor.isNullValue( null,
                                                           this.person[0] ) );
         } catch ( final Exception e ) {
@@ -191,7 +196,7 @@
                 }
             }
             if ( !errors.isEmpty() ) {
-                System.out.println(errors.toString());
+                System.out.println( errors.toString() );
                 fail( " Errors occured during execution " );
             }
         } catch ( InterruptedException e ) {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ObjectClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -6,24 +6,28 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class ObjectClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
 
-    InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                               "listAttr",
-                                                                               getClass().getClassLoader() );
-    TestBean  bean      = new TestBean();
+    InternalReadAccessor reader;
+    TestBean             bean = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                       "listAttr",
+                                       getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
-                                            this.bean );
+            this.reader.getBooleanValue( null,
+                                         this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -32,8 +36,8 @@
 
     public void testGetByteValue() {
         try {
-            this.extractor.getByteValue( null,
-                                         this.bean );
+            this.reader.getByteValue( null,
+                                      this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -42,8 +46,8 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
-                                         this.bean );
+            this.reader.getCharValue( null,
+                                      this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -52,8 +56,8 @@
 
     public void testGetDoubleValue() {
         try {
-            this.extractor.getDoubleValue( null,
-                                           this.bean );
+            this.reader.getDoubleValue( null,
+                                        this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -62,8 +66,8 @@
 
     public void testGetFloatValue() {
         try {
-            this.extractor.getFloatValue( null,
-                                          this.bean );
+            this.reader.getFloatValue( null,
+                                       this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -72,8 +76,8 @@
 
     public void testGetIntValue() {
         try {
-            this.extractor.getIntValue( null,
-                                        this.bean );
+            this.reader.getIntValue( null,
+                                     this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -82,8 +86,8 @@
 
     public void testGetLongValue() {
         try {
-            this.extractor.getLongValue( null,
-                                         this.bean );
+            this.reader.getLongValue( null,
+                                      this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -92,8 +96,8 @@
 
     public void testGetShortValue() {
         try {
-            this.extractor.getShortValue( null,
-                                          this.bean );
+            this.reader.getShortValue( null,
+                                       this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
             // success
@@ -101,29 +105,26 @@
     }
 
     public void testGetValue() {
-        try {
-            Assert.assertEquals( Collections.EMPTY_LIST,
-                                 this.extractor.getValue( null,
-                                                          this.bean ) );
-            Assert.assertTrue( this.extractor.getValue( null,
-                                                        this.bean ) instanceof List );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( Collections.EMPTY_LIST,
+                             this.reader.getValue( null,
+                                                   this.bean ) );
+        Assert.assertTrue( this.reader.getValue( null,
+                                                 this.bean ) instanceof List );
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
-                                                            this.bean ) );
+        Assert.assertFalse( this.reader.isNullValue( null,
+                                                     this.bean ) );
 
-            InternalReadAccessor nullExtractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                           "nullAttr",
-                                                                                           getClass().getClassLoader() );
-            Assert.assertTrue( nullExtractor.isNullValue( null,
-                                                          this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+
+        InternalReadAccessor nullExtractor = store.getReader( TestBean.class,
+                                                              "nullAttr",
+                                                              getClass().getClassLoader() );
+        Assert.assertTrue( nullExtractor.isNullValue( null,
+                                                      this.bean ) );
+
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/extractors/ShortClassFieldExtractorTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,24 +3,28 @@
 import junit.framework.Assert;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.TestBean;
 import org.drools.spi.InternalReadAccessor;
 
 public class ShortClassFieldExtractorTest extends BaseClassFieldExtractorsTest {
-    private static final short VALUE     = 3;
+    private static final short VALUE = 3;
 
-    InternalReadAccessor                  extractor = ClassFieldAccessorCache.getInstance().getReader( TestBean.class,
-                                                                                                "shortAttr",
-                                                                                                getClass().getClassLoader() );
-    TestBean                   bean      = new TestBean();
+    InternalReadAccessor       reader;
+    TestBean                   bean  = new TestBean();
 
     protected void setUp() throws Exception {
-        super.setUp();
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        this.reader = store.getReader( TestBean.class,
+                                              "shortAttr",
+                                              getClass().getClassLoader() );
     }
 
     public void testGetBooleanValue() {
         try {
-            this.extractor.getBooleanValue( null,
+            this.reader.getBooleanValue( null,
                                             this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -31,7 +35,7 @@
     public void testGetByteValue() {
         try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getByteValue( null,
+                                 this.reader.getByteValue( null,
                                                               this.bean ) );
         } catch ( final Exception e ) {
             fail( "Should not throw an exception" );
@@ -40,7 +44,7 @@
 
     public void testGetCharValue() {
         try {
-            this.extractor.getCharValue( null,
+            this.reader.getCharValue( null,
                                          this.bean );
             fail( "Should have throw an exception" );
         } catch ( final Exception e ) {
@@ -49,73 +53,45 @@
     }
 
     public void testGetDoubleValue() {
-        try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getDoubleValue( null,
+                                 this.reader.getDoubleValue( null,
                                                                 this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetFloatValue() {
-        try {
             Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getFloatValue( null,
+                                 this.reader.getFloatValue( null,
                                                                this.bean ),
                                  0.01 );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
     }
 
     public void testGetIntValue() {
-        try {
-            Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getIntValue( null,
-                                                             this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
+                             this.reader.getIntValue( null,
+                                                         this.bean ) );
     }
 
     public void testGetLongValue() {
-        try {
-            Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getLongValue( null,
-                                                              this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
+                             this.reader.getLongValue( null,
+                                                          this.bean ) );
     }
 
     public void testGetShortValue() {
-        try {
-            Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 this.extractor.getShortValue( null,
-                                                               this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
+                             this.reader.getShortValue( null,
+                                                           this.bean ) );
     }
 
     public void testGetValue() {
-        try {
-            Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
-                                 ((Number) this.extractor.getValue( null,
-                                                                    this.bean )).shortValue() );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertEquals( ShortClassFieldExtractorTest.VALUE,
+                             ((Number) this.reader.getValue( null,
+                                                                this.bean )).shortValue() );
     }
 
     public void testIsNullValue() {
-        try {
-            Assert.assertFalse( this.extractor.isNullValue( null,
-                                                            this.bean ) );
-        } catch ( final Exception e ) {
-            fail( "Should not throw an exception" );
-        }
+        Assert.assertFalse( this.reader.isNullValue( null,
+                                                        this.bean ) );
     }
 }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/common/BaseBetaConstraintsTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -7,6 +7,7 @@
 
 import org.drools.RuleBaseConfiguration;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.base.evaluators.ComparableEvaluatorsDefinition;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -46,9 +47,12 @@
                                                     Operator operator,
                                                     String fieldName,
                                                     Class clazz) {
-        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
-                                                                                          fieldName,
-                                                                                          getClass().getClassLoader() );
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+        InternalReadAccessor extractor = store.getReader( clazz,
+                                                          fieldName,
+                                                          getClass().getClassLoader() );
         Declaration declaration = new Declaration( identifier,
                                                    extractor,
                                                    new Pattern( 0,

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/AgendaEventSupportTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -81,9 +81,11 @@
         final Pattern pattern = new Pattern( 0,
                                              cheeseObjectType );
 
-        final ClassFieldReader extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
-                                                                                                   "type",
-                                                                                                   getClass().getClassLoader() );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        pkg.getClassFieldAccessorStore().setEagerWire( true );
+        final ClassFieldReader extractor = pkg.getClassFieldAccessorStore().getReader( Cheese.class,
+                                                                                       "type",
+                                                                                       getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -101,8 +103,10 @@
             public void evaluate(final KnowledgeHelper knowledgeHelper,
                                  final WorkingMemory workingMemory) throws Exception {
             }
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
+
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/event/RuleBaseEventListenerTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
@@ -71,13 +72,19 @@
         final Pattern pattern = new Pattern( 0,
                                              cheeseObjectType );
 
-        final ClassFieldReader extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
-                                                                                                   "type",
-                                                                                                   getClass().getClassLoader() );
+        ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
 
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "type",
+                                                            getClass().getClassLoader() );
+
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
-        final Evaluator evaluator = new EqualityEvaluatorsDefinition().getEvaluator( ValueType.STRING_TYPE, Operator.EQUAL, null );
+        final Evaluator evaluator = new EqualityEvaluatorsDefinition().getEvaluator( ValueType.STRING_TYPE,
+                                                                                     Operator.EQUAL,
+                                                                                     null );
 
         final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                     evaluator,
@@ -91,8 +98,10 @@
             public void evaluate(final KnowledgeHelper knowledgeHelper,
                                  final WorkingMemory workingMemory) throws Exception {
             }
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
+
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {
@@ -119,8 +128,10 @@
             public void evaluate(final KnowledgeHelper knowledgeHelper,
                                  final WorkingMemory workingMemory) throws Exception {
             }
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
+
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {
@@ -242,28 +253,29 @@
             this.id = id;
         }
 
-        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
-            id  = (String)in.readObject();
-            beforePackageAdded  = in.readInt();
-            afterPackageAdded  = in.readInt();
-            beforePackageRemoved  = in.readInt();
-            afterPackageRemoved  = in.readInt();
-            beforeRuleAdded  = in.readInt();
-            afterRuleAdded  = in.readInt();
-            beforeRuleRemoved  = in.readInt();
-            afterRuleRemoved  = in.readInt();
+        public void readExternal(ObjectInput in) throws IOException,
+                                                ClassNotFoundException {
+            id = (String) in.readObject();
+            beforePackageAdded = in.readInt();
+            afterPackageAdded = in.readInt();
+            beforePackageRemoved = in.readInt();
+            afterPackageRemoved = in.readInt();
+            beforeRuleAdded = in.readInt();
+            afterRuleAdded = in.readInt();
+            beforeRuleRemoved = in.readInt();
+            afterRuleRemoved = in.readInt();
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject(id);
-            out.writeInt(beforePackageAdded);
-            out.writeInt(afterPackageAdded);
-            out.writeInt(beforePackageRemoved);
-            out.writeInt(afterPackageRemoved);
-            out.writeInt(beforeRuleAdded);
-            out.writeInt(afterRuleAdded);
-            out.writeInt(beforeRuleRemoved);
-            out.writeInt(afterRuleRemoved);
+            out.writeObject( id );
+            out.writeInt( beforePackageAdded );
+            out.writeInt( afterPackageAdded );
+            out.writeInt( beforePackageRemoved );
+            out.writeInt( afterPackageRemoved );
+            out.writeInt( beforeRuleAdded );
+            out.writeInt( afterRuleAdded );
+            out.writeInt( beforeRuleRemoved );
+            out.writeInt( afterRuleRemoved );
         }
 
         public void afterPackageAdded(AfterPackageAddedEvent event) {

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/BaseMannersTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -36,6 +36,7 @@
 
 import org.drools.WorkingMemory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -92,6 +93,8 @@
 
     //private Evaluator       booleanNotEqualEvaluator;
 
+    ClassFieldAccessorStore store;
+
     protected void setUp() throws Exception {
         //Class shadow = ShadowProxyFactory.getProxy( Context.class );
         this.contextType = new ClassObjectType( Context.class );
@@ -115,12 +118,24 @@
         this.chosenType = new ClassObjectType( Chosen.class );
 
         EqualityEvaluatorsDefinition evals = new EqualityEvaluatorsDefinition();
-        this.integerEqualEvaluator = evals.getEvaluator( ValueType.PINTEGER_TYPE, Operator.EQUAL, null );
-        this.objectEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE, Operator.EQUAL, null );
-        this.objectNotEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE, Operator.NOT_EQUAL, null );
-        this.booleanEqualEvaluator = evals.getEvaluator( ValueType.PBOOLEAN_TYPE, Operator.EQUAL, null );
+        this.integerEqualEvaluator = evals.getEvaluator( ValueType.PINTEGER_TYPE,
+                                                         Operator.EQUAL,
+                                                         null );
+        this.objectEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE,
+                                                        Operator.EQUAL,
+                                                        null );
+        this.objectNotEqualEvaluator = evals.getEvaluator( ValueType.OBJECT_TYPE,
+                                                           Operator.NOT_EQUAL,
+                                                           null );
+        this.booleanEqualEvaluator = evals.getEvaluator( ValueType.PBOOLEAN_TYPE,
+                                                         Operator.EQUAL,
+                                                         null );
 
         this.pkg = new Package( "org.drools.examples.manners" );
+        this.pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store = this.pkg.getClassFieldAccessorStore();
+        store.setEagerWire( true );
+        
         this.pkg.addRule( getAssignFirstSeatRule() );
         this.pkg.addRule( getFindSeating() );
         this.pkg.addRule( getPathDone() );
@@ -237,12 +252,12 @@
 
                     drools.modifyRetract( context );;
                     context.setState( Context.ASSIGN_SEATS );
-//                    drools.update( tuple.get( contextDeclaration ),
-//                            context );
+                    //                    drools.update( tuple.get( contextDeclaration ),
+                    //                            context );
 
                     drools.modifyInsert( context );
 
-//                    System.err.println( "assign first seat :  " + seating + " : " + path );
+                    //                    System.err.println( "assign first seat :  " + seating + " : " + path );
 
                 } catch ( Exception e ) {
                     e.printStackTrace();
@@ -250,7 +265,8 @@
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -533,15 +549,17 @@
                     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();
                     throw new ConsequenceException( e );
                 }
             }
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
+
             }
 
             public void writeExternal(ObjectOutput out) throws IOException {
@@ -692,7 +710,8 @@
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -793,7 +812,8 @@
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -887,13 +907,14 @@
                     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 );
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -965,7 +986,8 @@
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -1026,7 +1048,8 @@
                 }
             }
 
-            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+            public void readExternal(ObjectInput in) throws IOException,
+                                                    ClassNotFoundException {
 
             }
 
@@ -1166,9 +1189,9 @@
                                                           final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
-                                                                                              fieldName,
-                                                                                              getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( clazz,
+                                                                fieldName,
+                                                                getClass().getClassLoader() );
 
         final FieldValue field = new LongFieldImpl( fieldValue );
 
@@ -1183,9 +1206,9 @@
                                                           final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
-                                                                                              fieldName,
-                                                                                              getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( clazz,
+                                                                fieldName,
+                                                                getClass().getClassLoader() );
 
         final FieldValue field = new BooleanFieldImpl( fieldValue );
 
@@ -1199,12 +1222,11 @@
                                      final String identifier) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
-                                                                                              fieldName,
-                                                                                              getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( clazz,
+                                                                fieldName,
+                                                                getClass().getClassLoader() );
 
-        pattern.addDeclaration( identifier,
-                                extractor );
+        pattern.addDeclaration( identifier ).setReadAccessor( extractor );
     }
 
     private BetaNodeFieldConstraint getBoundVariableConstraint(final Pattern pattern,
@@ -1213,9 +1235,9 @@
                                                                final Evaluator evaluator) throws IntrospectionException {
         final Class clazz = ((ClassObjectType) pattern.getObjectType()).getClassType();
 
-        final InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( clazz,
-                                                                                              fieldName,
-                                                                                              getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( clazz,
+                                                                fieldName,
+                                                                getClass().getClassLoader() );
 
         return new VariableConstraint( extractor,
                                        declaration,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/factmodel/ClassBuilderTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -13,16 +13,18 @@
 import junit.framework.TestCase;
 
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 
 public class ClassBuilderTest extends TestCase {
 
-    private ClassFieldAccessorCache cache;
-    private ClassLoader classLoader;
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+    private ClassLoader     classLoader;
 
     protected void setUp() throws Exception {
         super.setUp();
-        cache = ClassFieldAccessorCache.getInstance();
         classLoader = this.getClass().getClassLoader();
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( classLoader ) );
+        store.setEagerWire( true );
     }
 
     protected void tearDown() throws Exception {
@@ -42,21 +44,21 @@
             FieldDefinition intDef = new FieldDefinition( "intAttr",
                                                           "int" );
 
-
             FieldDefinition stringDef = new FieldDefinition( "stringAttr",
-                                                             "java.lang.String");//"java.lang.String" );
+                                                             "java.lang.String" );//"java.lang.String" );
             classDef.addField( intDef );
             classDef.addField( stringDef );
 
             Class clazz = builder.buildAndLoadClass( classDef );
-            intDef.setFieldAccessor( cache.getAccessor( clazz, intDef.getName(), classLoader ) );
-            stringDef.setFieldAccessor( cache.getAccessor( clazz, stringDef.getName(), classLoader ) );
+            intDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        intDef.getName(),
+                                                        classLoader ) );
+            stringDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                           stringDef.getName(),
+                                                           classLoader ) );
 
+            byte[] data = builder.buildClass( classDef );
 
-            byte[] data = builder.buildClass(classDef);
-
-
-
             Assert.assertSame( "Returned class should be the same",
                                clazz,
                                classDef.getDefinedClass() );
@@ -95,16 +97,16 @@
      * @throws FileNotFoundException
      * @throws IOException
      */
-	private void writeJar(byte[] data) throws FileNotFoundException,
-			IOException {
-		FileOutputStream out  = new FileOutputStream(new File("/Users/michaelneale/edson.jar"));
-		JarOutputStream jout = new JarOutputStream(out);
-		JarEntry je = new JarEntry("br/com/auster/TestClass1.class");
-		jout.putNextEntry(je);
-		jout.write(data);
-		jout.closeEntry();
-		jout.close();
-	}
+    private void writeJar(byte[] data) throws FileNotFoundException,
+                                      IOException {
+        FileOutputStream out = new FileOutputStream( new File( "/Users/michaelneale/edson.jar" ) );
+        JarOutputStream jout = new JarOutputStream( out );
+        JarEntry je = new JarEntry( "br/com/auster/TestClass1.class" );
+        jout.putNextEntry( je );
+        jout.write( data );
+        jout.closeEntry();
+        jout.close();
+    }
 
     public void testEquals() {
         try {
@@ -114,23 +116,23 @@
                                                             null,
                                                             new String[]{} );
             FieldDefinition long1Def = new FieldDefinition( "longAttr1",
-                                                          "long",
-                                                          true);
+                                                            "long",
+                                                            true );
             FieldDefinition long2Def = new FieldDefinition( "longAttr2",
-                                                          "long",
-                                                          true);
+                                                            "long",
+                                                            true );
             FieldDefinition doubleDef = new FieldDefinition( "doubleAttr",
-                                                            "double",
-                                                            true);
+                                                             "double",
+                                                             true );
             FieldDefinition intDef = new FieldDefinition( "intAttr",
                                                           "int",
-                                                          true);
+                                                          true );
             FieldDefinition strDef = new FieldDefinition( "stringAttr",
                                                           "java.lang.String",
-                                                          true);
+                                                          true );
             FieldDefinition dateDef = new FieldDefinition( "dateAttr",
                                                            "java.util.Date",
-                                                           true);
+                                                           true );
             FieldDefinition str2Def = new FieldDefinition( "stringAttr2",
                                                            "java.lang.String" );
             classDef.addField( long1Def );
@@ -142,15 +144,28 @@
             classDef.addField( str2Def );
 
             Class clazz = builder.buildAndLoadClass( classDef );
-            long1Def.setFieldAccessor( cache.getAccessor( clazz, long1Def.getName(), classLoader ) );
-            long2Def.setFieldAccessor( cache.getAccessor( clazz, long2Def.getName(), classLoader ) );
-            doubleDef.setFieldAccessor( cache.getAccessor( clazz, doubleDef.getName(), classLoader ) );
-            intDef.setFieldAccessor( cache.getAccessor( clazz, intDef.getName(), classLoader ) );
-            strDef.setFieldAccessor( cache.getAccessor( clazz, strDef.getName(), classLoader ) );
-            dateDef.setFieldAccessor( cache.getAccessor( clazz, dateDef.getName(), classLoader ) );
-            str2Def.setFieldAccessor( cache.getAccessor( clazz, str2Def.getName(), classLoader ) );
-            
-            
+            long1Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                          long1Def.getName(),
+                                                          classLoader ) );
+            long2Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                          long2Def.getName(),
+                                                          classLoader ) );
+            doubleDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                           doubleDef.getName(),
+                                                           classLoader ) );
+            intDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        intDef.getName(),
+                                                        classLoader ) );
+            strDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        strDef.getName(),
+                                                        classLoader ) );
+            dateDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                         dateDef.getName(),
+                                                         classLoader ) );
+            str2Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                         str2Def.getName(),
+                                                         classLoader ) );
+
             Object x = clazz.newInstance();
             Object y = clazz.newInstance();
 
@@ -159,7 +174,7 @@
             long2Def.setValue( x,
                                new Long( 30 ) );
             doubleDef.setValue( x,
-                               new Double( 50.0 ) );
+                                new Double( 50.0 ) );
             intDef.setValue( x,
                              new Integer( 10 ) );
             strDef.setValue( x,
@@ -218,7 +233,7 @@
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            Assert.fail("Exception not expected");
+            Assert.fail( "Exception not expected" );
         }
     }
 
@@ -231,29 +246,38 @@
                                                             new String[]{} );
             FieldDefinition intDef = new FieldDefinition( "intAttr",
                                                           "int",
-                                                          true);
+                                                          true );
             FieldDefinition strDef = new FieldDefinition( "stringAttr",
                                                           "java.lang.String",
-                                                          false);
+                                                          false );
             classDef.addField( intDef );
             classDef.addField( strDef );
 
             Class clazz = builder.buildAndLoadClass( classDef );
-            intDef.setFieldAccessor( cache.getAccessor( clazz, intDef.getName(), classLoader ) );
-            strDef.setFieldAccessor( cache.getAccessor( clazz, strDef.getName(), classLoader ) );
+            intDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        intDef.getName(),
+                                                        classLoader ) );
+            strDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        strDef.getName(),
+                                                        classLoader ) );
 
             Object x = clazz.newInstance();
 
             intDef.setValue( x,
                              new Integer( 10 ) );
-            strDef.setValue( x, "abc" );
+            strDef.setValue( x,
+                             "abc" );
 
-            Assert.assertEquals("Wrong hashcode calculation", 31+10, x.hashCode());
-            Assert.assertEquals("Wrong hashcode calculation", x.hashCode(), x.hashCode());
+            Assert.assertEquals( "Wrong hashcode calculation",
+                                 31 + 10,
+                                 x.hashCode() );
+            Assert.assertEquals( "Wrong hashcode calculation",
+                                 x.hashCode(),
+                                 x.hashCode() );
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            Assert.fail("Exception not expected");
+            Assert.fail( "Exception not expected" );
         }
     }
 
@@ -265,23 +289,23 @@
                                                             null,
                                                             new String[]{} );
             FieldDefinition long1Def = new FieldDefinition( "longAttr1",
-                                                          "long",
-                                                          true);
+                                                            "long",
+                                                            true );
             FieldDefinition long2Def = new FieldDefinition( "longAttr2",
-                                                          "long",
-                                                          true);
+                                                            "long",
+                                                            true );
             FieldDefinition doubleDef = new FieldDefinition( "doubleAttr",
-                                                            "double",
-                                                            true);
+                                                             "double",
+                                                             true );
             FieldDefinition intDef = new FieldDefinition( "intAttr",
                                                           "int",
-                                                          true);
+                                                          true );
             FieldDefinition strDef = new FieldDefinition( "stringAttr",
                                                           "java.lang.String",
-                                                          true);
+                                                          true );
             FieldDefinition dateDef = new FieldDefinition( "dateAttr",
                                                            "java.util.Date",
-                                                           true);
+                                                           true );
             FieldDefinition str2Def = new FieldDefinition( "stringAttr2",
                                                            "java.lang.String" );
             classDef.addField( long1Def );
@@ -293,14 +317,28 @@
             classDef.addField( str2Def );
 
             Class clazz = builder.buildAndLoadClass( classDef );
-            long1Def.setFieldAccessor( cache.getAccessor( clazz, long1Def.getName(), classLoader ) );
-            long2Def.setFieldAccessor( cache.getAccessor( clazz, long2Def.getName(), classLoader ) );
-            doubleDef.setFieldAccessor( cache.getAccessor( clazz, doubleDef.getName(), classLoader ) );
-            intDef.setFieldAccessor( cache.getAccessor( clazz, intDef.getName(), classLoader ) );
-            strDef.setFieldAccessor( cache.getAccessor( clazz, strDef.getName(), classLoader ) );
-            dateDef.setFieldAccessor( cache.getAccessor( clazz, dateDef.getName(), classLoader ) );
-            str2Def.setFieldAccessor( cache.getAccessor( clazz, str2Def.getName(), classLoader ) );
-            
+            long1Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                          long1Def.getName(),
+                                                          classLoader ) );
+            long2Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                          long2Def.getName(),
+                                                          classLoader ) );
+            doubleDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                           doubleDef.getName(),
+                                                           classLoader ) );
+            intDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        intDef.getName(),
+                                                        classLoader ) );
+            strDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                        strDef.getName(),
+                                                        classLoader ) );
+            dateDef.setReadWriteAccessor( store.getAccessor( clazz,
+                                                         dateDef.getName(),
+                                                         classLoader ) );
+            str2Def.setReadWriteAccessor( store.getAccessor( clazz,
+                                                         str2Def.getName(),
+                                                         classLoader ) );
+
             Object x = clazz.newInstance();
 
             long1Def.setValue( x,
@@ -308,7 +346,7 @@
             long2Def.setValue( x,
                                new Long( 30 ) );
             doubleDef.setValue( x,
-                               new Double( 50.0 ) );
+                                new Double( 50.0 ) );
             intDef.setValue( x,
                              new Integer( 10 ) );
             strDef.setValue( x,
@@ -320,17 +358,17 @@
 
             String result = x.toString();
 
-            Assert.assertTrue( result.contains( long1Def.getName() ));
-            Assert.assertTrue( result.contains( long2Def.getName() ));
-            Assert.assertTrue( result.contains( doubleDef.getName() ));
-            Assert.assertTrue( result.contains( intDef.getName() ));
-            Assert.assertTrue( result.contains( strDef.getName() ));
-            Assert.assertTrue( result.contains( dateDef.getName() ));
-            Assert.assertTrue( result.contains( str2Def.getName() ));
+            Assert.assertTrue( result.contains( long1Def.getName() ) );
+            Assert.assertTrue( result.contains( long2Def.getName() ) );
+            Assert.assertTrue( result.contains( doubleDef.getName() ) );
+            Assert.assertTrue( result.contains( intDef.getName() ) );
+            Assert.assertTrue( result.contains( strDef.getName() ) );
+            Assert.assertTrue( result.contains( dateDef.getName() ) );
+            Assert.assertTrue( result.contains( str2Def.getName() ) );
 
         } catch ( Exception e ) {
             e.printStackTrace();
-            Assert.fail("Exception not expected");
+            Assert.fail( "Exception not expected" );
         }
 
     }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AlphaNodeTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -23,6 +23,7 @@
 import org.drools.FactException;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
@@ -40,12 +41,18 @@
 import org.drools.spi.PropagationContext;
 
 public class AlphaNodeTest extends DroolsTestCase {
-
-    ClassFieldAccessorCache     cache  = ClassFieldAccessorCache.getInstance();
+    
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public void testLiteralConstraintAssertObjectWithoutMemory() throws Exception {
-        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( );
+        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         BuildContext buildContext = new BuildContext( ruleBase,
                                                       ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
         ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -59,9 +66,9 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
-                                                                  "type",
-                                                                  getClass().getClassLoader() );
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "type",
+                                                            getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -91,7 +98,6 @@
         // check alpha memory is empty 
         final AlphaMemory memory = (AlphaMemory) workingMemory.getNodeMemory( alphaNode );
 
-
         // object should assert as it passes text
         alphaNode.assertObject( f0,
                                 context,
@@ -99,7 +105,7 @@
 
         assertEquals( 1,
                       sink.getAsserted().size() );
-        
+
         Object[] list = (Object[]) sink.getAsserted().get( 0 );
         assertSame( cheddar,
                     workingMemory.getObject( (DefaultFactHandle) list[0] ) );
@@ -126,7 +132,7 @@
      *  This just test AlphaNode With a different Constraint type.
      */
     public void testReturnValueConstraintAssertObject() throws Exception {
-        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( );
+        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         BuildContext buildContext = new BuildContext( ruleBase,
                                                       ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
         ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -140,9 +146,9 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -196,7 +202,7 @@
     public void testUpdateSinkWithoutMemory() throws FactException,
                                              IntrospectionException {
         // An AlphaNode should try and repropagate from its source
-        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase( );
+        ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         BuildContext buildContext = new BuildContext( ruleBase,
                                                       ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
         ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newStatefulSession();
@@ -210,9 +216,9 @@
 
         final MockObjectSource source = new MockObjectSource( buildContext.getNextId() );
 
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/CompositeObjectSinkAdapterTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,7 @@
 import org.drools.Cheese;
 import org.drools.RuleBaseFactory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
 import org.drools.base.evaluators.Operator;
@@ -30,8 +31,11 @@
     private BuildContext                 buildContext;
 
     private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
     protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
         this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         this.buildContext = new BuildContext( ruleBase,
                                               ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
@@ -180,9 +184,9 @@
 
     public void testTripleAlpha() {
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
-                                                                                        "type",
-                                                                                        this.getClass().getClassLoader() );
+        InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                          "type",
+                                                          this.getClass().getClassLoader() );
 
         final LiteralConstraint lit = new LiteralConstraint( extractor,
                                                              equals.getEvaluator( ValueType.STRING_TYPE,
@@ -242,9 +246,9 @@
 
     public void testTripleAlphaCharacterConstraint() {
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
-                                                                                        "charType",
-                                                                                        this.getClass().getClassLoader() );
+        InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                          "charType",
+                                                          this.getClass().getClassLoader() );
 
         final LiteralConstraint lit = new LiteralConstraint( extractor,
                                                              equals.getEvaluator( extractor.getValueType(),
@@ -320,15 +324,14 @@
         assertEquals( 2,
                       ad.hashableSinks.size() );
         assertNull( ad.hashedSinkMap );
-
     }
 
     public void testPropagationWithNullValue() {
 
         final CompositeObjectSinkAdapter ad = new CompositeObjectSinkAdapter();
-        InternalReadAccessor extractor = ClassFieldAccessorCache.getInstance().getReader( Cheese.class,
-                                                                                        "type",
-                                                                                        this.getClass().getClassLoader() );
+        InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                          "type",
+                                                          this.getClass().getClassLoader() );
         final LiteralConstraint lit1 = new LiteralConstraint( extractor,
                                                               equals.getEvaluator( ValueType.STRING_TYPE,
                                                                                    Operator.EQUAL ),

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/FromNodeTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -12,6 +12,7 @@
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
@@ -38,9 +39,15 @@
 import org.drools.util.LinkedListEntry;
 
 public class FromNodeTest extends TestCase {
-    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public void testAlphaNode() {
         final PropagationContext context = new PropagationContextImpl( 0,
                                                                        PropagationContext.ASSERTION,
@@ -49,7 +56,7 @@
                                                                        null );
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -146,11 +153,11 @@
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
 
-        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
+        final ClassFieldReader priceExtractor = store.getReader( Cheese.class,
                                                                        "price",
                                                                        getClass().getClassLoader() );
 
-        final ClassFieldReader ageExtractor = cache.getReader( Person.class,
+        final ClassFieldReader ageExtractor = store.getReader( Person.class,
                                                                      "age",
                                                                      getClass().getClassLoader() );
 
@@ -256,7 +263,7 @@
                                                                        null );
         final ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                            (ReteooRuleBase) RuleBaseFactory.newRuleBase() );
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ObjectTypeNodeTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -205,7 +205,7 @@
         assertNotNull( memory );
     }
 
-    public void testMatches() {
+    public void testIsAssignableFrom() {
         ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator(); 
         final Rete source = new Rete((InternalRuleBase) ruleBase);
@@ -215,18 +215,18 @@
                                                             new ClassObjectType( String.class ),
                                                             buildContext );
 
-        assertFalse( objectTypeNode.matches( new Object() ) );
-        assertFalse( objectTypeNode.matches( new Integer( 5 ) ) );
-        assertTrue( objectTypeNode.matches( "string" ) );
+        assertFalse( objectTypeNode.isAssignableFrom( new ClassObjectType( new Object().getClass() ) ) );
+        assertFalse( objectTypeNode.isAssignableFrom( new ClassObjectType( new Integer( 5 ).getClass() ) ) );
+        assertTrue( objectTypeNode.isAssignableFrom( new ClassObjectType( "string".getClass() ) ) );
 
         objectTypeNode = new ObjectTypeNode( idGenerator.getNextId(),
                                              this.entryPoint,
                                              new ClassObjectType( Object.class ),
                                              buildContext );
 
-        assertTrue( objectTypeNode.matches( new Object() ) );
-        assertTrue( objectTypeNode.matches( new Integer( 5 ) ) );
-        assertTrue( objectTypeNode.matches( "string" ) );
+        assertTrue( objectTypeNode.isAssignableFrom( new ClassObjectType( new Object().getClass() ) ) );
+        assertTrue( objectTypeNode.isAssignableFrom( new ClassObjectType( new Integer( 5 ).getClass() ) ) );
+        assertTrue( objectTypeNode.isAssignableFrom( new ClassObjectType( "string".getClass() ) ) );
 
     }
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/OtherwiseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/OtherwiseTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/OtherwiseTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -4,6 +4,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
 import org.drools.base.TestBean;
 import org.drools.rule.Pattern;
@@ -28,6 +29,7 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
 
         final Package pkg = new Package( "Miss Manners" );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         final Rule rule1 = getRule( "rule1" );
         pkg.addRule( rule1 );
 
@@ -49,6 +51,7 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
 
         final Package pkg = new Package( "Miss Manners" );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         final Rule rule1 = getRule( "rule1" );
         pkg.addRule( rule1 );
         final Rule rule2 = getRule( "rule2" );
@@ -77,6 +80,7 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
 
         final Package pkg = new Package( "Miss Manners" );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         final Rule rule1 = getRule( "rule1" );
         pkg.addRule( rule1 );
 
@@ -102,6 +106,7 @@
         final RuleBase ruleBase = RuleBaseFactory.newRuleBase( RuleBase.RETEOO );
 
         final Package pkg = new Package( "Miss Manners" );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         final Rule rule1 = getRule( "rule1" );
         pkg.addRule( rule1 );
         final Rule rule2 = getRule( "rule2" );

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/QueryTerminalNodeTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -28,6 +28,7 @@
 import org.drools.QueryResults;
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ClassObjectType;
@@ -49,10 +50,13 @@
     private BuildContext     buildContext;
     private EntryPointNode   entryPoint;
 
-    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     private EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
     protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
         this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         this.buildContext = new BuildContext( ruleBase,
                                               ((ReteooRuleBase) ruleBase).getReteooBuilder().getIdGenerator() );
@@ -70,7 +74,7 @@
                                                                        buildContext );
         queryObjectTypeNode.attach();
 
-        ClassFieldReader extractor = cache.getReader( DroolsQuery.class,
+        ClassFieldReader extractor = store.getReader( DroolsQuery.class,
                                                             "name",
                                                             DroolsQuery.class.getClassLoader() );
 
@@ -99,7 +103,7 @@
                                                                         buildContext );
         cheeseObjectTypeNode.attach();
 
-        extractor = cache.getReader( Cheese.class,
+        extractor = store.getReader( Cheese.class,
                                         "type",
                                         getClass().getClassLoader() );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooRuleBaseTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooRuleBaseTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/ReteooRuleBaseTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -21,6 +21,7 @@
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorCache;
 
 public class ReteooRuleBaseTest extends DroolsTestCase {
     ReteooRuleBase ruleBase;
@@ -75,18 +76,21 @@
 
     public void testAddPackage() throws Exception {
         final org.drools.rule.Package pkg1 = new org.drools.rule.Package( "org.droos.test" );
+        pkg1.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg1.addGlobal( "global1",
                         Object.class );
         pkg1.addGlobal( "global2",
                         Object.class );
 
         final org.drools.rule.Package pkg2 = new org.drools.rule.Package( "org.droos.test" );
+        pkg2.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg2.addGlobal( "global1",
                         Object.class );
         pkg2.addGlobal( "global3",
                         Object.class );
 
         final org.drools.rule.Package pkg3 = new org.drools.rule.Package( "org.droos.test2" );
+        pkg3.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg3.addGlobal( "global3",
                         Object.class );
         pkg3.addGlobal( "global4",
@@ -133,18 +137,21 @@
 
     public void testRemovePackage() throws Exception {
         final org.drools.rule.Package pkg1 = new org.drools.rule.Package( "org.droos.test" );
+        pkg1.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg1.addGlobal( "global1",
                         Object.class );
         pkg1.addGlobal( "global2",
                         Object.class );
 
         final org.drools.rule.Package pkg2 = new org.drools.rule.Package( "org.droos.test" );
+        pkg2.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg2.addGlobal( "global1",
                         Object.class );
         pkg2.addGlobal( "global3",
                         Object.class );
 
         final org.drools.rule.Package pkg3 = new org.drools.rule.Package( "org.droos.test2" );
+        pkg3.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
         pkg3.addGlobal( "global3",
                         Object.class );
         pkg3.addGlobal( "global4",

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/DeclarationTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -24,17 +24,23 @@
 
 import org.drools.Cheese;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.spi.InternalReadAccessor;
 
 public class DeclarationTest extends TestCase {
 
-    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
 
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public void testDeclaration() throws IntrospectionException {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 5,
                                              new ClassObjectType( Cheese.class ) );
@@ -60,9 +66,9 @@
     }
 
     public void testGetFieldValue() throws IntrospectionException {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 5,
                                              new ClassObjectType( Cheese.class ) );

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/FieldConstraintTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -27,6 +27,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.WorkingMemory;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassObjectType;
 import org.drools.base.FieldFactory;
@@ -51,12 +52,16 @@
 
 public class FieldConstraintTest extends TestCase {
 
-    ClassFieldAccessorCache       cache       = ClassFieldAccessorCache.getInstance();
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
     EqualityEvaluatorsDefinition   equals      = new EqualityEvaluatorsDefinition();
     ComparableEvaluatorsDefinition comparables = new ComparableEvaluatorsDefinition();
 
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public FieldConstraintTest() {
-        super();
     }
 
     /**
@@ -77,9 +82,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
-                                                                  "type",
-                                                                  getClass().getClassLoader() );
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "type",
+                                                            getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -127,9 +132,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
-                                                                  "price",
-                                                                  getClass().getClassLoader() );
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "price",
+                                                            getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( 5 );
 
@@ -178,9 +183,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final InternalReadAccessor priceExtractor = cache.getReader( Cheese.class,
-                                                                  "price",
-                                                                  getClass().getClassLoader() );
+        final InternalReadAccessor priceExtractor = store.getReader( Cheese.class,
+                                                                     "price",
+                                                                     getClass().getClassLoader() );
 
         Pattern pattern = new Pattern( 0,
                                        new ClassObjectType( Cheese.class ) );
@@ -280,9 +285,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final InternalReadAccessor priceExtractor = cache.getReader( Cheese.class,
-                                                                  "price",
-                                                                  getClass().getClassLoader() );
+        final InternalReadAccessor priceExtractor = store.getReader( Cheese.class,
+                                                                     "price",
+                                                                     getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -403,9 +408,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
-                                                                  "type",
-                                                                  getClass().getClassLoader() );
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "type",
+                                                            getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -416,9 +421,9 @@
                                                                      evaluator,
                                                                      field );
 
-        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
-                                                                       "price",
-                                                                       getClass().getClassLoader() );
+        final ClassFieldReader priceExtractor = store.getReader( Cheese.class,
+                                                                 "price",
+                                                                 getClass().getClassLoader() );
 
         final FieldValue priceField = FieldFactory.getFieldValue( 10 );
 
@@ -478,9 +483,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
-                                                                  "type",
-                                                                  getClass().getClassLoader() );
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
+                                                            "type",
+                                                            getClass().getClassLoader() );
 
         final FieldValue field = FieldFactory.getFieldValue( "cheddar" );
 
@@ -491,9 +496,9 @@
                                                                      evaluator,
                                                                      field );
 
-        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
-                                                                       "price",
-                                                                       getClass().getClassLoader() );
+        final ClassFieldReader priceExtractor = store.getReader( Cheese.class,
+                                                                 "price",
+                                                                 getClass().getClassLoader() );
 
         final FieldValue priceField = FieldFactory.getFieldValue( 10 );
 
@@ -552,9 +557,9 @@
         final ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
         final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
 
-        final ClassFieldReader typeExtractor = cache.getReader( Cheese.class,
-                                                                      "type",
-                                                                      getClass().getClassLoader() );
+        final ClassFieldReader typeExtractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final FieldValue cheddarField = FieldFactory.getFieldValue( "cheddar" );
 
@@ -566,9 +571,9 @@
                                                                      stringEqual,
                                                                      cheddarField );
 
-        final ClassFieldReader priceExtractor = cache.getReader( Cheese.class,
-                                                                       "price",
-                                                                       getClass().getClassLoader() );
+        final ClassFieldReader priceExtractor = store.getReader( Cheese.class,
+                                                                 "price",
+                                                                 getClass().getClassLoader() );
 
         final FieldValue field10 = FieldFactory.getFieldValue( 10 );
 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2008-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/rule/PackageCompilationDataTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -10,6 +10,9 @@
 import junit.framework.TestCase;
 
 import org.drools.WorkingMemory;
+import org.drools.base.ClassFieldAccessorCache;
+import org.drools.common.InternalRuleBase;
+import org.drools.reteoo.ReteooRuleBase;
 import org.drools.spi.EvalExpression;
 import org.drools.spi.Tuple;
 
@@ -28,12 +31,22 @@
         }
     }
 
-    public void testCodeSourceUrl() throws IOException {
+    public void testCodeSourceUrl() throws Exception {
         final String className = TestEvalExpression.class.getName();
         
-        final JavaDialectRuntimeData pcData = new JavaDialectRuntimeData( new DialectRuntimeRegistry( getClass().getClassLoader() ) );
+        ReteooRuleBase rb = new ReteooRuleBase( "xxx" );
         
+        Package pkg = new Package( "org.drools" );
+        pkg.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        JavaDialectRuntimeData data = new JavaDialectRuntimeData();
+        data.onAdd( pkg.getDialectRuntimeRegistry(), rb.getRootClassLoader()  );
+        pkg.getDialectRuntimeRegistry().setDialectData( "java", data );
         
+        rb.addPackage( pkg );
+        
+        final JavaDialectRuntimeData pcData = ( JavaDialectRuntimeData ) pkg.getDialectRuntimeRegistry().getDialectData( "java" );
+        
+        
         final EvalCondition invoker = new EvalCondition(null);
         pcData.putInvoker(className, invoker);
         final InputStream is = getClass().getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");
@@ -41,7 +54,15 @@
             pcData.write(className.replace('.', '/') + ".class", read(is));
         } finally {
             is.close();
-        }
+        }                
+        
+        pcData.onAdd( pkg.getDialectRuntimeRegistry(), rb.getRootClassLoader() );
+        pcData.onBeforeExecute();
+        
+        Class cls = ((InternalRuleBase)rb).getRootClassLoader().loadClass( "org.drools.rule.PackageCompilationDataTest$TestEvalExpression" );
+        
+        System.out.println( cls );
+        
         final CodeSource codeSource = invoker.getEvalExpression().getClass().getProtectionDomain().getCodeSource();
         assertNotNull(codeSource.getLocation());
     }

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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/FieldIndexEntryTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -3,6 +3,7 @@
 import junit.framework.TestCase;
 
 import org.drools.Cheese;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassFieldReader;
 import org.drools.base.ClassFieldAccessorCache;
 import org.drools.base.ValueType;
@@ -15,11 +16,17 @@
 import org.drools.util.AbstractHashTable.SingleIndex;
 
 public class FieldIndexEntryTest extends TestCase {
-    ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
+    ClassFieldAccessorStore store = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public void testSingleEntry() {
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
 
@@ -64,7 +71,7 @@
     }
 
     public void testTwoEntries() {
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
+        final ClassFieldReader extractor = store.getReader( Cheese.class,
                                                                   "type",
                                                                   getClass().getClassLoader() );
         final FieldIndex fieldIndex = new FieldIndex( extractor,
@@ -119,7 +126,7 @@
     }
 
     public void testThreeEntries() {
-        final ClassFieldReader extractor = cache.getReader( Cheese.class,
+        final ClassFieldReader extractor = store.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-08-15 07:38:38 UTC (rev 21561)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/RightTupleIndexHashTableTest.java	2008-08-15 07:39:04 UTC (rev 21562)
@@ -8,6 +8,7 @@
 
 import org.drools.Cheese;
 import org.drools.base.ClassFieldAccessorCache;
+import org.drools.base.ClassFieldAccessorStore;
 import org.drools.base.ClassObjectType;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EqualityEvaluatorsDefinition;
@@ -22,13 +23,19 @@
 import org.drools.util.AbstractHashTable.FieldIndex;
 
 public class RightTupleIndexHashTableTest extends TestCase {
-    ClassFieldAccessorCache     cache  = ClassFieldAccessorCache.getInstance();
     EqualityEvaluatorsDefinition equals = new EqualityEvaluatorsDefinition();
 
+    ClassFieldAccessorStore      store  = new ClassFieldAccessorStore();
+
+    protected void setUp() throws Exception {
+        store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
+        store.setEagerWire( true );
+    }
+
     public void testSingleEntry() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -53,7 +60,7 @@
                       map.size() );
         assertNull( map.get( new LeftTuple( cheddarHandle1,
                                             null,
-                                            true) ) );
+                                            true ) ) );
 
         final Cheese stilton1 = new Cheese( "stilton",
                                             35 );
@@ -82,9 +89,9 @@
     }
 
     public void testTwoDifferentEntries() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -146,9 +153,9 @@
     }
 
     public void testTwoEqualEntries() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -209,9 +216,9 @@
     }
 
     public void testTwoDifferentEntriesSameHashCode() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( TestClass.class,
-                                                             "object",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( TestClass.class,
+                                                                "object",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( TestClass.class ) );
@@ -269,9 +276,9 @@
     }
 
     public void testRemove() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -343,9 +350,9 @@
     }
 
     public void testResize() throws Exception {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -359,7 +366,9 @@
                                                       equals.getEvaluator( ValueType.STRING_TYPE,
                                                                            Operator.EQUAL ) );
 
-        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( 16, 0.75f, new FieldIndex[]{fieldIndex} );
+        final RightTupleIndexHashTable map = new RightTupleIndexHashTable( 16,
+                                                                           0.75f,
+                                                                           new FieldIndex[]{fieldIndex} );
 
         assertEquals( 0,
                       map.size() );
@@ -569,9 +578,9 @@
     }
 
     public void testEmptyIterator() {
-        final InternalReadAccessor extractor = cache.getReader( Cheese.class,
-                                                             "type",
-                                                             getClass().getClassLoader() );
+        final InternalReadAccessor extractor = store.getReader( Cheese.class,
+                                                                "type",
+                                                                getClass().getClassLoader() );
 
         final Pattern pattern = new Pattern( 0,
                                              new ClassObjectType( Cheese.class ) );
@@ -591,8 +600,9 @@
                                            55 );
         final InternalFactHandle stiltonHandle = new DefaultFactHandle( 2,
                                                                         stilton );
-        
-        assertNull( map.getFirst( new LeftTuple( stiltonHandle, null,
+
+        assertNull( map.getFirst( new LeftTuple( stiltonHandle,
+                                                 null,
                                                  true ) ) );
     }
 




More information about the jboss-svn-commits mailing list