blob: 761de924ff7d017e25df2ba678e716e61f9a6067 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Cognos Incorporated, IBM Corporation and others
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.eclipse.equinox.log.internal;
import org.eclipse.equinox.log.ExtendedLogReaderService;
import org.eclipse.equinox.log.ExtendedLogService;
import org.osgi.framework.*;
import org.osgi.service.log.LogReaderService;
import org.osgi.service.log.LogService;
public class Activator implements BundleActivator, BundleListener, FrameworkListener, ServiceListener {
private static final String EVENT_ADMIN_CLASS = "org.osgi.service.event.EventAdmin"; //$NON-NLS-1$
private static final String[] LOGSERVICE_CLASSES = {LogService.class.getName(), ExtendedLogService.class.getName()};
private static final String[] LOGREADERSERVICE_CLASSES = {LogReaderService.class.getName(), ExtendedLogReaderService.class.getName()};
private ServiceRegistration logReaderServiceRegistration;
private ServiceRegistration logServiceRegistration;
private EventAdminAdapter eventAdminAdapter;
private volatile ExtendedLogReaderServiceFactory logReaderServiceFactory;
private ExtendedLogServiceFactory logServiceFactory;
public void start(BundleContext context) throws Exception {
ServiceReference[] logRef = context.getServiceReferences(ExtendedLogService.class.getName(), null);
if (logRef != null)
for (int i = 0; i < logRef.length; i++) {
Bundle provider = logRef[i].getBundle();
if (provider != null && provider.getBundleId() == 0)
return;
}
logReaderServiceFactory = new ExtendedLogReaderServiceFactory();
context.addBundleListener(this);
context.addServiceListener(this);
context.addFrameworkListener(this);
if (checkEventAdmin()) {
eventAdminAdapter = new EventAdminAdapter(context, logReaderServiceFactory);
eventAdminAdapter.start();
}
logServiceFactory = new ExtendedLogServiceFactory(logReaderServiceFactory);
context.addBundleListener(logServiceFactory);
logReaderServiceRegistration = context.registerService(LOGREADERSERVICE_CLASSES, logReaderServiceFactory, null);
logServiceRegistration = context.registerService(LOGSERVICE_CLASSES, logServiceFactory, null);
}
public void stop(BundleContext context) throws Exception {
if (logServiceRegistration == null)
return;
logServiceRegistration.unregister();
logServiceRegistration = null;
logReaderServiceRegistration.unregister();
logReaderServiceRegistration = null;
logServiceFactory.shutdown();
logServiceFactory = null;
if (eventAdminAdapter != null) {
eventAdminAdapter.stop();
eventAdminAdapter = null;
}
context.removeFrameworkListener(this);
context.removeServiceListener(this);
context.removeBundleListener(this);
}
private static boolean checkEventAdmin() {
// cannot support scheduling without the event admin package
try {
Class.forName(EVENT_ADMIN_CLASS);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
/**
* BundleListener.bundleChanged method.
*
*/
public void bundleChanged(BundleEvent event) {
Bundle bundle = event.getBundle();
if (logReaderServiceFactory.isLoggable(bundle, null, LogService.LOG_INFO))
logReaderServiceFactory.log(bundle, null, null, LogService.LOG_INFO, getBundleEventTypeName(event.getType()), null);
}
/**
* ServiceListener.serviceChanged method.
*
*/
public void serviceChanged(ServiceEvent event) {
ServiceReference reference = event.getServiceReference();
Bundle bundle = reference.getBundle();
int eventType = event.getType();
int logType = (eventType == ServiceEvent.MODIFIED) ? LogService.LOG_DEBUG : LogService.LOG_INFO;
if (logReaderServiceFactory.isLoggable(bundle, null, logType))
logReaderServiceFactory.log(bundle, null, reference, logType, getServiceEventTypeName(eventType), null);
}
/**
* FrameworkListener.frameworkEvent method.
*
*/
public void frameworkEvent(FrameworkEvent event) {
Bundle bundle = event.getBundle();
int eventType = event.getType();
int logType = (eventType == FrameworkEvent.ERROR) ? LogService.LOG_ERROR : LogService.LOG_INFO;
Throwable throwable = (eventType == FrameworkEvent.ERROR) ? event.getThrowable() : null;
if (logReaderServiceFactory.isLoggable(bundle, null, logType))
logReaderServiceFactory.log(bundle, null, null, logType, getFrameworkEventTypeName(eventType), throwable);
}
/**
* Convert BundleEvent type to a string.
*
*/
protected static String getBundleEventTypeName(int type) {
switch (type) {
case BundleEvent.INSTALLED :
return ("BundleEvent INSTALLED"); //$NON-NLS-1$
case BundleEvent.RESOLVED :
return ("BundleEvent RESOLVED"); //$NON-NLS-1$
case BundleEvent.STARTED :
return ("BundleEvent STARTED"); //$NON-NLS-1$
case BundleEvent.STARTING :
return ("BundleEvent STARTING"); //$NON-NLS-1$
case BundleEvent.STOPPED :
return ("BundleEvent STOPPED"); //$NON-NLS-1$
case BundleEvent.STOPPING :
return ("BundleEvent STOPPING"); //$NON-NLS-1$
case BundleEvent.UNINSTALLED :
return ("BundleEvent UNINSTALLED"); //$NON-NLS-1$
case BundleEvent.UNRESOLVED :
return ("BundleEvent UNRESOLVED"); //$NON-NLS-1$
case BundleEvent.UPDATED :
return ("BundleEvent UPDATED"); //$NON-NLS-1$
default :
return ("BundleEvent " + Integer.toHexString(type)); //$NON-NLS-1$
}
}
/**
* Convert ServiceEvent type to a string.
*
*/
protected static String getServiceEventTypeName(int type) {
switch (type) {
case ServiceEvent.REGISTERED :
return ("ServiceEvent REGISTERED"); //$NON-NLS-1$
case ServiceEvent.MODIFIED :
return ("ServiceEvent MODIFIED"); //$NON-NLS-1$
case ServiceEvent.UNREGISTERING :
return ("ServiceEvent UNREGISTERING"); //$NON-NLS-1$
default :
return ("ServiceEvent " + Integer.toHexString(type)); //$NON-NLS-1$
}
}
/**
* Convert FrameworkEvent type to a string.
*
*/
protected static String getFrameworkEventTypeName(int type) {
switch (type) {
case FrameworkEvent.ERROR :
return ("FrameworkEvent ERROR"); //$NON-NLS-1$
case FrameworkEvent.INFO :
return ("FrameworkEvent INFO"); //$NON-NLS-1$
case FrameworkEvent.PACKAGES_REFRESHED :
return ("FrameworkEvent PACKAGES REFRESHED"); //$NON-NLS-1$
case FrameworkEvent.STARTED :
return ("FrameworkEvent STARTED"); //$NON-NLS-1$
case FrameworkEvent.STARTLEVEL_CHANGED :
return ("FrameworkEvent STARTLEVEL CHANGED"); //$NON-NLS-1$
case FrameworkEvent.WARNING :
return ("FrameworkEvent WARNING"); //$NON-NLS-1$
default :
return ("FrameworkEvent " + Integer.toHexString(type)); //$NON-NLS-1$
}
}
}