/** * EasyBeans * Copyright (C) 2008 Bull S.A.S. * Contact: easybeans@ow2.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * * -------------------------------------------------------------------------- * $Id: EventComponent.java 5369 2010-02-24 14:58:19Z benoitf $ * -------------------------------------------------------------------------- */ package org.ow2.easybeans.component.event; import java.util.LinkedList; import java.util.List; import org.ow2.easybeans.api.EZBContainer; import org.ow2.easybeans.api.EZBJ2EEManagedObject; import org.ow2.easybeans.api.EZBServer; import org.ow2.easybeans.api.Factory; import org.ow2.easybeans.api.event.EZBEventListener; import org.ow2.easybeans.component.api.EZBComponentException; import org.ow2.easybeans.component.itf.EZBEventComponent; import org.ow2.easybeans.naming.J2EEManagedObjectNamingHelper; import org.ow2.util.event.api.IEventDispatcher; import org.ow2.util.event.api.IEventListener; import org.ow2.util.event.api.IEventService; import org.ow2.util.event.impl.EventDispatcher; import org.ow2.util.event.impl.EventService; import org.ow2.util.log.Log; import org.ow2.util.log.LogFactory; /** * Implementation of the EasyBeans event component. * @author missonng */ public class EventComponent implements EZBEventComponent { /** * Logger. */ private static Log logger = LogFactory.getLog(EventComponent.class); /** * The component event service. */ private IEventService service; /** * The component event listeners. */ private LinkedList<IEventListener> listeners = new LinkedList<IEventListener>(); /** * The component J2EEManagedObject. */ private LinkedList<EZBJ2EEManagedObject> objects = new LinkedList<EZBJ2EEManagedObject>(); /** * Init method.<br/> This method is called before the start method. * @throws EZBComponentException if the initialization has failed. */ public synchronized void init() throws EZBComponentException { //if nobody define the EventService instance (OSGi, ...), the component create its own instance. if (this.service == null) { this.service = new EventService(); this.service.start(); } } /** * Start method.<br/> This method is called after the init method. * @throws EZBComponentException if the start has failed. */ public synchronized void start() throws EZBComponentException { logger.info("started."); } /** * Stop method.<br/> This method is called when component needs to be * stopped. * @throws EZBComponentException if the stop is failing. */ public synchronized void stop() throws EZBComponentException { for (IEventListener listener : this.listeners) { this.service.unregisterListener(listener); } for (EZBJ2EEManagedObject object : this.objects) { this.service.unregisterDispatcher(object.getJ2EEManagedObjectId()); } this.listeners.clear(); this.objects.clear(); logger.info("stopped."); } /** * Set the event service to use. * @param service The event service to use. */ public synchronized void setEventService(final IEventService service) { this.service = service; } /** * @return the event service to use */ public synchronized IEventService getEventService() { return this.service; } /** * Register a new J2EE managed object.<br> * If a J2EE managed object with the same id is already registered, it will be unregistered first. * @param object The J2EE managed object to register. * @param dispatcher The event dispatcher for this J2EE managed object. */ public synchronized void registerJ2EEManagedObject(final EZBJ2EEManagedObject object, final IEventDispatcher dispatcher) { if (EZBServer.class.isAssignableFrom(object.getClass())) { registerEZBServer((EZBServer) object, dispatcher); } else if (EZBContainer.class.isAssignableFrom(object.getClass())) { registerEZBContainer((EZBContainer) object, dispatcher); } else if (Factory.class.isAssignableFrom(object.getClass())) { registerEZBFactory((Factory<?, ?>) object, dispatcher); } } /** * Unregister a J2EE managed object. * @param object The J2EE managed object to unregister. */ public synchronized void unregisterJ2EEManagedObject(final EZBJ2EEManagedObject object) { if (EZBServer.class.isAssignableFrom(object.getClass())) { unregisterEZBServer((EZBServer) object); } else if (EZBContainer.class.isAssignableFrom(object.getClass())) { unregisterEZBContainer((EZBContainer) object); } else if (Factory.class.isAssignableFrom(object.getClass())) { unregisterEZBFactory((Factory<?, ?>) object); } } /** * Register a new event listener.<br> * The listener will automatically be register with each dispatcher matching his filter. * @param eventListener The listener to register. */ public synchronized void registerEventListener(final EZBEventListener eventListener) { this.service.registerListener(eventListener, eventListener.getEventProviderFilter()); this.listeners.add(eventListener); } /** * Unregister an event listener. * @param eventListener The listener to unregister. */ public synchronized void unregisterEventListener(final EZBEventListener eventListener) { this.service.unregisterListener(eventListener); this.listeners.remove(eventListener); } /** * Creates a new IEventDispatcher. * * @return a new IEventDispatcher. */ public IEventDispatcher createEventDispatcher() { return new EventDispatcher(); } /** * Helper method to register a EZBServer. * @param server The EZBServer to register. * @param dispatcher The EventDispatcher for this EZBServer. */ private void registerEZBServer(final EZBServer server, final IEventDispatcher dispatcher) { this.service.registerDispatcher(server.getJ2EEManagedObjectId(), dispatcher); this.objects.add(server); } /** * Helper method to unregister a EZBServer. * @param server The EZBServer to unregister. */ private void unregisterEZBServer(final EZBServer server) { this.service.unregisterDispatcher(server.getJ2EEManagedObjectId()); this.objects.remove(server); } /** * Helper method to register a EZBContainer. * @param container The EZBContainer to register. * @param dispatcher The EventDispatcher for this EZBContainer. */ private void registerEZBContainer(final EZBContainer container, final IEventDispatcher dispatcher) { this.service.registerDispatcher(container.getJ2EEManagedObjectId(), dispatcher); this.objects.add(container); } /** * Helper method to unregister a EZBContainer. * @param container The EZBContainer to unregister. */ private void unregisterEZBContainer(final EZBContainer container) { this.service.unregisterDispatcher(container.getJ2EEManagedObjectId()); this.objects.remove(container); } /** * Helper method to register a Factory. * @param factory The Factory to register. * @param dispatcher The EventDispatcher for this Factory. */ private void registerEZBFactory(final Factory<?, ?> factory, final IEventDispatcher dispatcher) { this.service.registerDispatcher(factory.getJ2EEManagedObjectId(), dispatcher); this.objects.add(factory); List<String> methods = J2EEManagedObjectNamingHelper.getBeanMethodsManagedObjectIds(factory); for (final String method : methods) { this.service.registerDispatcher(method, dispatcher); } } /** * Helper method to unregister a Factory. * @param factory The Factory to unregister. */ private void unregisterEZBFactory(final Factory<?, ?> factory) { this.service.unregisterDispatcher(factory.getJ2EEManagedObjectId()); this.objects.remove(factory); List<String> methods = J2EEManagedObjectNamingHelper.getBeanMethodsManagedObjectIds(factory); for (final String method : methods) { this.service.unregisterDispatcher(method); } } }