2 *******************************************************************************
3 * Copyright (C) 2009-2011, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 package com.ibm.icu.impl.locale;
9 import java.util.Collections;
10 import java.util.Map.Entry;
12 import java.util.SortedMap;
13 import java.util.SortedSet;
14 import java.util.TreeMap;
15 import java.util.TreeSet;
17 public class UnicodeLocaleExtension extends Extension {
18 public static final char SINGLETON = 'u';
20 private static final SortedSet<String> EMPTY_SORTED_SET = new TreeSet<String>();
21 private static final SortedMap<String, String> EMPTY_SORTED_MAP = new TreeMap<String, String>();
23 private SortedSet<String> _attributes = EMPTY_SORTED_SET;
24 private SortedMap<String, String> _keywords = EMPTY_SORTED_MAP;
26 public static final UnicodeLocaleExtension CA_JAPANESE;
27 public static final UnicodeLocaleExtension NU_THAI;
30 CA_JAPANESE = new UnicodeLocaleExtension();
31 CA_JAPANESE._keywords = new TreeMap<String, String>();
32 CA_JAPANESE._keywords.put("ca", "japanese");
33 CA_JAPANESE._value = "ca-japanese";
35 NU_THAI = new UnicodeLocaleExtension();
36 NU_THAI._keywords = new TreeMap<String, String>();
37 NU_THAI._keywords.put("nu", "thai");
38 NU_THAI._value = "nu-thai";
41 private UnicodeLocaleExtension() {
45 UnicodeLocaleExtension(SortedSet<String> attributes, SortedMap<String, String> keywords) {
47 if (attributes != null && attributes.size() > 0) {
48 _attributes = attributes;
50 if (keywords != null && keywords.size() > 0) {
54 if (_attributes.size() > 0 || _keywords.size() > 0) {
55 StringBuilder sb = new StringBuilder();
56 for (String attribute : _attributes) {
57 sb.append(LanguageTag.SEP).append(attribute);
59 for (Entry<String, String> keyword : _keywords.entrySet()) {
60 String key = keyword.getKey();
61 String value = keyword.getValue();
63 sb.append(LanguageTag.SEP).append(key);
64 if (value.length() > 0) {
65 sb.append(LanguageTag.SEP).append(value);
68 _value = sb.substring(1); // skip leading '-'
72 public Set<String> getUnicodeLocaleAttributes() {
73 return Collections.unmodifiableSet(_attributes);
76 public Set<String> getUnicodeLocaleKeys() {
77 return Collections.unmodifiableSet(_keywords.keySet());
80 public String getUnicodeLocaleType(String unicodeLocaleKey) {
81 return _keywords.get(unicodeLocaleKey);
84 public static boolean isSingletonChar(char c) {
85 return (SINGLETON == AsciiUtil.toLower(c));
88 public static boolean isAttribute(String s) {
90 return (s.length() >= 3) && (s.length() <= 8) && AsciiUtil.isAlphaNumericString(s);
93 public static boolean isKey(String s) {
95 return (s.length() == 2) && AsciiUtil.isAlphaNumericString(s);
98 public static boolean isTypeSubtag(String s) {
100 return (s.length() >= 3) && (s.length() <= 8) && AsciiUtil.isAlphaNumericString(s);