static void applyChanges(
      RuleBase rb,
      boolean removeExistingPackages,
      Collection changes,
      Collection<String> removed,
      AgentEventListener listener) {
    if (changes == null && removed == null) return;

    rb.lock();

    if (removed != null) {
      removePackages(removed, rb, listener);
    }

    if (changes != null) {
      for (Iterator iter = changes.iterator(); iter.hasNext(); ) {
        Package p = (Package) iter.next();

        if (removeExistingPackages) {
          removePackage(p.getName(), rb);
        }
        try {
          listener.info("Adding package called " + p.getName());
          rb.addPackage(p);
        } catch (Exception e) {
          throw new RuntimeDroolsException(e);
        }
      }
    }

    rb.unlock();
  }
  static void removePackages(
      Collection<String> removedPackages, RuleBase rb, AgentEventListener listener) {

    for (String name : removedPackages) {
      listener.info("Removing package called " + name);
      removePackage(name, rb);
    }
  }