/* * Copyright 2005 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 java.util.Hashtable; import java.util.Map; import java.util.logging.Handler; import java.util.logging.LogManager; import java.util.logging.Logger; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cm.ManagedService; import org.osgi.service.log.LogEntry; import org.osgi.service.log.LogReaderService; import org.osgi.service.log.LogService; import org.ops4j.pax.logging.EventAdminPoster; import org.ops4j.pax.logging.PaxLoggingService; import org.ops4j.pax.logging.internal.eventadmin.EventAdminTracker; /** * Starts the Log4j log services. */ public class Activator implements BundleActivator { /** * The Managed Service PID for the log4j configuration */ public static final String CONFIGURATION_PID = "org.ops4j.pax.logging"; private static final String[] LOGSERVICE_NAMES = { LogService.class.getName(), org.knopflerfish.service.log.LogService.class.getName(), PaxLoggingService.class.getName(), ManagedService.class.getName() }; /** * Reference to the registered service */ private PaxLoggingServiceImpl m_PaxLogging; private ServiceRegistration m_RegistrationPaxLogging; private JdkHandler m_JdkHandler; private ServiceRegistration m_registrationLogReaderService; private FrameworkHandler m_frameworkHandler; private EventAdminPoster m_eventAdmin; /** * Default constructor */ public Activator() { } /** * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start( BundleContext bundleContext ) throws Exception { int ranking = 1; String rankingProperty = bundleContext.getProperty("org.ops4j.pax.logging.ranking"); if (rankingProperty != null) { ranking = Integer.parseInt(rankingProperty); } // register the LogReaderService LogReaderServiceImpl logReader = new LogReaderServiceImpl( 100 ); String readerServiceName = LogReaderService.class.getName(); Hashtable serviceProperties = new Hashtable(); serviceProperties.put( Constants.SERVICE_RANKING, ranking ); m_registrationLogReaderService = bundleContext.registerService( readerServiceName, logReader, serviceProperties ); // Tracking for the EventAdmin try { m_eventAdmin = new EventAdminTracker( bundleContext ); } catch( NoClassDefFoundError e ) { // If we hit a NCDFE, this means the event admin package is not available, // so use a dummy poster m_eventAdmin = new EventAdminPoster() { public void postEvent( Bundle bundle, int level, LogEntry entry, String message, Throwable exception, ServiceReference sr, Map context ) { } public void destroy() { } }; } // register the Pax Logging service m_PaxLogging = new PaxLoggingServiceImpl( bundleContext, logReader, m_eventAdmin ); serviceProperties = new Hashtable(); serviceProperties.put( Constants.SERVICE_ID, "org.ops4j.pax.logging.configuration" ); serviceProperties.put( Constants.SERVICE_PID, CONFIGURATION_PID ); serviceProperties.put( Constants.SERVICE_RANKING, ranking ); m_RegistrationPaxLogging = bundleContext.registerService( LOGSERVICE_NAMES, m_PaxLogging, serviceProperties ); // Add a global handler for all JDK Logging (java.util.logging). String skipJULProperty=bundleContext.getProperty("org.ops4j.pax.logging.skipJUL"); if( !Boolean.parseBoolean(skipJULProperty)) { LogManager manager = LogManager.getLogManager(); if( !Boolean.valueOf(bundleContext.getProperty("org.ops4j.pax.logging.skipJULReset")) ) { manager.reset(); } // clear out old handlers Logger rootLogger = manager.getLogger( "" ); Handler[] handlers = rootLogger.getHandlers(); for (int i = 0; i < handlers.length;i++) { rootLogger.removeHandler(handlers[i]); } rootLogger.setFilter(null); m_JdkHandler = new JdkHandler( m_PaxLogging ); rootLogger.addHandler( m_JdkHandler ); } m_frameworkHandler = new FrameworkHandler( m_PaxLogging ); bundleContext.addBundleListener( m_frameworkHandler ); bundleContext.addFrameworkListener( m_frameworkHandler ); bundleContext.addServiceListener( m_frameworkHandler ); } /** * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop( BundleContext bundleContext ) throws Exception { // shut down the trackers. m_eventAdmin.destroy(); // Clean up the listeners. bundleContext.removeBundleListener( m_frameworkHandler ); bundleContext.removeFrameworkListener( m_frameworkHandler ); bundleContext.removeServiceListener( m_frameworkHandler ); // Remove the global handler for all JDK Logging (java.util.logging). if( m_JdkHandler != null ) { Logger rootLogger = LogManager.getLogManager().getLogger( "" ); rootLogger.removeHandler( m_JdkHandler ); m_JdkHandler.flush(); m_JdkHandler.close(); m_JdkHandler = null; } m_RegistrationPaxLogging.unregister(); m_RegistrationPaxLogging = null; // Shutdown Pax Logging to ensure appender file locks get released if (m_PaxLogging != null) { m_PaxLogging.shutdown(); m_PaxLogging = null; } m_registrationLogReaderService.unregister(); m_registrationLogReaderService = null; } }