001: /*
002: * Copyright 2001-2005 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of 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,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.net.io;
017:
018: import java.util.Enumeration;
019: import org.apache.commons.net.util.ListenerList;
020:
021: /**
022: * The CopyStreamAdapter will relay CopyStreamEvents to a list of listeners
023: * when either of its bytesTransferred() methods are called. Its purpose
024: * is to facilitate the notification of the progress of a copy operation
025: * performed by one of the static copyStream() methods in
026: * org.apache.commons.io.Util to multiple listeners. The static
027: * copyStream() methods invoke the
028: * bytesTransfered(long, int) of a CopyStreamListener for performance
029: * reasons and also because multiple listeners cannot be registered given
030: * that the methods are static.
031: * <p>
032: * <p>
033: * @see CopyStreamEvent
034: * @see CopyStreamListener
035: * @see Util
036: * @author <a href="mailto:savarese@apache.org">Daniel F. Savarese</a>
037: * @version $Id: CopyStreamAdapter.java 165675 2005-05-02 20:09:55Z rwinston $
038: */
039: public class CopyStreamAdapter implements CopyStreamListener {
040: private ListenerList internalListeners;
041:
042: /**
043: * Creates a new copyStreamAdapter.
044: */
045: public CopyStreamAdapter() {
046: internalListeners = new ListenerList();
047: }
048:
049: /**
050: * This method is invoked by a CopyStreamEvent source after copying
051: * a block of bytes from a stream. The CopyStreamEvent will contain
052: * the total number of bytes transferred so far and the number of bytes
053: * transferred in the last write. The CopyStreamAdapater will relay
054: * the event to all of its registered listeners, listing itself as the
055: * source of the event.
056: * @param event The CopyStreamEvent fired by the copying of a block of
057: * bytes.
058: */
059: public void bytesTransferred(CopyStreamEvent event) {
060: bytesTransferred(event.getTotalBytesTransferred(), event
061: .getBytesTransferred(), event.getStreamSize());
062: }
063:
064: /**
065: * This method is not part of the JavaBeans model and is used by the
066: * static methods in the org.apache.commons.io.Util class for efficiency.
067: * It is invoked after a block of bytes to inform the listener of the
068: * transfer. The CopyStreamAdapater will create a CopyStreamEvent
069: * from the arguments and relay the event to all of its registered
070: * listeners, listing itself as the source of the event.
071: * @param totalBytesTransferred The total number of bytes transferred
072: * so far by the copy operation.
073: * @param bytesTransferred The number of bytes copied by the most recent
074: * write.
075: * @param streamSize The number of bytes in the stream being copied.
076: * This may be equal to CopyStreamEvent.UNKNOWN_STREAM_SIZE if
077: * the size is unknown.
078: */
079: public void bytesTransferred(long totalBytesTransferred,
080: int bytesTransferred, long streamSize) {
081: Enumeration listeners;
082: CopyStreamEvent event;
083:
084: listeners = internalListeners.getListeners();
085:
086: event = new CopyStreamEvent(this , totalBytesTransferred,
087: bytesTransferred, streamSize);
088:
089: while (listeners.hasMoreElements()) {
090: ((CopyStreamListener) (listeners.nextElement()))
091: .bytesTransferred(event);
092: }
093: }
094:
095: /**
096: * Registers a CopyStreamListener to receive CopyStreamEvents.
097: * Although this method is not declared to be synchronized, it is
098: * implemented in a thread safe manner.
099: * @param listener The CopyStreamlistener to register.
100: */
101: public void addCopyStreamListener(CopyStreamListener listener) {
102: internalListeners.addListener(listener);
103: }
104:
105: /**
106: * Unregisters a CopyStreamListener. Although this method is not
107: * synchronized, it is implemented in a thread safe manner.
108: * @param listener The CopyStreamlistener to unregister.
109: */
110: public void removeCopyStreamListener(CopyStreamListener listener) {
111: internalListeners.removeListener(listener);
112: }
113: }
|