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;
017    
018    import java.io.Serializable;
019    import java.util.Enumeration;
020    import org.apache.commons.net.util.ListenerList;
021    
022    /***
023     * ProtocolCommandSupport is a convenience class for managing a list of
024     * ProtocolCommandListeners and firing ProtocolCommandEvents.  You can
025     * simply delegate ProtocolCommandEvent firing and listener
026     * registering/unregistering tasks to this class.
027     * <p>
028     * <p>
029     * @see ProtocolCommandEvent
030     * @see ProtocolCommandListener
031     * @author Daniel F. Savarese
032     ***/
033    
034    public class ProtocolCommandSupport implements Serializable
035    {
036        private Object __source;
037        private ListenerList __listeners;
038    
039        /***
040         * Creates a ProtocolCommandSupport instant using the indicated source
041         * as the source of fired ProtocolCommandEvents.
042         * <p>
043         * @param source  The source to use for all generated ProtocolCommandEvents.
044         ***/
045        public ProtocolCommandSupport(Object source)
046        {
047            __listeners = new ListenerList();
048            __source = source;
049        }
050    
051    
052        /***
053         * Fires a ProtocolCommandEvent signalling the sending of a command to all
054         * registered listeners, invoking their
055         * {@link org.apache.commons.net.ProtocolCommandListener#protocolCommandSent protocolCommandSent() }
056         *  methods.
057         * <p>
058         * @param command The string representation of the command type sent, not
059         *      including the arguments (e.g., "STAT" or "GET").
060         * @param message The entire command string verbatim as sent to the server,
061         *        including all arguments.
062         ***/
063        public void fireCommandSent(String command, String message)
064        {
065            Enumeration en;
066            ProtocolCommandEvent event;
067            ProtocolCommandListener listener;
068    
069            en = __listeners.getListeners();
070    
071            event = new ProtocolCommandEvent(__source, command, message);
072    
073            while (en.hasMoreElements())
074            {
075                listener = (ProtocolCommandListener)en.nextElement();
076                listener.protocolCommandSent(event);
077            }
078        }
079    
080        /***
081         * Fires a ProtocolCommandEvent signalling the reception of a command reply
082         * to all registered listeners, invoking their
083         * {@link org.apache.commons.net.ProtocolCommandListener#protocolReplyReceived protocolReplyReceived() }
084         *  methods.
085         * <p>
086         * @param replyCode The integer code indicating the natureof the reply.
087         *   This will be the protocol integer value for protocols
088         *   that use integer reply codes, or the reply class constant
089         *   corresponding to the reply for protocols like POP3 that use
090         *   strings like OK rather than integer codes (i.e., POP3Repy.OK).
091         * @param message The entire reply as received from the server.
092         ***/
093        public void fireReplyReceived(int replyCode, String message)
094        {
095            Enumeration en;
096            ProtocolCommandEvent event;
097            ProtocolCommandListener listener;
098    
099            en = __listeners.getListeners();
100    
101            event = new ProtocolCommandEvent(__source, replyCode, message);
102    
103            while (en.hasMoreElements())
104            {
105                listener = (ProtocolCommandListener)en.nextElement();
106                listener.protocolReplyReceived(event);
107            }
108        }
109    
110        /***
111         * Adds a ProtocolCommandListener.
112         * <p>
113         * @param listener  The ProtocolCommandListener to add.
114         ***/
115        public void addProtocolCommandListener(ProtocolCommandListener listener)
116        {
117            __listeners.addListener(listener);
118        }
119    
120        /***
121         * Removes a ProtocolCommandListener.
122         * <p>
123         * @param listener  The ProtocolCommandListener to remove.
124         ***/
125        public void removeProtocolCommandListener(ProtocolCommandListener listener)
126        {
127            __listeners.removeListener(listener);
128        }
129    
130    
131        /***
132         * Returns the number of ProtocolCommandListeners currently registered.
133         * <p>
134         * @return The number of ProtocolCommandListeners currently registered.
135         ***/
136        public int getListenerCount()
137        {
138            return __listeners.getListenerCount();
139        }
140    
141    }
142