1c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen/* 2c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Copyright (C) 2015 The Android Open Source Project 3c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 4c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * you may not use this file except in compliance with the License. 6c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * You may obtain a copy of the License at 7c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 8c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * http://www.apache.org/licenses/LICENSE-2.0 9c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 10c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Unless required by applicable law or agreed to in writing, software 11c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * distributed under the License is distributed on an "AS IS" BASIS, 12c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * See the License for the specific language governing permissions and 14c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * limitations under the License. 15c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 16c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 17c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chenpackage com.android.phone.common.mail.store.imap; 18c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 19c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen/** 20c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Class representing "element"s in IMAP responses. 21c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 22c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * <p>Class hierarchy: 23c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * <pre> 24c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * ImapElement 25c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 26c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * |-- ImapElement.NONE (for 'index out of range') 27c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 28c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * |-- ImapList (isList() == true) 29c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | | 30c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | |-- ImapList.EMPTY 31c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | | 32c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | --- ImapResponse 33c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 34c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * --- ImapString (isString() == true) 35c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 36c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * |-- ImapString.EMPTY 37c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 38c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * |-- ImapSimpleString 39c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 40c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * |-- ImapMemoryLiteral 41c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * | 42c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * --- ImapTempFileLiteral 43c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * </pre> 44c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 45c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chenpublic abstract class ImapElement { 46c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 47c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * An element that is returned by {@link ImapList#getElementOrNone} to indicate an index 48c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * is out of range. 49c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 50c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public static final ImapElement NONE = new ImapElement() { 51c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override public void destroy() { 52c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen // Don't call super.destroy(). 53c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen // It's a shared object. We don't want the mDestroyed to be set on this. 54c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 55c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 56c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override public boolean isList() { 57c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return false; 58c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 59c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 60c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override public boolean isString() { 61c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return false; 62c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 63c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 64c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override public String toString() { 65c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return "[NO ELEMENT]"; 66c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 67c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 68c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override 69c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public boolean equalsForTest(ImapElement that) { 70c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return super.equalsForTest(that); 71c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 72c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen }; 73c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 74c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen private boolean mDestroyed = false; 75c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 76c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public abstract boolean isList(); 77c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 78c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public abstract boolean isString(); 79c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 80c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen protected boolean isDestroyed() { 81c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return mDestroyed; 82c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 83c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 84c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 85c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Clean up the resources used by the instance. 86c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * It's for removing a temp file used by {@link ImapTempFileLiteral}. 87c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 88c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public void destroy() { 89c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen mDestroyed = true; 90c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 91c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 92c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 93c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Throws {@link RuntimeException} if it's already destroyed. 94c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 95c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen protected final void checkNotDestroyed() { 96c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen if (mDestroyed) { 97c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen throw new RuntimeException("Already destroyed"); 98c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 99c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 100c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 101c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 102c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Return a string that represents this object; it's purely for the debug purpose. Don't 103c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * mistake it for {@link ImapString#getString}. 104c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * 105c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * Abstract to force subclasses to implement it. 106c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 107c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen @Override 108c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public abstract String toString(); 109c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen 110c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen /** 111c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * The equals implementation that is intended to be used only for unit testing. 112c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen * (Because it may be heavy and has a special sense of "equal" for testing.) 113c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen */ 114c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen public boolean equalsForTest(ImapElement that) { 115c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen if (that == null) { 116c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return false; 117c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 118c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen return this.getClass() == that.getClass(); // Has to be the same class. 119c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen } 120c1fb661a75ae4f16d91289d2dd7addcac223594eNancy Chen}