]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/core/src/com/ibm/icu/impl/duration/impl/XMLRecordWriter.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / core / src / com / ibm / icu / impl / duration / impl / XMLRecordWriter.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.Writer;\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 XMLRecordWriter implements RecordWriter {\r
18     private Writer w;\r
19     private List<String> nameStack;\r
20 \r
21     public XMLRecordWriter(Writer w) {\r
22         this.w = w;\r
23         this.nameStack = new ArrayList<String>();\r
24     }\r
25 \r
26     public boolean open(String title) {\r
27         newline();\r
28         writeString("<" + title + ">");\r
29         nameStack.add(title);\r
30         return true;\r
31     }\r
32 \r
33     public boolean close() {\r
34         int ix = nameStack.size() - 1;\r
35         if (ix >= 0) {\r
36             String name = nameStack.remove(ix);\r
37             newline();\r
38             writeString("</" + name + ">");\r
39             return true;\r
40         }\r
41         return false;\r
42     }\r
43 \r
44     public void flush() {\r
45         try {\r
46             w.flush();\r
47         } catch (IOException e) {\r
48         }\r
49     }\r
50 \r
51     public void bool(String name, boolean value) {\r
52         internalString(name, String.valueOf(value));\r
53     }\r
54 \r
55     public void boolArray(String name, boolean[] values) {\r
56         if (values != null) {\r
57             String[] stringValues = new String[values.length];\r
58             for (int i = 0; i < values.length; ++i) {\r
59                 stringValues[i] = String.valueOf(values[i]);\r
60             }\r
61             stringArray(name, stringValues);\r
62         }\r
63     }\r
64 \r
65     private static String ctos(char value) {\r
66         if (value == '<') {\r
67             return "&lt;";\r
68         }\r
69         if (value == '&') {\r
70             return "&amp;";\r
71         }\r
72         return String.valueOf(value);\r
73     }\r
74 \r
75     public void character(String name, char value) {\r
76         if (value != '\uffff') {\r
77             internalString(name, ctos(value));\r
78         }\r
79     }\r
80 \r
81     public void characterArray(String name, char[] values) {\r
82         if (values != null) {\r
83             String[] stringValues = new String[values.length];\r
84             for (int i = 0; i < values.length; ++i) {\r
85                 char value = values[i];\r
86                 if (value == '\uffff') {\r
87                     stringValues[i] = NULL_NAME;\r
88                 } else {\r
89                     stringValues[i] = ctos(value);\r
90                 }\r
91             }\r
92             internalStringArray(name, stringValues);\r
93         }\r
94     }\r
95 \r
96     public void namedIndex(String name, String[] names, int value) {\r
97         if (value >= 0) {\r
98             internalString(name, names[value]);\r
99         }\r
100     }\r
101 \r
102     public void namedIndexArray(String name, String[] names, byte[] values) {\r
103         if (values != null) {\r
104             String[] stringValues = new String[values.length];\r
105             for (int i = 0; i < values.length; ++i) {\r
106                 int value = values[i];\r
107                 if (value < 0) {\r
108                     stringValues[i] = NULL_NAME;\r
109                 } else {\r
110                     stringValues[i] = names[value];\r
111                 }\r
112             }\r
113             internalStringArray(name, stringValues);\r
114         }\r
115     }\r
116 \r
117     public static String normalize(String str) {\r
118         if (str == null) {\r
119             return null;\r
120         }\r
121         StringBuilder sb = null;\r
122         boolean inWhitespace = false;\r
123         char c = '\0';\r
124         boolean special = false;\r
125         for (int i = 0; i < str.length(); ++i) {\r
126             c = str.charAt(i);\r
127             if (UCharacter.isWhitespace(c)) {\r
128                 if (sb == null && (inWhitespace || c != ' ')) {\r
129                     sb = new StringBuilder(str.substring(0, i));\r
130                 }\r
131                 if (inWhitespace) {\r
132                     continue;\r
133                 }\r
134                 inWhitespace = true;\r
135                 special = false;\r
136                 c = ' ';\r
137             } else {\r
138                 inWhitespace = false;\r
139                 special = c == '<' || c == '&';\r
140                 if (special && sb == null) {\r
141                     sb = new StringBuilder(str.substring(0, i));\r
142                 }\r
143             }\r
144             if (sb != null) {\r
145                 if (special) {\r
146                     sb.append(c == '<' ? "&lt;" : "&amp;");\r
147                 } else {\r
148                     sb.append(c);\r
149                 }\r
150             }\r
151         }\r
152         if (sb != null) {\r
153             /*\r
154              * if (c == ' ') { int len = sb.length(); if (len == 0) { return\r
155              * " "; } if (len > 1 && c == ' ') { sb.deleteCharAt(len - 1); } }\r
156              */\r
157             return sb.toString();\r
158         }\r
159         return str;\r
160     }\r
161 \r
162     private void internalString(String name, String normalizedValue) {\r
163         if (normalizedValue != null) {\r
164             newline();\r
165             writeString("<" + name + ">" + normalizedValue + "</" + name + ">");\r
166         }\r
167     }\r
168 \r
169     private void internalStringArray(String name, String[] normalizedValues) {\r
170         if (normalizedValues != null) {\r
171             push(name + "List");\r
172             for (int i = 0; i < normalizedValues.length; ++i) {\r
173                 String value = normalizedValues[i];\r
174                 if (value == null) {\r
175                     value = NULL_NAME;\r
176                 }\r
177                 string(name, value);\r
178             }\r
179             pop();\r
180         }\r
181     }\r
182 \r
183     public void string(String name, String value) {\r
184         internalString(name, normalize(value));\r
185     }\r
186 \r
187     public void stringArray(String name, String[] values) {\r
188         if (values != null) {\r
189             push(name + "List");\r
190             for (int i = 0; i < values.length; ++i) {\r
191                 String value = normalize(values[i]);\r
192                 if (value == null) {\r
193                     value = NULL_NAME;\r
194                 }\r
195                 internalString(name, value);\r
196             }\r
197             pop();\r
198         }\r
199     }\r
200 \r
201     public void stringTable(String name, String[][] values) {\r
202         if (values != null) {\r
203             push(name + "Table");\r
204             for (int i = 0; i < values.length; ++i) {\r
205                 String[] rowValues = values[i];\r
206                 if (rowValues == null) {\r
207                     internalString(name + "List", NULL_NAME);\r
208                 } else {\r
209                     stringArray(name, rowValues);\r
210                 }\r
211             }\r
212             pop();\r
213         }\r
214     }\r
215 \r
216     private void push(String name) {\r
217         newline();\r
218         writeString("<" + name + ">");\r
219         nameStack.add(name);\r
220     }\r
221 \r
222     private void pop() {\r
223         int ix = nameStack.size() - 1;\r
224         String name = nameStack.remove(ix);\r
225         newline();\r
226         writeString("</" + name + ">");\r
227     }\r
228 \r
229     private void newline() {\r
230         writeString("\n");\r
231         for (int i = 0; i < nameStack.size(); ++i) {\r
232             writeString(INDENT);\r
233         }\r
234     }\r
235 \r
236     private void writeString(String str) {\r
237         if (w != null) {\r
238             try {\r
239                 w.write(str);\r
240             } catch (IOException e) {\r
241                 // if there's a problem, record it and stop writing\r
242                 System.err.println(e.getMessage());\r
243                 w = null;\r
244             }\r
245         }\r
246     }\r
247 \r
248     static final String NULL_NAME = "Null";\r
249     private static final String INDENT = "    ";\r
250 }\r