blob: 6a96e732d4caec2570f94ab4805de4d51ee34fcf [file] [log] [blame]
/*****************************************************************************
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License Version
* 1.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is available at http://www.sun.com/
*
* The Original Code is the CVS Client Library.
* The Initial Developer of the Original Code is Robert Greig.
* Portions created by Robert Greig are Copyright (C) 2000.
* All Rights Reserved.
*
* Contributor(s): Robert Greig.
*****************************************************************************/
package org.netbeans.lib.cvsclient.event;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.file.DirectoryObject;
import org.netbeans.lib.cvsclient.file.FileObject;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.io.UnsupportedEncodingException;
/**
* This class is responsible for firing CVS events to registered listeners.
* It can either fire events as they are generated or wait until a suitable
* checkpoint and fire many events at once. This can prevent event storms
* from degrading system performance.
* @author Robert Greig
*/
public final class EventManager
implements IEventSender, ICvsListenerRegistry {
// Fields =================================================================
private final List terminationListeners = new ArrayList();
private final List messageListener = new ArrayList();
private final List moduleExpansionListeners = new ArrayList();
private final List fileInfoListeners = new ArrayList();
private final List entryListeners = new ArrayList();
private final List directoryListeners = new ArrayList();
private final String myCharset;
// Setup ==================================================================
public EventManager(String charset) {
myCharset = charset;
}
// Accessing ==============================================================
public synchronized void addTerminationListener(ITerminationListener listener) {
terminationListeners.add(listener);
}
public synchronized void removeTerminationListener(ITerminationListener listener) {
terminationListeners.remove(listener);
}
public synchronized void addMessageListener(IMessageListener listener) {
messageListener.add(listener);
}
public synchronized void removeMessageListener(IMessageListener listener) {
messageListener.remove(listener);
}
public synchronized void addModuleExpansionListener(IModuleExpansionListener listener) {
moduleExpansionListeners.add(listener);
}
public synchronized void removeModuleExpansionListener(IModuleExpansionListener listener) {
moduleExpansionListeners.remove(listener);
}
public void addEntryListener(IEntryListener listener) {
entryListeners.add(listener);
}
public void removeEntryListener(IEntryListener listener) {
entryListeners.remove(listener);
}
public synchronized void addFileInfoListener(IFileInfoListener listener) {
fileInfoListeners.add(listener);
}
public synchronized void removeFileInfoListener(IFileInfoListener listener) {
fileInfoListeners.remove(listener);
}
public synchronized void addDirectoryListener(IDirectoryListener listener) {
directoryListeners.add(listener);
}
public synchronized void removeDirectoryListener(IDirectoryListener listener) {
directoryListeners.remove(listener);
}
// Actions ================================================================
public void notifyTerminationListeners(boolean error) {
final ITerminationListener[] copiedListeners;
synchronized (this) {
if (terminationListeners.size() == 0) {
return;
}
copiedListeners = new ITerminationListener[terminationListeners.size()];
terminationListeners.toArray(copiedListeners);
}
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].commandTerminated(error);
}
}
public void notifyMessageListeners(byte[] message, boolean error, boolean tagged) {
final IMessageListener[] copiedListeners;
synchronized (this) {
if (messageListener.size() == 0) {
return;
}
copiedListeners = new IMessageListener[messageListener.size()];
messageListener.toArray(copiedListeners);
}
try {
String stringMessage = new String(message, myCharset);
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].messageSent(stringMessage, message, error, tagged);
}
}
catch (UnsupportedEncodingException e) {
//
}
}
public void notifyModuleExpansionListeners(String module) {
final IModuleExpansionListener[] copiedListeners;
synchronized (this) {
if (moduleExpansionListeners.size() == 0) {
return;
}
copiedListeners = new IModuleExpansionListener[moduleExpansionListeners.size()];
moduleExpansionListeners.toArray(copiedListeners);
}
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].moduleExpanded(module);
}
}
public void notifyFileInfoListeners(Object fileInfoContainer) {
final IFileInfoListener[] copiedListeners;
synchronized (this) {
if (fileInfoListeners.size() == 0) {
return;
}
copiedListeners = new IFileInfoListener[fileInfoListeners.size()];
fileInfoListeners.toArray(copiedListeners);
}
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].fileInfoGenerated(fileInfoContainer);
}
}
public void notifyFileInfoListeners(byte[] bytes) {
final IMessageListener[] copiedListeners;
synchronized (this) {
if (messageListener.size() == 0) {
return;
}
copiedListeners = new IMessageListener[messageListener.size()];
messageListener.toArray(copiedListeners);
}
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].binaryMessageSent(bytes);
}
}
public void notifyEntryListeners(FileObject fileObject, Entry entry) {
final IEntryListener[] copiedListeners;
synchronized (this) {
if (entryListeners.size() == 0) {
return;
}
copiedListeners = new IEntryListener[entryListeners.size()];
entryListeners.toArray(copiedListeners);
}
for (int i = 0; i < copiedListeners.length; i++) {
copiedListeners[i].gotEntry(fileObject, entry);
}
}
public void notifyDirectoryListeners(DirectoryObject directoryObject, boolean setStatic) {
for (Iterator it = directoryListeners.iterator(); it.hasNext();) {
final IDirectoryListener directoryListener = (IDirectoryListener)it.next();
directoryListener.processingDirectory(directoryObject);
}
}
}