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