[jboss-jira] [JBoss JIRA] Updated: (JBRULES-1446) ClassCastException when iterating over an array using "from"

Mark Proctor (JIRA) jira-events at lists.jboss.org
Tue Mar 11 21:15:58 EDT 2008


     [ http://jira.jboss.com/jira/browse/JBRULES-1446?page=all ]

Mark Proctor updated JBRULES-1446:
----------------------------------

      Component/s: Reteoo
    Fix Version/s: 4.0.5
                   5.0.0-M1
         Assignee: Mark Proctor

> 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