/******************************************************************************* * Copyright (c) 2005, 2009 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.useradmin; import java.util.Dictionary; import java.util.Hashtable; import org.osgi.framework.*; import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; import org.osgi.service.useradmin.*; import org.osgi.service.useradmin.Role; import org.osgi.util.tracker.ServiceTracker; public class UserAdminEventAdapter implements UserAdminListener { // constants for Event topic substring public static final String TOPIC = "org/osgi/service/useradmin/UserAdmin"; //$NON-NLS-1$ public static final char TOPIC_SEPARATOR = '/'; public static final String EVENT = "event"; //$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$ public static final String ROLE_CREATED = "ROLE_CREATED"; //$NON-NLS-1$ public static final String ROLE_CHANGED = "ROLE_CHANGED"; //$NON-NLS-1$ public static final String ROLE_REMOVED = "ROLE_REMOVED"; //$NON-NLS-1$ // constants for Event properties public static final String ROLE = "role"; //$NON-NLS-1$ public static final String ROLE_NAME = "role.name"; //$NON-NLS-1$ public static final String ROLE_TYPE = "role.type"; //$NON-NLS-1$ private BundleContext context; private ServiceRegistration userAdminRegistration; private volatile ServiceTracker eventAdminTracker; public UserAdminEventAdapter(BundleContext context) { this.context = context; } public void start() throws Exception { Hashtable props = new Hashtable(3); userAdminRegistration = context.registerService(UserAdminListener.class.getName(), this, props); eventAdminTracker = new ServiceTracker(context, EventAdmin.class.getName(), null); eventAdminTracker.open(); } public void stop() throws Exception { ServiceTracker currentTracker = eventAdminTracker; if (currentTracker != null) { currentTracker.close(); eventAdminTracker = null; } if (userAdminRegistration != null) { userAdminRegistration.unregister(); userAdminRegistration = null; } this.context = null; } public void roleChanged(UserAdminEvent event) { ServiceTracker currentTracker = eventAdminTracker; EventAdmin eventAdmin = currentTracker == null ? null : ((EventAdmin) currentTracker.getService()); if (eventAdmin != null) { String typename = null; switch (event.getType()) { case UserAdminEvent.ROLE_CREATED : typename = ROLE_CREATED; break; case UserAdminEvent.ROLE_CHANGED : typename = ROLE_CHANGED; break; case UserAdminEvent.ROLE_REMOVED : typename = ROLE_REMOVED; break; default : return; } String topic = TOPIC + TOPIC_SEPARATOR + typename; Hashtable properties = new Hashtable(); ServiceReference ref = event.getServiceReference(); if (ref == null) { throw new RuntimeException("UserAdminEvent's getServiceReference() returns null."); //$NON-NLS-1$ } putServiceReferenceProperties(properties, ref); Role role = event.getRole(); if (role == null) { throw new RuntimeException("UserAdminEvent's getRole() returns null."); //$NON-NLS-1$ } if (role != null) { properties.put(ROLE, role); properties.put(ROLE_NAME, role.getName()); properties.put(ROLE_TYPE, new Integer(role.getType())); } properties.put(EVENT, event); Event convertedEvent = new Event(topic, (Dictionary) properties); eventAdmin.postEvent(convertedEvent); } } public void putServiceReferenceProperties(Hashtable 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); } } }