15c523858385176c33a7456bb84035de78552d22dMarc Blank/* 25c523858385176c33a7456bb84035de78552d22dMarc Blank * Copyright (C) 2010 The Android Open Source Project 35c523858385176c33a7456bb84035de78552d22dMarc Blank * 45c523858385176c33a7456bb84035de78552d22dMarc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 55c523858385176c33a7456bb84035de78552d22dMarc Blank * you may not use this file except in compliance with the License. 65c523858385176c33a7456bb84035de78552d22dMarc Blank * You may obtain a copy of the License at 75c523858385176c33a7456bb84035de78552d22dMarc Blank * 85c523858385176c33a7456bb84035de78552d22dMarc Blank * http://www.apache.org/licenses/LICENSE-2.0 95c523858385176c33a7456bb84035de78552d22dMarc Blank * 105c523858385176c33a7456bb84035de78552d22dMarc Blank * Unless required by applicable law or agreed to in writing, software 115c523858385176c33a7456bb84035de78552d22dMarc Blank * distributed under the License is distributed on an "AS IS" BASIS, 125c523858385176c33a7456bb84035de78552d22dMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c523858385176c33a7456bb84035de78552d22dMarc Blank * See the License for the specific language governing permissions and 145c523858385176c33a7456bb84035de78552d22dMarc Blank * limitations under the License. 155c523858385176c33a7456bb84035de78552d22dMarc Blank */ 165c523858385176c33a7456bb84035de78552d22dMarc Blank 175c523858385176c33a7456bb84035de78552d22dMarc Blankpackage com.android.email.mail.store.imap; 185c523858385176c33a7456bb84035de78552d22dMarc Blank 195c523858385176c33a7456bb84035de78552d22dMarc Blank/** 205c523858385176c33a7456bb84035de78552d22dMarc Blank * Class representing "element"s in IMAP responses. 215c523858385176c33a7456bb84035de78552d22dMarc Blank * 225c523858385176c33a7456bb84035de78552d22dMarc Blank * <p>Class hierarchy: 235c523858385176c33a7456bb84035de78552d22dMarc Blank * <pre> 245c523858385176c33a7456bb84035de78552d22dMarc Blank * ImapElement 255c523858385176c33a7456bb84035de78552d22dMarc Blank * | 265c523858385176c33a7456bb84035de78552d22dMarc Blank * |-- ImapElement.NONE (for 'index out of range') 275c523858385176c33a7456bb84035de78552d22dMarc Blank * | 285c523858385176c33a7456bb84035de78552d22dMarc Blank * |-- ImapList (isList() == true) 295c523858385176c33a7456bb84035de78552d22dMarc Blank * | | 305c523858385176c33a7456bb84035de78552d22dMarc Blank * | |-- ImapList.EMPTY 315c523858385176c33a7456bb84035de78552d22dMarc Blank * | | 325c523858385176c33a7456bb84035de78552d22dMarc Blank * | --- ImapResponse 335c523858385176c33a7456bb84035de78552d22dMarc Blank * | 345c523858385176c33a7456bb84035de78552d22dMarc Blank * --- ImapString (isString() == true) 355c523858385176c33a7456bb84035de78552d22dMarc Blank * | 365c523858385176c33a7456bb84035de78552d22dMarc Blank * |-- ImapString.EMPTY 375c523858385176c33a7456bb84035de78552d22dMarc Blank * | 385c523858385176c33a7456bb84035de78552d22dMarc Blank * |-- ImapSimpleString 395c523858385176c33a7456bb84035de78552d22dMarc Blank * | 405c523858385176c33a7456bb84035de78552d22dMarc Blank * |-- ImapMemoryLiteral 415c523858385176c33a7456bb84035de78552d22dMarc Blank * | 425c523858385176c33a7456bb84035de78552d22dMarc Blank * --- ImapTempFileLiteral 435c523858385176c33a7456bb84035de78552d22dMarc Blank * </pre> 445c523858385176c33a7456bb84035de78552d22dMarc Blank */ 455c523858385176c33a7456bb84035de78552d22dMarc Blankpublic abstract class ImapElement { 465c523858385176c33a7456bb84035de78552d22dMarc Blank /** 475c523858385176c33a7456bb84035de78552d22dMarc Blank * An element that is returned by {@link ImapList#getElementOrNone} to indicate an index 485c523858385176c33a7456bb84035de78552d22dMarc Blank * is out of range. 495c523858385176c33a7456bb84035de78552d22dMarc Blank */ 505c523858385176c33a7456bb84035de78552d22dMarc Blank public static final ImapElement NONE = new ImapElement() { 515c523858385176c33a7456bb84035de78552d22dMarc Blank @Override public void destroy() { 525c523858385176c33a7456bb84035de78552d22dMarc Blank // Don't call super.destroy(). 535c523858385176c33a7456bb84035de78552d22dMarc Blank // It's a shared object. We don't want the mDestroyed to be set on this. 545c523858385176c33a7456bb84035de78552d22dMarc Blank } 555c523858385176c33a7456bb84035de78552d22dMarc Blank 565c523858385176c33a7456bb84035de78552d22dMarc Blank @Override public boolean isList() { 575c523858385176c33a7456bb84035de78552d22dMarc Blank return false; 585c523858385176c33a7456bb84035de78552d22dMarc Blank } 595c523858385176c33a7456bb84035de78552d22dMarc Blank 605c523858385176c33a7456bb84035de78552d22dMarc Blank @Override public boolean isString() { 615c523858385176c33a7456bb84035de78552d22dMarc Blank return false; 625c523858385176c33a7456bb84035de78552d22dMarc Blank } 635c523858385176c33a7456bb84035de78552d22dMarc Blank 645c523858385176c33a7456bb84035de78552d22dMarc Blank @Override public String toString() { 655c523858385176c33a7456bb84035de78552d22dMarc Blank return "[NO ELEMENT]"; 665c523858385176c33a7456bb84035de78552d22dMarc Blank } 675c523858385176c33a7456bb84035de78552d22dMarc Blank 685c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 695c523858385176c33a7456bb84035de78552d22dMarc Blank public boolean equalsForTest(ImapElement that) { 705c523858385176c33a7456bb84035de78552d22dMarc Blank return super.equalsForTest(that); 715c523858385176c33a7456bb84035de78552d22dMarc Blank } 725c523858385176c33a7456bb84035de78552d22dMarc Blank }; 735c523858385176c33a7456bb84035de78552d22dMarc Blank 745c523858385176c33a7456bb84035de78552d22dMarc Blank private boolean mDestroyed = false; 755c523858385176c33a7456bb84035de78552d22dMarc Blank 765c523858385176c33a7456bb84035de78552d22dMarc Blank public abstract boolean isList(); 775c523858385176c33a7456bb84035de78552d22dMarc Blank 785c523858385176c33a7456bb84035de78552d22dMarc Blank public abstract boolean isString(); 795c523858385176c33a7456bb84035de78552d22dMarc Blank 805c523858385176c33a7456bb84035de78552d22dMarc Blank protected boolean isDestroyed() { 815c523858385176c33a7456bb84035de78552d22dMarc Blank return mDestroyed; 825c523858385176c33a7456bb84035de78552d22dMarc Blank } 835c523858385176c33a7456bb84035de78552d22dMarc Blank 845c523858385176c33a7456bb84035de78552d22dMarc Blank /** 855c523858385176c33a7456bb84035de78552d22dMarc Blank * Clean up the resources used by the instance. 865c523858385176c33a7456bb84035de78552d22dMarc Blank * It's for removing a temp file used by {@link ImapTempFileLiteral}. 875c523858385176c33a7456bb84035de78552d22dMarc Blank */ 885c523858385176c33a7456bb84035de78552d22dMarc Blank public void destroy() { 895c523858385176c33a7456bb84035de78552d22dMarc Blank mDestroyed = true; 905c523858385176c33a7456bb84035de78552d22dMarc Blank } 915c523858385176c33a7456bb84035de78552d22dMarc Blank 925c523858385176c33a7456bb84035de78552d22dMarc Blank /** 935c523858385176c33a7456bb84035de78552d22dMarc Blank * Throws {@link RuntimeException} if it's already destroyed. 945c523858385176c33a7456bb84035de78552d22dMarc Blank */ 955c523858385176c33a7456bb84035de78552d22dMarc Blank protected final void checkNotDestroyed() { 965c523858385176c33a7456bb84035de78552d22dMarc Blank if (mDestroyed) { 975c523858385176c33a7456bb84035de78552d22dMarc Blank throw new RuntimeException("Already destroyed"); 985c523858385176c33a7456bb84035de78552d22dMarc Blank } 995c523858385176c33a7456bb84035de78552d22dMarc Blank } 1005c523858385176c33a7456bb84035de78552d22dMarc Blank 1015c523858385176c33a7456bb84035de78552d22dMarc Blank /** 1025c523858385176c33a7456bb84035de78552d22dMarc Blank * Return a string that represents this object; it's purely for the debug purpose. Don't 1035c523858385176c33a7456bb84035de78552d22dMarc Blank * mistake it for {@link ImapString#getString}. 1045c523858385176c33a7456bb84035de78552d22dMarc Blank * 1055c523858385176c33a7456bb84035de78552d22dMarc Blank * Abstract to force subclasses to implement it. 1065c523858385176c33a7456bb84035de78552d22dMarc Blank */ 1075c523858385176c33a7456bb84035de78552d22dMarc Blank @Override 1085c523858385176c33a7456bb84035de78552d22dMarc Blank public abstract String toString(); 1095c523858385176c33a7456bb84035de78552d22dMarc Blank 1105c523858385176c33a7456bb84035de78552d22dMarc Blank /** 1115c523858385176c33a7456bb84035de78552d22dMarc Blank * The equals implementation that is intended to be used only for unit testing. 1125c523858385176c33a7456bb84035de78552d22dMarc Blank * (Because it may be heavy and has a special sense of "equal" for testing.) 1135c523858385176c33a7456bb84035de78552d22dMarc Blank */ 1145c523858385176c33a7456bb84035de78552d22dMarc Blank public boolean equalsForTest(ImapElement that) { 1155c523858385176c33a7456bb84035de78552d22dMarc Blank if (that == null) { 1165c523858385176c33a7456bb84035de78552d22dMarc Blank return false; 1175c523858385176c33a7456bb84035de78552d22dMarc Blank } 1185c523858385176c33a7456bb84035de78552d22dMarc Blank return this.getClass() == that.getClass(); // Has to be the same class. 1195c523858385176c33a7456bb84035de78552d22dMarc Blank } 1205c523858385176c33a7456bb84035de78552d22dMarc Blank} 121