[rules-users] shadow copy lacks a property value of the original fact

Henry Canterburry canterburry at gmail.com
Tue Jan 15 23:38:51 EST 2008


I was just debugging my rules and monitored my working memory and 
variables, trying to figure out why a certain Pattern match was not 
firing, and noticed that a property value for a fact I inserted earlier 
via the RHS does not seem to be inserted into working memory along with 
the object. The fact's delegate (?) has the property value, but the fact 
(as displayed in the variables tab) has a null value for the property.

Here is the rule that inserts the fact into memory:

rule "Explode Globals"
    when
        $request : DecisionRequest( )
        $input : Object() from $request.getRequestObjects().values()
    then
        insert ( $input );       
end

Just before the insert executes, $input looks like this in the variables 
tab:

$input - NamedCollection<T> (id=61)
    list - LinkedList<E> (id=62)
    name - "constraints"

After the insert however, when the engine checks the name value in my 
java class, the same fact now looks like this in the variables tab:
 
this - NamedCollectionShadowProxy (id=83)
   delegate - NamedCollection<T> (id=61)
      list - LinkedList<E> (id=62)
      name - "constraints"
   list - LinkedList<E> (id=87)
   name - null << ??

So, when I next have a rule that looks like this:

rule "Assemble Constraints"
    when
        $const : OrderConstraint()
        $coll : NamedCollection( name == "constraints" )
    then
        $coll.add($const);   
        update($coll);   
end

Here is the java class:

public class NamedCollection<T> implements Collection<T>{

    private static final long serialVersionUID = -457439174592908333L;
    private Collection<T> list = new LinkedList<T>();
    private String name;
       
    public NamedCollection(){
       
    }

    public NamedCollection(String name){
        this.name = name;
    }

...more methods...

    public String getName(){
        return this.name;
    }
   
    public void setName(String name){
        this.name = name;
    }
}

The pattern does not match since the value for name is null! When I 
place a breakpoint in my java code during drools debugging, the name 
value will return null each time. I also have another rule that creates 
a new OrderConstraint, so all conditions for the last rule to fire 
exist...other than the name property being null although it is set in 
the delegate. I do not have any other rules that modify the 
NamedCollection.

What am I doing wrong? Is this again related to having a class implement 
a collection?

HC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080115/0de8a0f0/attachment.html 


More information about the rules-users mailing list