Exemplo n.º 1
0
  private Results update(final InternalKieModule currentKM, final ReleaseId newReleaseId) {
    final InternalKieModule newKM = (InternalKieModule) kr.getKieModule(newReleaseId);
    ChangeSetBuilder csb = new ChangeSetBuilder();
    final KieJarChangeSet cs = csb.build(currentKM, newKM);

    final List<String> modifiedClasses = getModifiedClasses(cs);
    final List<String> dslFiles = getUnchangedDslFiles(newKM, cs);

    ((KieModuleKieProject) kProject).updateToModule(newKM);

    final ResultsImpl results = new ResultsImpl();

    List<String> kbasesToRemove = new ArrayList<String>();
    for (Entry<String, KieBase> kBaseEntry : kBases.entrySet()) {
      String kbaseName = kBaseEntry.getKey();
      final KieBaseModel kieBaseModel = kProject.getKieBaseModel(kbaseName);
      // if a kbase no longer exists, just remove it from the cache
      if (kieBaseModel == null) {
        // have to save for later removal to avoid iteration errors
        kbasesToRemove.add(kbaseName);
      } else {
        final InternalKnowledgeBase kBase = (InternalKnowledgeBase) kBaseEntry.getValue();
        boolean locked = kBase.tryLock();
        if (locked) {
          try {
            updateKBase(
                kBase,
                currentKM,
                newReleaseId,
                newKM,
                cs,
                modifiedClasses,
                dslFiles,
                results,
                kieBaseModel);
          } finally {
            kBase.unlock();
          }
        } else {
          kBase.enqueueModification(
              new Runnable() {
                @Override
                public void run() {
                  updateKBase(
                      kBase,
                      currentKM,
                      newReleaseId,
                      newKM,
                      cs,
                      modifiedClasses,
                      dslFiles,
                      results,
                      kieBaseModel);
                }
              });
        }
      }
    }

    for (String kbaseToRemove : kbasesToRemove) {
      kBases.remove(kbaseToRemove);
    }

    for (Iterator<Entry<String, KieSession>> it = this.kSessions.entrySet().iterator();
        it.hasNext(); ) {
      Entry<String, KieSession> ksession = it.next();
      if (kProject.getKieSessionModel(ksession.getKey()) == null) {
        // remove sessions that no longer exist
        it.remove();
      }
    }

    for (Iterator<Entry<String, StatelessKieSession>> it =
            this.statelessKSessions.entrySet().iterator();
        it.hasNext(); ) {
      Entry<String, StatelessKieSession> ksession = it.next();
      if (kProject.getKieSessionModel(ksession.getKey()) == null) {
        // remove sessions that no longer exist
        it.remove();
      }
    }

    return results;
  }