[jboss-jira] [JBoss JIRA] Closed: (JBRULES-1446) ClassCastException when iterating over an array using "from"
Mark Proctor (JIRA)
jira-events at lists.jboss.org
Tue Mar 11 21:53:58 EDT 2008
[ http://jira.jboss.com/jira/browse/JBRULES-1446?page=all ]
Mark Proctor closed JBRULES-1446.
---------------------------------
Resolution: Done
> ClassCastException when iterating over an array using "from"
> ------------------------------------------------------------
>
> Key: JBRULES-1446
> URL: http://jira.jboss.com/jira/browse/JBRULES-1446
> Project: JBoss Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: Reteoo
> Affects Versions: 4.0.4
> Environment: Windows XP
> Reporter: Krzysztof Karski
> Assigned To: Mark Proctor
> Fix For: 4.0.5, 5.0.0-M1
>
>
> To reproduce the error, please create the two following objects:
> package test;
> public class DomainObject {
> private String message;
> private int value;
> private double value2;
>
> public String getMessage() {
> return message;
> }
> public void setMessage(String message) {
> this.message = message;
> }
> public int getValue() {
> return value;
> }
> public void setValue(int value) {
> this.value = value;
> }
> public double getValue2() {
> return value2;
> }
> public void setValue2(double value2) {
> this.value2 = value2;
> }
>
> }
> package test;
> public class DomainObjectHolder {
> DomainObject[] objects = new DomainObject[3];
>
> public DomainObjectHolder(){
>
> objects[0] = new DomainObject();
> objects[0].setMessage("Message1");
> objects[0].setValue(1);
> objects[0].setValue2(2);
>
> objects[1] = new DomainObject();
> objects[1].setMessage("Message2");
> objects[1].setValue(3);
> objects[1].setValue2(4);
>
> objects[2] = new DomainObject();
> objects[2].setMessage("Message3");
> objects[2].setValue(5);
> objects[2].setValue2(6);
> }
>
> public DomainObject[] getObjects(){
> return objects;
> }
>
> }
> Here are a few rule that will trigger the ClassCastException:
> rule "Test Rule"
> when
> $holder : DomainObjectHolder()
> $object : DomainObject( $message : message) from $holder.objects;
> then
> System.out.println("Selected Object " + $message);
> end
> rule "Test Rule"
> when
> $holder : DomainObjectHolder()
> $object : DomainObject( ) from $holder.objects;
> then
> System.out.println("Selected Object " + $object.getMessage());
> end
> This rule does not trigger the exception:
> rule "Test Rule"
> when
> $holder : DomainObjectHolder()
> $object : DomainObject( ) from $holder.objects;
> then
> System.out.println("Selected Object");
> end
> Here is the exception message:
> java.lang.ClassCastException: [Ltest.DomainObject; cannot be cast to test.DomainObject
> at org.drools.base.test.DomainObject9939622$getMessage.getValue(Unknown Source)
> at org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:127)
> at org.drools.rule.Declaration.getValue(Declaration.java:198)
> at sequitem.quanteq.rules.exit.Rule_Test_Rule_0ConsequenceInvoker.evaluate(Rule_Test_Rule_0ConsequenceInvoker.java:17)
> 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:471)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:433)
> at sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:98)
> at sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:45)
> at sequitem.quanteq.tradesystem.RuleBasedTradeSystem.onStart(RuleBasedTradeSystem.java:186)
> at org.activequant.tradesystem.simple.TradeSystemBase.start(TradeSystemBase.java:242)
> 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 org.activequant.container.context.TradeSystemContextBase.invoke(TradeSystemContextBase.java:134)
> at org.activequant.container.context.TradeSystemContextBase.access$2(TradeSystemContextBase.java:132)
> at org.activequant.container.context.TradeSystemContextBase$2.start(TradeSystemContextBase.java:152)
> at org.activequant.container.context.TradeSystemContextBase.start(TradeSystemContextBase.java:179)
> at sequitem.quanteq.backtest.exits.StandardExistBackTest.main(StandardExistBackTest.java:36)
> Exception in thread "main" java.lang.reflect.InvocationTargetException
> 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 org.activequant.container.context.TradeSystemContextBase.invoke(TradeSystemContextBase.java:134)
> at org.activequant.container.context.TradeSystemContextBase.access$2(TradeSystemContextBase.java:132)
> at org.activequant.container.context.TradeSystemContextBase$2.start(TradeSystemContextBase.java:152)
> at org.activequant.container.context.TradeSystemContextBase.start(TradeSystemContextBase.java:179)
> at sequitem.quanteq.backtest.exits.StandardExistBackTest.main(StandardExistBackTest.java:36)
> Caused by: org.drools.spi.ConsequenceException: java.lang.ClassCastException: [Ltest.DomainObject; cannot be cast to test.DomainObject
> at org.drools.base.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:14)
> at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:554)
> at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:514)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:471)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:433)
> at sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:98)
> at sequitem.quanteq.rules.engine.StatefulEngine.execute(StatefulEngine.java:45)
> at sequitem.quanteq.tradesystem.RuleBasedTradeSystem.onStart(RuleBasedTradeSystem.java:186)
> at org.activequant.tradesystem.simple.TradeSystemBase.start(TradeSystemBase.java:242)
> ... 9 more
> Caused by: java.lang.ClassCastException: [Ltest.DomainObject; cannot be cast to test.DomainObject
> at org.drools.base.test.DomainObject9939622$getMessage.getValue(Unknown Source)
> at org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:127)
> at org.drools.rule.Declaration.getValue(Declaration.java:198)
> at sequitem.quanteq.rules.exit.Rule_Test_Rule_0ConsequenceInvoker.evaluate(Rule_Test_Rule_0ConsequenceInvoker.java:17)
> at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:550)
> ... 16 more
--
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
More information about the jboss-jira
mailing list