Search in sources :

Example 1 with KieBaseUpdate

use of org.drools.core.impl.KieBaseUpdate in project drools by kiegroup.

the class CanonicalKieBaseUpdater method run.

@Override
public void run() {
    CanonicalKieModule oldKM = (CanonicalKieModule) ctx.currentKM;
    CanonicalKieModule newKM = (CanonicalKieModule) ctx.newKM;
    Map<String, AtomicInteger> globalsCounter = new HashMap<>();
    // To keep compatible the classes generated from declared types the new kmodule has to be loaded with the classloader of the old one
    newKM.setIncrementalUpdate(true);
    CanonicalKiePackages newPkgs = newKM.getKiePackages(ctx.newKieBaseModel);
    InternalKnowledgeBuilder pkgbuilder = ctx.kbuilder;
    CompositeKnowledgeBuilder ckbuilder = pkgbuilder.batch();
    newKM.setIncrementalUpdate(false);
    removeResources(pkgbuilder);
    List<RuleImpl> rulesToBeRemoved;
    List<RuleImpl> rulesToBeAdded;
    if (ctx.modifyingUsedClass) {
        // remove all ObjectTypeNodes for the modified classes
        for (Class<?> cls : ctx.modifiedClasses) {
            clearInstancesOfModifiedClass(cls);
        }
        for (InternalKnowledgePackage kpkg : ctx.kBase.getPackagesMap().values()) {
            List<TypeDeclaration> types = new ArrayList<>(kpkg.getTypeDeclarations().values());
            for (TypeDeclaration type : types) {
                kpkg.removeTypeDeclaration(type.getTypeName());
                kpkg.addTypeDeclaration(((InternalKnowledgePackage) newPkgs.getKiePackage(kpkg.getName())).getTypeDeclaration(type.getTypeName()));
            }
        }
        rulesToBeRemoved = getAllRulesInKieBase(oldKM, ctx.currentKieBaseModel);
        rulesToBeAdded = getAllRulesInKieBase(newKM, ctx.newKieBaseModel);
    } else {
        ctx.kBase.processAllTypesDeclaration(newPkgs.getKiePackages());
        rulesToBeRemoved = new ArrayList<>();
        rulesToBeAdded = new ArrayList<>();
        for (ResourceChangeSet changeSet : ctx.cs.getChanges().values()) {
            if (!isPackageInKieBase(ctx.newKieBaseModel, changeSet.getResourceName())) {
                continue;
            }
            InternalKnowledgePackage kpkg = (InternalKnowledgePackage) newPkgs.getKiePackage(changeSet.getResourceName());
            InternalKnowledgePackage oldKpkg = ctx.kBase.getPackage(changeSet.getResourceName());
            if (oldKpkg == null) {
                try {
                    oldKpkg = (InternalKnowledgePackage) ctx.kBase.addPackage(CoreComponentFactory.get().createKnowledgePackage(changeSet.getResourceName())).get();
                } catch (InterruptedException | ExecutionException e) {
                    throw new RuntimeException(e);
                }
            }
            if (kpkg != null) {
                for (Rule newRule : kpkg.getRules()) {
                    RuleImpl rule = oldKpkg.getRule(newRule.getName());
                    if (rule != null) {
                        rule.setLoadOrder(((RuleImpl) newRule).getLoadOrder());
                    }
                }
            }
            this.updateResource(pkgbuilder, ckbuilder, changeSet);
            for (ResourceChange change : changeSet.getChanges()) {
                String changedItemName = change.getName();
                if (change.getChangeType() == ChangeType.UPDATED || change.getChangeType() == ChangeType.REMOVED) {
                    switch(change.getType()) {
                        case GLOBAL:
                            oldKpkg.removeGlobal(changedItemName);
                            AtomicInteger globalCounter = globalsCounter.get(changedItemName);
                            if (globalCounter == null || globalCounter.decrementAndGet() <= 0) {
                                ctx.kBase.removeGlobal(changedItemName);
                            }
                            break;
                        case RULE:
                            RuleImpl removedRule = oldKpkg.getRule(changedItemName);
                            if (removedRule != null) {
                                rulesToBeRemoved.add(removedRule);
                                oldKpkg.removeRule(removedRule);
                            }
                            break;
                        case DECLARATION:
                            oldKpkg.removeTypeDeclaration(changedItemName);
                            break;
                        case FUNCTION:
                            oldKpkg.removeFunction(changedItemName);
                            break;
                        default:
                            throw new IllegalArgumentException("Unsupported change type: " + change.getType() + "!");
                    }
                }
                if (kpkg != null && (change.getChangeType() == ChangeType.UPDATED || change.getChangeType() == ChangeType.ADDED)) {
                    switch(change.getType()) {
                        case GLOBAL:
                            globalsCounter.computeIfAbsent(changedItemName, name -> ctx.kBase.getGlobals().get(name) == null ? new AtomicInteger(1) : new AtomicInteger(0)).incrementAndGet();
                            Class<?> globalClass = kpkg.getGlobals().get(changedItemName);
                            oldKpkg.addGlobal(changedItemName, globalClass);
                            ctx.kBase.addGlobal(changedItemName, globalClass);
                            break;
                        case RULE:
                            RuleImpl addedRule = kpkg.getRule(changedItemName);
                            rulesToBeAdded.add(addedRule);
                            oldKpkg.addRule(addedRule);
                            break;
                        case DECLARATION:
                            TypeDeclaration addedType = kpkg.getTypeDeclaration(changedItemName);
                            oldKpkg.addTypeDeclaration(addedType);
                            break;
                        case FUNCTION:
                            Function addedFunction = kpkg.getFunctions().get(changedItemName);
                            oldKpkg.addFunction(addedFunction);
                            break;
                        default:
                            throw new IllegalArgumentException("Unsupported change type: " + change.getType() + "!");
                    }
                }
            }
        }
    }
    if (ctx.modifyingUsedClass) {
        invalidateAccessorForOldClass();
        updateAllResources(pkgbuilder, ckbuilder);
    }
    ((CompositeKnowledgeBuilderImpl) ckbuilder).build(false);
    KieBaseUpdate kieBaseUpdate = new KieBaseUpdate(rulesToBeRemoved, rulesToBeAdded);
    ctx.kBase.beforeIncrementalUpdate(kieBaseUpdate);
    ctx.kBase.removeRules(rulesToBeRemoved);
    ctx.kBase.addRules(rulesToBeAdded);
    ctx.kBase.afterIncrementalUpdate(kieBaseUpdate);
    for (InternalWorkingMemory wm : ctx.kBase.getWorkingMemories()) {
        wm.notifyWaitOnRest();
    }
}
Also used : CanonicalKiePackages(org.drools.modelcompiler.CanonicalKiePackages) ResourceChange(org.kie.internal.builder.ResourceChange) Function(org.drools.core.rule.Function) TypeDeclaration(org.drools.core.rule.TypeDeclaration) CompositeKnowledgeBuilder(org.kie.internal.builder.CompositeKnowledgeBuilder) ChangeType(org.kie.internal.builder.ChangeType) HashMap(java.util.HashMap) CoreComponentFactory(org.drools.core.reteoo.CoreComponentFactory) ArrayList(java.util.ArrayList) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) KieBaseUpdate(org.drools.core.impl.KieBaseUpdate) Rule(org.kie.api.definition.rule.Rule) CompositeKnowledgeBuilderImpl(org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl) KiePackage(org.kie.api.definition.KiePackage) KieBaseUpdaterImplContext(org.drools.compiler.kie.builder.impl.KieBaseUpdaterImplContext) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) KieBaseModelImpl(org.drools.compiler.kproject.models.KieBaseModelImpl) ResourceChangeSet(org.kie.internal.builder.ResourceChangeSet) CanonicalKieModule(org.drools.modelcompiler.CanonicalKieModule) ExecutionException(java.util.concurrent.ExecutionException) InternalKnowledgeBuilder(org.drools.compiler.builder.InternalKnowledgeBuilder) List(java.util.List) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) KieBaseUpdaterImpl(org.drools.compiler.kie.builder.impl.KieBaseUpdaterImpl) CompositeKnowledgeBuilder(org.kie.internal.builder.CompositeKnowledgeBuilder) InternalKnowledgeBuilder(org.drools.compiler.builder.InternalKnowledgeBuilder) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) ResourceChangeSet(org.kie.internal.builder.ResourceChangeSet) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) Function(org.drools.core.rule.Function) ExecutionException(java.util.concurrent.ExecutionException) ResourceChange(org.kie.internal.builder.ResourceChange) CanonicalKiePackages(org.drools.modelcompiler.CanonicalKiePackages) CanonicalKieModule(org.drools.modelcompiler.CanonicalKieModule) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) CompositeKnowledgeBuilderImpl(org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl) KieBaseUpdate(org.drools.core.impl.KieBaseUpdate) Rule(org.kie.api.definition.rule.Rule) TypeDeclaration(org.drools.core.rule.TypeDeclaration) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage)

