12ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
42ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/*
52ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *******************************************************************************
62ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Copyright (C) 2009-2010, International Business Machines Corporation and    *
72ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * others. All Rights Reserved.                                                *
82ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller *******************************************************************************
92ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */
102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpackage android.icu.impl.locale;
112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Collections;
132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Map;
142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Map.Entry;
152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.Set;
162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.SortedMap;
172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.TreeMap;
182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport java.util.TreeSet;
192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.impl.locale.InternalLocaleBuilder.CaseInsensitiveChar;
212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerimport android.icu.impl.locale.InternalLocaleBuilder.CaseInsensitiveString;
222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
241537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller/**
251537b2f39245c07b00aa78c3600f7aebcb172490Neil Fuller * @hide Only a subset of ICU is exposed in Android
26836e6b40a94ec3fb7545a76cb072960442b7eee9Neil Fuller */
272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpublic class LocaleExtensions {
282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private SortedMap<Character, Extension> _map;
302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private String _id;
312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static final SortedMap<Character, Extension> EMPTY_MAP =
332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Collections.unmodifiableSortedMap(new TreeMap<Character, Extension>());
342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public static final LocaleExtensions EMPTY_EXTENSIONS;
362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public static final LocaleExtensions CALENDAR_JAPANESE;
372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public static final LocaleExtensions NUMBER_THAI;
382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    static {
402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        EMPTY_EXTENSIONS = new LocaleExtensions();
412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        EMPTY_EXTENSIONS._id = "";
422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        EMPTY_EXTENSIONS._map = EMPTY_MAP;
432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        CALENDAR_JAPANESE = new LocaleExtensions();
452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        CALENDAR_JAPANESE._id = "u-ca-japanese";
462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        CALENDAR_JAPANESE._map = new TreeMap<Character, Extension>();
472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        CALENDAR_JAPANESE._map.put(Character.valueOf(UnicodeLocaleExtension.SINGLETON), UnicodeLocaleExtension.CA_JAPANESE);
482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        NUMBER_THAI = new LocaleExtensions();
502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        NUMBER_THAI._id = "u-nu-thai";
512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        NUMBER_THAI._map = new TreeMap<Character, Extension>();
522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        NUMBER_THAI._map.put(Character.valueOf(UnicodeLocaleExtension.SINGLETON), UnicodeLocaleExtension.NU_THAI);
532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private LocaleExtensions() {
562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /*
592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Package local constructor, only used by InternalLocaleBuilder.
602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    LocaleExtensions(Map<CaseInsensitiveChar, String> extensions,
622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            Set<CaseInsensitiveString> uattributes, Map<CaseInsensitiveString, String> ukeywords) {
632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        boolean hasExtension = (extensions != null && extensions.size() > 0);
642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        boolean hasUAttributes = (uattributes != null && uattributes.size() > 0);
652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        boolean hasUKeywords = (ukeywords != null && ukeywords.size() > 0);
662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (!hasExtension && !hasUAttributes && !hasUKeywords) {
682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _map = EMPTY_MAP;
692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _id = "";
702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return;
712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // Build extension map
742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        _map = new TreeMap<Character, Extension>();
752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (hasExtension) {
762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            for (Entry<CaseInsensitiveChar, String> ext : extensions.entrySet()) {
772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                char key = AsciiUtil.toLower(ext.getKey().value());
782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                String value = ext.getValue();
792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (LanguageTag.isPrivateusePrefixChar(key)) {
812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    // we need to exclude special variant in privuateuse, e.g. "x-abc-lvariant-DEF"
822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    value = InternalLocaleBuilder.removePrivateuseVariant(value);
832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    if (value == null) {
842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                        continue;
852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    }
862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                Extension e = new Extension(key, AsciiUtil.toLowerString(value));
892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                _map.put(Character.valueOf(key), e);
902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (hasUAttributes || hasUKeywords) {
942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            TreeSet<String> uaset = null;
952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            TreeMap<String, String> ukmap = null;
962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (hasUAttributes) {
982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                uaset = new TreeSet<String>();
992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                for (CaseInsensitiveString cis : uattributes) {
1002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    uaset.add(AsciiUtil.toLowerString(cis.value()));
1012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
1022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (hasUKeywords) {
1052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                ukmap = new TreeMap<String, String>();
1062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                for (Entry<CaseInsensitiveString, String> kwd : ukeywords.entrySet()) {
1072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    String key = AsciiUtil.toLowerString(kwd.getKey().value());
1082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    String type = AsciiUtil.toLowerString(kwd.getValue());
1092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    ukmap.put(key, type);
1102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
1112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            UnicodeLocaleExtension ule = new UnicodeLocaleExtension(uaset, ukmap);
1142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _map.put(Character.valueOf(UnicodeLocaleExtension.SINGLETON), ule);
1152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (_map.size() == 0) {
1182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            // this could happen when only privuateuse with special variant
1192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _map = EMPTY_MAP;
1202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _id = "";
1212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        } else {
1222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            _id = toID(_map);
1232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public Set<Character> getKeys() {
1272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return Collections.unmodifiableSet(_map.keySet());
1282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public Extension getExtension(Character key) {
1312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return _map.get(Character.valueOf(AsciiUtil.toLower(key.charValue())));
1322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String getExtensionValue(Character key) {
1352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Extension ext = _map.get(Character.valueOf(AsciiUtil.toLower(key.charValue())));
1362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (ext == null) {
1372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return null;
1382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return ext.getValue();
1402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public Set<String> getUnicodeLocaleAttributes() {
1432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Extension ext = _map.get(Character.valueOf(UnicodeLocaleExtension.SINGLETON));
1442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (ext == null) {
1452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Collections.emptySet();
1462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        assert (ext instanceof UnicodeLocaleExtension);
1482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return ((UnicodeLocaleExtension)ext).getUnicodeLocaleAttributes();
1492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public Set<String> getUnicodeLocaleKeys() {
1522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Extension ext = _map.get(Character.valueOf(UnicodeLocaleExtension.SINGLETON));
1532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (ext == null) {
1542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Collections.emptySet();
1552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        assert (ext instanceof UnicodeLocaleExtension);
1572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return ((UnicodeLocaleExtension)ext).getUnicodeLocaleKeys();
1582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String getUnicodeLocaleType(String unicodeLocaleKey) {
1612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Extension ext = _map.get(Character.valueOf(UnicodeLocaleExtension.SINGLETON));
1622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (ext == null) {
1632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return null;
1642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        assert (ext instanceof UnicodeLocaleExtension);
1662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return ((UnicodeLocaleExtension)ext).getUnicodeLocaleType(AsciiUtil.toLowerString(unicodeLocaleKey));
1672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean isEmpty() {
1702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return _map.isEmpty();
1712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public static boolean isValidKey(char c) {
1742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return LanguageTag.isExtensionSingletonChar(c) || LanguageTag.isPrivateusePrefixChar(c);
1752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public static boolean isValidUnicodeLocaleKey(String ukey) {
1782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return UnicodeLocaleExtension.isKey(ukey);
1792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    private static String toID(SortedMap<Character, Extension> map) {
1822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        StringBuilder buf = new StringBuilder();
1832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        Extension privuse = null;
1842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        for (Entry<Character, Extension> entry : map.entrySet()) {
1852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            char singleton = entry.getKey().charValue();
1862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            Extension extension = entry.getValue();
1872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (LanguageTag.isPrivateusePrefixChar(singleton)) {
1882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                privuse = extension;
1892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            } else {
1902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                if (buf.length() > 0) {
1912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    buf.append(LanguageTag.SEP);
1922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                }
1932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                buf.append(extension);
1942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (privuse != null) {
1972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if (buf.length() > 0) {
1982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                buf.append(LanguageTag.SEP);
1992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
2002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            buf.append(privuse);
2012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return buf.toString();
2032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
206f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Override
2072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String toString() {
2082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return _id;
2092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
2112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public String getID() {
2122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return _id;
2132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
215f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Override
2162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int hashCode() {
2172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return _id.hashCode();
2182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
220f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert    @Override
2212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean equals(Object other) {
2222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (this == other) {
2232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return true;
2242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if (!(other instanceof LocaleExtensions)) {
2262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return false;
2272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
2282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return this._id.equals(((LocaleExtensions)other)._id);
2292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
2302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller}
231