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
018 package org.apache.geronimo.javamail.store.imap.connection;
019
020 import java.util.List;
021
022 import javax.mail.Flags;
023 import javax.mail.Folder;
024 import javax.mail.MessagingException;
025
026 import org.apache.geronimo.javamail.store.imap.connection.IMAPResponseTokenizer.Token;
027
028
029 /**
030 * Utility class to aggregate status responses for a mailbox.
031 */
032 public class IMAPMailboxStatus {
033 // the set of available flag values for this mailbox
034 public Flags availableFlags = null;
035 // the permanent flags for this mailbox.
036 public Flags permanentFlags = null;
037 // the open mode flags
038 public int mode = Folder.READ_WRITE;
039
040 // number of messages in the box
041 public int messages = -1;
042 // the number of newly added messages
043 public int recentMessages = -1;
044 // the number of unseen messages
045 public int unseenMessages = -1;
046
047 // the next UID for this mailbox
048 public long uidNext = -1L;
049 // the UID validity item
050 public long uidValidity = -1L;
051
052 public IMAPMailboxStatus() {
053 }
054
055
056 /**
057 * Merge information from a server status message. These
058 * messages are in the form "* NAME args". We only handle
059 * STATUS and FLAGS messages here.
060 *
061 * @param source The parsed status message.
062 *
063 * @exception MessagingException
064 */
065 public void mergeStatus(IMAPStatusResponse source) throws MessagingException {
066 // update any of the values that have changed since the last.
067 if (source.messages != -1) {
068 messages = source.messages;
069 }
070 if (source.uidNext != -1L) {
071 uidNext = source.uidNext;
072 }
073 if (source.uidValidity != -1L) {
074 uidValidity = source.uidValidity;
075 }
076 if (source.recentMessages != -1) {
077 recentMessages = source.recentMessages;
078 }
079 if (source.unseenMessages != -1) {
080 unseenMessages = source.unseenMessages;
081 }
082 }
083
084 /**
085 * Merge in the FLAGS response from an EXAMINE or
086 * SELECT mailbox command.
087 *
088 * @param response The returned FLAGS item.
089 *
090 * @exception MessagingException
091 */
092 public void mergeFlags(IMAPFlagsResponse response) throws MessagingException {
093 if (response != null) {
094 availableFlags = response.getFlags();
095 }
096 }
097
098
099 public void mergeSizeResponses(List responses) throws MessagingException
100 {
101 for (int i = 0; i < responses.size(); i++) {
102 mergeStatus((IMAPSizeResponse)responses.get(i));
103 }
104 }
105
106
107 public void mergeOkResponses(List responses) throws MessagingException {
108 for (int i = 0; i < responses.size(); i++) {
109 mergeStatus((IMAPOkResponse)responses.get(i));
110 }
111 }
112
113
114 /**
115 * Gather mailbox status information from mailbox status
116 * messages. These messages come in as untagged messages in the
117 * form "* nnn NAME".
118 *
119 * @param source The parse message information.
120 *
121 * @exception MessagingException
122 */
123 public void mergeStatus(IMAPSizeResponse source) throws MessagingException {
124 if (source != null) {
125 String name = source.getKeyword();
126
127 // untagged exists response
128 if (source.isKeyword("EXISTS")) {
129 messages = source.getSize();
130 }
131 // untagged resent response
132 else if (source.isKeyword("RECENT")) {
133 recentMessages = source.getSize();
134 }
135 }
136 }
137
138
139
140
141 /**
142 * Gather mailbox status information from mailbox status
143 * messages. These messages come in as untagged messages in the
144 * form "* OK [NAME args]".
145 *
146 * @param source The parse message information.
147 *
148 * @exception MessagingException
149 */
150 public void mergeStatus(IMAPOkResponse source) throws MessagingException {
151 if (source != null) {
152 String name = source.getKeyword();
153
154 // untagged UIDVALIDITY response
155 if (source.isKeyword("UIDVALIDITY")) {
156 List arguments = source.getStatus();
157 uidValidity = ((Token)arguments.get(0)).getLong();
158 }
159 // untagged UIDNEXT response
160 if (source.isKeyword("UIDNEXT")) {
161 List arguments = source.getStatus();
162 uidNext = ((Token)arguments.get(0)).getLong();
163 }
164 // untagged unseen response
165 else if (source.isKeyword("UNSEEN")) {
166 List arguments = source.getStatus();
167 uidValidity = ((Token)arguments.get(0)).getInteger();
168 }
169 }
170 }
171
172
173 /**
174 * Gather mailbox status information from mailbox status
175 * messages. These messages come in as untagged messages in the
176 * form "* OK [NAME args]".
177 *
178 * @param source The parse message information.
179 *
180 * @exception MessagingException
181 */
182 public void mergeStatus(IMAPPermanentFlagsResponse source) throws MessagingException {
183 if (source != null) {
184 // this is already parsed.
185 permanentFlags = source.flags;
186 }
187 }
188 }