]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/locale/Extension.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / locale / Extension.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2009, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.impl.locale;\r
8 \r
9 import com.ibm.icu.impl.locale.LanguageTag.ParseStatus;\r
10 \r
11 public class Extension {\r
12     private char _key;\r
13     protected String _value;\r
14 \r
15     protected Extension(char key) {\r
16         _key = key;\r
17     }\r
18 \r
19     public char getKey() {\r
20         return _key;\r
21     }\r
22 \r
23     public String getValue() {\r
24         return _value;\r
25     }\r
26 \r
27     public String getID() {\r
28         return _key + LanguageTag.SEP + _value;\r
29     }\r
30 \r
31     public String toString() {\r
32         return getID();\r
33     }\r
34 \r
35     public static Extension create(StringTokenIterator itr, ParseStatus sts) {\r
36         if (sts.isError() || itr.isDone()) {\r
37             return null;\r
38         }\r
39 \r
40         Extension ext = null;\r
41         String key = itr.current();\r
42         if (LanguageTag.isExtensionSingleton(key) || LanguageTag.isPrivateuseSingleton(key)) {\r
43             itr.next();\r
44             ext = create(key.charAt(0), itr, sts);\r
45         }\r
46 \r
47         return ext;\r
48     }\r
49 \r
50     public static Extension create(char key, StringTokenIterator val, ParseStatus sts) {\r
51         if (sts.isError()) {\r
52             return null;\r
53         }\r
54         if (val.isDone()) {\r
55             sts.errorIndex = val.currentStart();\r
56             sts.errorMsg = "Missing extension subtag for extension :" + key;\r
57             return null;\r
58         }\r
59 \r
60         Extension ext = null;\r
61         key = AsciiUtil.toLower(key);\r
62 \r
63         switch (key) {\r
64         case UnicodeLocaleExtension.SINGLETON:\r
65             ext = new UnicodeLocaleExtension();\r
66             break;\r
67         case PrivateuseExtension.SINGLETON:\r
68             ext = new PrivateuseExtension();\r
69             break;\r
70         default:\r
71             ext = new Extension(key);\r
72             break;\r
73         }\r
74 \r
75         ext.setExtensionValue(val, sts);\r
76 \r
77         if (ext.getValue() == null) {\r
78             // return null only when nothing parsed.\r
79             return null;\r
80         }\r
81 \r
82         return ext;\r
83     }\r
84 \r
85     protected void setExtensionValue(StringTokenIterator itr, ParseStatus sts) {\r
86         if (sts.isError() || itr.isDone()) {\r
87             _value = null;\r
88             return;\r
89         }\r
90 \r
91         StringBuilder buf = new StringBuilder();\r
92         while (!itr.isDone()) {\r
93             String s = itr.current();\r
94             if (!LanguageTag.isExtensionSubtag(s)) {\r
95                 break;\r
96             }\r
97             s = LanguageTag.canonicalizeExtensionSubtag(s);\r
98             if (buf.length() != 0) {\r
99                 buf.append(LanguageTag.SEP);\r
100             }\r
101             buf.append(s);\r
102             sts.parseLength = itr.currentEnd();\r
103             itr.next();\r
104         }\r
105 \r
106         if (buf.length() == 0) {\r
107             sts.errorIndex = itr.currentStart();\r
108             sts.errorMsg = "Invalid extension subtag: " + itr.current(); \r
109             _value = null;\r
110         } else {\r
111             _value = buf.toString();\r
112         }\r
113     }\r
114 }\r