[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