You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2014/11/25 10:33:31 UTC

svn commit: r1641555 - /sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java

Author: fmeschbe
Date: Tue Nov 25 09:33:31 2014
New Revision: 1641555

URL: http://svn.apache.org/r1641555
Log:
SLING-4197 - Catch and log Throwable thrown from StartupListener methods

Modified:
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java?rev=1641555&r1=1641554&r2=1641555&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java Tue Nov 25 09:33:31 2014
@@ -18,7 +18,10 @@
  */
 package org.apache.sling.launchpad.base.impl;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -52,6 +55,7 @@ import org.osgi.util.tracker.ServiceTrac
  * @see StartupListener
  * @since 2.4.0
  */
+@SuppressWarnings("deprecation")
 public class DefaultStartupHandler
     implements StartupHandler, BundleListener, FrameworkListener, Runnable {
 
@@ -77,7 +81,7 @@ public class DefaultStartupHandler
     private final StartupMode startupMode;
 
     /** Service tracker for startup listeners. */
-    private final ServiceTracker listenerTracker;
+    private final ServiceTracker<StartupListener, StartupListener> listenerTracker;
 
     /** Expected bundle counts. */
     private final int expectedBundlesCount;
@@ -103,21 +107,25 @@ public class DefaultStartupHandler
         this.startupMode = manager.getMode();
         this.targetStartLevel = manager.getTargetStartLevel();
 
-        this.listenerTracker = new ServiceTracker(context, StartupListener.class.getName(),
-                new ServiceTrackerCustomizer() {
+        this.listenerTracker = new ServiceTracker<StartupListener, StartupListener>(context, StartupListener.class,
+                new ServiceTrackerCustomizer<StartupListener, StartupListener>() {
 
-                    public void removedService(final ServiceReference reference, final Object service) {
+                    public void removedService(final ServiceReference<StartupListener> reference, final StartupListener service) {
                         context.ungetService(reference);
                     }
 
-                    public void modifiedService(final ServiceReference reference, final Object service) {
+                    public void modifiedService(final ServiceReference<StartupListener> reference, final StartupListener service) {
                         // nothing to do
                     }
 
-                    public Object addingService(final ServiceReference reference) {
-                        final StartupListener listener = (StartupListener) context.getService(reference);
-                        if ( listener != null ) {
-                            listener.inform(startupMode, finished.get());
+                    public StartupListener addingService(final ServiceReference<StartupListener> reference) {
+                        final StartupListener listener = context.getService(reference);
+                        if (listener != null) {
+                            try {
+                                listener.inform(startupMode, finished.get());
+                            } catch (Throwable t) {
+                                logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
+                            }
                         }
                         return listener;
                     }
@@ -271,14 +279,14 @@ public class DefaultStartupHandler
         logger.log(Logger.LOG_INFO, "Startup finished.");
         this.finished.set(true);
 
-        final Object[] listeners = this.listenerTracker.getServices();
-        if ( listeners != null ) {
-            for(final Object l : listeners) {
-                if ( l instanceof StartupListener ) {
-                    ((StartupListener) l).startupFinished(this.startupMode);
-                }
+        for (StartupListener listener : this.getStartupListeners()) {
+            try {
+                listener.startupFinished(this.startupMode);
+            } catch (Throwable t) {
+                logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
             }
         }
+
         // stop the queue
         this.enqueue(false);
 
@@ -297,12 +305,11 @@ public class DefaultStartupHandler
      * @param ratio ratio
      */
     private void startupProgress(final float ratio) {
-        final Object[] listeners = this.listenerTracker.getServices();
-        if ( listeners != null ) {
-            for(final Object l : listeners) {
-                if ( l instanceof StartupListener ) {
-                    ((StartupListener) l).startupProgress(ratio);
-                }
+        for (StartupListener listener : this.getStartupListeners()) {
+            try {
+                listener.startupProgress(ratio);
+            } catch (Throwable t) {
+                logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
             }
         }
     }
@@ -328,4 +335,56 @@ public class DefaultStartupHandler
             }
         }
     }
+
+    private Iterable<StartupListener> getStartupListeners() {
+        final ServiceReference<StartupListener>[] refs = this.listenerTracker.getServiceReferences();
+        if (refs == null || refs.length == 0) {
+            return Collections.<StartupListener>emptyList();
+        }
+
+        return new Iterable<StartupListener>() {
+
+            @Override
+            public Iterator<StartupListener> iterator() {
+                return new Iterator<StartupListener>() {
+
+                    private int i = 0;
+
+                    private StartupListener next = seek();
+
+                    @Override
+                    public StartupListener next() {
+                        if (this.next == null) {
+                            throw new NoSuchElementException();
+                        }
+
+                        final StartupListener result = this.next;
+                        this.next = seek();
+                        return result;
+                    }
+
+                    @Override
+                    public boolean hasNext() {
+                        return this.next != null;
+                    }
+
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+
+                    private StartupListener seek() {
+                        for (; i < refs.length; i++) {
+                            final StartupListener sl = DefaultStartupHandler.this.listenerTracker.getService(refs[i]);
+                            if (sl != null) {
+                                return sl;
+                            }
+                        }
+
+                        return null;
+                    }
+                };
+            }
+        };
+    }
 }