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