[jboss-svn-commits] JBL Code SVN: r8184 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/compiler main/java/org/drools/semantics/java test/java/org/drools/integrationtests test/java/org/drools/lang test/java/org/drools/semantics/java
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Dec 10 14:57:26 EST 2006
Author: mark.proctor at jboss.com
Date: 2006-12-10 14:57:12 -0500 (Sun, 10 Dec 2006)
New Revision: 8184
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
Log:
JBRULES-339 'from' support for reasoning over facts not in the working memory
-inlined JFDI
-integrated JFDI
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 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -35,6 +35,8 @@
import org.apache.commons.jci.problems.CompilationProblem;
import org.apache.commons.jci.readers.MemoryResourceReader;
import org.apache.commons.jci.readers.ResourceReader;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
+import org.codehaus.jfdi.interpreter.TypeResolver;
import org.drools.RuntimeDroolsException;
import org.drools.base.ClassFieldExtractorCache;
import org.drools.facttemplates.FactTemplate;
@@ -50,14 +52,12 @@
import org.drools.rule.LineMappings;
import org.drools.rule.Package;
import org.drools.rule.Rule;
-import org.drools.semantics.java.ClassTypeResolver;
import org.drools.semantics.java.FunctionBuilder;
import org.drools.semantics.java.FunctionFixer;
import org.drools.semantics.java.PackageStore;
import org.drools.semantics.java.RuleBuilder;
import org.drools.semantics.java.StaticMethodFunctionResolver;
import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
import org.drools.xml.XmlPackageReader;
import org.xml.sax.SAXException;
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionBuilder.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -27,12 +27,12 @@
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
+import org.codehaus.jfdi.interpreter.TypeResolver;
import org.drools.RuntimeDroolsException;
import org.drools.lang.descr.FunctionDescr;
import org.drools.rule.LineMappings;
import org.drools.rule.Package;
import org.drools.spi.AvailableVariables;
-import org.drools.spi.TypeResolver;
public class FunctionBuilder {
private static final StringTemplateGroup functionGroup = new StringTemplateGroup( new InputStreamReader( FunctionBuilder.class.getResourceAsStream( "javaFunction.stg" ) ),
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/RuleBuilder.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -16,7 +16,10 @@
* limitations under the License.
*/
+import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -25,15 +28,26 @@
import java.util.Map;
import java.util.Set;
+import org.antlr.runtime.ANTLRReaderStream;
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.TokenStream;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.operations.Expr;
+import org.codehaus.jfdi.parser.JFDILexer;
+import org.codehaus.jfdi.parser.JFDIParser;
import org.drools.RuntimeDroolsException;
import org.drools.base.ClassFieldExtractorCache;
import org.drools.base.ClassObjectType;
+import org.drools.base.DroolsJFDIFactory;
import org.drools.base.FieldFactory;
import org.drools.base.ShadowProxyFactory;
import org.drools.base.ValueType;
+import org.drools.base.dataproviders.JFDIDataProvider;
import org.drools.base.evaluators.Operator;
import org.drools.base.resolvers.DeclarationVariable;
import org.drools.base.resolvers.GlobalVariable;
@@ -45,6 +59,7 @@
import org.drools.facttemplates.FactTemplate;
import org.drools.facttemplates.FactTemplateFieldExtractor;
import org.drools.facttemplates.FactTemplateObjectType;
+import org.drools.lang.descr.AccessorDescr;
import org.drools.lang.descr.AccumulateDescr;
import org.drools.lang.descr.AndDescr;
import org.drools.lang.descr.AttributeDescr;
@@ -92,12 +107,12 @@
import org.drools.rule.VariableConstraint;
import org.drools.rule.VariableRestriction;
import org.drools.spi.AvailableVariables;
+import org.drools.spi.DataProvider;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
import org.drools.spi.FieldValue;
import org.drools.spi.ObjectType;
import org.drools.spi.Restriction;
-import org.drools.spi.TypeResolver;
/**
* This builds the rule structure from an AST.
@@ -980,8 +995,29 @@
private From build(final FromDescr fromDescr) {
final Column column = build( fromDescr.getReturnedColumn() );
- return null;
+ AccessorDescr accessor = (AccessorDescr) fromDescr.getDataSource();
+ DataProvider dataProvider = null;
+ try {
+ JFDIParser parser = createParser( accessor.toString() );
+ DroolsJFDIFactory factory = new DroolsJFDIFactory( this.typeResolver );
+ factory.setDeclarationMap( this.declarations );
+ factory.setGlobalsMap( this.pkg.getGlobals() );
+ parser.setValueHandlerFactory( factory );
+
+ dataProvider = new JFDIDataProvider(parser.expr(), factory);
+ } catch ( final Exception e ) {
+ this.errors.add( new RuleError( this.rule,
+ fromDescr,
+ null,
+ "Unable to build expression for 'from' node '" + accessor.toString() + "'" ) );
+ return null;
+ }
+
+
+ return new From( column,
+ dataProvider );
}
+
// private From build(final FromDescr fromDescr) {
// return null;
// @todo: waiting for JFDI so we can impl this properly
@@ -1133,6 +1169,27 @@
// return valueHandler;
// }
+ protected JFDIParser createParser(String text) throws IOException {
+ JFDIParser parser = new JFDIParser( createTokenStream( text ) );
+ DroolsJFDIFactory factory = new DroolsJFDIFactory( this.typeResolver );
+ parser.setValueHandlerFactory( factory );
+ return parser;
+ }
+
+ private TokenStream createTokenStream(String text) throws IOException {
+ return new CommonTokenStream( createLexer( text ) );
+ }
+
+ private JFDILexer createLexer(String text) throws IOException {
+ JFDILexer lexer = new JFDILexer( new ANTLRStringStream( text ) );
+ return lexer;
+ }
+
+ private Reader createReader(String text) {
+ InputStream in = getClass().getResourceAsStream( text );
+ return new InputStreamReader( in );
+ }
+
private EvalCondition build(final EvalDescr evalDescr) {
final String className = "eval" + this.counter++;
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/StaticMethodFunctionResolver.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -4,10 +4,10 @@
import java.util.Iterator;
import java.util.List;
+import org.codehaus.jfdi.interpreter.TypeResolver;
import org.drools.RuntimeDroolsException;
import org.drools.spi.AvailableVariables;
import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
public class StaticMethodFunctionResolver
implements
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -31,6 +31,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import junit.framework.Assert;
import junit.framework.TestCase;
@@ -41,6 +42,7 @@
import org.drools.CheeseEqual;
import org.drools.Cheesery;
import org.drools.FactHandle;
+import org.drools.FromTestClass;
import org.drools.IndexedNumber;
import org.drools.Person;
import org.drools.PersonInterface;
@@ -845,98 +847,127 @@
public void testBasicFrom() throws Exception {
// FIXME
- // final PackageBuilder builder = new PackageBuilder();
- // builder.addPackageFromDrl( new InputStreamReader(
- // getClass().getResourceAsStream( "test_From.drl" ) ) );
- // final Package pkg = builder.getPackage();
- //
- // final RuleBase ruleBase = getRuleBase();
- // ruleBase.addPackage( pkg );
- //
- // WorkingMemory workingMemory = ruleBase.newWorkingMemory();
- // List list1 = new ArrayList();
- // workingMemory.setGlobal( "list1", list1 );
- // List list2 = new ArrayList();
- // workingMemory.setGlobal( "list2", list2 );
- // List list3 = new ArrayList();
- // workingMemory.setGlobal( "list3", list3 );
- //
- // Cheesery cheesery = new Cheesery();
- // Cheese stilton = new Cheese( "stilton", 12);
- // Cheese cheddar = new Cheese( "cheddar", 15);
- // cheesery.addCheese( stilton );
- // cheesery.addCheese( cheddar );
- // workingMemory.setGlobal( "cheesery", cheesery );
- // workingMemory.assertObject( cheesery );
- //
- // workingMemory.fireAllRules();
- //
- // // from using a global
- // assertEquals( 2, list1.size() );
- // assertEquals( cheddar, list1.get( 0 ) );
- // assertEquals( stilton, list1.get( 1 ) );
- //
- // // from using a declaration
- // assertEquals( 2, list2.size() );
- // assertEquals( cheddar, list2.get( 0 ) );
- // assertEquals( stilton, list2.get( 1 ) );
- //
- // // from using a declaration
- // assertEquals( 1, list3.size() );
- // assertEquals( stilton, list3.get( 0 ) );
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_From.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+
+ WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+ List list1 = new ArrayList();
+ workingMemory.setGlobal( "list1",
+ list1 );
+ List list2 = new ArrayList();
+ workingMemory.setGlobal( "list2",
+ list2 );
+ List list3 = new ArrayList();
+ workingMemory.setGlobal( "list3",
+ list3 );
+
+ Cheesery cheesery = new Cheesery();
+ Cheese stilton = new Cheese( "stilton",
+ 12 );
+ Cheese cheddar = new Cheese( "cheddar",
+ 15 );
+ cheesery.addCheese( stilton );
+ cheesery.addCheese( cheddar );
+ workingMemory.setGlobal( "cheesery",
+ cheesery );
+ workingMemory.assertObject( cheesery );
+
+ workingMemory.fireAllRules();
+
+ // from using a global
+ assertEquals( 2,
+ list1.size() );
+ assertEquals( cheddar,
+ list1.get( 0 ) );
+ assertEquals( stilton,
+ list1.get( 1 ) );
+
+ // from using a declaration
+ assertEquals( 2,
+ list2.size() );
+ assertEquals( cheddar,
+ list2.get( 0 ) );
+ assertEquals( stilton,
+ list2.get( 1 ) );
+
+ // from using a declaration
+ assertEquals( 1,
+ list3.size() );
+ assertEquals( stilton,
+ list3.get( 0 ) );
}
public void testFromWithParams() throws Exception {
// FIXME
- // final PackageBuilder builder = new PackageBuilder();
- // builder.addPackageFromDrl( new InputStreamReader(
- // getClass().getResourceAsStream( "test_FromWithParams.drl" ) ) );
- // final Package pkg = builder.getPackage();
- //
- // final RuleBase ruleBase = getRuleBase();
- // ruleBase.addPackage( pkg );
- //
- // WorkingMemory workingMemory = ruleBase.newWorkingMemory();
- // List list = new ArrayList();
- // Object globalObject = new Object();
- // workingMemory.setGlobal( "list", list );
- // workingMemory.setGlobal( "testObject", new FromTestClass() );
- // workingMemory.setGlobal( "globalObject", globalObject );
- //
- // Person bob = new Person( "bob" );
- // workingMemory.assertObject( bob );
- //
- // workingMemory.fireAllRules();
- //
- // assertEquals( 6, list.size() );
- //
- // List array = (List) list.get( 0 );
- // assertEquals(3, array.size());
- // Person p = (Person) array.get( 0 );
- // assertSame(p, bob);
- //
- // assertEquals("42", array.get( 1 ));
- //
- // List nested = (List) array.get( 2 );
- // assertEquals("x", nested.get( 0 ));
- // assertEquals("y", nested.get( 1 ));
- //
- // Map map = ( Map ) list.get( 1 );
- // assertEquals( 2, map.keySet().size() );
- //
- // assertTrue( map.keySet().contains( bob ) );
- // assertSame( globalObject, map.get( bob ) );
- //
- // assertTrue( map.keySet().contains( "key1" ) );
- // Map nestedMap = ( Map ) map.get( "key1" );
- // assertEquals( 1, nestedMap.keySet().size() );
- // assertTrue( nestedMap.keySet().contains( "key2" ) );
- // assertEquals( "value2", nestedMap.get( "key2" ) );
- //
- // assertEquals( new Integer( 42 ), list.get( 2 ) );
- // assertEquals( "literal", list.get( 3 ) );
- // assertSame( bob, list.get( 4 ) );
- // assertSame( globalObject, list.get( 5 ) );
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FromWithParams.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+
+ WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+ List list = new ArrayList();
+ Object globalObject = new Object();
+ workingMemory.setGlobal( "list",
+ list );
+ workingMemory.setGlobal( "testObject",
+ new FromTestClass() );
+ workingMemory.setGlobal( "globalObject",
+ globalObject );
+
+ Person bob = new Person( "bob" );
+ workingMemory.assertObject( bob );
+
+ workingMemory.fireAllRules();
+
+ assertEquals( 6,
+ list.size() );
+
+ List array = (List) list.get( 0 );
+ assertEquals( 3,
+ array.size() );
+ Person p = (Person) array.get( 0 );
+ assertSame( p,
+ bob );
+
+ assertEquals( new Integer( 42 ),
+ array.get( 1 ) );
+
+ List nested = (List) array.get( 2 );
+ assertEquals( "x",
+ nested.get( 0 ) );
+ assertEquals( "y",
+ nested.get( 1 ) );
+
+ Map map = (Map) list.get( 1 );
+ assertEquals( 2,
+ map.keySet().size() );
+
+ assertTrue( map.keySet().contains( bob ) );
+ assertSame( globalObject,
+ map.get( bob ) );
+
+ assertTrue( map.keySet().contains( "key1" ) );
+ Map nestedMap = (Map) map.get( "key1" );
+ assertEquals( 1,
+ nestedMap.keySet().size() );
+ assertTrue( nestedMap.keySet().contains( "key2" ) );
+ assertEquals( "value2",
+ nestedMap.get( "key2" ) );
+
+ assertEquals( new Integer( 42 ),
+ list.get( 2 ) );
+ assertEquals( "literal",
+ list.get( 3 ) );
+ assertSame( bob,
+ list.get( 4 ) );
+ assertSame( globalObject,
+ list.get( 5 ) );
}
public void testWithInvalidRule() throws Exception {
@@ -3545,12 +3576,12 @@
public void testDeclaringAndUsingBindsInSamePattern() throws Exception {
final RuleBaseConfiguration config = new RuleBaseConfiguration();
config.setRemoveIdentities( true );
-
+
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_DeclaringAndUsingBindsInSamePattern.drl" ) ) );
final Package pkg = builder.getPackage();
- final RuleBase ruleBase = getRuleBase(config);
+ final RuleBase ruleBase = getRuleBase( config );
ruleBase.addPackage( pkg );
final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -517,7 +517,7 @@
assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
assertEquals( "something.doIt", accessor.toString() );
- }
+ }
public void testSimpleAccessorAndArgWithFrom() throws Exception {
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -21,8 +21,9 @@
import java.util.List;
import java.util.Map;
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
import org.drools.spi.AvailableVariables;
-import org.drools.spi.TypeResolver;
import org.drools.rule.Package;
import junit.framework.TestCase;
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java 2006-12-10 19:56:41 UTC (rev 8183)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/StaticMethodFunctionResolverTest.java 2006-12-10 19:57:12 UTC (rev 8184)
@@ -7,9 +7,10 @@
import junit.framework.TestCase;
+import org.codehaus.jfdi.interpreter.TypeResolver;
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
import org.drools.spi.AvailableVariables;
import org.drools.spi.FunctionResolver;
-import org.drools.spi.TypeResolver;
public class StaticMethodFunctionResolverTest extends TestCase {
public void test1() throws Exception {
More information about the jboss-svn-commits
mailing list