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    {
041        private ListenerList internalListeners;
042    
043        /**
044         * Creates a new copyStreamAdapter.
045         */
046        public CopyStreamAdapter()
047        {
048            internalListeners = new ListenerList();
049        }
050    
051        /**
052         * This method is invoked by a CopyStreamEvent source after copying
053         * a block of bytes from a stream.  The CopyStreamEvent will contain
054         * the total number of bytes transferred so far and the number of bytes
055         * transferred in the last write.  The CopyStreamAdapater will relay
056         * the event to all of its registered listeners, listing itself as the
057         * source of the event.
058         * @param event The CopyStreamEvent fired by the copying of a block of
059         *              bytes.
060         */
061        public void bytesTransferred(CopyStreamEvent event)
062        {
063            bytesTransferred(event.getTotalBytesTransferred(),
064                             event.getBytesTransferred(),
065                             event.getStreamSize());
066        }
067    
068        /**
069         * This method is not part of the JavaBeans model and is used by the
070         * static methods in the org.apache.commons.io.Util class for efficiency.
071         * It is invoked after a block of bytes to inform the listener of the
072         * transfer.  The CopyStreamAdapater will create a CopyStreamEvent
073         * from the arguments and relay the event to all of its registered
074         * listeners, listing itself as the source of the event.
075         * @param totalBytesTransferred  The total number of bytes transferred
076         *         so far by the copy operation.
077         * @param bytesTransferred  The number of bytes copied by the most recent
078         *          write.
079         * @param streamSize The number of bytes in the stream being copied.
080         *        This may be equal to CopyStreamEvent.UNKNOWN_STREAM_SIZE if
081         *        the size is unknown.
082         */
083        public void bytesTransferred(long totalBytesTransferred,
084                                     int bytesTransferred, long streamSize)
085        {
086            Enumeration listeners;
087            CopyStreamEvent event;
088    
089            listeners = internalListeners.getListeners();
090    
091            event = new CopyStreamEvent(this,
092                                        totalBytesTransferred,
093                                        bytesTransferred,
094                                        streamSize);
095    
096            while (listeners.hasMoreElements())
097            {
098                ((CopyStreamListener) (listeners.nextElement())).
099                    bytesTransferred(event);
100            }
101        }
102    
103        /**
104         * Registers a CopyStreamListener to receive CopyStreamEvents.
105         * Although this method is not declared to be synchronized, it is
106         * implemented in a thread safe manner.
107         * @param listener  The CopyStreamlistener to register.
108         */
109        public void addCopyStreamListener(CopyStreamListener listener)
110        {
111            internalListeners.addListener(listener);
112        }
113    
114        /**
115         * Unregisters a CopyStreamListener.  Although this method is not
116         * synchronized, it is implemented in a thread safe manner.
117         * @param listener  The CopyStreamlistener to unregister.
118         */
119        public void removeCopyStreamListener(CopyStreamListener listener)
120        {
121            internalListeners.removeListener(listener);
122        }
123    }