hammant 2002/11/29 13:30:07 Added: src/java/org/apache/avalon/cornerstone/blocks/event DefaultEventManager.java InvalidEventTypeException.java src/java/org/apache/avalon/cornerstone/services/event Event.java EventManager.java Filter.java Publisher.java Register.java Subscriber.java Log: Mauro Talevi suppies "Event Notifier pattern by Gupta et al. (Java Report, Vol. 3, No. 7, July 1998, 19-36)" block. Revision Changes Path 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/event/DefaultEventManager.java Index: DefaultEventManager.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.blocks.event; import java.util.Hashtable; import java.util.Enumeration; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.phoenix.BlockContext; import org.apache.avalon.cornerstone.services.event.Event; import org.apache.avalon.cornerstone.services.event.Filter; import org.apache.avalon.cornerstone.services.event.EventManager; import org.apache.avalon.cornerstone.services.event.Publisher; import org.apache.avalon.cornerstone.services.event.Register; import org.apache.avalon.cornerstone.services.event.Subscriber; /** * EventManager Block * * @phoenix:block * @phoenix:service name="org.apache.avalon.cornerstone.services.event.EventManager" * * @author Mauro Talevi */ public class DefaultEventManager extends AbstractLogEnabled implements EventManager, Contextualizable, Configurable, Serviceable, Initializable, Disposable { private final String m_rootEventType = "Event"; private Class m_eventClass; private Publisher m_publisher = new DefaultPublisher(); private Register m_register = new DefaultRegister(); private Hashtable m_subscribers = new Hashtable(); public Publisher getPublisher(){ return m_publisher; } public Register getRegister(){ return m_register; } public void contextualize( final Context context ) { } public void configure( final Configuration configuration ) throws ConfigurationException { } /** * ServiceManager dependencies */ public void service( final ServiceManager serviceManager ) throws ServiceException { } public void initialize() throws Exception { m_eventClass = Class.forName( m_rootEventType ); getLogger().info("Initialising eventClass " + m_eventClass); } public void dispose() { } class DefaultPublisher implements Publisher { public void publish( final Event event ) { getLogger().info("Publishing event " + event.getClass()); System.out.println("Publishing event " + event.getClass()); for ( Enumeration e = m_subscribers.elements(); e.hasMoreElements(); ){ Subscriber subscriber = (Subscriber)e.nextElement(); if (subscriber.getEventType().isAssignableFrom(event.getClass()) && (subscriber.getFilter() != null || subscriber.getFilter().filter(event))){ getLogger().info("Informing subscriber "+subscriber+" of event "+event.getClass()); subscriber.inform(event); } } } } class DefaultRegister implements Register { public void subscribe( final Subscriber subscriber ) throws InvalidEventTypeException { if ( !m_eventClass.isAssignableFrom( subscriber.getEventType() ) ) throw new InvalidEventTypeException(); getLogger().info( "Subscribing event " + subscriber.getEventType().getName() ); // Add to list but prevent duplicate subscriptions if ( !m_subscribers.containsKey( subscriber.getUID() ) ){ m_subscribers.put( subscriber.getUID(), subscriber ); getLogger().info( "Subscribed Event " + subscriber.getEventType().getName() ); if ( getLogger().isDebugEnabled() ){ getLogger().debug( "Subscribers now active: " + m_subscribers.size() ); } } } public void unsubscribe( Subscriber subscriber ) throws InvalidEventTypeException { if ( !m_eventClass.isAssignableFrom( subscriber.getEventType() ) ) throw new InvalidEventTypeException(); if ( m_subscribers.containsKey( subscriber.getUID() ) ){ m_subscribers.remove( subscriber.getUID() ); getLogger().info( "Unsubscribed Event " + subscriber.getEventType().getName() ); if ( getLogger().isDebugEnabled() ){ getLogger().debug( "Subscribers now active: " + m_subscribers.size() ); } } else { getLogger().warn( "Subscriber " + subscriber.getUID() + " not found" ); } } } } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/event/InvalidEventTypeException.java Index: InvalidEventTypeException.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.blocks.event; /** * InvalidEventTypeException is thrown whenever the event type of a <tt>Subscriber</tt> * is not assignable from the root event type. * * @author Mauro Talevi */ public class InvalidEventTypeException extends RuntimeException { } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/Event.java Index: Event.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; import java.io.Serializable; /** * <tt>Event</tt> is a common ancestor type for all events. * * It is Serializable to allow events to be published and received * in a distributed architecture. * * @author Mauro Talevi */ public interface Event extends Serializable { /** * Returns the event type * @return int representing the event type */ public int getType(); /** * Returns the event source * @return Object representing the event source */ public Object getSource(); } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/EventManager.java Index: EventManager.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; /** * <p>Service to manage event notification. The designed has been inspired by the paper by * Gupta, S., J. M. Hartkopf, and S. Ramaswamy, in Java Report, Vol. 3, No. 7, July 1998, 19-36, * "Event Notifier: A Pattern for Event Notification".</p> * * <p>EventManager brokers events between a <tt>Publisher</tt>, which produces events, * and a <tt>Subscriber</tt>, which handles the notification of events. * A <tt>Filter</tt> discards events not of interest to a subscriber. * All Events have a common ancestor type <tt>Event</tt> and the event types are * identified by a <tt>Class</tt>.</p> * * @author Mauro Talevi */ public interface EventManager { /** * Represents Role of the service */ String ROLE = EventManager.class.getName(); /** * Returns the Publisher with which events can be published. */ public Publisher getPublisher(); /** * Returns the Register with which subscribers can * subscribe and unsubscribe interest to given Events. */ public Register getRegister(); } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/Filter.java Index: Filter.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; import java.io.Serializable; /** * A Filter allows subscribers to specify which events * they should be informed of. * It is Serializable to allow events to be published and received * in a distributed architecture. * * @author Mauro Talevi */ public interface Filter extends Serializable { /** * Filters event, discarding those not of interest to the subscriber. * * @param event the <tt>Event</tt> * @return boolean <code>true</code> if Event passes filter */ public boolean filter( Event event ); } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/Publisher.java Index: Publisher.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; /** * <tt>Publisher</tt> produces or publishes events that are brokered by <tt>EventManager</tt> * and of which the appropriate subscribers are informed of. * * @author Mauro Talevi */ public interface Publisher { /** * Publishes an event for subscribers to be informed of. * * @param event the <tt>Event</tt> being published */ public void publish( Event event ); } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/Register.java Index: Register.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; /** * <tt>Register</tt> allows a <tt>Subscriber</tt> to subscribe to * and unsubscribe from <tt>EventManager</tt>. * * @author Mauro Talevi */ public interface Register { /** * Subscribes a Subscriber to the EventManager. * The Subscriber abstracts all the information needed for the subscription. * @param subscriber the Subscriber * @see Subscriber */ public void subscribe( Subscriber subscriber ); /** * Unsubscribes an Subscriber from the EventManager. * @param subscriber the Subscriber * @see Subscriber */ public void unsubscribe( Subscriber subscriber ); } 1.1 jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/services/event/Subscriber.java Index: Subscriber.java =================================================================== /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE.txt file. */ package org.apache.avalon.cornerstone.services.event; /** * <tt>Subscriber</tt> registers its interest in a class of events and * filters the events of which it should be notified. * * @author Mauro Talevi */ public interface Subscriber { /** * Returns UID (Unique ID) set when the subscriber is created. * The UID is required when the subscriber is remote, since the * <tt>Filter</tt> will in general be deep-copied to a new object. * * @return the String encoding the UID */ public String getUID(); /** * Returns the event type of the event on which the Subscriber is interested. * The event type is encoded by a <tt>Class</tt>. * * @return the <tt>Class</tt> encoding the event type */ public Class getEventType(); /** * Returns the filter used to select the events in which the subscriber is * interested. * * @return the <tt>Filter</tt> */ public Filter getFilter(); /** * Callback method informing the Subscriber of the occurence of an event. * * @param event the <tt>Event</tt> of which the <tt>Subscriber</tt> is informed */ public void inform( Event event ); }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>