[jboss-svn-commits] JBL Code SVN: r12131 - in labs/jbossrules/trunk/drools-compiler/src: test/java/org/drools/rule/builder/dialect/mvel and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 24 20:47:45 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-05-24 20:47:44 -0400 (Thu, 24 May 2007)
New Revision: 12131

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/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_mvel.drl
Log:
JBRULES-873 optional ; delimiters

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	2007-05-24 22:31:02 UTC (rev 12130)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilder.java	2007-05-25 00:47:44 UTC (rev 12131)
@@ -1,15 +1,13 @@
 package org.drools.rule.builder.dialect.mvel;
 
 import java.io.Serializable;
-import java.util.HashMap;
 
 import org.drools.base.mvel.DroolsMVELFactory;
 import org.drools.base.mvel.MVELConsequence;
 import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.builder.ConsequenceBuilder;
 import org.drools.rule.builder.RuleBuildContext;
-import org.drools.rule.builder.ConsequenceBuilder;
 import org.mvel.MVEL;
-import org.mvel.integration.impl.MapVariableResolverFactory;
 
 public class MVELConsequenceBuilder
     implements
@@ -21,10 +19,66 @@
 
         final DroolsMVELFactory factory = new DroolsMVELFactory(context.getDeclarationResolver().getDeclarations(), null,  context.getPkg().getGlobals() );
 
-        final Serializable expr = MVEL.compileExpression( (String) context.getRuleDescr().getConsequence() );
+        final Serializable expr = MVEL.compileExpression( delimitExpressions( (String) context.getRuleDescr().getConsequence()) );
+        //final Serializable expr = MVEL.compileExpression( (String) ruleDescr.getConsequence() );
 
         context.getRule().setConsequence( new MVELConsequence( expr,
                                                                factory ) );
     }
+    
+    /**
+     * Allows newlines to demarcate expressions, as per MVEL command line.
+     * If expression spans multiple lines (ie inside an unbalanced bracket) then
+     * it is left alone.
+     * Uses character based iteration which is at least an order of magnitude faster then a single 
+     * simple regex.
+     */
+    public String delimitExpressions(String s) {
 
+        StringBuffer result = new StringBuffer();
+        char[] cs = s.toCharArray();
+        int brace = 0;
+        int sqre = 0;
+        int crly = 0;
+        char lastNonWhite = ' ';
+        for ( int i = 0; i < cs.length; i++ ) {
+            char c = cs[i];
+            switch ( c ) {
+                case '(' :
+                    brace++;
+                    break;
+                case '{' :
+                    crly++;
+                    break;
+                case '[' :
+                    sqre++;
+                    break;
+                case ')' :
+                    brace--;
+                    break;
+                case '}' :
+                    crly--;
+                    break;
+                case ']' :
+                    sqre--;
+                    break;                    
+                default :
+                    break;
+            }   
+            if ((brace == 0 && sqre == 0 && crly == 0) &&
+                    (c == '\n' || c == '\r')) {
+                if (lastNonWhite != ';') {
+                    result.append( ';' );
+                    lastNonWhite = ';';
+                }
+            } else if  (!Character.isWhitespace( c )) {
+                lastNonWhite = c;
+            }
+            result.append( c );
+            
+
+        }
+        return result.toString();
+    }
+
 }

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	2007-05-24 22:31:02 UTC (rev 12130)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELConsequenceBuilderTest.java	2007-05-25 00:47:44 UTC (rev 12131)
@@ -90,4 +90,30 @@
         assertEquals( 5,
                       cheddar.getPrice() );
     }
+    
+    /**
+     * Just like MVEL command line, we can allow expressions to span lines, with optional ";"
+     * seperating expressions. If its needed a ";" can be thrown in, but if not, a new line is fine.
+     * 
+     * However, when in the middle of unbalanced brackets, a new line means nothing.
+     * 
+     * @throws Exception
+     */
+    public void testLineSpanOptionalSemis() throws Exception {
+        
+        String simpleEx = "foo\nbar\nbaz";
+        MVELConsequenceBuilder cons = new MVELConsequenceBuilder();
+        assertEquals("foo;\nbar;\nbaz", cons.delimitExpressions(simpleEx));
+        
+        String ex = "foo (\n bar \n)\nbar;\nyeah;\nman\nbaby";
+        assertEquals("foo (\n bar \n);\nbar;\nyeah;\nman;\nbaby", cons.delimitExpressions(ex));
+
+        ex = "foo {\n bar \n}\nbar;   \nyeah;\nman\nbaby";
+        assertEquals("foo {\n bar \n};\nbar;   \nyeah;\nman;\nbaby", cons.delimitExpressions(ex));
+
+        ex = "foo [\n bar \n]\nbar;  x\nyeah();\nman[42]\nbaby;ca chiga;\nend";
+        assertEquals("foo [\n bar \n];\nbar;  x;\nyeah();\nman[42];\nbaby;ca chiga;\nend", cons.delimitExpressions(ex));
+
+        
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_mvel.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_mvel.drl	2007-05-24 22:31:02 UTC (rev 12130)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_mvel.drl	2007-05-25 00:47:44 UTC (rev 12131)
@@ -10,8 +10,8 @@
         $c : Cheese(type == "stilton", price == (new Integer(5) + 5), eval(price == (new Integer(5) + 5)) )
         eval( $c.price == 10 && list == empty)
     then
-        a = new java.math.BigInteger( "10" );
-        b = new java.math.BigInteger( "10" );
-        c = a + b;
-        list.add( c + $c.price);
+        a = new java.math.BigInteger( "10" )
+        b = new java.math.BigInteger( "10" )
+        c = a + b; //look ma, optional ';' - ooh ahh....
+        list.add( c + $c.price)
 end  
\ No newline at end of file




More information about the jboss-svn-commits mailing list