    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      http://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017
    018package org.apache.commons.net;
    019import java.util.EventObject;
    020
    021/**
    022 * There exists a large class of IETF protocols that work by sending an
    023 * ASCII text command and arguments to a server, and then receiving an
    024 * ASCII text reply.  For debugging and other purposes, it is extremely
    025 * useful to log or keep track of the contents of the protocol messages.
    026 * The ProtocolCommandEvent class coupled with the
    027 * {@link org.apache.commons.net.ProtocolCommandListener}
    028 *  interface facilitate this process.
    029 *
    030 *
    031 * @see ProtocolCommandListener
    032 * @see ProtocolCommandSupport
    033 */
    034
    035public class ProtocolCommandEvent extends EventObject
    036{
    037    private static final long serialVersionUID = 403743538418947240L;
    038
    039    private final int replyCode;
    040    private final boolean isCommand;
    041    private final String message, command;
    042
    043    /**
    044     * Creates a ProtocolCommandEvent signalling a command was sent to
    045     * the server.  ProtocolCommandEvents created with this constructor
    046     * should only be sent after a command has been sent, but before the
    047     * reply has been received.
    048     *
    049     * @param source  The source of the event.
    050     * @param command The string representation of the command type sent, not
    051     *      including the arguments (e.g., "STAT" or "GET").
    052     * @param message The entire command string verbatim as sent to the server,
    053     *        including all arguments.
    054     */
    055    public ProtocolCommandEvent(final Object source, final String command, final String message)
    056    {
    057        super(source);
    058        this.replyCode = 0;
    059        this.message = message;
    060        this.isCommand = true;
    061        this.command = command;
    062    }
    063
    064
    065    /**
    066     * Creates a ProtocolCommandEvent signalling a reply to a command was
    067     * received.  ProtocolCommandEvents created with this constructor
    068     * should only be sent after a complete command reply has been received
    069     * fromt a server.
    070     *
    071     * @param source  The source of the event.
    072     * @param replyCode The integer code indicating the natureof the reply.
    073     *   This will be the protocol integer value for protocols
    074     *   that use integer reply codes, or the reply class constant
    075     *   corresponding to the reply for protocols like POP3 that use
    076     *   strings like OK rather than integer codes (i.e., POP3Repy.OK).
    077     * @param message The entire reply as received from the server.
    078     */
    079    public ProtocolCommandEvent(final Object source, final int replyCode, final String message)
    080    {
    081        super(source);
    082        this.replyCode = replyCode;
    083        this.message = message;
    084        this.isCommand = false;
    085        this.command = null;
    086    }
    087
    088    /**
    089     * Returns the string representation of the command type sent (e.g., "STAT"
    090     * or "GET").  If the ProtocolCommandEvent is a reply event, then null
    091     * is returned.
    092     *
    093     * @return The string representation of the command type sent, or null
    094     *         if this is a reply event.
    095     */
    096    public String getCommand()
    097    {
    098        return command;
    099    }
    100
    101
    102    /**
    103     * Returns the reply code of the received server reply.  Undefined if
    104     * this is not a reply event.
    105     *
    106     * @return The reply code of the received server reply.  Undefined if
    107     *         not a reply event.
    108     */
    109    public int getReplyCode()
    110    {
    111        return replyCode;
    112    }
    113
    114    /**
    115     * Returns true if the ProtocolCommandEvent was generated as a result
    116     * of sending a command.
    117     *
    118     * @return true If the ProtocolCommandEvent was generated as a result
    119     * of sending a command.  False otherwise.
    120     */
    121    public boolean isCommand()
    122    {
    123        return isCommand;
    124    }
    125
    126    /**
    127     * Returns true if the ProtocolCommandEvent was generated as a result
    128     * of receiving a reply.
    129     *
    130     * @return true If the ProtocolCommandEvent was generated as a result
    131     * of receiving a reply.  False otherwise.
    132     */
    133    public boolean isReply()
    134    {
    135        return !isCommand();
    136    }
    137
    138    /**
    139     * Returns the entire message sent to or received from the server.
    140     * Includes the line terminator.
    141     *
    142     * @return The entire message sent to or received from the server.
    143     */
    144    public String getMessage()
    145    {
    146        return message;
    147    }
    148}