[FELIX-3414] Fix problems with the refreshPackages which does not wait for the refresh to be completed.
This is a simple workaround (which may not always work) that should improve the situation waiting to leverage the new osgi wiring api.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1348921 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
index 0fe5fa6..f1bcb83 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
@@ -674,11 +674,7 @@
*/
void refresh(Bundle[] bundles)
{
- PackageAdmin padmin = FileInstall.getPackageAdmin();
- if (padmin != null)
- {
- padmin.refreshPackages(bundles);
- }
+ FileInstall.refresh(bundles);
}
/**
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
index 0099276..79fb7b6 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
@@ -37,9 +37,12 @@
import org.apache.felix.fileinstall.internal.Util.Logger;
import org.apache.felix.utils.collections.DictionaryAsMap;
import org.apache.felix.utils.properties.InterpolationHelper;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
@@ -56,7 +59,7 @@
* fragment).
*
*/
-public class FileInstall implements BundleActivator, ServiceTrackerCustomizer
+public class FileInstall implements BundleActivator, ServiceTrackerCustomizer, FrameworkListener
{
static ServiceTracker padmin;
static ServiceTracker startLevel;
@@ -68,10 +71,12 @@
ServiceTracker listenersTracker;
static boolean initialized;
static final Object barrier = new Object();
+ static final Object refreshLock = new Object();
public void start(BundleContext context) throws Exception
{
this.context = context;
+ context.addFrameworkListener(this);
Hashtable props = new Hashtable();
props.put("url.handler.protocol", JarDirUrlHandler.PROTOCOL);
@@ -296,7 +301,7 @@
for (Iterator w = toNotify.iterator(); w.hasNext();)
{
DirectoryWatcher dir = (DirectoryWatcher) w.next();
- dir.removeListener( listener );
+ dir.removeListener(listener);
}
}
@@ -311,6 +316,37 @@
}
}
+ /**
+ * Convenience to refresh the packages
+ */
+ static void refresh(Bundle[] bundles)
+ {
+ PackageAdmin padmin = getPackageAdmin();
+ if (padmin != null)
+ {
+ synchronized (refreshLock) {
+ padmin.refreshPackages(bundles);
+ try {
+ refreshLock.wait(30000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ public void frameworkEvent(FrameworkEvent event)
+ {
+ if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED
+ || event.getType() == FrameworkEvent.ERROR)
+ {
+ synchronized (refreshLock)
+ {
+ refreshLock.notifyAll();
+ }
+ }
+ }
+
static PackageAdmin getPackageAdmin()
{
return getPackageAdmin(10000);