Hello,
I have rules based on a class which is generated dynamically (my rules
are also generated dynamically).
I have found how to specify the ClassLoader to compile the rules (with
the PackageBuilderConfiguration class), but I don't know how to specify
the ClassLoader for the execution.
Can anyone tell me how to do this?
I am using JBRules 3.0.4.
Thanks
Damien
My code:
Class elementClass = ((ListImpl)
contact.getList()).getElementClass(clmSession);
String className = elementClass.getSimpleName();
String fullClassName = elementClass.getName();
PackageBuilderConfiguration config = new
PackageBuilderConfiguration();
config.setClassLoader(contact.getClass().getClassLoader());
PackageBuilder builder = new PackageBuilder(config);
PackageDescr pack = new
PackageDescr("com.konversation.core.condition");
pack.addImport(fullClassName);
RuleDescr ruleDescr = new RuleDescr("Province = QC");
AndDescr and = new AndDescr();
ColumnDescr column = new ColumnDescr(className, "contact");
LiteralDescr fieldConstraint = new
LiteralDescr("propProvince", "==", "QC");
column.addDescr(fieldConstraint);
and.addDescr(column);
ruleDescr.setLhs(and);
ruleDescr.setConsequence("System.out.println(\"province =
QC\");");
pack.addRule(ruleDescr);
builder.addPackage(pack);
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( builder.getPackage() );
WorkingMemory workingMemory = ruleBase.newWorkingMemory();
FactHandle handle = workingMemory.assertObject(contact);
workingMemory.fireAllRules();
The DRL generated :
package com.konversation.core.condition;
import com.konversation.worlds.List67ElementImpl;
rule "Province = QC"
when
contact : List67ElementImpl( propProvince == "QC" )
then
System.out.println("province = QC");
end
The exception:
java.lang.NoClassDefFoundError:
com/konversation/worlds/List67ElementImpl
at
org.drools.base.com.konversation.worlds.List67ElementImpl$getPropProvince.getValue(Unknown
Source)
at org.drools.base.ClassFieldExtractor.getValue(Unknown
Source)
at org.drools.reteoo.AlphaNodeSwitch.getNode(Unknown Source)
at
org.drools.reteoo.HashedObjectSinkList$1.hasNext(Unknown Source)
at
org.drools.reteoo.ObjectSource.propagateAssertObject(Unknown Source)
at org.drools.reteoo.ObjectTypeNode.assertObject(Unknown
Source)
at org.drools.reteoo.Rete.assertObject(Unknown Source)
at org.drools.reteoo.ReteooRuleBase.assertObject(Unknown
Source)
at
org.drools.reteoo.ReteooWorkingMemory.doAssertObject(Unknown Source)
at
org.drools.common.AbstractWorkingMemory.assertObject(Unknown Source)
at
org.drools.common.AbstractWorkingMemory.assertObject(Unknown Source)