]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/duration/impl/XMLRecordReader.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / duration / impl / XMLRecordReader.java
1 /*\r
2 ******************************************************************************\r
3 * Copyright (C) 2007-2010, International Business Machines Corporation and   *\r
4 * others. All Rights Reserved.                                               *\r
5 ******************************************************************************\r
6 */\r
7 \r
8 package com.ibm.icu.impl.duration.impl;\r
9 \r
10 import java.io.IOException;\r
11 import java.io.Reader;\r
12 import java.util.ArrayList;\r
13 import java.util.List;\r
14 \r
15 import com.ibm.icu.lang.UCharacter;\r
16 \r
17 public class XMLRecordReader implements RecordReader {\r
18     private Reader r;\r
19 \r
20     private List<String> nameStack;\r
21 \r
22     private boolean atTag;\r
23 \r
24     private String tag; // cache\r
25 \r
26     public XMLRecordReader(Reader r) {\r
27         this.r = r;\r
28         this.nameStack = new ArrayList<String>();\r
29 \r
30         // skip XML prologue\r
31         if (getTag().startsWith("?xml")) {\r
32             advance();\r
33         }\r
34 \r
35         // skip FIRST comment\r
36         if (getTag().startsWith("!--")) {\r
37             advance();\r
38         }\r
39     }\r
40 \r
41     public boolean open(String title) {\r
42         if (getTag().equals(title)) {\r
43             nameStack.add(title);\r
44             advance();\r
45             return true;\r
46         }\r
47         return false;\r
48     }\r
49 \r
50     public boolean close() {\r
51         int ix = nameStack.size() - 1;\r
52         String name = nameStack.get(ix);\r
53         if (getTag().equals("/" + name)) {\r
54             nameStack.remove(ix);\r
55             advance();\r
56             return true;\r
57         }\r
58         return false;\r
59     }\r
60 \r
61     public boolean bool(String name) {\r
62         String s = string(name);\r
63         if (s != null) {\r
64             return "true".equals(s);\r
65         }\r
66         return false;\r
67     }\r
68 \r
69     public boolean[] boolArray(String name) {\r
70         String[] sa = stringArray(name);\r
71         if (sa != null) {\r
72             boolean[] result = new boolean[sa.length];\r
73             for (int i = 0; i < sa.length; ++i) {\r
74                 result[i] = "true".equals(sa[i]);\r
75             }\r
76             return result;\r
77         }\r
78         return null;\r
79     }\r
80 \r
81     public char character(String name) {\r
82         String s = string(name);\r
83         if (s != null) {\r
84             return s.charAt(0);\r
85         }\r
86         return '\uffff';\r
87     }\r
88 \r
89     public char[] characterArray(String name) {\r
90         String[] sa = stringArray(name);\r
91         if (sa != null) {\r
92             char[] result = new char[sa.length];\r
93             for (int i = 0; i < sa.length; ++i) {\r
94                 result[i] = sa[i].charAt(0);\r
95             }\r
96             return result;\r
97         }\r
98         return null;\r
99     }\r
100 \r
101     public byte namedIndex(String name, String[] names) {\r
102         String sa = string(name);\r
103         if (sa != null) {\r
104             for (int i = 0; i < names.length; ++i) {\r
105                 if (sa.equals(names[i])) {\r
106                     return (byte) i;\r
107                 }\r
108             }\r
109         }\r
110         return (byte) -1;\r
111     }\r
112 \r
113     public byte[] namedIndexArray(String name, String[] names) {\r
114         String[] sa = stringArray(name);\r
115         if (sa != null) {\r
116             byte[] result = new byte[sa.length];\r
117             loop: for (int i = 0; i < sa.length; ++i) {\r
118                 String s = sa[i];\r
119                 for (int j = 0; j < names.length; ++j) {\r
120                     if (names[j].equals(s)) {\r
121                         result[i] = (byte) j;\r
122                         continue loop;\r
123                     }\r
124                 }\r
125                 result[i] = (byte) -1;\r
126             }\r
127             return result;\r
128         }\r
129         return null;\r
130     }\r
131 \r
132     public String string(String name) {\r
133         if (match(name)) {\r
134             String result = readData();\r
135             if (match("/" + name)) {\r
136                 return result;\r
137             }\r
138         }\r
139         return null;\r
140     }\r
141 \r
142     public String[] stringArray(String name) {\r
143         if (match(name + "List")) {\r
144             List<String> list = new ArrayList<String>();\r
145             String s;\r
146             while (null != (s = string(name))) {\r
147                 if ("Null".equals(s)) {\r
148                     s = null;\r
149                 }\r
150                 list.add(s);\r
151             }\r
152             if (match("/" + name + "List")) {\r
153                 return list.toArray(new String[list.size()]);\r
154             }\r
155         }\r
156         return null;\r
157     }\r
158 \r
159     public String[][] stringTable(String name) {\r
160         if (match(name + "Table")) {\r
161             List<String[]> list = new ArrayList<String[]>();\r
162             String[] sa;\r
163             while (null != (sa = stringArray(name))) {\r
164                 list.add(sa);\r
165             }\r
166             if (match("/" + name + "Table")) {\r
167                 return list.toArray(new String[list.size()][]);\r
168             }\r
169         }\r
170         return null;\r
171     }\r
172 \r
173     private boolean match(String target) {\r
174         if (getTag().equals(target)) {\r
175             // System.out.println("match '" + target + "'");\r
176             advance();\r
177             return true;\r
178         }\r
179         return false;\r
180     }\r
181 \r
182     private String getTag() {\r
183         if (tag == null) {\r
184             tag = readNextTag();\r
185         }\r
186         return tag;\r
187     }\r
188 \r
189     private void advance() {\r
190         tag = null;\r
191     }\r
192 \r
193     private String readData() {\r
194         StringBuilder sb = new StringBuilder();\r
195         boolean inWhitespace = false;\r
196         // boolean inAmp = false;\r
197         while (true) {\r
198             int c = readChar();\r
199             if (c == -1 || c == '<') {\r
200                 atTag = c == '<';\r
201                 break;\r
202             }\r
203             if (c == '&') {\r
204                 c = readChar();\r
205                 if (c == '#') {\r
206                     StringBuilder numBuf = new StringBuilder();\r
207                     int radix = 10;\r
208                     c = readChar();\r
209                     if (c == 'x') {\r
210                         radix = 16;\r
211                         c = readChar();\r
212                     }\r
213                     while (c != ';' && c != -1) {\r
214                         numBuf.append((char) c);\r
215                         c = readChar();\r
216                     }\r
217                     try {\r
218                         int num = Integer.parseInt(numBuf.toString(), radix);\r
219                         c = (char) num;\r
220                     } catch (NumberFormatException ex) {\r
221                         System.err.println("numbuf: " + numBuf.toString()\r
222                                 + " radix: " + radix);\r
223                         throw ex;\r
224                     }\r
225                 } else {\r
226                     StringBuilder charBuf = new StringBuilder();\r
227                     while (c != ';' && c != -1) {\r
228                         charBuf.append((char) c);\r
229                         c = readChar();\r
230                     }\r
231                     String charName = charBuf.toString();\r
232                     if (charName.equals("lt")) {\r
233                         c = '<';\r
234                     } else if (charName.equals("gt")) {\r
235                         c = '>';\r
236                     } else if (charName.equals("quot")) {\r
237                         c = '"';\r
238                     } else if (charName.equals("apos")) {\r
239                         c = '\'';\r
240                     } else if (charName.equals("amp")) {\r
241                         c = '&';\r
242                     } else {\r
243                         System.err.println("unrecognized character entity: '"\r
244                                 + charName + "'");\r
245                         continue;\r
246                     }\r
247                 }\r
248             }\r
249 \r
250             if (UCharacter.isWhitespace(c)) {\r
251                 if (inWhitespace) {\r
252                     continue;\r
253                 }\r
254                 c = ' ';\r
255                 inWhitespace = true;\r
256             } else {\r
257                 inWhitespace = false;\r
258             }\r
259             sb.append((char) c);\r
260         }\r
261         //System.err.println("read data: '" + sb.toString() + "'");\r
262         return sb.toString();\r
263     }\r
264 \r
265     private String readNextTag() {\r
266         int c = '\0';\r
267         while (!atTag) {\r
268             c = readChar();\r
269             if (c == '<' || c == -1) {\r
270                 if (c == '<') {\r
271                     atTag = true;\r
272                 }\r
273                 break;\r
274             }\r
275             if (!UCharacter.isWhitespace(c)) {\r
276                 System.err.println("Unexpected non-whitespace character "\r
277                         + Integer.toHexString(c));\r
278                 break;\r
279             }\r
280         }\r
281 \r
282         if (atTag) {\r
283             atTag = false;\r
284             StringBuilder sb = new StringBuilder();\r
285             while (true) {\r
286                 c = readChar();\r
287                 if (c == '>' || c == -1) {\r
288                     break;\r
289                 }\r
290                 sb.append((char) c);\r
291             }\r
292             // System.err.println("read tag: '" + sb.toString() + "'");\r
293             return sb.toString();\r
294         }\r
295         return null;\r
296     }\r
297 \r
298     int readChar() {\r
299         try {\r
300             return r.read();\r
301         } catch (IOException e) {\r
302             // assume end of input\r
303         }\r
304         return -1;\r
305     }\r
306 }\r