| /******************************************************************************* |
| * 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(); |
| } |
| } |
| } |