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 2015/04/07 17:25:08 UTC

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

Author: cziegeler
Date: Tue Apr  7 15:25:08 2015
New Revision: 1671876

URL: http://svn.apache.org/r1671876
Log:
SLING-4586 : Use log service for logging on startup as soon as it's available

Modified:
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/DefaultStartupHandler.java
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/Sling.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=1671876&r1=1671875&r2=1671876&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 Apr  7 15:25:08 2015
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.launchpad.base.impl;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.BlockingQueue;
@@ -95,15 +97,24 @@ public class DefaultStartupHandler
     /** MBean startup listener. */
     private final StartupListener mbeanStartupListener;
 
+    /** The started time. */
+    private final long startedAt;
+
+    private volatile Object[] logService;
+
     /**
      * Constructor.
      * @param context Bundle context
      * @param logger  Logger
      * @param manager The startup manager
      */
-    public DefaultStartupHandler(final BundleContext context, final Logger logger, final StartupManager manager) {
+    public DefaultStartupHandler(final BundleContext context,
+            final Logger logger,
+            final StartupManager manager,
+            final long startedAt) {
         this.logger = logger;
         this.bundleContext = context;
+        this.startedAt = startedAt;
         this.startupMode = manager.getMode();
         this.targetStartLevel = manager.getTargetStartLevel();
 
@@ -133,7 +144,7 @@ public class DefaultStartupHandler
                         if (listener != null) {
                             try {
                                 listener.inform(startupMode, finished.get());
-                            } catch (Throwable t) {
+                            } catch (final Throwable t) {
                                 logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
                             }
                         }
@@ -156,7 +167,7 @@ public class DefaultStartupHandler
         }
 
         this.bundleContext.registerService(StartupHandler.class.getName(), this, null);
-        logger.log(Logger.LOG_INFO, "Started startup handler with target start level="
+        this.log(Logger.LOG_INFO, "Started startup handler with target start level="
                + String.valueOf(this.targetStartLevel) + ", and expected bundle count=" + String.valueOf(this.expectedBundlesCount));
         final Thread t = new Thread(this);
         t.start();
@@ -211,7 +222,7 @@ public class DefaultStartupHandler
      */
     private void incStartLevel() {
         final int newLevel = this.startLevelService.getStartLevel() + 1;
-        logger.log(Logger.LOG_DEBUG, "Increasing start level to " + String.valueOf(newLevel));
+        this.log(Logger.LOG_DEBUG, "Increasing start level to " + String.valueOf(newLevel));
         this.startLevelService.setStartLevel(newLevel);
     }
 
@@ -220,7 +231,7 @@ public class DefaultStartupHandler
      */
     @Override
     public void waitWithStartup(final boolean flag) {
-        logger.log(Logger.LOG_DEBUG, "Wait with startup " + flag);
+        this.log(Logger.LOG_DEBUG, "Wait with startup " + flag);
         if ( flag ) {
             this.startupShouldWait.incrementAndGet();
         } else {
@@ -260,7 +271,7 @@ public class DefaultStartupHandler
         if ( finished.get() ) {
             return;
         }
-        logger.log(Logger.LOG_DEBUG, "Received framework event " + event);
+        this.log(Logger.LOG_DEBUG, "Received framework event " + event);
 
         if ( !this.useIncremental ) {
             // restart
@@ -279,7 +290,7 @@ public class DefaultStartupHandler
                 } else {
                     this.enqueue(true);
                     final int startLevel = this.startLevelService.getStartLevel();
-                    logger.log(Logger.LOG_INFO, "Startup progress " + String.valueOf(startLevel) + '/' + String.valueOf(targetStartLevel));
+                    this.log(Logger.LOG_DEBUG, "Startup progress " + String.valueOf(startLevel) + '/' + String.valueOf(targetStartLevel));
                     final float ratio = (float) startLevel / (float) targetStartLevel;
                     this.startupProgress(ratio);
                 }
@@ -287,18 +298,66 @@ public class DefaultStartupHandler
         }
     }
 
+    private void log(final int level, final String msg) {
+        log(null, level, msg, null);
+    }
+
+    private void log(final int level, final String msg, final Throwable t) {
+        log(null, level, msg, t);
+    }
+
+    private void log(final ServiceReference<?> sRef, final int level, final String msg, final Throwable t) {
+        boolean loggedWithService = false;
+        if ( this.logService == null ) {
+            final ServiceReference<?> ref = this.bundleContext.getServiceReference("org.osgi.service.log.LogService");
+            if ( ref != null ) {
+                final Object ls = this.bundleContext.getService(ref);
+                if ( ls != null ) {
+                    final Class<?>[] formalParams = {
+                            ServiceReference.class,
+                            Integer.TYPE,
+                            String.class,
+                            Throwable.class
+                        };
+
+                    try {
+                        final Method logMethod = ls.getClass().getMethod("log", formalParams);
+                        logMethod.setAccessible(true);
+                        logService = new Object[] { ls, logMethod };
+                    } catch (final NoSuchMethodException ex) {
+                        // no need to log
+                    }
+                }
+            }
+        }
+        if ( this.logService != null ) {
+            final Object[] params = {sRef, new Integer(level), msg, t};
+            try {
+                ((Method) this.logService[1]).invoke(this.logService[0], params);
+                loggedWithService = true;
+            } catch (final InvocationTargetException ex) {
+                // no need to log
+            } catch (final IllegalAccessException ex) {
+                // no need to log
+            }
+        }
+        if ( !loggedWithService ) {
+            logger.log(level, msg);
+        }
+    }
+
     /**
      * Notify finished startup
      */
     private void startupFinished() {
-        logger.log(Logger.LOG_INFO, "Startup finished.");
+        this.log(Logger.LOG_INFO, "Startup finished in " + String.valueOf(System.currentTimeMillis() - this.startedAt) + "ms");
         this.finished.set(true);
 
         for (final StartupListener listener : this.listenerTracker.getServices(new StartupListener[0])) {
             try {
                 listener.startupFinished(this.startupMode);
             } catch (Throwable t) {
-                logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
+                this.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
             }
         }
         if ( this.mbeanStartupListener != null ) {
@@ -326,8 +385,8 @@ public class DefaultStartupHandler
         for (final StartupListener listener : this.listenerTracker.getServices(new StartupListener[0])) {
             try {
                 listener.startupProgress(ratio);
-            } catch (Throwable t) {
-                logger.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
+            } catch (final Throwable t) {
+                this.log(Logger.LOG_ERROR, "Error calling StartupListener " + listener, t);
             }
         }
         if ( this.mbeanStartupListener != null ) {
@@ -341,13 +400,13 @@ public class DefaultStartupHandler
     @Override
     public void bundleChanged(final BundleEvent event) {
         if (!finished.get()) {
-            logger.log(Logger.LOG_DEBUG, "Received bundle event " + event);
+            this.log(Logger.LOG_DEBUG, "Received bundle event " + event);
 
             if (event.getType() == BundleEvent.RESOLVED || event.getType() == BundleEvent.STARTED) {
                 // Add (if not existing) bundle to active bundles and refresh progress bar
                 activeBundles.add(event.getBundle().getSymbolicName());
 
-                logger.log(Logger.LOG_INFO, "Startup progress " + String.valueOf(activeBundles.size()) + '/' + String.valueOf(expectedBundlesCount));
+                this.log(Logger.LOG_DEBUG, "Startup progress " + String.valueOf(activeBundles.size()) + '/' + String.valueOf(expectedBundlesCount));
                 final float ratio = (float) activeBundles.size() / (float) expectedBundlesCount;
                 this.startupProgress(ratio);
             } else if (event.getType() == BundleEvent.STOPPED) {

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java?rev=1671876&r1=1671875&r2=1671876&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java Tue Apr  7 15:25:08 2015
@@ -192,6 +192,7 @@ public class Sling {
         this.logger = logger;
         this.resourceProvider = resourceProvider;
 
+        final long startedAt = System.currentTimeMillis();
         this.logger.log(Logger.LOG_INFO, "Starting Apache Sling");
 
         // read the default parameters
@@ -222,7 +223,7 @@ public class Sling {
                 init(tmpFramework);
             }
 
-            new DefaultStartupHandler(tmpFramework.getBundleContext(), logger, startupManager);
+            new DefaultStartupHandler(tmpFramework.getBundleContext(), logger, startupManager, startedAt);
 
             // finally start
             tmpFramework.start();