/****************************************************************************** * 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.context.event; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.SmartApplicationListener; import org.springframework.core.GenericTypeResolver; /** * Listener dispatching OSGi events to interested listeners. This class acts mainly as an adapter bridging the * {@link ApplicationListener} interface with {@link OsgiBundleApplicationContextListener}. * * @author Costin Leau * */ class ApplicationListenerAdapter<E extends OsgiBundleApplicationContextEvent> implements SmartApplicationListener { private final OsgiBundleApplicationContextListener<E> osgiListener; private final Class<?> eventType; private final String toString; static <E extends OsgiBundleApplicationContextEvent> ApplicationListenerAdapter<E> createAdapter( OsgiBundleApplicationContextListener<E> listener) { return new ApplicationListenerAdapter<E>(listener); } private ApplicationListenerAdapter(OsgiBundleApplicationContextListener<E> listener) { this.osgiListener = listener; Class<?> evtType = GenericTypeResolver .resolveTypeArgument(listener.getClass(), OsgiBundleApplicationContextListener.class); this.eventType = (evtType == null ? OsgiBundleApplicationContextEvent.class : evtType); toString = "ApplicationListenerAdapter for listener " + osgiListener; } @SuppressWarnings("unchecked") public void onApplicationEvent(ApplicationEvent event) { if (eventType.isInstance(event)) { osgiListener.onOsgiApplicationEvent((E) event); } } public boolean equals(Object obj) { return osgiListener.equals(obj); } public int hashCode() { return osgiListener.hashCode(); } public String toString() { return toString; } public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) { return (eventType != null && eventType.isAssignableFrom(eventType)); } public boolean supportsSourceType(Class<?> sourceType) { return true; } public int getOrder() { return LOWEST_PRECEDENCE; } }