/******************************************************************************* * Copyright (c) 2007, 2013 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.eclipse.equinox.internal.cm; import java.util.Dictionary; import java.util.Hashtable; import org.osgi.framework.*; import org.osgi.service.cm.*; import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; import org.osgi.util.tracker.ServiceTracker; public class ConfigurationEventAdapter implements ConfigurationListener { // constants for Event topic substring public static final String TOPIC = "org/osgi/service/cm/ConfigurationEvent"; //$NON-NLS-1$ public static final char TOPIC_SEPARATOR = '/'; // constants for Event types public static final String CM_UPDATED = "CM_UPDATED"; //$NON-NLS-1$ public static final String CM_DELETED = "CM_DELETED"; //$NON-NLS-1$ // constants for Event properties public static final String CM_FACTORY_PID = "cm.factoryPid"; //$NON-NLS-1$ public static final String CM_PID = "cm.pid"; //$NON-NLS-1$ public static final String SERVICE = "service"; //$NON-NLS-1$ public static final String SERVICE_ID = "service.id"; //$NON-NLS-1$ public static final String SERVICE_OBJECTCLASS = "service.objectClass"; //$NON-NLS-1$ public static final String SERVICE_PID = "service.pid"; //$NON-NLS-1$ private final BundleContext context; private ServiceRegistration<ConfigurationListener> configListenerRegistration; private final ServiceTracker<EventAdmin, EventAdmin> eventAdminTracker; public ConfigurationEventAdapter(BundleContext context) { this.context = context; eventAdminTracker = new ServiceTracker<EventAdmin, EventAdmin>(context, EventAdmin.class, null); } public void start() throws Exception { eventAdminTracker.open(); configListenerRegistration = context.registerService(ConfigurationListener.class, this, null); } public void stop() throws Exception { configListenerRegistration.unregister(); configListenerRegistration = null; eventAdminTracker.close(); } public void configurationEvent(ConfigurationEvent event) { EventAdmin eventAdmin = eventAdminTracker.getService(); if (eventAdmin == null) { return; } String typename = null; switch (event.getType()) { case ConfigurationEvent.CM_UPDATED : typename = CM_UPDATED; break; case ConfigurationEvent.CM_DELETED : typename = CM_DELETED; break; default : // do nothing return; } String topic = TOPIC + TOPIC_SEPARATOR + typename; ServiceReference<ConfigurationAdmin> ref = event.getReference(); if (ref == null) { throw new RuntimeException("ServiceEvent.getServiceReference() is null"); //$NON-NLS-1$ } Hashtable<String, Object> properties = new Hashtable<String, Object>(); properties.put(CM_PID, event.getPid()); if (event.getFactoryPid() != null) { properties.put(CM_FACTORY_PID, event.getFactoryPid()); } putServiceReferenceProperties(properties, ref); Event convertedEvent = new Event(topic, (Dictionary<String, Object>) properties); eventAdmin.postEvent(convertedEvent); } private void putServiceReferenceProperties(Hashtable<String, Object> properties, ServiceReference<?> ref) { properties.put(SERVICE, ref); properties.put(SERVICE_ID, ref.getProperty(org.osgi.framework.Constants.SERVICE_ID)); Object o = ref.getProperty(org.osgi.framework.Constants.SERVICE_PID); if ((o != null) && (o instanceof String)) { properties.put(SERVICE_PID, o); } Object o2 = ref.getProperty(org.osgi.framework.Constants.OBJECTCLASS); if ((o2 != null) && (o2 instanceof String[])) { properties.put(SERVICE_OBJECTCLASS, o2); } } }