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}