[jboss-svn-commits] JBL Code SVN: r18934 - in labs/jbossrules/branches/4.0.x: 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 15:08:49 EDT 2008
Author: tirelli
Date: 2008-03-13 15:08:49 -0400 (Thu, 13 Mar 2008)
New Revision: 18934
Modified:
labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/FieldFactory.java
Log:
JBRULES-1505: fixing CCE on nested Date attributes
Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java 2008-03-13 19:02:33 UTC (rev 18933)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/lang/MVELDumper.java 2008-03-13 19:08:49 UTC (rev 18934)
@@ -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.base.evaluators.DateFactory.parseDate( "+text+" )";
+ }
}
this.template = processRestriction( descr.getEvaluator(), text );
}
Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java 2008-03-13 19:02:33 UTC (rev 18933)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/main/java/org/drools/rule/builder/PatternBuilder.java 2008-03-13 19:08:49 UTC (rev 18934)
@@ -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;
@@ -64,6 +65,7 @@
import org.drools.rule.VariableConstraint;
import org.drools.rule.VariableRestriction;
import org.drools.rule.builder.dialect.mvel.MVELDialect;
+import org.drools.rule.builder.dialect.mvel.MVELExprAnalyzer;
import org.drools.spi.Constraint;
import org.drools.spi.Evaluator;
import org.drools.spi.FieldExtractor;
@@ -71,6 +73,8 @@
import org.drools.spi.ObjectType;
import org.drools.spi.Restriction;
import org.drools.spi.Constraint.ConstraintType;
+import org.mvel.ExpressionCompiler;
+import org.mvel.ParserContext;
/**
* A builder for patterns
@@ -371,12 +375,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,
@@ -388,6 +395,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/branches/4.0.x/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java 2008-03-13 19:02:33 UTC (rev 18933)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java 2008-03-13 19:08:49 UTC (rev 18934)
@@ -71,6 +71,18 @@
assertEquals( expected, result );
}
+ public void testDumpWithDateAttr() throws Exception {
+ String input = "Person( son.birthDate == \"01-jan-2000\" )";
+ String expected = "son.birthDate == org.drools.base.evaluators.DateFactory.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/branches/4.0.x/drools-core/src/main/java/org/drools/base/FieldFactory.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/FieldFactory.java 2008-03-13 19:02:33 UTC (rev 18933)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/FieldFactory.java 2008-03-13 19:08:49 UTC (rev 18934)
@@ -18,7 +18,11 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.drools.base.evaluators.DateFactory;
import org.drools.base.field.BooleanFieldImpl;
import org.drools.base.field.DoubleFieldImpl;
import org.drools.base.field.LongFieldImpl;
@@ -28,6 +32,9 @@
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 +87,14 @@
} 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 );
+ SimpleDateFormat df = new SimpleDateFormat( DATE_FORMAT_MASK );
+ Date date;
+ try {
+ date = df.parse( value );
+ field = new ObjectFieldImpl( date );
+ } catch ( ParseException e ) {
+ field = new ObjectFieldImpl( value );
+ }
} else if ( valueType == ValueType.ARRAY_TYPE ) {
//MN: I think its fine like this.
field = new ObjectFieldImpl( value );
@@ -173,7 +186,18 @@
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 ) {
+ SimpleDateFormat df = new SimpleDateFormat( DATE_FORMAT_MASK );
+ Date date;
+ try {
+ date = df.parse( (String) value );
+ field = new ObjectFieldImpl( date );
+ } catch ( ParseException e ) {
+ field = new ObjectFieldImpl( value );
+ }
+ } else {
+ field = new ObjectFieldImpl( value );
+ }
} else if ( valueType == ValueType.ARRAY_TYPE ) {
//MN: I think its fine like this.
field = new ObjectFieldImpl( value );
@@ -234,4 +258,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