[jboss-svn-commits] JBL Code SVN: r35660 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/rule/builder and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 21 22:29:21 EDT 2010


Author: tsurdilovic
Date: 2010-10-21 22:29:21 -0400 (Thu, 21 Oct 2010)
New Revision: 35660

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Bin.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/BinTask.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEscapesMvelTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapes.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapesoff.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EvalRewriteMatches.drl
Log:
JBRULES-2745 - Problems in the use of escapes in the "matches" operator


Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java	2010-10-22 01:59:43 UTC (rev 35659)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -19,7 +19,9 @@
 import java.util.Iterator;
 
 import org.drools.base.evaluators.Operator;
+import org.drools.builder.conf.ProcessStringEscapesOption;
 import org.drools.core.util.ReflectiveVisitor;
+import org.drools.core.util.StringUtils;
 import org.drools.lang.descr.FieldBindingDescr;
 import org.drools.lang.descr.FieldConstraintDescr;
 import org.drools.lang.descr.LiteralRestrictionDescr;
@@ -28,6 +30,7 @@
 import org.drools.lang.descr.RestrictionConnectiveDescr;
 import org.drools.lang.descr.ReturnValueRestrictionDescr;
 import org.drools.lang.descr.VariableRestrictionDescr;
+import org.drools.rule.builder.RuleBuildContext;
 
 /**
  * 
@@ -41,6 +44,15 @@
     private static final String eol = System.getProperty( "line.separator" );
     private String              template;
     private String              fieldName;
+    private RuleBuildContext context;
+    
+    public MVELDumper(RuleBuildContext context) {
+    	this.context = context;
+    }
+    
+    public MVELDumper() {
+    	
+    }
 
     public String dump(FieldConstraintDescr fieldConstr) {
         return this.dump( fieldConstr, false );
@@ -146,17 +158,33 @@
                    evaluator( evaluator ) + " " + 
                    value + evaluatorSufix( evaluator );
         } else if(op == Operator.determineOperator( "matches", false )) {
-            evaluator = "~=";
-            return evaluatorPrefix( evaluator ) + 
-                   this.fieldName + " " + 
-                   evaluator( evaluator ) + " " + 
-                   value.replaceAll( "\\\\", "\\\\\\\\" ) + evaluatorSufix( evaluator );
+        	evaluator = "~=";
+        	if(context != null && !context.getConfiguration().isProcessStringEscapes()) {
+        		return evaluatorPrefix( evaluator ) + 
+                this.fieldName + " " + 
+                evaluator( evaluator ) + " " + 
+                value.replaceAll( "\\\\", "\\\\\\\\" ) + evaluatorSufix( evaluator );
+        	} else {
+        		return evaluatorPrefix( evaluator ) + 
+                this.fieldName + " " + 
+                evaluator( evaluator ) + " " + 
+                value +
+                evaluatorSufix( evaluator );
+        	}
         } else if(op == Operator.determineOperator( "matches", true )) {
             evaluator = "not ~=";
-            return evaluatorPrefix( evaluator ) + 
-                   this.fieldName + " " + 
-                   evaluator( evaluator ) + " " + 
-                   value.replaceAll( "\\\\", "\\\\\\\\" ) + evaluatorSufix( evaluator );
+            if(context != null && !context.getConfiguration().isProcessStringEscapes()) {
+            	return evaluatorPrefix( evaluator ) + 
+                this.fieldName + " " + 
+                evaluator( evaluator ) + " " + 
+                value.replaceAll( "\\\\", "\\\\\\\\" ) + evaluatorSufix( evaluator );
+            } else {
+            	return evaluatorPrefix( evaluator ) + 
+                this.fieldName + " " + 
+                evaluator( evaluator ) + " " + 
+                value + 
+                evaluatorSufix( evaluator );
+            }
         }
         return evaluatorPrefix( evaluator ) + 
                this.fieldName + " " + 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-10-22 01:59:43 UTC (rev 35659)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -475,7 +475,7 @@
                                                fieldConstraintDescr );
 
         PredicateDescr predicateDescr = new PredicateDescr();
-        MVELDumper dumper = new MVELDumper();
+        MVELDumper dumper = new MVELDumper(context);
         predicateDescr.setContent( dumper.dump( fieldConstraintDescr,
                                                 Date.class.isAssignableFrom( resultType ) ) );
 

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Bin.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Bin.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Bin.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -0,0 +1,14 @@
+package org.drools;
+
+public class Bin {
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Bin.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/BinTask.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/BinTask.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/BinTask.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -0,0 +1,14 @@
+package org.drools;
+
+public class BinTask {
+	private Bin bin;
+
+	public Bin getBin() {
+		return bin;
+	}
+
+	public void setBin(Bin bin) {
+		this.bin = bin;
+	}
+	
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/BinTask.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEscapesMvelTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEscapesMvelTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEscapesMvelTest.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -0,0 +1,98 @@
+package org.drools.integrationtests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.Bin;
+import org.drools.BinTask;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderErrors;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.builder.conf.ProcessStringEscapesOption;
+import org.drools.io.ResourceFactory;
+import org.drools.runtime.StatefulKnowledgeSession;
+
+import junit.framework.TestCase;
+
+public class ProcessEscapesMvelTest extends TestCase {
+	
+	public void testProcessStringEscapesOptionOn() throws Exception {
+		KnowledgeBase kbase = readKnowledgeBase();
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		
+		List list = new ArrayList();
+		ksession.setGlobal( "list", list );
+		
+		BinTask bt = new BinTask();
+		Bin b = new Bin();
+		b.setName("aa123bb");
+		bt.setBin(b);
+		
+		ksession.insert(b);
+		ksession.insert(bt);
+		ksession.fireAllRules();
+		
+		assertEquals(1, list.size());
+		
+	}
+	
+	public void testProcessStringEscapesOptionOff() throws Exception {
+		KnowledgeBase kbase = readKnowledgeBaseWithEscapesOff();
+		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+		
+		List list = new ArrayList();
+		ksession.setGlobal( "list", list );
+		
+		BinTask bt = new BinTask();
+		Bin b = new Bin();
+		b.setName("aa123bb");
+		bt.setBin(b);
+		
+		ksession.insert(bt);
+		ksession.insert(b);
+		ksession.fireAllRules();
+		
+		assertEquals(1, list.size());
+	}
+	
+	private KnowledgeBase readKnowledgeBase() throws Exception {
+		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+		kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "processescapes.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." + errors.toArray());
+		}
+		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+		return kbase;
+	}
+	
+	private KnowledgeBase readKnowledgeBaseWithEscapesOff() throws Exception {
+		KnowledgeBuilderConfiguration kbconf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
+		kbconf.setProperty("drools.parser.processStringEscapes", "false");
+		
+		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbconf);
+		//kbuilder.add(ResourceFactory.newClassPathResource("processescapes.drl"), ResourceType.DRL);
+		kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "processescapesoff.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." + errors.toArray());
+		}
+		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+		return kbase;
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessEscapesMvelTest.java
___________________________________________________________________
Name: svn:mime-type
   + text/plain

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java	2010-10-22 01:59:43 UTC (rev 35659)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java	2010-10-22 02:29:21 UTC (rev 35660)
@@ -46,7 +46,7 @@
     
     public void testDumpMatches() throws Exception {
         String input = "Cheese( type.toString matches \"something\\swith\\tsingle escapes\" )";
-        String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
+        String expected = "type.toString ~= \"something\\swith\\tsingle escapes\"" ;
         PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
         
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
@@ -57,7 +57,7 @@
 
     public void testDumpMatches2() throws Exception {
         String input = "Cheese( type.toString matches 'something\\swith\\tsingle escapes' )";
-        String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
+        String expected = "type.toString ~= \"something\\swith\\tsingle escapes\"" ;
         PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
 
         FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapes.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapes.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapes.drl	2010-10-22 02:29:21 UTC (rev 35660)
@@ -0,0 +1,14 @@
+package org.drools.integrationtests
+
+import org.drools.BinTask;
+import org.drools.Bin;
+
+global java.util.List list;
+
+rule "escapeon"
+	when
+		$task : BinTask( $bn : bin.name matches "\\w\\w\\d{3}\\w\\w" )
+		$bin : Bin( $nm : name  matches "\\w\\w\\d{3}\\w\\w" ) 
+	then 
+		list.add( $task );		
+end

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapesoff.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapesoff.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/processescapesoff.drl	2010-10-22 02:29:21 UTC (rev 35660)
@@ -0,0 +1,14 @@
+package org.drools.integrationtests
+
+import org.drools.BinTask;
+import org.drools.Bin;
+
+global java.util.List list;
+
+rule "escapeoff"
+	when
+		$task : BinTask( $bn : bin.name matches "\w\w\d{3}\w\w" )
+		$bin : Bin( $nm : name  matches "\w\w\d{3}\w\w" ) 
+	then 
+		list.add( $task );		
+end
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EvalRewriteMatches.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EvalRewriteMatches.drl	2010-10-22 01:59:43 UTC (rev 35659)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EvalRewriteMatches.drl	2010-10-22 02:29:21 UTC (rev 35660)
@@ -5,7 +5,7 @@
 rule "eval rewrite with 'matches'"
     salience 20
 	when
-	    $oi : OrderItem( order.number == 14, seq == 1, order.customer matches "M\w*" )
+	    $oi : OrderItem( order.number == 14, seq == 1, order.customer matches "M\\w*" )
 	then
 	    results.add( $oi );
 end
@@ -13,7 +13,7 @@
 rule "eval rewrite with 'not matches'"
     salience 10
 	when
-	    $oi : OrderItem( order.number == 14, seq == 2, order.customer not matches "B\w*" )
+	    $oi : OrderItem( order.number == 14, seq == 2, order.customer not matches "B\\w*" )
 	then
 	    results.add( $oi );
 end



More information about the jboss-svn-commits mailing list