You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2017/07/30 14:34:42 UTC

karaf git commit: React correctly when bundle stops

Repository: karaf
Updated Branches:
  refs/heads/master c63c75795 -> ccedc7753


React correctly when bundle stops


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/ccedc775
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/ccedc775
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/ccedc775

Branch: refs/heads/master
Commit: ccedc775389bb6c618db6aa8f191be471cf71b66
Parents: c63c757
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Sun Jul 30 15:39:18 2017 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Sun Jul 30 16:34:20 2017 +0200

----------------------------------------------------------------------
 .../org/apache/karaf/log/command/LogTail.java   | 54 ++++++++++++--------
 1 file changed, 34 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/ccedc775/log/src/main/java/org/apache/karaf/log/command/LogTail.java
----------------------------------------------------------------------
diff --git a/log/src/main/java/org/apache/karaf/log/command/LogTail.java b/log/src/main/java/org/apache/karaf/log/command/LogTail.java
index 00d5a2b..d43b639 100644
--- a/log/src/main/java/org/apache/karaf/log/command/LogTail.java
+++ b/log/src/main/java/org/apache/karaf/log/command/LogTail.java
@@ -27,11 +27,11 @@ import org.ops4j.pax.logging.spi.PaxAppender;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 @Command(scope = "log", name = "tail", description = "Continuously display log entries. Use ctrl-c to quit this command")
 @Service
 public class LogTail extends DisplayLog {
-
     @Reference
     Session session;
 
@@ -45,26 +45,10 @@ public class LogTail extends DisplayLog {
         PrintStream out = session.getConsole();
         display(out, minLevel);
         out.flush();
-        PaxAppender appender = event -> printEvent(out, event, minLevel);
-        ServiceTracker<LogService, LogService> tracker = new ServiceTracker<LogService, LogService>(context, LogService.class, null) {
-            
-            @Override
-            public LogService addingService(ServiceReference<LogService> reference) {
-                LogService service = super.addingService(reference);
-                service.addAppender(appender);
-                return service;
-            }
 
-            @Override
-            public void removedService(ServiceReference<LogService> reference, LogService service) {
-                service.removeAppender(appender);
-                synchronized (LogTail.this) {
-                    LogTail.this.notifyAll();
-                }
-            };
-        };
+        PaxAppender appender = event -> printEvent(out, event, minLevel);
+        ServiceTracker<LogService, LogService> tracker = new LogServiceTracker(context, LogService.class, null, appender);
         tracker.open();
-        
         try {
             synchronized (this) {
                 wait();
@@ -76,8 +60,38 @@ public class LogTail extends DisplayLog {
             tracker.close();
         }
         out.println();
-
         return null;
     }
+    
+    private synchronized void stopTail() {
+        notifyAll();
+    }
+
+    /**
+     * Track LogService dynamically so we can react when the log core bundle stops even while we block for the tail
+     */
+    private final class LogServiceTracker extends ServiceTracker<LogService, LogService> {
+        private final PaxAppender appender;
+    
+        private LogServiceTracker(BundleContext context, Class<LogService> clazz,
+                                  ServiceTrackerCustomizer<LogService, LogService> customizer,
+                                  PaxAppender appender) {
+            super(context, clazz, customizer);
+            this.appender = appender;
+        }
+    
+        @Override
+        public LogService addingService(ServiceReference<LogService> reference) {
+            LogService service = super.addingService(reference);
+            service.addAppender(appender);
+            return service;
+        }
+    
+        @Override
+        public void removedService(ServiceReference<LogService> reference, LogService service) {
+            service.removeAppender(appender);
+            stopTail();
+        }
+    }
 
 }