/* Copyright 2007 Niclas Hedhman. * * Licensed 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.ops4j.pax.logging.service.internal; import org.osgi.framework.Bundle; import org.osgi.framework.BundleEvent; import org.osgi.framework.FrameworkEvent; import org.osgi.framework.FrameworkListener; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; import org.osgi.framework.SynchronousBundleListener; import org.osgi.service.log.LogService; /** * One instance of this class will be instantiated to listen in on events generated by * the OSGi framework and log those. * * <p>By default, all events log by this class are logged at the DEBUG level. This can be * changed to a different level by setting the system property * "org.ops4j.pax.logging.service.frameworkEventsLogLevel" to DEBUG, INFO, WARNING, or ERROR.</p> */ public class FrameworkHandler implements SynchronousBundleListener, FrameworkListener, ServiceListener { public static final String FRAMEWORK_EVENTS_LOG_LEVEL_PROP_NAME = "org.ops4j.pax.logging.service.frameworkEventsLogLevel"; private final PaxLoggingServiceImpl m_service; private final int loggingLevel; public FrameworkHandler( final PaxLoggingServiceImpl service ) { m_service = service; final String levelName = System.getProperty( FRAMEWORK_EVENTS_LOG_LEVEL_PROP_NAME, "DEBUG" ).trim(); loggingLevel = convertLevel( levelName ); } public void bundleChanged( final BundleEvent bundleEvent ) { final Bundle bundle = bundleEvent.getBundle(); String message; final int type = bundleEvent.getType(); switch( type ) { case BundleEvent.INSTALLED: message = "BundleEvent INSTALLED"; break; case BundleEvent.STARTED: message = "BundleEvent STARTED"; break; case BundleEvent.STOPPED: message = "BundleEvent STOPPED"; break; case BundleEvent.UPDATED: message = "BundleEvent UPDATED"; break; case BundleEvent.UNINSTALLED: message = "BundleEvent UNINSTALLED"; break; case BundleEvent.RESOLVED: message = "BundleEvent RESOLVED"; break; case BundleEvent.UNRESOLVED: message = "BundleEvent UNRESOLVED"; break; case BundleEvent.STARTING: message = "BundleEvent STARTING"; break; case BundleEvent.STOPPING: message = "BundleEvent STOPPING"; break; default: message = "BundleEvent [unknown:" + type + "]"; break; } if (bundle != null) message += " - " + bundle.getSymbolicName(); if (loggingLevel > 0) { m_service.log( bundle, loggingLevel, message, null ); } } public void frameworkEvent( final FrameworkEvent frameworkEvent ) { final int type = frameworkEvent.getType(); String message; int level = loggingLevel; switch( type ) { case FrameworkEvent.ERROR: message = "FrameworkEvent ERROR"; level = LogService.LOG_ERROR; break; case FrameworkEvent.INFO: message = "FrameworkEvent INFO"; level = LogService.LOG_INFO; break; case FrameworkEvent.PACKAGES_REFRESHED: message = "FrameworkEvent PACKAGES REFRESHED"; break; case FrameworkEvent.STARTED: message = "FrameworkEvent STARTED"; break; case FrameworkEvent.STARTLEVEL_CHANGED: message = "FrameworkEvent STARTLEVEL CHANGED"; break; case FrameworkEvent.WARNING: message = "FrameworkEvent WARNING"; level = LogService.LOG_WARNING; break; default: message = "FrameworkEvent [unknown:" + type + "]"; break; } final Bundle bundle = frameworkEvent.getBundle(); final Throwable exception = frameworkEvent.getThrowable(); if (bundle != null) message += " - " + bundle.getSymbolicName(); if (loggingLevel > 0) { m_service.log( bundle, level, message, exception ); } } public void serviceChanged( final ServiceEvent serviceEvent ) { final ServiceReference serviceRef = serviceEvent.getServiceReference(); String message; final int type = serviceEvent.getType(); switch( type ) { case ServiceEvent.MODIFIED: message = "ServiceEvent MODIFIED"; break; case ServiceEvent.REGISTERED: message = "ServiceEvent REGISTERED"; break; case ServiceEvent.UNREGISTERING: message = "ServiceEvent UNREGISTERING"; break; default: message = "ServiceEvent [unknown:" + type + "]"; break; } message += " - " + serviceRef; Bundle bundle = serviceRef.getBundle(); if (bundle != null) message += " - " + bundle.getSymbolicName(); if (loggingLevel > 0) { m_service.log( serviceRef, loggingLevel, message ); } } private static int convertLevel( final String levelName ) { if( "DEBUG".equals( levelName ) ) { return LogService.LOG_DEBUG; } else if( "INFO".equals( levelName ) ) { return LogService.LOG_INFO; } else if( "WARN".equals( levelName ) || "WARNING".equals( levelName ) ) { return LogService.LOG_WARNING; } else if( "ERROR".equals( levelName ) ) { return LogService.LOG_ERROR; } else if("DISABLED".equals( levelName ) ) { return 0; } else { return LogService.LOG_DEBUG; } } }