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