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