blob: 4615d9fc14c6c34135ec01f922c0f78389c6867f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipsei.equinox.event.mapper;
import java.util.Dictionary;
import java.util.Hashtable;
import org.osgi.framework.*;
import org.osgi.service.cm.ConfigurationEvent;
import org.osgi.service.cm.ConfigurationListener;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.log.LogEntry;
import org.osgi.service.log.LogListener;
import org.osgi.service.log.LogReaderService;
import org.osgi.service.upnp.UPnPDevice;
import org.osgi.service.upnp.UPnPEventListener;
import org.osgi.service.upnp.UPnPService;
import org.osgi.service.useradmin.UserAdminEvent;
import org.osgi.service.useradmin.UserAdminListener;
import org.osgi.service.wireadmin.WireAdminEvent;
import org.osgi.service.wireadmin.WireAdminListener;
import org.osgi.service.wireadmin.WireConstants;
import org.osgi.util.tracker.ServiceTracker;
/**
* Main class for redeliver special events like FrameworkEvents via EventAdmin.
*
*
* @version $Revision: 1.4 $
*/
public class EventRedeliverer implements FrameworkListener, BundleListener,
ServiceListener, LogListener, LogReaderServiceListener,
ConfigurationListener, WireAdminListener, UPnPEventListener,
UserAdminListener {
private ServiceTracker eventAdminTracker;
private LogReaderServiceTracker logTracker;
private LogReaderService reader;
private final static boolean DEBUG = false;
private BundleContext bc;
private ServiceRegistration configurationListenerReg;
private ServiceRegistration wireAdminListenerReg;
private ServiceRegistration upnpEventListenerReg;
private ServiceRegistration userAdminListenerReg;
public EventRedeliverer(BundleContext bc) {
this.bc = bc;
}
public void close() {
if (logTracker != null) {
logTracker.close();
logTracker = null;
}
if (eventAdminTracker != null) {
eventAdminTracker.close();
eventAdminTracker = null;
}
if (reader != null) {
reader.removeLogListener(this);
}
reader = null;
bc.removeFrameworkListener(this);
bc.removeBundleListener(this);
bc.removeServiceListener(this);
if (configurationListenerReg != null) {
configurationListenerReg.unregister();
configurationListenerReg = null;
}
if (wireAdminListenerReg != null) {
wireAdminListenerReg.unregister();
wireAdminListenerReg = null;
}
if (upnpEventListenerReg != null) {
upnpEventListenerReg.unregister();
upnpEventListenerReg = null;
}
if (userAdminListenerReg != null) {
userAdminListenerReg.unregister();
userAdminListenerReg = null;
}
}
/**
* prepare any service trackers and register event listeners which are
* necessary to obtain events to be mapped
*/
public void open() {
// open ServiceTracker for EventAdmin
eventAdminTracker = new ServiceTracker(bc, EventAdmin.class.getName(),
null);
eventAdminTracker.open();
// open ServiceTracker for LogReaderService
logTracker = new LogReaderServiceTracker(bc, this);
logTracker.open();
// add legacy event listener for framework level event
bc.addFrameworkListener(this);
bc.addBundleListener(this);
bc.addServiceListener(this);
// register configurationListener
configurationListenerReg = bc.registerService(
ConfigurationListener.class.getName(), this, null);
// register WireAdminListener
Hashtable ht = new Hashtable();
// create an event mask to receive all the types of WireAdminEvent
Integer mask = new Integer(WireAdminEvent.WIRE_CONNECTED
| WireAdminEvent.WIRE_CREATED | WireAdminEvent.WIRE_DELETED
| WireAdminEvent.WIRE_DISCONNECTED | WireAdminEvent.WIRE_TRACE
| WireAdminEvent.WIRE_UPDATED
| WireAdminEvent.CONSUMER_EXCEPTION
| WireAdminEvent.PRODUCER_EXCEPTION);
ht.put(WireConstants.WIREADMIN_EVENTS, mask);
wireAdminListenerReg = bc.registerService(WireAdminListener.class
.getName(), this, ht);
// register UPnPEventListener
// create a Filter object to receive all the UPnP events
Hashtable ht2 = new Hashtable();
Filter filter = null;
try {
filter = bc.createFilter("(|(|(" + UPnPDevice.TYPE + "=*)("
+ UPnPDevice.ID + "=*))(|(" + UPnPService.TYPE + "=*)("
+ UPnPService.ID + "=*)))");
}
catch (InvalidSyntaxException e) {
System.out
.println("Exception thrown while trying to create Filter. "
+ e);
e.printStackTrace(System.out);
}
if (filter != null) {
ht2.put(UPnPEventListener.UPNP_FILTER, filter);
upnpEventListenerReg = bc.registerService(UPnPEventListener.class
.getName(), this, ht2);
}
// register usrAdminListener
userAdminListenerReg = bc.registerService(UserAdminListener.class
.getName(), this, null);
}
private EventAdmin getEventAdmin() {
if (eventAdminTracker == null)
return null;
return (EventAdmin) eventAdminTracker.getService();
}
/**
* @param event
* @see org.osgi.framework.FrameworkListener#frameworkEvent(org.osgi.framework.FrameworkEvent)
*/
public void frameworkEvent(FrameworkEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new FrameworkEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
private void printNoEventAdminError() {
if (DEBUG) {
System.out.println(this.getClass().getName()
+ ": Cannot find the EventAdmin.");
}
}
/**
* @param event
* @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
*/
public void bundleChanged(BundleEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new BundleEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param event
* @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
*/
public void serviceChanged(ServiceEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new ServiceEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param entry
* @see org.osgi.service.log.LogListener#logged(org.osgi.service.log.LogEntry)
*/
public void logged(LogEntry entry) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new LogEntryAdapter(entry, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param reference
* @param service
* @see org.eclipse.equinox.event.mapper.LogReaderServiceListener#logReaderServiceAdding(org.osgi.framework.ServiceReference,
* org.osgi.service.log.LogReaderService)
*/
public void logReaderServiceAdding(ServiceReference reference,
LogReaderService service) {
if (reader != null) {
return;
}
reader = service;
reader.addLogListener(this);
}
/**
* @param reference
* @param service
* @see org.eclipse.equinox.event.mapper.LogReaderServiceListener#logReaderServiceRemoved(org.osgi.framework.ServiceReference,
* org.osgi.service.log.LogReaderService)
*/
public void logReaderServiceRemoved(ServiceReference reference,
LogReaderService service) {
if ((reader != null) && reader.equals(service)) {
reader.removeLogListener(this);
reader = null;
}
// ungetService() will be called after returning to
// LogReaderServiceTracker's removedService() method.
}
/**
* @param event
* @see org.osgi.service.cm.ConfigurationListener#configurationEvent(org.osgi.service.cm.ConfigurationEvent)
*/
public void configurationEvent(ConfigurationEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new ConfigurationEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param event
* @see org.osgi.service.wireadmin.WireAdminListener#wireAdminEvent(org.osgi.service.wireadmin.WireAdminEvent)
*/
public void wireAdminEvent(WireAdminEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new WireAdminEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param deviceId
* @param serviceId
* @param events
* @see org.osgi.service.upnp.UPnPEventListener#notifyUPnPEvent(java.lang.String,
* java.lang.String, java.util.Dictionary)
*/
public void notifyUPnPEvent(String deviceId, String serviceId,
Dictionary events) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new UPnPEventAdapter(deviceId, serviceId, events, eventAdmin))
.redeliver();
}
else {
printNoEventAdminError();
}
}
/**
* @param event
* @see org.osgi.service.useradmin.UserAdminListener#roleChanged(org.osgi.service.useradmin.UserAdminEvent)
*/
public void roleChanged(UserAdminEvent event) {
EventAdmin eventAdmin = getEventAdmin();
if (eventAdmin != null) {
(new UserAdminEventAdapter(event, eventAdmin)).redeliver();
}
else {
printNoEventAdminError();
}
}
}