[rules-users] PatternBuilder createRestriction bug on Drools 5.1.1

Manuel Ortiz manuel.ortizramos at gmail.com
Thu Dec 22 05:21:15 EST 2011


Dear Wolfgang:

Sorry, I don't understand your answer very well. The bug I report has to do
with composite restrictions, not with static variable declarations. Maybe
my bug description is not very good.

I used "Hello world" example described at

http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html/ch08.html#d0e6981


changing the first single restriction to a composite restriction in which
the second part of the restriction compares an int to a string literal to
fire a wrong type rule compile error. But as this second restriction
belongs to a composite restriction, the composite one is created with a
null component, no compile error reported.

I understand that Message.HELLO is correctly declared in the "Hello World"
example project and that this static variable shouldn't be a problem at
compiling. In fact, if you change the static variable by a literal number,
the error would be the same.

Sorry for my english. I hope this explanation helps to understand the bug.

Kind regards,

Manuel Ortiz.

2011/12/22 Wolfgang Laun <wolfgang.laun at gmail.com>

> Using an undeclared static variable (Message.HELLO) wasn't handled
> cleanly in 5.1.1. This has been fixed in 5.2.0.
> -W
>
>
> 2011/12/22 Manuel Ortiz <manuel.ortizramos at gmail.com>:
> > Dear Wolfgang:
> >
> > Just change the "Hello World" rule in the "Hello World" example by this
> > one...
> >
> > rule "Hello World"
> > when
> > m : Message( status == Message.HELLO || != "WrongType", myMessage :
> message
> > )
> > then
> > System.out.println( myMessage );
> > m.setMessage( "Goodbye cruel world" );
> > m.setStatus( Message.GOODBYE );
> > update( m );
> > end
> >
> > ...and you will get the following building error:
> >
> > Description Resource Path Location Type
> > Error: java.lang.NullPointerException Sample.drl
> /DroolsTest2/src/main/rules
> > Unknown Drools Error
> >
> > This NullPointerException breaks the normal drools compiler execution
> flow.
> > In contrast, if you use the following "Hello World" rule...
> >
> > rule "Hello World"
> > when
> > m : Message( status != "WrongType", myMessage : message )
> > then
> > System.out.println( myMessage );
> > m.setMessage( "Goodbye cruel world" );
> > m.setStatus( Message.GOODBYE );
> > update( m );
> > end
> >
> > ...then you get the following building errors:
> >
> > Description Resource Path Location Type
> > BuildError: Unable to create a Field value of type  'ValueType = 'int''
> and
> > value 'WrongType' Sample.drl /DroolsTest2/src/main/rules Unknown Drools
> > Error
> > BuildError: Unable to create restriction '[LiteralRestriction: !=
> > WrongType]' for field 'status' in the rule 'Hello World' Sample.drl
> > /DroolsTest2/src/main/rules line 7 Drools Error
> >
> > which don't break the drools compiler execution flow.
> >
> > I think this one should be the right output for the first example.
> >
> > Below you can find my fix to this problem, based on the assumption that
> > createRestriction must return null if the restriction (neither composite
> nor
> > simple) cannot be constructed.
> >
> > At PatternBuilder.java, substitute createRestriction by...
> >
> >     private Restriction createRestriction(final RuleBuildContext context,
> >                                           final Pattern pattern,
> >                                           final FieldConstraintDescr
> > fieldConstraintDescr,
> >                                           final
> RestrictionConnectiveDescr
> > top,
> >                                           final InternalReadAccessor
> > extractor) {
> >         Restriction[] restrictions = new
> > Restriction[top.getRestrictions().size()];
> >         int index = 0;
> >
> >         for ( Iterator it = top.getRestrictions().iterator();
> it.hasNext();
> > ) {
> >             RestrictionDescr restrictionDescr = (RestrictionDescr)
> > it.next();
> >
> >             if ( restrictionDescr instanceof RestrictionConnectiveDescr
> ) {
> >                 restrictions[index] = this.createRestriction( context,
> >                                                                 pattern,
> >
> > fieldConstraintDescr,
> >
> > (RestrictionConnectiveDescr) restrictionDescr,
> >
> extractor );
> >
> >             } else {
> >                 restrictions[index] = buildRestriction( context,
> >                                                         pattern,
> >                                                         extractor,
> >
> > fieldConstraintDescr,
> >                                                         restrictionDescr
> );
> >                 if ( restrictions[index] == null ) {
> >                     context.getErrors().add( new DescrBuildError(
> > context.getParentDescr(),
> >
> > fieldConstraintDescr,
> >                                                                   null,
> >
> "Unable to
> > create restriction '" + restrictionDescr.toString() + "' for field '" +
> > fieldConstraintDescr.getFieldName() + "' in the rule '" +
> > context.getRule().getName() + "'" ) );
> >                 }
> >             }
> >
> >             if(restrictions[index] == null)
> >             {
> > index = 0;
> > break;
> >             }
> >             else
> >             {
> > index++;
> >             }
> >         }
> >
> > if(index == 0) {
> > return null;
> >         } else if ( restrictions.length > 1 ) {
> >             AbstractCompositeRestriction composite = null;
> >             if ( top.getConnective() == RestrictionConnectiveDescr.AND )
> {
> >                 composite = new AndCompositeRestriction( restrictions );
> >             } else if ( top.getConnective() ==
> RestrictionConnectiveDescr.OR
> > ) {
> >                 composite = new OrCompositeRestriction( restrictions );
> >             } else {
> >                 context.getErrors().add( new DescrBuildError(
> > context.getParentDescr(),
> >
> > fieldConstraintDescr,
> >                                                               null,
> >                                                               "This is a
> > bug: Impossible to create a composite restriction for connective: " +
> > top.getConnective() + "' for field '" +
> fieldConstraintDescr.getFieldName()
> > + "' in the rule '"
> >                                                                       +
> > context.getRule().getName() + "'" ) );
> >             }
> >
> >             return composite;
> >         } else if ( restrictions.length == 1 ) {
> >             return restrictions[0];
> >         }
> >         context.getErrors().add( new DescrBuildError(
> > context.getParentDescr(),
> >
> fieldConstraintDescr,
> >                                                       null,
> >                                                       "This is a bug:
> trying
> > to create a restriction for an empty restriction list for field '" +
> > fieldConstraintDescr.getFieldName() + "' in the rule '" +
> > context.getRule().getName() + "'" ) );
> >         return null;
> >     }
> >
> > Kind regards,
> >
> > Manuel Ortiz.
> >
> >
> > 2011/12/22 Wolfgang Laun <wolfgang.laun at gmail.com>
> >>
> >> Now would you mind posting an example reproducing this error...
> >> -W
> >>
> >> On 22/12/2011, Manuel Ortiz <manuel.ortizramos at gmail.com> wrote:
> >> > Dear Sirs:
> >> >
> >> > I'm working on an application which writes a set of rules using
> >> > information
> >> > which is stored in BDD tables. This information can be 'wrong'
> >> > concerning
> >> > rule compilation, and I expect that Drools reports the corresponding
> >> > compilation errors.
> >> >
> >> > I've found that PatternBuilder.createRestriction() fails to process
> >> > composite restrictions when one of the single restrictions cannot be
> >> > implemented. The problem is that although one of the sigle
> restrictions
> >> > is
> >> > returned null, the composite restriction array is succesfully
> returned,
> >> > one
> >> > of its elements being null, wich causes a NullPointerException when
> the
> >> > composite restriction is processed in
> >> > PatternBuilder.build(AbstractCompositeConstraint version) to obtain a
> >> > MultiRestrictionFieldConstraint object.
> >> >
> >> > I would like to know if this bug has yet been reported and fixed in
> some
> >> > Drools version beyond 5.1.1
> >> >
> >> > Thank you very much for your time.
> >> >
> >> > Kind regards,
> >> >
> >> > Manuel Ortiz
> >> >
> >> _______________________________________________
> >> rules-users mailing list
> >> rules-users at lists.jboss.org
> >> https://lists.jboss.org/mailman/listinfo/rules-users
> >
> >
> >
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20111222/54d71145/attachment.html 


More information about the rules-users mailing list