[rules-users] Are globals not permitted with queries?
Borris
borris at chaos.org.uk
Tue Jul 22 11:48:11 EDT 2014
I was experimenting with ways of avoiding having to put literal strings
into my rules (it is very fragile and bugs can be silent for a long
time). I tried declaring a global and then tried supplying it to a
query. This generates a backtrace during the newKieSession. A simple
example to provoke the problem:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession =
kContainer.newKieSession("ksession-rules");
kSession.setGlobal("AString", "Hello World");
kSession.fireAllRules();
package com.sample
global java.lang.String AString;
declare Thing
name: String @key
end
rule init
when
then
insert( new Thing( AString ) );
end
query test(String $in)
Thing( $in; )
end
rule spot
when
test( "Hello World"; )
Thing( "Hello World"; )
test( AString; )
Thing( AString; )
then
System.out.println("found msg\n");
end
java.lang.NullPointerException
at
org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:243)
at
org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:263)
at
org.drools.core.rule.LogicTransformer.fixClonedDeclarations(LogicTransformer.java:134)
at
org.drools.core.rule.LogicTransformer.transform(LogicTransformer.java:99)
at
org.drools.core.definitions.rule.impl.RuleImpl.getTransformedLhs(RuleImpl.java:560)
at
org.drools.core.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:105)
at org.drools.core.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:100)
at
org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1455)
at
org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1435)
at
org.drools.core.impl.KnowledgeBaseImpl.addPackages(KnowledgeBaseImpl.java:838)
at
org.drools.core.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:266)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:412)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:346)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:498)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:469)
at com.sample.DroolsTest.main(DroolsTest.java:17)
The 3rd action in the spot rule causes the null exception during
initialise, if it is present. Comment out just that line and no
exceptions happen and behaviour is as expected.
Are globals permitted in the way I am trying to use them, as a parameter
to a query?
Borris
More information about the rules-users
mailing list