[rules-users] PatternBuilder createRestriction bug on Drools 5.1.1

Manuel Ortiz manuel.ortizramos at gmail.com
Thu Dec 22 05:36:00 EST 2011


Thank you very much Wolfgang.

Then I understand that this composite restriction compiling error is fixed
in 5.2.0. Isn't it?

Thank you again for your time.

Kind regards,

Manuel Ortiz.

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

> Sorry - I should have made it clear that it doesn't matter *why* one
> of the components of a composite restriction is in error. Either a
> missing declaration or a type incompatibility - it results in a null
> reference, and some agent processing this doesn't check.
>
> -W
>
> 2011/12/22 Manuel Ortiz <manuel.ortizramos at gmail.com>:
> > 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
> >
> >
> >
> > _______________________________________________
> > 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/45516abc/attachment.html 


More information about the rules-users mailing list