/***************************************************************************** * 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); } } }