[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);