TerraChu
TerraChu

Reputation: 85

Adding Rule into existing KiePackage and KieBase

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

Answers (2)

Sathish Kumar
Sathish Kumar

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

laune
laune

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

Related Questions