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@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@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@gmail.com>
>>
>> Now would you mind posting an example reproducing this error...
>> -W
>>
>> On 22/12/2011, Manuel Ortiz <manuel.ortizramos@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@lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users