[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