[jboss-svn-commits] JBL Code SVN: r32501 - in labs/jbossrules/trunk/drools-compiler/src: test/java/org/drools/integrationtests and 1 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Apr 10 19:23:42 EDT 2010
Author: tirelli
Date: 2010-04-10 19:23:41 -0400 (Sat, 10 Apr 2010)
New Revision: 32501
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.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/mvel/MVELConsequenceBuilderTest.java
Log:
JBRULES-2480: MVEL-212: fixing silent failure for MVEL consequences containing comments. Adding test for MVEL-212.
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 2010-04-10 20:47:30 UTC (rev 32500)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java 2010-04-10 23:23:41 UTC (rev 32501)
@@ -148,6 +148,41 @@
for ( int i = 0; i < cs.length; i++ ) {
char c = cs[i];
switch ( c ) {
+ case '/' :
+ if( i < cs.length-1 && cs[i+1] == '*' ) {
+ // multi-line comment
+ int start = i;
+ i+=2; // skip the /*
+ for( ; i < cs.length; i++ ) {
+ if( cs[i] == '*' && i < cs.length-1 && cs[i+1] == '/' ) {
+ i++; // skip the */
+ break;
+ } else if( cs[i] == '\n' || cs[i] == '\r' ) {
+ lastNonWhite = checkAndAddSemiColon( result,
+ brace,
+ sqre,
+ crly,
+ lastNonWhite );
+ }
+ }
+ result.append( cs, start, i-start );
+ break;
+ } else if( i < cs.length-1 && cs[i+1] != '/' ) {
+ // not a line comment
+ break;
+ }
+ // otherwise handle it in the same way as #
+ case '#' :
+ // line comment
+ lastNonWhite = checkAndAddSemiColon( result,
+ brace,
+ sqre,
+ crly,
+ lastNonWhite );
+ i = processLineComment( cs,
+ i,
+ result);
+ continue;
case '(' :
brace++;
break;
@@ -169,7 +204,8 @@
default :
break;
}
- if ( (brace == 0 && sqre == 0 && crly == 0) && (c == '\n' || c == '\r') ) {
+ if ( brace == 0 && sqre == 0 && crly == 0 && ( c == '\n' || c == '\r' ) ){
+ // line break
if ( lastNonWhite != ';' ) {
result.append( ';' );
lastNonWhite = ';';
@@ -178,9 +214,34 @@
lastNonWhite = c;
}
result.append( c );
-
}
return result.toString();
}
+ private static int processLineComment(char[] cs,
+ int i,
+ StringBuilder result) {
+ for( ; i < cs.length; i++ ) {
+ result.append( cs[i] );
+ if( cs[i] == '\n' || cs[i] == '\r' ) {
+ break;
+ }
+ }
+ return i;
+ }
+
+ private static char checkAndAddSemiColon(StringBuilder result,
+ int brace,
+ int sqre,
+ int crly,
+ char lastNonWhite) {
+ if ( brace == 0 && sqre == 0 && crly == 0 ){
+ if ( lastNonWhite != ';' ) {
+ result.append( ';' );
+ lastNonWhite = ';';
+ }
+ }
+ return lastNonWhite;
+ }
+
}
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 2010-04-10 20:47:30 UTC (rev 32500)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2010-04-10 23:23:41 UTC (rev 32501)
@@ -137,7 +137,6 @@
import org.drools.marshalling.MarshallerFactory;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.ReteooRuleBase;
-import org.drools.reteoo.ReteooRuleBase;
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.rule.InvalidRulePackage;
import org.drools.rule.Package;
@@ -147,7 +146,10 @@
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
import org.drools.spi.ConsequenceExceptionHandler;
import org.drools.spi.GlobalResolver;
-import org.drools.util.CompositeClassLoader;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
/** Run all the tests with the ReteOO engine implementation */
public class MiscTest extends TestCase {
@@ -6956,4 +6958,101 @@
//((CompositeClassLoader)((PackageBuilderConfiguration)conf).getClassLoader()).dumpStats();
}
+
+ public void testMVELConsequenceWithoutSemiColon1() throws Exception {
+ String drl = "";
+ drl += "package test\n";
+ drl += "import org.drools.Person\n";
+ drl += "import org.drools.Pet\n";
+ drl += "rule test dialect 'mvel'\n";
+ drl += "when\n";
+ drl += "$person:Person()\n";
+ drl += "$pet:Pet()\n";
+ drl += "then\n";
+ drl += " retract($person) // some comment\n";
+ drl += " retract($pet) // another comment\n";
+ drl += "end\n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newReaderResource( new StringReader( drl ) ),
+ ResourceType.DRL );
+ KnowledgeBuilderErrors errors = kbuilder.getErrors();
+ if ( errors.size() > 0 ) {
+ for ( KnowledgeBuilderError error : errors ) {
+ System.err.println( error );
+ }
+ throw new IllegalArgumentException( "Could not parse knowledge." );
+ }
+ assertFalse( kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+
+ // create working memory mock listener
+ org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
+
+ ksession.addEventListener( wml );
+
+ org.drools.runtime.rule.FactHandle personFH = ksession.insert( new Person("Toni") );
+ org.drools.runtime.rule.FactHandle petFH = ksession.insert( new Pet("Toni") );
+
+ int fired = ksession.fireAllRules();
+ assertEquals( 1, fired );
+
+ // capture the arguments and check that the retracts happened
+ ArgumentCaptor<org.drools.event.rule.ObjectRetractedEvent> retracts = ArgumentCaptor.forClass(org.drools.event.rule.ObjectRetractedEvent.class);
+ verify( wml, times(2) ).objectRetracted( retracts.capture() );
+ List<org.drools.event.rule.ObjectRetractedEvent> values = retracts.getAllValues();
+ assertThat( values.get( 0 ).getFactHandle(), is( personFH ) );
+ assertThat( values.get( 1 ).getFactHandle(), is( petFH ) );
+
+ }
+
+ // following test depends on MVEL: http://jira.codehaus.org/browse/MVEL-212
+ public void FIXME_testMVELConsequenceUsingFactConstructors() throws Exception {
+ String drl = "";
+ drl += "package test\n";
+ drl += "import org.drools.Person\n";
+ drl += "global org.drools.runtime.StatefulKnowledgeSession ksession\n";
+ drl += "rule test dialect 'mvel'\n";
+ drl += "when\n";
+ drl += " $person:Person( name == 'mark' )\n";
+ drl += "then\n";
+ drl += " // bellow constructor for Person does not exist\n";
+ drl += " Person p = new Person( 'bob', 30, 555 )\n";
+ drl += " ksession.update(ksession.getFactHandle($person), new Person('bob', 30, 999, 453, 534, 534, 32))\n";
+ drl += "end\n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newReaderResource( new StringReader( drl ) ),
+ ResourceType.DRL );
+ KnowledgeBuilderErrors errors = kbuilder.getErrors();
+ if ( errors.size() > 0 ) {
+ for ( KnowledgeBuilderError error : errors ) {
+ System.err.println( error );
+ }
+ }
+ assertTrue( kbuilder.hasErrors() );
+
+// KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+// kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+// StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+// ksession.setGlobal( "ksession", ksession );
+//
+// // create working memory mock listener
+// org.drools.event.rule.WorkingMemoryEventListener wml = Mockito.mock( org.drools.event.rule.WorkingMemoryEventListener.class );
+//
+// ksession.addEventListener( wml );
+//
+// org.drools.runtime.rule.FactHandle personFH = ksession.insert( new Person("mark", 40) );
+//
+// int fired = ksession.fireAllRules();
+// assertEquals( 1, fired );
+//
+// // capture the arguments and check that the retracts happened
+// ArgumentCaptor<org.drools.event.rule.ObjectUpdatedEvent> updates = ArgumentCaptor.forClass(org.drools.event.rule.ObjectUpdatedEvent.class);
+// verify( wml, times(1) ).objectUpdated( updates.capture() );
+// assertThat( updates.getValue().getFactHandle(), is( personFH ) );
+ }
}
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 2010-04-10 20:47:30 UTC (rev 32500)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java 2010-04-10 23:23:41 UTC (rev 32501)
@@ -233,6 +233,14 @@
assertEquals( " \n\nfoo [\n bar \n];\n\n\nbar; x;\n \nyeah();\nman[42];\nbaby;ca chiga;\nend",
MVELConsequenceBuilder.delimitExpressions( ex ) );
+ ex = " retract(f1) // some comment\n retract(f2)\nend";
+ assertEquals( " retract(f1) ;// some comment\n retract(f2);\nend",
+ MVELConsequenceBuilder.delimitExpressions( ex ) );
+
+ ex = " retract(f1 /* inline comment */) /* some\n comment\n*/ retract(f2)\nend";
+ assertEquals( " retract(f1 /* inline comment */) ;/* some\n comment\n*/ retract(f2);\nend",
+ MVELConsequenceBuilder.delimitExpressions( ex ) );
+
}
public void testMVELDebugSymbols() throws DroolsParserException {
More information about the jboss-svn-commits
mailing list