[
http://jira.jboss.com/jira/browse/JBRULES-1315?page=comments#action_12398341 ]
Pavlin Zahariev commented on JBRULES-1315:
------------------------------------------
Hi there,
I think I found the reason why this happens.
If you use "collect", this creates CollectNode in the reteoo tree. CollectNode
has leftInput and rightInput data members.
If then your rules share two nodes, which are parents of a collectNode, i.e.
ParentNode1->ParentNode2->CollectNode,
In my case it was
LeftInputAdapterNode->EvalCondition->Node->FromNode->CollectNode, where the
first two were shared 8 times,
then when the package (and the rules) are destroyed, you get two calls to the both
parent's remove(final BaseNode node,... method - one from the leftInput and one for
the rightInput members of the CollectNode.
This in turn will decreese the sharedCount of Parent2 twice instead of just once, those
somewhere in the middle of the destruction process
Parent1 will try to removeTupleSink( (TupleSink) parentNode2 ); twice and it will fail
because there are no more tupleSink objects to remove.
The code where it fails is Ok, but care should be taken to manuipulte sharedCount
correctly both ways.
Ok, Is there any chance we can get this fixed?
I know it sounds kinda stupid, but we are going to the release phase of very-very
important project (very important only for me and my customer of course :)
and this is a bad issue. I can fix it my self, but... I'm new in Drools and bit
affraid I may brake something else. And then I just don't have enough time for the
moment to sit down and study Drools sources carefully.
Cheers,
Pavlin
Rule that uses a 'collect' and 'from' clause together
causes problem
--------------------------------------------------------------------
Key: JBRULES-1315
URL:
http://jira.jboss.com/jira/browse/JBRULES-1315
Project: JBoss Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: Reteoo
Affects Versions: 4.0.3
Reporter: Igor Bolic
Attachments: testRemovePackage.rar
Test case:
Write a Rule that uses a 'collect' and 'from' clause together, example:
package com.sample.mypackage
rule "Apply discount"
when
$order: Order();
$items : ArrayList() from collect (OrderItem() from $order.items)
then
#apply discount
end
first i add the package to RuleBase object, everthing works fine. When i try to
'refresh' my rules, i.e. first remove the package and again
add the same (modified) package to the RuleBase object, following error occurs:
java.lang.IllegalArgumentException: Cannot remove a sink, when the list of sinks is null
at org.drools.reteoo.ObjectSource.removeObjectSink(ObjectSource.java:116)
at org.drools.reteoo.AlphaNode.remove(AlphaNode.java:181)
at org.drools.reteoo.LeftInputAdapterNode.remove(LeftInputAdapterNode.java:204)
at org.drools.reteoo.FromNode.remove(FromNode.java:153)
at
org.drools.reteoo.RightInputAdapterNode.remove(RightInputAdapterNode.java:167)
at org.drools.reteoo.BetaNode.remove(BetaNode.java:186)
at org.drools.reteoo.RuleTerminalNode.remove(RuleTerminalNode.java:461)
at org.drools.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:224)
at org.drools.reteoo.ReteooRuleBase.removeRule(ReteooRuleBase.java:272)
at org.drools.common.AbstractRuleBase.removePackage(AbstractRuleBase.java:460)
...
I've found a workaround for this error by writing my .drl code as following:
package com.sample.mypackage
rule "Explode Cart"
salience 11
dialect "java"
when
$order: Order()
$item : OrderItem() from $order.items
then
insert( $item );
end
rule "Apply discount"
no-loop true
when
$order : Order();
$items : ArrayList() from collect (OrderItem())
then
#apply discount
end
Now, my rules are 'refreshed' without any error.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira