I'm trying to use the enabled function to ensure that some rules only fire
under certain conditions. 

I have the following in my DRL :

rule "Load pricelist"
        salience 10000
        when
                        $unitPrice : Pricelist() from 
PricelistUtilities.getPriceLists() 
        then
                insert ($unitPrice);
end

rule "Retract a priced unit"
        salience 5000
        when
                $priceUnit : PriceUnit( basePrice != null )
        then
                System.out.println("Retracting ..." + $priceUnit);
                retract ( $priceUnit );
end

rule "Price Unit by Prodid, Grade, Pattern, Color"
        enabled ( $detailPrice == true )
        salience 2500
        when
                        $priceUnit : PriceUnit ( $detailPrice : detailPrice )
                        $priceList : Pricelist( prodid == $priceUnit.prodid, 
coverGrade ==
$priceUnit.coverGrade, coverSeries == $priceUnit.coverSeries, coverColor ==
$priceUnit.coverColor )
        then
                modify ( $priceUnit )   {
                        setBasePrice ( $priceList.getBasePrice() );
                }
end

rule "Price Unit by Prodid, Grade, Pattern"
        enabled ( $detailPrice == true )
        salience 2000
        when
                        $priceUnit : PriceUnit ( $detailPrice : detailPrice )
                        $priceList : Pricelist( prodid == $priceUnit.prodid, 
coverGrade ==
$priceUnit.coverGrade , coverSeries == $priceUnit.coverSeries  )
        then
                modify ( $priceUnit )   {
                        setBasePrice ( $priceList.getBasePrice() );
                }
end

rule "Price Unit by Prodid, Grade, Pattern 0000"
        salience 1500
        when
                        $priceUnit : PriceUnit ( )
                        $priceList : Pricelist( prodid == $priceUnit.prodid, 
coverGrade ==
$priceUnit.coverGrade , coverSeries == "0000" )
        then
                System.out.println("Pricing unit : " + $priceUnit + " from  " + 
$priceList);
                $priceUnit.setBasePrice($priceList.getBasePrice());
                update ( $priceUnit );
end

Before adding the 'enabled' conditions to the rules, it all worked fine. But
after adding the 'enabled' function, I'm getting the following NullPointer
exception :

Exception executing consequence for rule "Price Unit by Prodid, Grade,
Pattern 0000" in com.sample: java.lang.NullPointerException
        at
org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
        at 
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1283)
        at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1209)
        at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1442)
        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)
        at
org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)
        at
org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)
        at com.generic.rules.utils.DroolsTest.main(DroolsTest.java:37)
Caused by: java.lang.NullPointerException
        at 
org.drools.common.DefaultAgenda.createActivation(DefaultAgenda.java:569)
        at
org.drools.reteoo.RuleTerminalNode.modifyLeftTuple(RuleTerminalNode.java:297)
        at
org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:246)
        at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:363)
        at
org.drools.reteoo.LeftTupleSource.doModifyLeftTuple(LeftTupleSource.java:297)
        at
org.drools.reteoo.LeftTupleSource.modifyLeftTuple(LeftTupleSource.java:271)
        at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:429)
        at
org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateModifyObject(CompositeLeftTupleSinkAdapter.java:260)
        at
org.drools.reteoo.CompositeLeftTupleSinkAdapter.propagateModifyObject(CompositeLeftTupleSinkAdapter.java:275)
        at
org.drools.reteoo.LeftInputAdapterNode.modifyObject(LeftInputAdapterNode.java:170)
        at
org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507)
        at
org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432)
        at 
org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314)
        at 
org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265)
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:470)
        at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:370)
        at
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:317)
        at
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:312)
        at
com.sample.Rule_Price_Unit_by_Prodid__Grade__Pattern_0000_8fe2d406670448989b7e4f1e051a27e9.defaultConsequence(Rule_Price_Unit_by_Prodid__Grade__Pattern_0000_8fe2d406670448989b7e4f1e051a27e9.java:9)
        at
com.sample.Rule_Price_Unit_by_Prodid__Grade__Pattern_0000_8fe2d406670448989b7e4f1e051a27e9DefaultConsequenceInvokerGenerated.evaluate(Unknown
Source)
        at
com.sample.Rule_Price_Unit_by_Prodid__Grade__Pattern_0000_8fe2d406670448989b7e4f1e051a27e9DefaultConsequenceInvoker.evaluate(Unknown
Source)
        at 
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1273)
        ... 6 more

In the console I also see the results of my System.out.println :

Pricing unit : PriceUnit [prodid=001001, coverGrade= A, coverSeries=1234,
coverColor=05, basePrice=null] from  Pricelist [prodid=001001, cover=
A0000null, basePrice=599]

The only 'null' is $priceUnit.basePrice, which is what I'm trying to set.

I only get the exception when the 'detailedPrice' of PriceUnit is set to
false (i.e. when "Price Unit by Prodid, Grade, Pattern 0000" is attempting
to fire. If I set detailedPrice to true, the other rules fire just fine.

If I comment out the 'update ( $priceUnit );',  the consequence fires just
fine, but then other rules fire as well. When PriceUnit's pattern is set to
anything other than '1234', then too consequence of ""Price Unit by Prodid,
Grade, Pattern 0000"" rule fires just fine and I get the following output
(correctly so) :

Pricing unit : PriceUnit [prodid=001001, coverGrade= A, coverSeries=3456,
coverColor=05, basePrice=null] from  Pricelist [prodid=001001, cover=
A0000null, basePrice=599]
Retracting ...PriceUnit [prodid=001001, coverGrade= A, coverSeries=3456,
coverColor=05, basePrice=599]

What is causing the 'NullPointerException' ?  

I'm using Drools 5.4.0.

Please help.

G



--
View this message in context: 
http://drools.46999.n3.nabble.com/NullPointerException-using-enabled-function-tp4018382.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to