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.ortizra...@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.l...@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.ortizra...@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.l...@gmail.com> >> >> >> >> Now would you mind posting an example reproducing this error... >> >> -W >> >> >> >> On 22/12/2011, Manuel Ortiz <manuel.ortizra...@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 > > > > _______________________________________________ > 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