[rules-users] PatternBuilder createRestriction bug on Drools 5.1.1

Wolfgang Laun wolfgang.laun at gmail.com
Thu Dec 22 06:06:23 EST 2011


2011/12/22 Manuel Ortiz <manuel.ortizramos at gmail.com>:
> Thank you very much Wolfgang.
>
> Then I understand that this composite restriction compiling error is fixed
> in 5.2.0. Isn't it?

Yes.
-W

>
> 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
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>




More information about the rules-users mailing list