[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