[jboss-jira] [JBoss JIRA] Commented: (JBRULES-2527) NullPointerException during rule compilation on entry.getValue().getExtractor().getExtractToClass() instead of clear, understandable compiler error because the getter doesn't exist
Mark Proctor (JIRA)
jira-events at lists.jboss.org
Sun May 30 18:35:08 EDT 2010
[ https://jira.jboss.org/browse/JBRULES-2527?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12533155#action_12533155 ]
Mark Proctor commented on JBRULES-2527:
---------------------------------------
I could not recreate this problem using this unit test:
public void testFieldBindingOnWrongFieldName() {
String str = "";
str += "package org.drools\n";
str += "import org.drools.Person\n";
str += "global java.util.List mlist\n";
str += "rule rule1 \n";
str += "when\n";
str += "$a : Person( $f : invalidFieldName, name == \"a\" )\n";
str += "then\n";
str += " mlist.add( $f );\n";
str += "end\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
ResourceType.DRL );
if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}
Person a = new Person( "a" );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
List mlist = new ArrayList();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.setGlobal( "mlist",
mlist );
ksession.insert( a );
ksession.fireAllRules();
ksession.dispose();
}
I get this error:
junit.framework.AssertionFailedError: Unable to create Field Extractor for 'invalidFieldName' : [Rule name='rule1']
org.drools.RuntimeDroolsException: Field/method 'invalidFieldName' not found for class 'org.drools.Person'Rule Compilation error : [Rule name='rule1']
org/drools/Rule_rule1_0.java (7:352) : $f cannot be resolved
at junit.framework.Assert.fail(Assert.java:47)
at org.drools.integrationtests.MiscTest.testFieldBindingOnWrongFieldName(MiscTest.java:6309)
Can you recreate your problem by tweaking the above test?
> NullPointerException during rule compilation on entry.getValue().getExtractor().getExtractToClass() instead of clear, understandable compiler error because the getter doesn't exist
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: JBRULES-2527
> URL: https://jira.jboss.org/browse/JBRULES-2527
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: drools-compiler (expert)
> Affects Versions: 5.1.0.M2
> Reporter: Geoffrey De Smet
> Assignee: Edson Tirelli
> Priority: Minor
> Fix For: FUTURE
>
>
> When adding this rule, I got a NullPointerException:
> rule "myRule"
> when
> MyFact(
> ...
> $myVariable : wrongGetterName
> )
> ...
> end
> It crashes in
> PatternBuilder.getDeclarationsMap(PatternBuilder.java:666) (With that line number it must be evil! :))
> on this line:
> declarations.put( entry.getKey(),
> entry.getValue().getExtractor().getExtractToClass() );
> and in debug it shows that
> entry.getValue() is $myVariable
> and that
> entry.getValue().getExtractor() is null
> which makes .getExtractToClass() give the NPE
> It turns out that MyFact.getWrongGetterName() doesn't exist (it should be MyFact.getCorrectGetterName()).
> Exception in thread "main" java.lang.NullPointerException
> at org.drools.rule.builder.PatternBuilder.getDeclarationsMap(PatternBuilder.java:666)
> at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:599)
> at org.drools.rule.builder.PatternBuilder.buildConstraint(PatternBuilder.java:269)
> at org.drools.rule.builder.PatternBuilder.buildConstraint(PatternBuilder.java:294)
> at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:213)
> at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:108)
> at org.drools.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:69)
> at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:79)
> at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:1142)
> at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:628)
> at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:252)
> at org.drools.planner.config.localsearch.LocalSearchSolverConfig.buildRuleBase(LocalSearchSolverConfig.java:193)
> at org.drools.planner.config.localsearch.LocalSearchSolverConfig.buildSolver(LocalSearchSolverConfig.java:170)
> at org.drools.planner.config.XmlSolverConfigurer.buildSolver(XmlSolverConfigurer.java:77)
> at org.drools.planner.examples.nurserostering.app.NurseRosteringApp.createSolver(NurseRosteringApp.java:31)
> at org.drools.planner.examples.common.app.CommonApp.createSolutionBusiness(CommonApp.java:43)
> at org.drools.planner.examples.common.app.CommonApp.<init>(CommonApp.java:22)
> at org.drools.planner.examples.nurserostering.app.NurseRosteringApp.<init>(NurseRosteringApp.java:18)
> at org.drools.planner.examples.nurserostering.app.NurseRosteringApp.main(NurseRosteringApp.java:24)
> 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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list