001 /*
002 * Copyright 2002-2006 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.application.support;
017
018 import java.util.ArrayList;
019 import java.util.Iterator;
020
021 import org.springframework.context.ApplicationEvent;
022 import org.springframework.context.ApplicationListener;
023
024 /**
025 * This class is responsible for re-dispatching application events to a collection of
026 * additional registered listeners. This is needed due to the way that the application
027 * context handles the ApplicationListener tag interface. For any beans that are
028 * prototypes, one instance will be registered as an ApplicationListener and all the
029 * others will not. Further, there is no mechanism to get a reference to the context's
030 * event dispatcher to add listeners at runtime.
031 * <p>
032 * By defining a bean with this type in the context, it will be added as a typical event
033 * listener. Then, this dispatcher can be set on any other bean (including prototypes)
034 * that need to be added to the event mechanism. In order to wire it all together, any
035 * object that wants to register for events simply defines a property of type
036 * ApplicationEventDispatcher and in the property setter method, call the
037 * {@link #addListener(ApplicationListener)} method on itself (or a delegate handler).
038 * Like this:
039 *
040 * <pre>
041 * public void setApplicationEventRedispatcher( ApplicationEventRedispatcher dispatcher ) {
042 * dispatcher.addListener(this);
043 * }
044 * </pre>
045 *
046 * @author Larry Streepy
047 *
048 */
049 public class ApplicationEventRedispatcher implements ApplicationListener {
050
051 /** Our list of delegates to dispatch events to. */
052 private ArrayList delegates = new ArrayList();
053
054 /**
055 * Handle an application event, dispatch it to all our delegates.
056 *
057 * @param event to dispatch
058 */
059 public void onApplicationEvent( ApplicationEvent event ) {
060 Iterator iter = delegates.iterator();
061 while( iter.hasNext() ) {
062 ((ApplicationListener) iter.next()).onApplicationEvent(event);
063 }
064 }
065
066 /**
067 * Add a listener to our set.
068 *
069 * @param l Listener to add
070 */
071 public void addListener( ApplicationListener l ) {
072 delegates.add(l);
073 }
074
075 /**
076 * Remove a listener from our set.
077 *
078 * @param l Listener to remove
079 */
080 public void removeListener( ApplicationListener l ) {
081 delegates.remove(l);
082 }
083 }