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

bill simms sitrious at gmail.com
Thu Jul 9 17:02:44 EDT 2009


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090709/a9d04eff/attachment.html 


More information about the rules-users mailing list