[jboss-jira] [JBoss JIRA] (JBRULES-3709) When use method of FACT match(Object... objs), throws java.lang.RuntimeException: cannot invoke method

Yingzhi Wang (JIRA) jira-events at lists.jboss.org
Sat Dec 29 03:42:08 EST 2012


     [ https://issues.jboss.org/browse/JBRULES-3709?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Yingzhi Wang updated JBRULES-3709:
----------------------------------

    Attachment: user_src.zip


The source of the issue
                
> When use method of FACT match(Object... objs), throws java.lang.RuntimeException: cannot invoke method 
> -------------------------------------------------------------------------------------------------------
>
>                 Key: JBRULES-3709
>                 URL: https://issues.jboss.org/browse/JBRULES-3709
>             Project: JBRULES
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: drools-core
>    Affects Versions: 5.4.0.Final, 5.5.0.Final
>         Environment: OS: Windows xp
> IDE: Eclipse
> JRE: 1.6
>            Reporter: Yingzhi Wang
>            Assignee: Mark Proctor
>            Priority: Critical
>              Labels: RuntimeException, invoke, method
>         Attachments: user_src.zip
>
>
>     I writed a method of fact User "public boolean match(Boolean... bs)", and when I use it in drl like this "User(match(true, true))", it will thows exception: java.lang.RuntimeException: cannot invoke method: match. But if I change it to User(match(true)), it will be ok.
> And also, If I insert fact first, then add the rule, It will throws this exception, if I add the rule first, then insert fact, it will be ok.
> Is DRools not support method(Object... objs)?
> FACT: User
> package user;
> public class User {
> 	public boolean match(Boolean... bs) {
> 		return true;
> 	}
> 	public boolean matchList(Boolean b1, Boolean b2) {
> 		return true;
> 	}
> }
> DRL: user.drl
> package test
> import user.User
> rule "test"
> 	when
> 		// User(match(true))  // is ok
> 		User(match(true, true)) // is err	
> 		// User(matchList(true, true)) // is ok
> 	then
> 		System.out.println("It's OK!");
> end
> main:
> KnowledgeBase base = KnowledgeBaseFactory.newKnowledgeBase();
> StatefulKnowledgeSession s = base.newStatefulKnowledgeSession();
> // user insert here will be err
> User user = new User(); 
> s.insert(user);
> 		
> // add rule
> KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> builder.add(ResourceFactory.newClassPathResource("user.drl", Test.class), ResourceType.DRL);
> KnowledgeBuilderErrors errs = builder.getErrors();
> if (!errs.isEmpty()) {
> 	for (KnowledgeBuilderError e: errs) {
> 		System.out.println(e.toString());
> 	}
> }
> Collection<KnowledgePackage> col = builder.getKnowledgePackages();
> base.addKnowledgePackages(col);
> 		
> // user insert here is ok
> // User user = new User(); 
> // s.insert(user);
> 		
> // fire
> s.fireAllRules();
> Exception:
> Exception in thread "main" java.lang.RuntimeException: cannot invoke method: match
> 	at org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.getValue(MethodAccessor.java:63)
> 	at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
> 	at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
> 	at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:123)
> 	at org.mvel2.MVEL.executeExpression(MVEL.java:930)
> 	at org.drools.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:70)
> 	at org.drools.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:49)
> 	at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:167)
> 	at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:124)
> 	at org.drools.reteoo.AlphaNode$ObjectSinkUpdateAdapter.assertObject(AlphaNode.java:325)
> 	at org.drools.reteoo.ObjectTypeNode.updateSink(ObjectTypeNode.java:334)
> 	at org.drools.reteoo.AlphaNode.updateSink(AlphaNode.java:203)
> 	at org.drools.reteoo.LeftInputAdapterNode.attach(LeftInputAdapterNode.java:120)
> 	at org.drools.reteoo.builder.BuildUtils.attachNode(BuildUtils.java:145)
> 	at org.drools.reteoo.builder.GroupElementBuilder$AndBuilder.build(GroupElementBuilder.java:127)
> 	at org.drools.reteoo.builder.GroupElementBuilder.build(GroupElementBuilder.java:71)
> 	at org.drools.reteoo.builder.ReteooRuleBuilder.addSubRule(ReteooRuleBuilder.java:155)
> 	at org.drools.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:128)
> 	at org.drools.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:116)
> 	at org.drools.reteoo.ReteooRuleBase.addRule(ReteooRuleBase.java:445)
> 	at org.drools.common.AbstractRuleBase.addRule(AbstractRuleBase.java:956)
> 	at org.drools.common.AbstractRuleBase.addPackages(AbstractRuleBase.java:627)
> 	at org.drools.reteoo.ReteooRuleBase.addPackages(ReteooRuleBase.java:472)
> 	at org.drools.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:150)
> 	at user.Test.main(Test.java:36)
> Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
> 	at org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.executeAll(MethodAccessor.java:149)
> 	at org.mvel2.optimizers.impl.refl.nodes.MethodAccessor.getValue(MethodAccessor.java:48)
> 	... 24 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list