Author: angelo.vandersijpt at luminis.eu
Date: Mon Oct 18 15:02:46 2010
New Revision: 185

Log:
AMDATU-103 Cleanup up the LogHandler, making classes responsible for one thing 
only. Furthermore, cleaned up the way the ConsoleLogHandler uses its 
configuration.

Modified:
   
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/osgi/Activator.java
   
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/ConsoleLogHandler.java
   
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/JdkLogForwarder.java

Modified: 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/osgi/Activator.java
==============================================================================
--- 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/osgi/Activator.java
  (original)
+++ 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/osgi/Activator.java
  Mon Oct 18 15:02:46 2010
@@ -16,111 +16,52 @@
  */
 package org.amdatu.platform.loghandler.osgi;
 
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedList;
+import java.util.Properties;
 
 import org.amdatu.platform.loghandler.service.ConsoleLogHandler;
 import org.amdatu.platform.loghandler.service.JdkLogForwarder;
-import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ManagedService;
 import org.osgi.service.log.LogListener;
 import org.osgi.service.log.LogReaderService;
-import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.service.log.LogService;
 
 /**
  * This is the OSGi activator for this log handler bundle.
  * @author ivol
  */
 public class Activator extends DependencyActivatorBase {
-    // The console log handler
-    private LogListener m_console;
 
-    // All log reader services
-    private LinkedList<LogReaderService> m_readers = new 
LinkedList<LogReaderService>();
-
-    // The tracker to track log reader services
-    private ServiceTracker m_logReaderTracker;
-
-    // We use a ServiceListener to dynamically keep track of all the 
LogReaderService service being
-    // registered or unregistered
-    private ServiceListener m_serviceListener = new ServiceListener() {
-        public void serviceChanged(ServiceEvent event) {
-            BundleContext bc = 
event.getServiceReference().getBundle().getBundleContext();
-            LogReaderService lrs = (LogReaderService) 
bc.getService(event.getServiceReference());
-            if (lrs != null) {
-                if (event.getType() == ServiceEvent.REGISTERED) {
-                    m_readers.add(lrs);
-                    lrs.addLogListener(m_console);
-                } else if (event.getType() == ServiceEvent.UNREGISTERING) {
-                    lrs.removeLogListener(m_console);
-                    m_readers.remove(lrs);
-                }
-            }
-        }
-    };
-
-    /**
-     * {@inheritDoc}
-     */
     @Override
     public void init(BundleContext context, DependencyManager manager) throws 
Exception {
         System.out.println("Starting Log handler.");
 
-        Component service = manager.createComponent();
-        Dictionary<String, String> props = new Hashtable<String, String>();
-        props.put(Constants.SERVICE_PID, ConsoleLogHandler.PID);
-        manager.add(
-                service
+        // Register our console log handler
+        Properties consoleLogHandlerProps = new Properties();
+        consoleLogHandlerProps.put(Constants.SERVICE_PID, 
ConsoleLogHandler.PID);
+        manager.add(createComponent()
+                .setInterface(new String[]{LogListener.class.getName(), 
ManagedService.class.getName()}, consoleLogHandlerProps)
                 .setImplementation(ConsoleLogHandler.class)
-                .setInterface(new String[]{LogListener.class.getName(), 
ManagedService.class.getName()}, props)
-                
.add(manager.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true)));
-        m_console = (LogListener) service.getService();
-
-        // Get a list of all the registered LogReaderService, and add the 
console listener
-        m_logReaderTracker = new ServiceTracker(context, 
LogReaderService.class.getName(), null);
-        m_logReaderTracker.open();
-        Object[] readers = m_logReaderTracker.getServices();
-        if (readers != null) {
-            for (int i = 0; i < readers.length; i++) {
-                LogReaderService lrs = (LogReaderService) readers[i];
-                m_readers.add(lrs);
-                lrs.addLogListener(m_console);
-            }
-        }
-
-        // Add the ServiceListener, but with a filter so that we only receive 
events related to LogReaderService
-        String filter = "(objectclass=" + LogReaderService.class.getName() + 
")";
-        try {
-            context.addServiceListener(m_serviceListener, filter);
-        } catch (InvalidSyntaxException e) {
-            System.out.println(e.getMessage());
-            e.printStackTrace();
-        }
-
-        // Other than the default handler we pass the package name of the
-        // classes whose JDK loggers must forward logs to the OSGi Service.
-        new JdkLogForwarder(context, new 
String[]{"org.ops4j.pax.web.service.jetty.internal"});
+                .add(createServiceDependency()
+                    .setService(LogReaderService.class)
+                    .setRequired(false)
+                    .setCallbacks("logReaderAdded", "logReaderRemoved")));
+
+
+        // Register the JDKLog bridge
+        manager.add(createComponent()
+                .setImplementation(new 
JdkLogForwarder("org.ops4j.pax.web.service.jetty.internal"))
+                .add(createServiceDependency()
+                    .setService(LogService.class)
+                    .setRequired(true)));
+
+        // TODO Why do we filter? Don't we just want all stuff?
     }
 
     @Override
     public void destroy(BundleContext context, DependencyManager manager) 
