You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2012/07/24 09:34:13 UTC

svn commit: r1364927 - /sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java

Author: cziegeler
Date: Tue Jul 24 07:34:13 2012
New Revision: 1364927

URL: http://svn.apache.org/viewvc?rev=1364927&view=rev
Log:
SLING-2524 : Improve package refresh behaviour

Modified:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java?rev=1364927&r1=1364926&r2=1364927&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/tasks/RefreshBundlesTask.java Tue Jul 24 07:34:13 2012
@@ -25,14 +25,24 @@ import java.util.Set;
 
 import org.apache.sling.installer.api.tasks.InstallationContext;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
 
 /**
  * Refresh a set of bundles.
  */
-public class RefreshBundlesTask extends AbstractBundleTask {
+public class RefreshBundlesTask
+    extends AbstractBundleTask
+    implements FrameworkListener{
 
     private static final String REFRESH_PACKAGES_ORDER = "60-";
 
+    /** Max time allowed to refresh packages */
+    private static final int MAX_REFRESH_PACKAGES_WAIT_SECONDS = 90;
+
+    /** Counter for package refresh events. */
+    private volatile long refreshEventCount;
+
     /** Global set of bundles to refresh. */
     private static final Set<Long> BUNDLE_IDS = new HashSet<Long>();
 
@@ -78,7 +88,42 @@ public class RefreshBundlesTask extends 
         }
         if ( bundles.size() > 0 ) {
             ctx.log("Refreshing bundles {}", bundles);
-            this.getPackageAdmin().refreshPackages(bundles.toArray(new Bundle[bundles.size()]));
+            this.refreshEventCount = -1;
+            this.getBundleContext().addFrameworkListener(this);
+            try {
+                this.refreshEventCount = 0;
+                this.getPackageAdmin().refreshPackages(bundles.toArray(new Bundle[bundles.size()]));
+                final long start = System.currentTimeMillis();
+                do {
+                    synchronized ( this ) {
+                        try {
+                            this.wait(MAX_REFRESH_PACKAGES_WAIT_SECONDS * 1000);
+                        } catch (final InterruptedException ignore) {
+                            // ignore
+                        }
+                        if ( start + MAX_REFRESH_PACKAGES_WAIT_SECONDS * 1000 < System.currentTimeMillis() ) {
+                            this.getLogger().warn("No FrameworkEvent.PACKAGES_REFRESHED event received within {}"
+                                            + " seconds after refresh.", MAX_REFRESH_PACKAGES_WAIT_SECONDS);
+                            this.refreshEventCount++;
+                        }
+                    }
+                } while ( this.refreshEventCount < 1);
+            } finally {
+                this.getBundleContext().removeFrameworkListener(this);
+            }
         }
 	}
+
+    /**
+     * @see org.osgi.framework.FrameworkListener#frameworkEvent(org.osgi.framework.FrameworkEvent)
+     */
+    public void frameworkEvent(final FrameworkEvent event) {
+        if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
+            this.getLogger().debug("FrameworkEvent.PACKAGES_REFRESHED");
+            synchronized (this) {
+                this.refreshEventCount++;
+                this.notify();
+            }
+        }
+    }
 }