Reputation: 85
I'm trying to add a Rule to a KiePackage that has already been defined and built using KieBuilder.
I know you can remove a rule using:
base.removeRule("com.somepackage", "ruleName");
But is there an equivalent for adding a rule? I've tried adding a new .drl file into the KieFileSystem and using KieScanner to pick up the changes, but it doesn't seem to work:
KieBaseConfiguration config = service.newKieBaseConfiguration();
KieBase base = kContainer.newKieBase(config);
KieFileSystem fileSystem = service.newKieFileSystem();
KieBuilder builder = service.newKieBuilder(fileSystem);
fileSystem.write(originalDrlFile, someFile)
builder.buildAll() // first drl is loaded
fileSystem.write(newlDrlFile, someFile)
KieScanner scanner = service.newKieScanner(kContainer);
scanner.scanNow();
KieSession ksession1 = kContainer.newKieSession();
builder.buildAll() // reloading with new drl.
When I evaluate a fact against ksession1, the new rules dont exist in the KieBase. Am I missing something?
Upvotes: 2
Views: 3902
Reputation: 209
Where are we making a relationship between the kieBuilder and kieBase?
I have tried something like this..
kieContainer= kieService.newKieContainer(kiebuilder.getKieModule().getReleaseId());
kieSession = kieContainer.newKieSession();
Upvotes: 0
Reputation: 31290
private KieSession kieSession;
public void build() throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
FileInputStream fis2 = new FileInputStream( "override/r2.drl" );
kfs.write( "src/main/resources/r2.drl",
kieServices.getResources().newInputStreamResource( fis2 ) );
FileInputStream fis1 = new FileInputStream( "override/r1.drl" );
kfs.write( "src/main/resources/r1.drl",
kieServices.getResources().newInputStreamResource( fis1 ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieContainer.newKieSession();
}
The build
method illustrates an incremental build. To add a rule, you can do the entire process using an additional DRL file with the new rule once more. Or, if you keep the KieFileSystem, you can add the DRL file later, call buildAll once more, recreate the KieBase, etc.
Upvotes: 2