Example 2 with KieBaseUpdate

use of org.drools.core.impl.KieBaseUpdate in project drools by kiegroup.

the class KieBaseUpdaterImpl method run.

@Override
public void run() {
    InternalKnowledgeBuilder kbuilder = ctx.kbuilder;
    CompositeKnowledgeBuilder ckbuilder = kbuilder.batch();
    boolean shouldRebuild = applyResourceChanges(kbuilder, ckbuilder);
    removeResources(kbuilder);
    // remove all ObjectTypeNodes for the modified classes
    if (ctx.modifyingUsedClass) {
        for (Class<?> cls : ctx.modifiedClasses) {
            clearInstancesOfModifiedClass(cls);
        }
        for (InternalKnowledgePackage pkg : ctx.kBase.getPackagesMap().values()) {
            DialectRuntimeData mvel = pkg.getDialectRuntimeRegistry().getDialectData("mvel");
            if (mvel != null) {
                mvel.resetParserConfiguration();
            }
        }
    }
    if (shouldRebuild) {
        // readd unchanged dsl files to the kbuilder
        for (String dslFile : ctx.unchangedResources) {
            if (isFileInKBase(ctx.newKM, ctx.newKieBaseModel, dslFile)) {
                ctx.newKM.addResourceToCompiler(ckbuilder, ctx.newKieBaseModel, dslFile);
            }
        }
        KieBaseUpdate kieBaseUpdate = createKieBaseUpdate();
        ctx.kBase.beforeIncrementalUpdate(kieBaseUpdate);
        rebuildAll(kbuilder, ckbuilder);
        ctx.kBase.afterIncrementalUpdate(kieBaseUpdate);
    }
    ctx.kBase.setResolvedReleaseId(ctx.newReleaseId);
    for (InternalWorkingMemory wm : ctx.kBase.getWorkingMemories()) {
        wm.notifyWaitOnRest();
    }
}
Also used : InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) DialectRuntimeData(org.drools.core.rule.DialectRuntimeData) CompositeKnowledgeBuilder(org.kie.internal.builder.CompositeKnowledgeBuilder) InternalKnowledgeBuilder(org.drools.compiler.builder.InternalKnowledgeBuilder) KieBaseUpdate(org.drools.core.impl.KieBaseUpdate) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage)

