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