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