1345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/*
2345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Copyright (C) 2008 The Android Open Source Project
3345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
4345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
5345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * you may not use this file except in compliance with the License.
6345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * You may obtain a copy of the License at
7345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
8345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
9345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein *
10345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software
11345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
12345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * See the License for the specific language governing permissions and
14345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * limitations under the License.
15345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */
16345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
17345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpackage com.android.emailcommon.mail;
18345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
1948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport android.content.Context;
2048360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
21345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.android.emailcommon.service.SearchParams;
22345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.google.common.annotations.VisibleForTesting;
23345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
24345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
25345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpublic abstract class Folder {
26345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public enum OpenMode {
27345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        READ_WRITE, READ_ONLY,
28345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
29345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
30345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public enum FolderType {
31345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        HOLDS_FOLDERS, HOLDS_MESSAGES,
32345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
33345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
34345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
35345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Identifiers of "special" folders.
36345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
37345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public enum FolderRole {
38345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        INBOX,      // NOTE:  The folder's name must be INBOX
39345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        TRASH,
40345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        SENT,
41345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        DRAFTS,
42345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
43345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        OUTBOX,     // Local folders only - not used in remote Stores
44345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        OTHER,      // this folder has no specific role
45345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        UNKNOWN     // the role of this folder is unknown
46345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
47345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
48345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
49345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Callback for each message retrieval.
50345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *
51345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Not all {@link Folder} implementations may invoke it.
52345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
53345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public interface MessageRetrievalListener {
54345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        public void messageRetrieved(Message message);
55345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        public void loadAttachmentProgress(int progress);
56345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
57345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
58345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
59345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Forces an open of the MailProvider. If the provider is already open this
60345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * function returns without doing anything.
61345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *
62345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param mode READ_ONLY or READ_WRITE
63345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param callbacks Pointer to callbacks class.  This may be used by the folder between this
64345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * time and when close() is called.  This is only used for remote stores - should be null
65345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * for LocalStore.LocalFolder.
66345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
67345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void open(OpenMode mode)
68345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
69345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
70345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
71345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Forces a close of the MailProvider. Any further access will attempt to
72345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * reopen the MailProvider.
73345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *
74345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param expunge If true all deleted messages will be expunged.
75345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
7690660b081cb9eafd333c31ef58bd85f86d485152Yu Ping Hu    public abstract void close(boolean expunge);
77345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
78345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
79345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return True if further commands are not expected to have to open the
80345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *         connection.
81345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
82345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    @VisibleForTesting
83345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract boolean isOpen();
84345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
85345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
86345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Returns the mode the folder was opened with. This may be different than the mode the open
87345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * was requested with.
88345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
89345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract OpenMode getMode() throws MessagingException;
90345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
91345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
92345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Reports if the Store is able to create folders of the given type.
93345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Does not actually attempt to create a folder.
94345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param type
95345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return true if can create, false if cannot create
96345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
97345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract boolean canCreate(FolderType type);
98345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
99345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
100345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Attempt to create the given folder remotely using the given type.
101345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return true if created, false if cannot create (e.g. server side)
102345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
103345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract boolean create(FolderType type) throws MessagingException;
104345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
105345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract boolean exists() throws MessagingException;
106345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
107345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
108345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Returns the number of messages in the selected folder.
109345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
110345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract int getMessageCount() throws MessagingException;
111345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
112345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract int getUnreadMessageCount() throws MessagingException;
113345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
114345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message getMessage(String uid) throws MessagingException;
115345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
116345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
117345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Fetches the given list of messages. The specified listener is notified as
118345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * each fetch completes. Messages are downloaded as (as) lightweight (as
119345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * possible) objects to be filled in with later requests. In most cases this
120345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * means that only the UID is downloaded.
121345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
122345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message[] getMessages(int start, int end, MessageRetrievalListener listener)
123345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
124345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
1258a065b8843de18c41019967790a42d2c08bdd99cMartin Hibdon    public abstract Message[] getMessages(long startDate, long endDate, MessageRetrievalListener listener)
1268a065b8843de18c41019967790a42d2c08bdd99cMartin Hibdon            throws MessagingException;
1278a065b8843de18c41019967790a42d2c08bdd99cMartin Hibdon
128345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message[] getMessages(SearchParams params,MessageRetrievalListener listener)
129345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
130345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
131345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message[] getMessages(String[] uids, MessageRetrievalListener listener)
132345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
133345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
134345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
135345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Return a set of messages based on the state of the flags.
136345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Note: Not typically implemented in remote stores, so not abstract.
137345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *
138345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param setFlags The flags that should be set for a message to be selected (can be null)
139345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param clearFlags The flags that should be clear for a message to be selected (can be null)
140345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @param listener
141345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return A list of messages matching the desired flag states.
142345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @throws MessagingException
143345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
144345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public Message[] getMessages(Flag[] setFlags, Flag[] clearFlags,
145345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            MessageRetrievalListener listener) throws MessagingException {
146345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        throw new MessagingException("Not implemented");
147345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
148345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
14948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    public abstract void appendMessage(Context context, Message message, final boolean noTimeout)
15048360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler            throws MessagingException;
151345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
152345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
153345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Copies the given messages to the destination folder.
154345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
155345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void copyMessages(Message[] msgs, Folder folder,
156345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            MessageUpdateCallbacks callbacks) throws MessagingException;
157345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
158345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void setFlags(Message[] messages, Flag[] flags, boolean value)
159345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            throws MessagingException;
160345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
161345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message[] expunge() throws MessagingException;
162345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
163345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void fetch(Message[] messages, FetchProfile fp,
164345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein            MessageRetrievalListener listener) throws MessagingException;
165345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
166345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract void delete(boolean recurse) throws MessagingException;
167345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
168345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract String getName();
169345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
170345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Flag[] getPermanentFlags() throws MessagingException;
171345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
172345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
173345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * This method returns a string identifying the name of a "role" folder
174345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * (such as inbox, draft, sent, or trash).  Stores that do not implement this
175345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * feature can be used - the account UI will provide default strings.  To
176345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * let the server identify specific folder roles, simply override this method.
177345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     *
178345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * @return The server- or protocol- specific role for this folder.  If some roles are known
179345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * but this is not one of them, return FolderRole.OTHER.  If roles are unsupported here,
180345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * return FolderRole.UNKNOWN.
181345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
182345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public FolderRole getRole() {
183345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return FolderRole.UNKNOWN;
184345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
185345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
186345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
187345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Create an empty message of the appropriate type for the Folder.
188345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
189345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public abstract Message createMessage(String uid) throws MessagingException;
190345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
191345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    /**
192345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     * Callback interface by which a folder can report UID changes caused by certain operations.
193345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein     */
194345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public interface MessageUpdateCallbacks {
195345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
196345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * The operation caused the message's UID to change
197345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * @param message The message for which the UID changed
198345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * @param newUid The new UID for the message
199345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
200345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        public void onMessageUidChange(Message message, String newUid) throws MessagingException;
201345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
202345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        /**
203345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * The operation could not be completed because the message doesn't exist
204345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * (for example, it was already deleted from the server side.)
205345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * @param message The message that does not exist
206345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         * @throws MessagingException
207345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein         */
208345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        public void onMessageNotFound(Message message) throws MessagingException;
209345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
210345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein
211345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    @Override
212345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    public String toString() {
213345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein        return getName();
214345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein    }
215345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein}
216