/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.extender.internal.blueprint.event; import java.security.AccessController; import java.security.PrivilegedAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.service.blueprint.container.BlueprintEvent; import org.springframework.util.ClassUtils; /** * Dispatcher that transforms Spring application context lifecycle events into notifications to the OSGi EventAdmin * service. * * <b>Note:</b> This class does not assume the EventAdmin service or classes are available. If the classes are missing, * the dispatcher will not publish any events during its life time. If the service is unavailable, the dispatcher will * stop sending events until the service becomes available. * * @author Costin Leau */ public class EventAdminDispatcher { /** logger */ private static final Log log; /** Whether the Event Admin library is present on the classpath */ private static final boolean eventAdminAvailable; static { eventAdminAvailable = ClassUtils.isPresent("org.osgi.service.event.EventAdmin", EventAdminDispatcher.class.getClassLoader()); log = LogFactory.getLog(EventAdminDispatcher.class); if (!eventAdminAvailable) { log.info("EventAdmin package not found; no Blueprint lifecycle events will be published"); } } /** * Actual creation of EventAdmin dispatcher. In separate inner class to avoid runtime dependency on EventAdmin * classes. * * @author Costin Leau */ private static abstract class EventAdminDispatcherFactory { private static EventDispatcher createDispatcher(BundleContext bundleContext) { if (log.isTraceEnabled()) log.trace("Creating [" + OsgiEventDispatcher.class.getName() + "]"); return new OsgiEventDispatcher(bundleContext, PublishType.POST); } } /** actual dispatcher */ private final EventDispatcher dispatcher; public EventAdminDispatcher(BundleContext bundleContext) { if (eventAdminAvailable) { dispatcher = EventAdminDispatcherFactory.createDispatcher(bundleContext); } else { dispatcher = null; } } public void beforeClose(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.beforeClose(event); return null; } }); } else { dispatcher.beforeClose(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void beforeRefresh(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.beforeRefresh(event); return null; } }); } else { dispatcher.beforeRefresh(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void afterClose(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.afterClose(event); return null; } }); } else { dispatcher.afterClose(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void afterRefresh(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.afterRefresh(event); return null; } }); } else { dispatcher.afterRefresh(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void refreshFailure(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.refreshFailure(event); return null; } }); } else { dispatcher.refreshFailure(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void grace(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.grace(event); return null; } }); } else { dispatcher.grace(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } public void waiting(final BlueprintEvent event) { if (dispatcher != null) { try { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { dispatcher.waiting(event); return null; } }); } else { dispatcher.waiting(event); } } catch (Throwable th) { log.warn("Cannot dispatch event " + event, th); } } } }