You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2017/11/15 05:43:31 UTC

svn commit: r1815290 - in /felix/trunk/osgi-r7/configurator: ./ src/main/java/org/apache/felix/configurator/impl/ src/main/java/org/apache/felix/configurator/impl/logger/

Author: cziegeler
Date: Wed Nov 15 05:43:31 2017
New Revision: 1815290

URL: http://svn.apache.org/viewvc?rev=1815290&view=rev
Log:
Update logging, make log service optional

Added:
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java   (with props)
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java   (with props)
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java   (with props)
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java   (with props)
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java   (with props)
Removed:
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/AbstractLogger.java
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/ConsoleLogger.java
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceLogger.java
Modified:
    felix/trunk/osgi-r7/configurator/pom.xml
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/Activator.java
    felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/SystemLogger.java

Modified: felix/trunk/osgi-r7/configurator/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/pom.xml?rev=1815290&r1=1815289&r2=1815290&view=diff
==============================================================================
--- felix/trunk/osgi-r7/configurator/pom.xml (original)
+++ felix/trunk/osgi-r7/configurator/pom.xml Wed Nov 15 05:43:31 2017
@@ -60,11 +60,13 @@
                             ${project.artifactId}
                         </Bundle-SymbolicName>
                         <Import-Package>
-                            !org.osgi.service.coordinator,
+                            org.osgi.service.coordinator;resolution:=optional,
+                            org.osgi.service.log;resolution:=optional,
                             *
                         </Import-Package>
                         <DynamicImport-Package>
-                            org.osgi.service.coordinator
+                            org.osgi.service.coordinator;version="[1.0,2)",
+                            org.osgi.service.log;version="[1.3,2)"                         
                         </DynamicImport-Package>
                         <Provide-Capability>
                             osgi.extender;osgi.extender="osgi.configurator";version:Version="1.0"

Modified: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/Activator.java?rev=1815290&r1=1815289&r2=1815290&view=diff
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/Activator.java (original)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/Activator.java Wed Nov 15 05:43:31 2017
@@ -16,7 +16,6 @@
  */
 package org.apache.felix.configurator.impl;
 
-import org.apache.felix.configurator.impl.logger.LogServiceLogger;
 import org.apache.felix.configurator.impl.logger.SystemLogger;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -27,15 +26,12 @@ import org.osgi.framework.BundleContext;
  */
 public class Activator implements BundleActivator {
 
-    private volatile LogServiceLogger logger;
-
     private volatile ServicesListener listener;
 
     @Override
     public final void start(final BundleContext context)
     throws Exception {
-        this.logger = new LogServiceLogger(context);
-        SystemLogger.setLogService(this.logger);
+        SystemLogger.init(context);
 
         listener = new ServicesListener(context);
     }
@@ -47,6 +43,6 @@ public class Activator implements Bundle
             listener.deactivate();
             listener = null;
         }
-        this.logger.close();
+        SystemLogger.destroy();
     }
 }

