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