/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.core.designer.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.teiid.core.designer.CoreModelerPlugin;
import org.teiid.core.designer.util.CoreArgCheck;
/**
* @since 8.0
*/
abstract public class AbstractEventSource implements EventSource {
private static final String LISTENER_MAY_NOT_BE_NULL = CoreModelerPlugin.Util.getString("AbstractEventSource.The_event_listener_may_not_be_null"); //$NON-NLS-1$
private static final String EVENT_CLASS_MAY_NOT_BE_NULL = CoreModelerPlugin.Util.getString("AbstractEventSource.The_event_class_may_not_be_null"); //$NON-NLS-1$
Map eventClassListeners = new HashMap(5);
List eventListeners = new ArrayList(5);
@Override
public synchronized void addListener( Class eventClass,
EventObjectListener listener ) {
CoreArgCheck.isNotNull(listener, LISTENER_MAY_NOT_BE_NULL);
CoreArgCheck.isNotNull(eventClass, EVENT_CLASS_MAY_NOT_BE_NULL);
if (!eventClassListeners.containsKey(eventClass)) {
List listenerList = new ArrayList(1);
listenerList.add(listener);
eventClassListeners.put(eventClass, listenerList);
} else {
List listenerList = (List)eventClassListeners.get(eventClass);
if (!listenerList.contains(listener)) {
listenerList.add(listener);
}
}
}
public synchronized void addListener( EventObjectListener listener ) {
CoreArgCheck.isNotNull(listener, LISTENER_MAY_NOT_BE_NULL);
if (!eventListeners.contains(listener)) {
eventListeners.add(listener);
}
}
@Override
public synchronized void removeListener( Class eventClass,
EventObjectListener listener ) {
CoreArgCheck.isNotNull(listener, LISTENER_MAY_NOT_BE_NULL);
CoreArgCheck.isNotNull(eventClass, EVENT_CLASS_MAY_NOT_BE_NULL);
if (eventClassListeners.containsKey(eventClass)) {
List listenerList = (List)eventClassListeners.get(eventClass);
listenerList.remove(listener);
}
}
@Override
public synchronized void removeListener( EventObjectListener listener ) {
CoreArgCheck.isNotNull(listener, LISTENER_MAY_NOT_BE_NULL);
eventListeners.remove(listener);
// Remove the listener from all of the event class listeners ...
Iterator iter = eventClassListeners.values().iterator();
while (iter.hasNext()) {
List listenerList = (List)iter.next();
listenerList.remove(listener);
}
}
public synchronized void removeAllListeners() {
eventClassListeners.clear();
eventListeners.clear();
}
public synchronized List getListeners() {
// Return those listeners that listen to all events ...
return new ArrayList(eventListeners);
}
public synchronized List getAllListeners() {
Set result = new HashSet();
result.addAll(eventListeners);
Iterator iter = eventClassListeners.values().iterator();
while (iter.hasNext()) {
List listenerList = (List)iter.next();
result.addAll(listenerList);
}
return new ArrayList(result);
}
public synchronized List getListeners( Class eventClass ) {
CoreArgCheck.isNotNull(eventClass, EVENT_CLASS_MAY_NOT_BE_NULL);
// Always include those listeners that listen to all events ...
List returnList = new ArrayList(eventListeners);
// Add any those that listen to the specific event class ...
List listeners = (List)eventClassListeners.get(eventClass);
if (listeners != null) {
// Add them one-by-one, so there are no duplicates ...
Object listener = null;
Iterator itr = listeners.iterator();
while (itr.hasNext()) {
listener = itr.next();
if (!returnList.contains(listener)) {
returnList.add(listener);
}
}
}
return returnList;
}
}