Hello everyone,

I just discovered that invoking Bundle.update() method may fire a framework event PACKAGES_REFRESHED event. In the trunk, I see, in Felix.java, line 1691, that the "update" method may invoke the refreshPackage(null) method, which then fires the event.

Is is a normal behavior ?
So far, I was fairly certain that this event was only fired after invoking PackageAdmin.refreshPackages() methods. Actually, we are using our own bundle installer, which install/updates our bundles.
And our bundle installer does the following, when it updates a bundle:

class BundleInstaller implements FrameworkListener {
 boolean refreshing = false;

 void update(Bundle([] bundles) {
   for (Bundle b : bundles) {
      b.stop();
      b.update(); // May fire a PACKAGES_REFRESHED event
   }

   synchronized (this) {
     this.refreshing = true;
   }
   *packageAdmin.refresh(null); // asynchronous *

   synchronized (this) {
*while (refreshing) wait(); *// ensure that all bundles are refreshed before restarting updated bundles.
   }

   for (Bundle b : bundles) {
      b.start();
   }
 }

 // Here, I listen to the framework event "PACKAGES_REFRESHED"
 void frameworkEvent(FrameworkEvent event) {
    switch (event.getType()) {
       case FrameworkEvent.PACKAGES_REFRESHED:
       synchronized (this) {
          this.refreshing = false;
          notify();
       }
     }
 }
}

The problem here, is that the first loop of my method "update" invokes Bundle.update(), which may fire some unexpected PACKAGES_REFRESHED events ... I'm expecting only one, and my waiting loop exits after the first event received.

So, what can I do in order to ensure that the PackageAdmin.refreshPackages(null) method has completed ?

Thanks in advance;
/pierre



Reply via email to