Added: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java?rev=1815290&view=auto
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java (added)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java Wed Nov 15 05:43:31 2017
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.configurator.impl.logger;
+
+interface InternalLogger {
+
+    void log(int level, String message, Throwable exception);
+}

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/InternalLogger.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java?rev=1815290&view=auto
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java (added)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java Wed Nov 15 05:43:31 2017
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.configurator.impl.logger;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * This class adds support for using a LogService
+ */
+public class LogServiceEnabledLogger {
+    // name of the LogService class (this is a string to not create a reference to the class)
+    private static final String LOGSERVICE_CLASS = "org.osgi.service.log.LogService";
+
+    // the log service to log messages to
+    protected final ServiceTracker<Object, Object> logServiceTracker;
+
+    private volatile InternalLogger currentLogger;
+
+    protected volatile int trackingCount = -2;
+
+    public LogServiceEnabledLogger(final BundleContext bundleContext) {
+        // Start a tracker for the log service
+        // we only track a single log service which in reality should be enough
+        logServiceTracker = new ServiceTracker<>( bundleContext, LOGSERVICE_CLASS, new ServiceTrackerCustomizer<Object, Object>() {
+            private volatile boolean hasService = false;
+
+            @Override
+            public Object addingService(final ServiceReference<Object> reference) {
+                if ( !hasService )  {
+                    final Object logService = bundleContext.getService(reference);
+                    if ( logService != null ) {
+                        hasService = true;
+                        final LogServiceSupport lsl = new LogServiceSupport(logService);
+                        return lsl;
+                    }
+                }
+                return null;
+            }
+
+            @Override
+            public void modifiedService(final ServiceReference<Object> reference, final Object service) {
+                // nothing to do
+            }
+
+            @Override
+            public void removedService(final ServiceReference<Object> reference, final Object service) {
+                hasService = false;
+                bundleContext.ungetService(reference);
+            }
+        } );
+        logServiceTracker.open();
+    }
+
+    /**
+     * Close the logger
+     */
+    public void close() {
+        // stop the tracker
+        logServiceTracker.close();
+    }
+
+    /**
+     * Method to actually emit the log message. If the LogService is available,
+     * the message will be logged through the LogService. Otherwise the message
+     * is logged to stdout (or stderr in case of LOG_ERROR level messages),
+     *
+     * @param level The log level of the messages. This corresponds to the log
+     *          levels defined by the OSGi LogService.
+     * @param message The message to print
+     * @param ex The <code>Throwable</code> causing the message to be logged.
+     */
+    public void log(final int level, final String message, final Throwable ex) {
+        getLogger().log(level, message, ex);
+    }
+
+    private InternalLogger getLogger() {
+        if ( this.trackingCount < this.logServiceTracker.getTrackingCount() ) {
+            final Object logServiceSupport = this.logServiceTracker.getService();
+            if ( logServiceSupport == null ) {
+                this.currentLogger = this.getDefaultLogger();
+            } else {
+                this.currentLogger = ((LogServiceSupport)logServiceSupport).getLogger();
+            }
+            this.trackingCount = this.logServiceTracker.getTrackingCount();
+        }
+        return currentLogger;
+    }
+
+    private InternalLogger getDefaultLogger() {
+        return new StdOutLogger();
+    }
+}
\ No newline at end of file

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceEnabledLogger.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java?rev=1815290&view=auto
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java (added)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java Wed Nov 15 05:43:31 2017
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.configurator.impl.logger;
+
+import org.osgi.service.log.LogService;
+
+/**
+ * This is a logger based on the LogService.
+ */
+class LogServiceSupport {
+
+    private final LogService logService;
+
+    public LogServiceSupport(final Object logService) {
+        this.logService = (LogService) logService;
+    }
+
+    InternalLogger getLogger() {
+        return new R6LogServiceLogger(this.logService);
+    }
+}
\ No newline at end of file

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/LogServiceSupport.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java?rev=1815290&view=auto
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java (added)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java Wed Nov 15 05:43:31 2017
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.configurator.impl.logger;
+
+import org.osgi.service.log.LogService;
+
+/**
+ * This is a logger based on the R6 LogService.
+ */
+class R6LogServiceLogger implements InternalLogger {
+    private final LogService logService;
+
+    public R6LogServiceLogger(final LogService logService) {
+        this.logService = logService;
+    }
+
+    @Override
+    public void log(final int level, final String message, final Throwable ex) {
+        this.logService.log(level, message, ex);
+    }
+}
\ No newline at end of file

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/R6LogServiceLogger.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Added: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java?rev=1815290&view=auto
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java (added)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java Wed Nov 15 05:43:31 2017
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.configurator.impl.logger;
+
+import java.io.PrintStream;
+
+import org.osgi.service.log.LogService;
+
+/**
+ * This logger logs to std out / err
+ */
+class StdOutLogger implements InternalLogger {
+
+    @Override
+    public void log(final int level, final String message, final Throwable ex) {
+        // output depending on level
+        final PrintStream out = ( level == LogService.LOG_ERROR )? System.err: System.out;
+
+        // level as a string
+        final StringBuilder buf = new StringBuilder();
+        switch (level)  {
+            case ( LogService.LOG_DEBUG ):
+                buf.append( "[DEBUG] " );
+                break;
+            case ( LogService.LOG_INFO ):
+                buf.append( "[INFO] " );
+                break;
+            case ( LogService.LOG_WARNING ):
+                buf.append( "[WARN] " );
+                break;
+            case ( LogService.LOG_ERROR ):
+                buf.append( "[ERROR] " );
+                break;
+            default:
+                buf.append( "[UNK] " );
+                break;
+        }
+
+        buf.append(message);
+
+        final String msg = buf.toString();
+
+        if ( ex == null ) {
+            out.println(msg);
+        } else {
+            // keep the message and the stacktrace together
+            synchronized ( out ) {
+                out.println( msg );
+                ex.printStackTrace( out );
+            }
+        }
+    }
+}

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/StdOutLogger.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/SystemLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/SystemLogger.java?rev=1815290&r1=1815289&r2=1815290&view=diff
==============================================================================
--- felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/SystemLogger.java (original)
+++ felix/trunk/osgi-r7/configurator/src/main/java/org/apache/felix/configurator/impl/logger/SystemLogger.java Wed Nov 15 05:43:31 2017
@@ -18,41 +18,56 @@
  */
 package org.apache.felix.configurator.impl.logger;
 
+import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 public final class SystemLogger {
 
-    private static volatile LogService LOGGER = new ConsoleLogger();
+    private static volatile LogServiceEnabledLogger LOGGER;
 
-    public static void setLogService(final LogService service) {
-        LOGGER = service == null ? new ConsoleLogger() : service;
+    public static void init(final BundleContext bundleContext) {
+        LOGGER = new LogServiceEnabledLogger(bundleContext);
+    }
+
+    public static void destroy() {
+        if ( LOGGER != null ) {
+            LOGGER.close();
+            LOGGER = null;
+        }
+    }
+
+    private static void log(final int level, final String message, final Throwable cause) {
+        final LogServiceEnabledLogger l = LOGGER;
+        if ( l != null ) {
+            l.log(level, message, cause);
+        }
     }
 
     public static void debug(final String message) {
-        LOGGER.log(LogService.LOG_DEBUG, message);
+        log(LogService.LOG_DEBUG, message, null);
     }
 
     public static void debug(final String message, final Throwable cause) {
-        LOGGER.log(LogService.LOG_DEBUG, message, cause);
+        log(LogService.LOG_DEBUG, message, cause);
     }
 
     public static void info(final String message) {
-        LOGGER.log(LogService.LOG_INFO, message);
+        log(LogService.LOG_INFO, message, null);
     }
 
     public static void warning(final String message) {
-        LOGGER.log(LogService.LOG_WARNING, message);
+        log(LogService.LOG_WARNING, message, null);
     }
 
     public static void warning(final String message, final Throwable cause) {
-        LOGGER.log(LogService.LOG_WARNING, message, cause);
+        log(LogService.LOG_WARNING, message, cause);
     }
 
     public static void error(final String message) {
-        LOGGER.log(LogService.LOG_ERROR, message);
+        log(LogService.LOG_ERROR, message, null);
     }
 
     public static void error(final String message, final Throwable cause) {
-        LOGGER.log(LogService.LOG_ERROR, message, cause);
+        log(LogService.LOG_ERROR, message, cause);
     }
 }