Example 3 with KieBaseUpdate

use of org.drools.core.impl.KieBaseUpdate in project drools by kiegroup.

the class KieBaseUpdaterImpl method createKieBaseUpdate.

private KieBaseUpdate createKieBaseUpdate() {
    KieBaseUpdate kieBaseUpdate = new KieBaseUpdate();
    for (ResourceChangeSet changeSet : ctx.cs.getChanges().values()) {
        if (!isPackageInKieBase(ctx.newKieBaseModel, changeSet.getPackageName())) {
            continue;
        }
        InternalKnowledgePackage currentPkg = ctx.currentKM.getPackage(changeSet.getPackageName());
        InternalKnowledgePackage newPkg = ctx.newKM.getPackage(changeSet.getPackageName());
        for (ResourceChange change : changeSet.getChanges()) {
            if (change.getType() == ResourceChange.Type.RULE) {
                switch(change.getChangeType()) {
                    case ADDED:
                        kieBaseUpdate.registerRuleToBeAdded(newPkg.getRule(change.getName()));
                        break;
                    case REMOVED:
                        kieBaseUpdate.registerRuleToBeRemoved(currentPkg.getRule(change.getName()));
                        break;
                    case UPDATED:
                        kieBaseUpdate.registerRuleToBeAdded(newPkg.getRule(change.getName()));
                        kieBaseUpdate.registerRuleToBeRemoved(currentPkg.getRule(change.getName()));
                        break;
                }
            }
        }
    }
    return kieBaseUpdate;
}
Also used : KieBaseUpdate(org.drools.core.impl.KieBaseUpdate) ResourceChangeSet(org.kie.internal.builder.ResourceChangeSet) ResourceChange(org.kie.internal.builder.ResourceChange) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage)

Aggregations

InternalKnowledgePackage (org.drools.core.definitions.InternalKnowledgePackage)3 KieBaseUpdate (org.drools.core.impl.KieBaseUpdate)3 InternalKnowledgeBuilder (org.drools.compiler.builder.InternalKnowledgeBuilder)2 InternalWorkingMemory (org.drools.core.common.InternalWorkingMemory)2 CompositeKnowledgeBuilder (org.kie.internal.builder.CompositeKnowledgeBuilder)2 ResourceChange (org.kie.internal.builder.ResourceChange)2 ResourceChangeSet (org.kie.internal.builder.ResourceChangeSet)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 ExecutionException (java.util.concurrent.ExecutionException)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 CompositeKnowledgeBuilderImpl (org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl)1 KieBaseUpdaterImpl (org.drools.compiler.kie.builder.impl.KieBaseUpdaterImpl)1 KieBaseUpdaterImplContext (org.drools.compiler.kie.builder.impl.KieBaseUpdaterImplContext)1 KieBaseModelImpl (org.drools.compiler.kproject.models.KieBaseModelImpl)1 RuleImpl (org.drools.core.definitions.rule.impl.RuleImpl)1 CoreComponentFactory (org.drools.core.reteoo.CoreComponentFactory)1 DialectRuntimeData (org.drools.core.rule.DialectRuntimeData)1