[rules-users] PatternBuilder createRestriction bug on Drools 5.1.1

Manuel Ortiz manuel.ortizramos at gmail.com
Thu Dec 22 04:14:46 EST 2011


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20111222/d5628ada/attachment.html 


More information about the rules-users mailing list