throws Exception {
-        System.out.println("Stopping Log handler.");
-
-        for (Iterator<LogReaderService> i = m_readers.iterator(); 
i.hasNext();) {
-            LogReaderService lrs = i.next();
-            lrs.removeLogListener(m_console);
-            i.remove();
-        }
-        m_logReaderTracker.close();
     }
 }

Modified: 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/ConsoleLogHandler.java
==============================================================================
--- 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/ConsoleLogHandler.java
       (original)
+++ 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/ConsoleLogHandler.java
       Mon Oct 18 15:02:46 2010
@@ -16,38 +16,32 @@
  */
 package org.amdatu.platform.loghandler.service;
 
-import java.io.IOException;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
 
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 import org.osgi.service.log.LogEntry;
 import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
 import org.osgi.service.log.LogService;
 
 /**
  * Handles log messages and prints them to the console.
  * @author ivol
  */
-public class ConsoleLogHandler extends java.util.logging.Handler implements 
LogListener, ManagedService {
-    /**
-     * Mapping of text for all possible loglevels.
-     */
-    private static final Map<Integer, String> LOGLEVEL;
+public class ConsoleLogHandler implements LogListener, ManagedService {
+    private static int DEFAULT_LOG_LEVEL = LogService.LOG_INFO;
+    private int m_minLogLevel = DEFAULT_LOG_LEVEL;
+
+    private static final Map<Integer, String> LOG_LEVELS;
     static {
-        LOGLEVEL = new HashMap<Integer, String>();
-        LOGLEVEL.put(LogService.LOG_DEBUG, "DEBUG");
-        LOGLEVEL.put(LogService.LOG_INFO, "INFO");
-        LOGLEVEL.put(LogService.LOG_WARNING, "WARNING");
-        LOGLEVEL.put(LogService.LOG_ERROR, "ERROR");
+        LOG_LEVELS = new HashMap<Integer, String>();
+        LOG_LEVELS.put(LogService.LOG_DEBUG, "DEBUG");
+        LOG_LEVELS.put(LogService.LOG_INFO, "INFO");
+        LOG_LEVELS.put(LogService.LOG_WARNING, "WARNING");
+        LOG_LEVELS.put(LogService.LOG_ERROR, "ERROR");
     }
 
     // Name of the configuration PID and property that determines the minimum 
log level
@@ -55,26 +49,18 @@
     public static final String PID = "org.amdatu.platform.loghandler";
     private static final String MIN_LOGLEVEL_KEY = "console.mininum.loglevel";
 
-    // Injected by the Felix dependency manager
-    private volatile ConfigurationAdmin m_configurationAdmin;
+    public void logReaderAdded(LogReaderService reader) {
+        reader.addLogListener(this);
+    }
 
-    // The minimum log level
-    private int m_minLogLevel = LogService.LOG_INFO;
+    public void logReaderRemoved(LogReaderService reader) {
+        reader.removeLogListener(this);
+    }
 
-    /**
-     * Invoked by the Felix dependency manager.
-     */
-    public void init() {
-        readMinLogLevel();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public void logged(LogEntry entry) {
         if (entry.getLevel() <= m_minLogLevel) {
-            String level = LOGLEVEL.get(entry.getLevel());
-            System.out.println(level + ": " + entry.getMessage() + " [" + 
entry.getBundle().getSymbolicName() + "]");
+            String levelName = LOG_LEVELS.get(entry.getLevel());
+            System.out.println(levelName + ": " + entry.getMessage() + " [" + 
entry.getBundle().getSymbolicName() + "]");
             if (entry.getException() != null) {
                 System.out.println(entry.getException().getMessage());
                 entry.getException().printStackTrace();
@@ -82,85 +68,27 @@
         }
     }
 
-    private void readMinLogLevel() {
-        Configuration config;
-        try {
-            config = m_configurationAdmin.getConfiguration(PID);
-            if (config != null && config.getProperties() != null) {
-                String minLogLevel = 
config.getProperties().get(MIN_LOGLEVEL_KEY).toString();
-                if ("DEBUG".equalsIgnoreCase(minLogLevel)) {
-                    m_minLogLevel = LogService.LOG_DEBUG;
-                } else if ("INFO".equalsIgnoreCase(minLogLevel)) {
-                    m_minLogLevel = LogService.LOG_INFO;
-                } else if ("WARNING".equalsIgnoreCase(minLogLevel)) {
-                    m_minLogLevel = LogService.LOG_WARNING;
-                } else if ("ERROR".equalsIgnoreCase(minLogLevel)) {
-                    m_minLogLevel = LogService.LOG_ERROR;
-                } else {
-                    m_minLogLevel = LogService.LOG_INFO;
-                }
-            }
-        } catch (IOException e) {
-            System.out.println("Could not initialize minimum log level for the 
Console logger, using INFO");
-            e.printStackTrace();
-        }
-    }
-
-    @Override
-    public void close() throws SecurityException {
-    }
-
-    @Override
-    public void flush() {
+    public void updated(Dictionary properties) throws ConfigurationException {
+        m_minLogLevel = getLogLevelFromProperties(properties);
     }
 
-    @Override
-    public void publish(final LogRecord record) {
-        logged(new LogEntry() {
-            public Bundle getBundle() {
-                // Bundle is unkown in JDK logging
-                return null;
-            }
-
-            public Throwable getException() {
-                return record.getThrown();
-            }
-
-            public int getLevel() {
-                Level level = record.getLevel();
-                if (level == Level.FINE || level == Level.FINEST || level == 
Level.FINER) {
-                    return LogService.LOG_DEBUG;
-                } else if (level == Level.INFO) {
-                    return LogService.LOG_INFO;
-                } else if (level == Level.WARNING) {
-                    return LogService.LOG_WARNING;
-                } else if (level == Level.SEVERE) {
-                    return LogService.LOG_ERROR;
-                } else {
-                    return LogService.LOG_INFO;
-                }
-            }
-
-            public String getMessage() {
-                return record.getMessage();
-            }
+    private int getLogLevelFromProperties(Dictionary dictionary) {
+        if (dictionary == null) {
+            return DEFAULT_LOG_LEVEL;
+        }
 
-            public ServiceReference getServiceReference() {
-                // Service reference is unknown in JDK logging
-                return null;
-            }
+        String minLogLevel = (String) dictionary.get(MIN_LOGLEVEL_KEY);
+        if (minLogLevel == null) {
+            return DEFAULT_LOG_LEVEL;
+        }
 
-            public long getTime() {
-                return record.getMillis();
+        for (Map.Entry<Integer, String> logLevelEntry : LOG_LEVELS.entrySet()) 
{
+            if (minLogLevel.equalsIgnoreCase(logLevelEntry.getValue())) {
+                return logLevelEntry.getKey();
             }
-        });
-    }
+        }
 
-    /**
-     * {@inheritDoc}
-     */
-    public void updated(Dictionary properties) throws ConfigurationException {
-        // When the configuration is changed, read the minimum log level
-        readMinLogLevel();
+        // If we get here, there is no other way we can find the log level
+        return DEFAULT_LOG_LEVEL;
     }
 }

Modified: 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/JdkLogForwarder.java
==============================================================================
--- 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/JdkLogForwarder.java
 (original)
+++ 
trunk/platform-bundles/loghandler/src/main/java/org/amdatu/platform/loghandler/service/JdkLogForwarder.java
 Mon Oct 18 15:02:46 2010
@@ -16,212 +16,79 @@
  */
 package org.amdatu.platform.loghandler.service;
 
-import java.util.logging.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
 
-import org.osgi.framework.*;
 import org.osgi.service.log.LogService;
 
 /**
  * This class forwards JDK log messages to the OSGi log service.
  * @author ivol
  */
-public class JdkLogForwarder {
-    // Instance variables
-    private final BundleContext m_bundleContext;
+public class JdkLogForwarder extends Handler {
+
+    private static final Map<Level, Integer> LOG_LEVEL_MAPPING = new 
HashMap<Level, Integer>();
+    static {
+        LOG_LEVEL_MAPPING.put(Level.SEVERE, LogService.LOG_ERROR);
+        LOG_LEVEL_MAPPING.put(Level.WARNING, LogService.LOG_WARNING);
+        LOG_LEVEL_MAPPING.put(Level.INFO, LogService.LOG_INFO);
+        LOG_LEVEL_MAPPING.put(Level.CONFIG, LogService.LOG_INFO);
+    }
+
+    private volatile LogService m_log;
     private final String[] m_loggerNames;
-    private final Handler m_defaultHandler;
-    private final ServiceListener m_logServiceServiceListener = new 
LogServiceServiceListener();
-    private ServiceReference m_lastUsedLogServiceRef;
-    private Handler m_lastUsedHandler;
-
-    /**
-     * Constructor.
-     * @param bundleContext
-     * @param loggerNames
-     */
-    public JdkLogForwarder(BundleContext bundleContext, String[] loggerNames) {
-        this(bundleContext, loggerNames, null);
-    }
-
-    /**
-     * Constructor
-     * @param bundleContext
-     * @param loggerNames
-     * @param defaultHandler
-     */
-    public JdkLogForwarder(BundleContext bundleContext, String[] loggerNames, 
Handler defaultHandler) {
-        m_bundleContext = bundleContext;
+
+    public JdkLogForwarder(String... loggerNames) {
         m_loggerNames = loggerNames;
-        m_defaultHandler = defaultHandler != null ? defaultHandler : new 
DummyLogHandler();
     }
 
-    /**
-     * Starts the JDK log forwarder
-     */
     public void start() {
-        for (String loggerName : getLoggerNames()) {
+        for (String loggerName : m_loggerNames) {
             Logger logger = Logger.getLogger(loggerName);
             logger.setUseParentHandlers(false);
+            logger.addHandler(this);
         }
-
-        updateLogHandler();
-        addLogServiceListener();
     }
 
-    /**
-     * Stops the JDK log forwarder
-     */
     public void stop() {
-        
getBundleContext().removeServiceListener(getLogServiceServiceListener());
-
-        for (String loggerName : getLoggerNames()) {
-            Logger.getLogger(loggerName).removeHandler(getLastUsedHandler());
-        }
-
-        if (getLastUsedLogServiceRef() != null) {
-            getBundleContext().ungetService(getLastUsedLogServiceRef());
+        for (String loggerName : m_loggerNames) {
+            Logger.getLogger(loggerName).removeHandler(this);
         }
     }
 
-    protected void updateLogHandler() {
-        ServiceReference logServiceRef = 
getBundleContext().getServiceReference(LogService.class.getName());
-        Handler logHandler = null;
 
-        if (logServiceRef != null && logServiceRef == 
getLastUsedLogServiceRef()) {
+    @Override
+    public void publish(LogRecord record) {
+        if (record.getLevel() == Level.OFF) {
             return;
         }
-        if (logServiceRef != null) {
-            logHandler = new OsgiLogDelegateHandler((LogService) 
getBundleContext().getService(logServiceRef));
-        } else {
-            logHandler = getDefaultHandler();
-        }
-
-        Handler lastUsedHandler = getLastUsedHandler();
-
-        for (String loggerName : getLoggerNames()) {
-            Logger logger = Logger.getLogger(loggerName);
-            logger.removeHandler(lastUsedHandler);
-            logger.addHandler(logHandler);
-        }
-
-        if (getLastUsedLogServiceRef() != null) {
-            getBundleContext().ungetService(getLastUsedLogServiceRef());
-        }
 
-        setLastUsedLogServiceRef(logServiceRef);
-        setLastUsedHandler(logHandler);
-    }
-
-    protected void addLogServiceListener() {
-        try {
-            
getBundleContext().addServiceListener(getLogServiceServiceListener(),
-                    String.format("(%s=%s)", Constants.OBJECTCLASS, 
LogService.class.getName()));
-        } catch (InvalidSyntaxException ex) {
-            // / This exception should not occur in the first place
-            throw new RuntimeException(ex.getMessage());
+        if (record.getThrown() != null) {
+            m_log.log(getToOsgiLogLevel(record.getLevel()), 
record.getMessage(), record.getThrown());
+        } else {
+            m_log.log(getToOsgiLogLevel(record.getLevel()), 
record.getMessage());
         }
     }
 
-    protected BundleContext getBundleContext() {
-        return m_bundleContext;
+    @Override
+    public void close() throws SecurityException {
     }
 
-    protected String[] getLoggerNames() {
-        return m_loggerNames;
+    @Override
+    public void flush() {
     }
 
-    protected Handler getDefaultHandler() {
-        return m_defaultHandler;
-    }
-
-    protected ServiceListener getLogServiceServiceListener() {
-        return m_logServiceServiceListener;
-    }
-
-    protected ServiceReference getLastUsedLogServiceRef() {
-        return m_lastUsedLogServiceRef;
-    }
-
-    protected void setLastUsedLogServiceRef(ServiceReference 
lastUsedLogServiceRef) {
-        m_lastUsedLogServiceRef = lastUsedLogServiceRef;
-    }
-
-    protected Handler getLastUsedHandler() {
-        return m_lastUsedHandler;
-    }
-
-    protected void setLastUsedHandler(Handler lastUsedHandler) {
-        m_lastUsedHandler = lastUsedHandler;
-    }
-
-    protected class LogServiceServiceListener implements ServiceListener {
-        // @Override
-        public void serviceChanged(ServiceEvent serviceEvent) {
-            try {
-                updateLogHandler();
-            } catch (Throwable ex) {
-                System.out.println("Error: " + ex.getMessage());
-                ex.printStackTrace();
-            }
+    private int getToOsgiLogLevel(Level level) {
+        if (LOG_LEVEL_MAPPING.containsKey(level)) {
+            return LOG_LEVEL_MAPPING.get(level);
         }
-    }
-
-    protected class OsgiLogDelegateHandler extends Handler {
-        private final LogService m_logService;
-
-        @Override
-        public void publish(LogRecord record) {
-            if (record.getLevel() == Level.OFF) {
-                return;
-            }
-
-            if (record.getThrown() != null) {
-                getLogService().log(getToOsgiLogLevel(record.getLevel()), 
record.getMessage(), record.getThrown());
-            } else {
-                getLogService().log(getToOsgiLogLevel(record.getLevel()), 
record.getMessage());
-            }
-        }
-
-        @Override
-        public void close() throws SecurityException {
-        }
-
-        @Override
-        public void flush() {
-        }
-
-        protected int getToOsgiLogLevel(Level level) {
-            if (level == Level.SEVERE) {
-                return LogService.LOG_ERROR;
-            } else if (level == Level.WARNING) {
-                return LogService.LOG_WARNING;
-            } else if (level == Level.INFO || level == Level.CONFIG) {
-                return LogService.LOG_INFO;
-            } else {
-                return LogService.LOG_DEBUG;
-            }
-        }
-
-        public OsgiLogDelegateHandler(LogService logService) {
-            m_logService = logService;
-        }
-
-        protected LogService getLogService() {
-            return m_logService;
+        else {
+            return LogService.LOG_DEBUG;
         }
     }
 
-    protected class DummyLogHandler extends Handler {
-        @Override
-        public void publish(LogRecord record) {
-        }
-
-        @Override
-        public void close() throws SecurityException {
-        }
-
-        @Override
-        public void flush() {
-        }
-    }
 }

Reply via email to