ImapList.java revision 7e5ba0e1eaee76ab6e6c7ea9362348f660796596
17e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki/*
27e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * Copyright (C) 2010 The Android Open Source Project
37e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki *
47e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
57e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * you may not use this file except in compliance with the License.
67e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * You may obtain a copy of the License at
77e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki *
87e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
97e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki *
107e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * Unless required by applicable law or agreed to in writing, software
117e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
127e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * See the License for the specific language governing permissions and
147e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * limitations under the License.
157e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki */
167e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
177e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onukipackage com.android.email.mail.store.imap;
187e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
197e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onukiimport java.util.ArrayList;
207e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
217e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki/**
227e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki * Class represents an IMAP list.
237e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki */
247e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onukipublic class ImapList extends ImapElement {
257e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
267e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * {@link ImapList} representing an empty list.
277e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
287e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public static final ImapList EMPTY = new ImapList() {
297e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        @Override void add(ImapElement e) {
307e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            throw new RuntimeException();
317e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
327e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    };
337e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
347e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    private final ArrayList<ImapElement> mList = new ArrayList<ImapElement>();
357e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
367e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /* package */ void add(ImapElement e) {
377e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        if (e == null) {
387e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            throw new RuntimeException("Can't add null");
397e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
407e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        mList.add(e);
417e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
427e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
437e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    @Override
447e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean isString() {
457e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return false;
467e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
477e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
487e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    @Override
497e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean isList() {
507e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return true;
517e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
527e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
537e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final int size() {
547e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return mList.size();
557e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
567e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
577e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean isEmpty() {
587e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return size() == 0;
597e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
607e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
617e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
627e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return true if the element at {@code index} exists, is string, and equals to {@code s}.
637e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * (case insensitive)
647e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
657e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean is(int index, String s) {
667e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return is(index, s, false);
677e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
687e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
697e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
707e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Same as {@link #is(int, String)}, but does the prefix match if {@code prefixMatch}.
717e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
727e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean is(int index, String s, boolean prefixMatch) {
737e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        if (!prefixMatch) {
747e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            return getStringOrEmpty(index).is(s);
757e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        } else {
767e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            return getStringOrEmpty(index).startsWith(s);
777e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
787e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
797e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
807e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
817e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return the element at {@code index}.
827e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * If {@code index} is out of range, returns {@link ImapElement#NONE}.
837e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
847e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapElement getElementOrNone(int index) {
857e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return (index >= mList.size()) ? ImapElement.NONE : mList.get(index);
867e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
877e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
887e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
897e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return the element at {@code index} if it's a list.
907e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * If {@code index} is out of range or not a list, returns {@link ImapList#EMPTY}.
917e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
927e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapList getListOrEmpty(int index) {
937e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        ImapElement el = getElementOrNone(index);
947e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return el.isList() ? (ImapList) el : EMPTY;
957e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
967e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
977e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
987e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return the element at {@code index} if it's a string.
997e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * If {@code index} is out of range or not a string, returns {@link ImapString#EMPTY}.
1007e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1017e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapString getStringOrEmpty(int index) {
1027e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        ImapElement el = getElementOrNone(index);
1037e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return el.isString() ? (ImapString) el : ImapString.EMPTY;
1047e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1057e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1067e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1077e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return an element keyed by {@code key}.  Return null if not found.  {@code key} has to be
1087e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * at an even index.
1097e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1107e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /* package */ final ImapElement getKeyedElementOrNull(String key, boolean prefixMatch) {
1117e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        for (int i = 1; i < size(); i += 2) {
1127e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            if (is(i-1, key, prefixMatch)) {
1137e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                return mList.get(i);
1147e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            }
1157e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
1167e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return null;
1177e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1187e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1197e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1207e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return an {@link ImapList} keyed by {@code key}.
1217e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return {@link ImapList#EMPTY} if not found.
1227e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1237e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapList getKeyedListOrEmpty(String key) {
1247e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return getKeyedListOrEmpty(key, false);
1257e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1267e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1277e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1287e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return an {@link ImapList} keyed by {@code key}.
1297e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return {@link ImapList#EMPTY} if not found.
1307e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1317e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapList getKeyedListOrEmpty(String key, boolean prefixMatch) {
1327e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        ImapElement e = getKeyedElementOrNull(key, prefixMatch);
1337e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return (e != null) ? ((ImapList) e) : ImapList.EMPTY;
1347e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1357e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1367e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1377e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return an {@link ImapString} keyed by {@code key}.
1387e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return {@link ImapString#EMPTY} if not found.
1397e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1407e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapString getKeyedStringOrEmpty(String key) {
1417e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return getKeyedStringOrEmpty(key, false);
1427e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1437e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1447e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1457e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return an {@link ImapString} keyed by {@code key}.
1467e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return {@link ImapString#EMPTY} if not found.
1477e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1487e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final ImapString getKeyedStringOrEmpty(String key, boolean prefixMatch) {
1497e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        ImapElement e = getKeyedElementOrNull(key, prefixMatch);
1507e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return (e != null) ? ((ImapString) e) : ImapString.EMPTY;
1517e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1527e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1537e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1547e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return true if it contains {@code s}.
1557e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1567e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final boolean contains(String s) {
1577e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        for (int i = 0; i < size(); i++) {
1587e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            if (getStringOrEmpty(i).is(s)) {
1597e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                return true;
1607e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            }
1617e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
1627e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return false;
1637e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1647e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1657e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    @Override
1667e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public void destroy() {
1677e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        for (ImapElement e : mList) {
1687e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            e.destroy();
1697e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
1707e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1717e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1727e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    @Override
1737e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public String toString() {
1747e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return mList.toString();
1757e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1767e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1777e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1787e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Return the text representations of the contents concatenated with ",".
1797e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1807e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public final String flatten() {
1817e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return flatten(new StringBuilder()).toString();
1827e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
1837e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
1847e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    /**
1857e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Returns text representations (i.e. getString()) of contents joined together with
1867e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * "," as the separator.
1877e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     *
1887e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * Only used for building the capability string passed to vendor policies.
1897e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     *
1907e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * We can't use toString(), because it's for debugging (meaning the format may change any time),
1917e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     * and it won't expand literals.
1927e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki     */
1937e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    private final StringBuilder flatten(StringBuilder sb) {
1947e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        sb.append('[');
1957e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        for (int i = 0; i < mList.size(); i++) {
1967e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            if (i > 0) {
1977e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                sb.append(',');
1987e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            }
1997e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            final ImapElement e = getElementOrNone(i);
2007e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            if (e.isList()) {
2017e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                getListOrEmpty(i).flatten(sb);
2027e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            } else if (e.isString()) {
2037e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                sb.append(getStringOrEmpty(i).getString());
2047e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            }
2057e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
2067e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        sb.append(']');
2077e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return sb;
2087e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
2097e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki
2107e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    @Override
2117e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    public boolean equalsForTest(ImapElement that) {
2127e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        if (!super.equalsForTest(that)) {
2137e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            return false;
2147e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
2157e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        ImapList thatList = (ImapList) that;
2167e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        if (size() != thatList.size()) {
2177e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            return false;
2187e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
2197e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        for (int i = 0; i < size(); i++) {
2207e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            if (!mList.get(i).equalsForTest(thatList.getElementOrNone(i))) {
2217e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki                return false;
2227e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki            }
2237e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        }
2247e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki        return true;
2257e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki    }
2267e5ba0e1eaee76ab6e6c7ea9362348f660796596Makoto Onuki}
227