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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 13 16:29:58 EDT 2008


Author: tirelli
Date: 2008-03-13 16:29:58 -0400 (Thu, 13 Mar 2008)
New Revision: 18938

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-core/src/main/java/org/drools/base/FieldFactory.java
Log:
JBRULES-1505: fixing CCE on nested Date attributes

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	2008-03-13 19:31:25 UTC (rev 18937)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java	2008-03-13 20:29:58 UTC (rev 18938)
@@ -37,12 +37,18 @@
 public class MVELDumper extends ReflectiveVisitor {
 
     private StringBuffer        mvelDump;
+    private boolean             isDateField;
     private static final String eol = System.getProperty( "line.separator" );
     private String              template;
     private String              fieldName;
 
     public String dump(FieldConstraintDescr fieldConstr) {
+        return this.dump( fieldConstr, false );
+    }
+
+    public String dump(FieldConstraintDescr fieldConstr, boolean isDateField ) {
         mvelDump = new StringBuffer();
+        this.isDateField = isDateField;
         this.visit( fieldConstr );
         return mvelDump.toString();
     }
@@ -74,6 +80,9 @@
             }
         } else if( descr.getType() == LiteralRestrictionDescr.TYPE_STRING ) {
             text = "\"" + text + "\"";
+            if( this.isDateField ) {
+                text = "org.drools.util.DateUtils.parseDate( "+text+" )";
+            }
         }
         this.template = processRestriction( descr.getEvaluator(), descr.isNegated(), text );
     }

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	2008-03-13 19:31:25 UTC (rev 18937)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java	2008-03-13 20:29:58 UTC (rev 18938)
@@ -17,6 +17,7 @@
 package org.drools.rule.builder;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -26,8 +27,8 @@
 import org.drools.base.FieldFactory;
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.compiler.DescrBuildError;
 import org.drools.compiler.Dialect;
-import org.drools.compiler.DescrBuildError;
 import org.drools.facttemplates.FactTemplate;
 import org.drools.facttemplates.FactTemplateFieldExtractor;
 import org.drools.facttemplates.FactTemplateObjectType;
@@ -72,6 +73,8 @@
 import org.drools.spi.ObjectType;
 import org.drools.spi.Restriction;
 import org.drools.spi.Constraint.ConstraintType;
