[rules-users] ClassCastException when using an accumulate function on a locally declared type

Edson Tirelli tirelli at post.com
Fri Jul 10 12:25:52 EDT 2009


   This was a bug. It is fixed now. Thanks for reporting.

https://jira.jboss.org/jira/browse/JBRULES-2202

   Edson

2009/7/9 bill simms <sitrious at gmail.com>

> Hello,
>
> Recently I've been working with Drools version 5.0.1 to set up an event
> processor.  While doing so I have come
> across difficulties with the accumulate function, in that it will always
> throw a ClassCastException
> when inserting events that are declared within my drl file.  To illustrate
> this I've set up an example which is
> shown below.  I've search Google and the mailing list for several hours,
> but the only way past this problem
> appears to be that I will have to declare a class externally and make sure
> it implements Serializable.  Does
> anyone has suggestions for another approach?  Secondly, I would have
> assumed that since Drools was
> compiling these internally declared classes, that Serializable would have
> been implemented automatically.  So
> is this a result of the generated class not implementing Serializable, or
> have I missed something in my rules
> file?  Thanks.
>
> The important part of my drl file is:
>
> declare TestEvent
>    @role( event )
>    @expires(10s)
>    id : String
> end
>
> #This rule works fine when 'Accumulate Count' is commented out, and is used
> to make
> #sure that the event inserting has worked.
> rule "Is It There"
>     when
>         TestEvent() from entry-point "test"
>     then
>         System.out.println("Found a TestEvent.");
> end
>
> #This rule throws a ClassCastException when a TestEvent is inserted.
> rule "Accumulate Count"
>     when
>         $n : Number() from accumulate($t : TestEvent() from entry-point
> "test",    count($t))
>     then
>         System.out.println("Found " + $n + " events.");
> end
>
> The unit test does this:
>
> FactType testEventType =
> session.getKnowledgeBase().getFactType("com.drools.test", "TestEvent");
> for(int i = 0; i < 10; i++){
>     Object testEvent = testEventType.newInstance();
>     testEventType.set(testEvent, "id", "id");
>     WorkingMemoryEntryPoint mainStream =
> session.getWorkingMemoryEntryPoint("test");
>     mainStream.insert(event);
>     session.fireAllRules();
> }
>
> The exception I receive is:
>
> org.drools.RuntimeDroolsException: java.lang.ClassCastException:
> com.drools.test.TestEvent cannot be cast to java.io.Serializable
>     at org.drools.rule.Accumulate.accumulate(Accumulate.java:172)
>     at
> org.drools.reteoo.AccumulateNode.modifyTuple(AccumulateNode.java:424)
>     at
> org.drools.reteoo.AccumulateNode.assertObject(AccumulateNode.java:284)
>     at
> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
>     at
> org.drools.reteoo.PropagationQueuingNode$AssertAction.execute(PropagationQueuingNode.java:326)
>     at
> org.drools.reteoo.PropagationQueuingNode.propagateActions(PropagationQueuingNode.java:221)
>     at
> org.drools.reteoo.PropagationQueuingNode$PropagateAction.execute(PropagationQueuingNode.java:394)
>     at
> org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:1486)
>     at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:158)
>     at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:122)
>     at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:80)
>     at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:28)
>     at com.drools.test.MyUnitTest.testEvents(EvaluationTest.java:66)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>     at java.lang.reflect.Method.invoke(Unknown Source)
>     at
> org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
>     at
> org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
>     at
> org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
>     at
> org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
>     at
> org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
>     at
> org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
>     at
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
>     at
> org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
>     at
> org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
>     at
> org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
>     at
> org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
>     at
> org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
>     at
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
>     at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
>     at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>     at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> Caused by: java.lang.ClassCastException: com.drools.test.TestEvent cannot
> be cast to java.io.Serializable
>     at
> org.drools.base.accumulators.JavaAccumulatorFunctionExecutor.accumulate(JavaAccumulatorFunctionExecutor.java:110)
>     at org.drools.rule.Accumulate.accumulate(Accumulate.java:164)
>     ... 36 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
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090710/c31b35fb/attachment.html 


More information about the rules-users mailing list