[rules-users] Error creating shadow fact for object: [] when inserting Collection into working memory

Edson Tirelli tirelli at post.com
Tue Jan 15 06:23:53 EST 2008


   Henry,

   This is tricky. Can you please open a JIRA for it? I will take a look as
soon as I can on how to fix that.

   Meanwhile, the workaround is: instead of inheriting from a collection
class, can you wrap it instead?

public class NamedCollection<T> {
   private String name;
   private LinkedList<T> list;

   // constructor, getters, setters
}

   This change will make it work for you.

    []s
    Edson

2008/1/15, Henry Canterburry <canterburry at gmail.com>:
>
> I am having the same problem as described in this post:
>
> http://www.nabble.com/The-effect-of-not-using-shadow-facts-tp11652637p11708600.html
>
> The problem is, there really was no solution mentioned. Here is my
> collections class that I am asserting into working memory:
>
> public class NamedCollection<T> extends LinkedList<T>{
>
>    public NamedCollection(String name){
>         super();
>         this.name = name;
>     }
>
>     public String getName(){
>         return name;
>     }
>
>     /**
>      *
>      */
>     private static final long serialVersionUID = -457439174592908333L;
>     private String name;
>
>     @Override
>     public int hashCode() {
>         final int prime = 31;
>         int result = super.hashCode();
>         result = prime * result + ((name == null) ? 0 : name.hashCode());
>         return result;
>     }
>
>     @Override
>     public boolean equals(Object obj) {
>         if (this == obj)
>             return true;
>         if (!super.equals(obj))
>             return false;
>         if (getClass() != obj.getClass())
>             return false;
>         final NamedCollection other = (NamedCollection) obj;
>         if (name == null) {
>             if (other.name != null)
>                 return false;
>         } else if (!name.equals(other.name))
>             return false;
>         return true;
>     }
> }
>
> I get the following error when inserting this fact into memory:
> org.drools.RuntimeDroolsException: Error creating shadow fact for object:
> []
>     at org.drools.reteoo.Rete$ClassObjectTypeConf.getShadow(Rete.java:628)
>     at org.drools.reteoo.Rete.assertObject(Rete.java:166)
>     at
> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)
>     at
> org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java
> :71)
>     at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java
> :886)
>     at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java
> :858)
>     at
> org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java
> :60)
>     at
> org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java
> :54)
>     at
> sequitem.quanteq.ruleflow.Rule_Explode_Globals_0.consequence
> (Rule_Explode_Globals_0.java:15)
>     at
>
> sequitem.quanteq.ruleflow.Rule_Explode_Globals_0ConsequenceInvoker.evaluate
> (Rule_Explode_Globals_0ConsequenceInvoker.java:22)
>     at
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:550)
>     at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java
> :514)
>     at
> org.drools.common.AbstractWorkingMemory.fireAllRules(
> AbstractWorkingMemory.java:462)
>     at
> org.drools.common.AbstractWorkingMemory.fireAllRules(
> AbstractWorkingMemory.java:424)
>     at
> sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java
> :50)
>     at
> sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java
> :24)
>     at
>
> sequitem.quanteq.rules.RandomMarketEntryRulesTest.testRandomMarketEntryRules
> (RandomMarketEntryRulesTest.java:56)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java
> :39)
>     at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:25)
>     at java.lang.reflect.Method.invoke(Method.java:597)
>     at junit.framework.TestCase.runTest(TestCase.java:168)
>     at junit.framework.TestCase.runBare(TestCase.java:134)
>     at junit.framework.TestResult$1.protect(TestResult.java:110)
>     at junit.framework.TestResult.runProtected(TestResult.java:128)
>     at junit.framework.TestResult.run(TestResult.java:113)
>     at junit.framework.TestCase.run(TestCase.java:124)
>     at junit.framework.TestSuite.runTest(TestSuite.java:232)
>     at junit.framework.TestSuite.run(TestSuite.java:227)
>     at junit.textui.TestRunner.doRun(TestRunner.java:116)
>     at junit.textui.TestRunner.doRun(TestRunner.java:109)
>     at junit.textui.TestRunner.run(TestRunner.java:77)
>     at junit.textui.TestRunner.run(TestRunner.java:62)
>     at
> sequitem.quanteq.rules.RandomMarketEntryRulesTest.main(
> RandomMarketEntryRulesTest.java:64)
> Caused by: java.lang.NullPointerException
>     at java.util.LinkedList.clear(LinkedList.java:292)E
>
>     at
> sequitem.quanteq.rules.engine.NamedCollectionShadowProxy.updateProxy
> (Unknown
> Source)
>     at
> sequitem.quanteq.rules.engine.NamedCollectionShadowProxy.setShadowedObject
> (Unknown
> Source)
>     at org.drools.reteoo.Rete$ClassObjectTypeConf.getShadow(Rete.java:626)
>     ... 33 more
> Time: 67.75
> There was 1 error:
> 1)
> testRandomMarketEntryRules(
> sequitem.quanteq.rules.RandomMarketEntryRulesTest
> )org.drools.spi.ConsequenceException:
> org.drools.RuntimeDroolsException: Error creating shadow fact for object:
> []
>     at
> org.drools.base.DefaultConsequenceExceptionHandler.handleException(
> DefaultConsequenceExceptionHandler.java:14)
>     at
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:553)
>     at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java
> :514)
>     at
> org.drools.common.AbstractWorkingMemory.fireAllRules(
> AbstractWorkingMemory.java:462)
>     at
> org.drools.common.AbstractWorkingMemory.fireAllRules(
> AbstractWorkingMemory.java:424)
>     at
> sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java
> :50)
>     at
> sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java
> :24)
>     at
>
> sequitem.quanteq.rules.RandomMarketEntryRulesTest.testRandomMarketEntryRules
> (RandomMarketEntryRulesTest.java:56)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java
> :39)
>     at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:25)
>     at
> sequitem.quanteq.rules.RandomMarketEntryRulesTest.main(
> RandomMarketEntryRulesTest.java:64)
> Caused by: org.drools.RuntimeDroolsException: Error creating shadow fact
> for object: []
>     at org.drools.reteoo.Rete$ClassObjectTypeConf.getShadow(Rete.java:628)
>     at org.drools.reteoo.Rete.assertObject(Rete.java:166)
>     at
> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)
>     at
> org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java
> :71)
>     at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java
> :886)
>     at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java
> :858)
>     at
> org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java
> :60)
>     at
> org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java
> :54)
>     at
> sequitem.quanteq.ruleflow.Rule_Explode_Globals_0.consequence
> (Rule_Explode_Globals_0.java:15)
>     at
>
> sequitem.quanteq.ruleflow.Rule_Explode_Globals_0ConsequenceInvoker.evaluate
> (Rule_Explode_Globals_0ConsequenceInvoker.java:22)
>     at
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:550)
>     ... 23 more
> Caused by: java.lang.NullPointerException
>     at java.util.LinkedList.clear(LinkedList.java:292)
>     at
> sequitem.quanteq.rules.engine.NamedCollectionShadowProxy.updateProxy
> (Unknown
> Source)
>     at
> sequitem.quanteq.rules.engine.NamedCollectionShadowProxy.setShadowedObject
> (Unknown
> Source)
>     at org.drools.reteoo.Rete$ClassObjectTypeConf.getShadow(Rete.java:626)
>     ... 33 more
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
  Edson Tirelli
  JBoss Drools Core Development
  Office: +55 11 3529-6000
  Mobile: +55 11 9287-5646
  JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080115/772fdc03/attachment.html 


More information about the rules-users mailing list