+import org.mvel.ParserContext;
+import org.mvel.compiler.ExpressionCompiler;
 
 /**
  * A builder for patterns
@@ -374,12 +377,15 @@
         MVELDialect mvelDialect = (MVELDialect) context.getDialect( "mvel" );
         boolean strictMode = mvelDialect.isStrictMode();
         mvelDialect.setStrictMode( false );
-
         context.setDialect( mvelDialect );
 
+        // analyze field type:
+        Class resultType = getFieldReturnType( pattern,
+                                               fieldConstraintDescr );
+        
         PredicateDescr predicateDescr = new PredicateDescr();
         MVELDumper dumper = new MVELDumper();
-        predicateDescr.setContent( dumper.dump( fieldConstraintDescr ) );
+        predicateDescr.setContent( dumper.dump( fieldConstraintDescr, Date.class.isAssignableFrom( resultType ) ) );
 
         build( context,
                pattern,
@@ -391,6 +397,23 @@
         context.setDialect( dialect );
     }
 
+    /**
+     * @param pattern
+     * @param fieldConstraintDescr
+     * @return
+     */
+    private Class getFieldReturnType(final Pattern pattern,
+                                     final FieldConstraintDescr fieldConstraintDescr) {
+        String dummyField = "__DUMMY__";
+        String dummyExpr = dummyField+"."+fieldConstraintDescr.getFieldName();
+        ExpressionCompiler compiler = new ExpressionCompiler( dummyExpr );
+        ParserContext mvelcontext = new ParserContext();
+        mvelcontext.addInput( dummyField, ((ClassObjectType) pattern.getObjectType()).getClassType() );
+        compiler.compile( mvelcontext );
+        Class resultType = compiler.getReturnType();
+        return resultType;
+    }
+
     private Restriction createRestriction(final RuleBuildContext context,
                                           final Pattern pattern,
                                           final FieldConstraintDescr fieldConstraintDescr,

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	2008-03-13 19:31:25 UTC (rev 18937)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java	2008-03-13 20:29:58 UTC (rev 18938)
@@ -7,15 +7,22 @@
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.Lexer;
 import org.antlr.runtime.TokenStream;
+import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
+import org.drools.base.evaluators.SetEvaluatorsDefinition;
 import org.drools.lang.descr.FieldConstraintDescr;
 import org.drools.lang.descr.PatternDescr;
 
 public class MVELDumperTest extends TestCase {
 
     private MVELDumper dumper;
-
+    
     protected void setUp() throws Exception {
         super.setUp();
+        
+        // configure operators
+        new SetEvaluatorsDefinition();
+        new MatchesEvaluatorsDefinition();
+        
         dumper = new MVELDumper();
     }
 
@@ -71,6 +78,18 @@
         assertEquals( expected, result );
     }
 
+    public void testDumpWithDateAttr() throws Exception {
+        String input = "Person( son.birthDate == \"01-jan-2000\" )";
+        String expected = "son.birthDate == org.drools.util.DateUtils.parseDate( \"01-jan-2000\" )" ;
+        DRLParser parser = parse( input );
+        PatternDescr pattern = (PatternDescr) parser.fact( null );
+        
+        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+        String result = dumper.dump( fieldDescr, true );
+        
+        assertEquals( expected, result );
+    }
+
     private DRLParser parse(final String text) throws Exception {
         return newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2008-03-13 19:31:25 UTC (rev 18937)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldFactory.java	2008-03-13 20:29:58 UTC (rev 18938)
@@ -18,16 +18,21 @@
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Date;
 
 import org.drools.base.field.BooleanFieldImpl;
 import org.drools.base.field.DoubleFieldImpl;
 import org.drools.base.field.LongFieldImpl;
 import org.drools.base.field.ObjectFieldImpl;
 import org.drools.spi.FieldValue;
+import org.drools.util.DateUtils;
 
 public class FieldFactory {
     private static final FieldFactory INSTANCE = new FieldFactory();
 
+    private static final String     DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
+    private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
+
     public static FieldFactory getInstance() {
         return FieldFactory.INSTANCE;
     }
@@ -80,8 +85,8 @@
         } else if ( valueType == ValueType.STRING_TYPE ) {
             field = new ObjectFieldImpl( value.intern() );
         } else if ( valueType == ValueType.DATE_TYPE ) {
-            //MN: I think its fine like this, seems to work !
-            field = new ObjectFieldImpl( value );
+            Date date = DateUtils.parseDate( value );
+            field = new ObjectFieldImpl( date );
         } else if ( valueType == ValueType.ARRAY_TYPE ) {
             //MN: I think its fine like this.
             field = new ObjectFieldImpl( value );
@@ -173,7 +178,12 @@
             field = new ObjectFieldImpl( value );
         } else if ( valueType == ValueType.DATE_TYPE ) {
             //MN: I think its fine like this, seems to work !
-            field = new ObjectFieldImpl( value );
+            if( value instanceof String ) {
+                Date date = DateUtils.parseDate( (String) value );
+                field = new ObjectFieldImpl( date );
+            } else {
+                field = new ObjectFieldImpl( value );
+            }
         } else if ( valueType == ValueType.ARRAY_TYPE ) {
             //MN: I think its fine like this.
             field = new ObjectFieldImpl( value );
@@ -234,4 +244,12 @@
         return value;
     }
 
+    /** Check for the system property override, if it exists */
+    private static String getDateFormatMask() {
+        String fmt = System.getProperty( "drools.dateformat" );
+        if ( fmt == null ) {
+            fmt = FieldFactory.DEFAULT_FORMAT_MASK;
+        }
+        return fmt;
+    }
 }
\ No newline at end of file




More information about the jboss-svn-commits mailing list