    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 *      https://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.imap;
    019
    020/**
    021 * IMAPCommand stores IMAP command codes.
    022 */
    023public enum IMAPCommand {
    024    // These enums must either use the same name as the IMAP command
    025    // or must provide the correct string as the parameter.
    026
    027    /**
    028     * Valid in any state.
    029     */
    030    CAPABILITY(0),
    031
    032    /**
    033     * Valid in any state.
    034     */
    035    NOOP(0),
    036
    037    /**
    038     * Valid in any state.
    039     */
    040    LOGOUT(0),
    041
    042    /**
    043     * Valid in Not Authenticated state.
    044     */
    045    STARTTLS(0),
    046
    047    /**
    048     * Valid in Not Authenticated state.
    049     */
    050    AUTHENTICATE(1),
    051
    052    /**
    053     * Valid in Not Authenticated state.
    054     */
    055    LOGIN(2),
    056
    057    /**
    058     * Authenticate an IMAP connection using OAuth.
    059     */
    060    XOAUTH(1),
    061
    062    /**
    063     * Valid in authenticated state.
    064     */
    065    SELECT(1),
    066
    067    /**
    068     * Valid in authenticated state.
    069     */
    070    EXAMINE(1),
    071
    072    /**
    073     * Valid in authenticated state.
    074     */
    075    CREATE(1),
    076
    077    /**
    078     * Valid in authenticated state.
    079     */
    080    DELETE(1),
    081
    082    /**
    083     * Valid in authenticated state.
    084     */
    085    RENAME(2),
    086
    087    /**
    088     * Valid in authenticated state.
    089     */
    090    SUBSCRIBE(1),
    091
    092    /**
    093     * Valid in authenticated state.
    094     */
    095    UNSUBSCRIBE(1),
    096
    097    /**
    098     * Valid in authenticated state.
    099     */
    100    LIST(2),
    101
    102    /**
    103     * Valid in authenticated state.
    104     */
    105    LSUB(2),
    106
    107    /**
    108     * Valid in authenticated state.
    109     */
    110    STATUS(2), // P2 = list in ()
    111
    112    /**
    113     * Valid in authenticated state.
    114     */
    115    APPEND(2, 4), // mbox [(flags)] [date-time] literal
    116
    117    /**
    118     * Valid in selected state (substate of authenticated).
    119     */
    120    CHECK(0),
    121
    122    /**
    123     * Valid in selected state (substate of authenticated).
    124     */
    125    CLOSE(0),
    126
    127    /**
    128     * Valid in selected state (substate of authenticated).
    129     */
    130    EXPUNGE(0),
    131
    132    /**
    133     * Valid in selected state (substate of authenticated).
    134     */
    135    SEARCH(1, Integer.MAX_VALUE),
    136
    137    /**
    138     * Valid in selected state (substate of authenticated).
    139     */
    140    FETCH(2),
    141
    142    /**
    143     * Valid in selected state (substate of authenticated).
    144     */
    145    STORE(3),
    146
    147    /**
    148     * Valid in selected state (substate of authenticated).
    149     */
    150    COPY(2),
    151
    152    /**
    153     * Valid in selected state (substate of authenticated).
    154     */
    155    UID(2, Integer.MAX_VALUE);
    156
    157    /**
    158     * Gets the IMAP protocol string command corresponding to a command code.
    159     *
    160     * @param command the {@link IMAPCommand} whose command string is required. Must not be null.
    161     * @return The IMAP protocol string command corresponding to a command code.
    162     */
    163    public static String getCommand(final IMAPCommand command) {
    164        return command.getIMAPCommand();
    165    }
    166
    167    private final String imapCommand;
    168
    169    @SuppressWarnings("unused") // not yet used
    170    private final int minParamCount;
    171
    172    @SuppressWarnings("unused") // not yet used
    173    private final int maxParamCount;
    174
    175    IMAPCommand() {
    176        this(null);
    177    }
    178
    179    IMAPCommand(final int paramCount) {
    180        this(null, paramCount, paramCount);
    181    }
    182
    183    IMAPCommand(final int minCount, final int maxCount) {
    184        this(null, minCount, maxCount);
    185    }
    186
    187    IMAPCommand(final String name) {
    188        this(name, 0);
    189    }
    190
    191    IMAPCommand(final String name, final int paramCount) {
    192        this(name, paramCount, paramCount);
    193    }
    194
    195    IMAPCommand(final String name, final int minCount, final int maxCount) {
    196        this.imapCommand = name;
    197        this.minParamCount = minCount;
    198        this.maxParamCount = maxCount;
    199    }
    200
    201    /**
    202     * Gets the IMAP protocol string command for this command
    203     *
    204     * @return The IMAP protocol string command corresponding to this command
    205     */
    206    public String getIMAPCommand() {
    207        return imapCommand != null ? imapCommand : name();
    208    }
    209
    210}
    211