• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  ******************************************************************************
6  * Copyright (C) 2007-2010, International Business Machines Corporation and   *
7  * others. All Rights Reserved.                                               *
8  ******************************************************************************
9  */
10 
11 package ohos.global.icu.impl.duration.impl;
12 
13 import java.io.IOException;
14 import java.io.Writer;
15 import java.util.ArrayList;
16 import java.util.List;
17 
18 import ohos.global.icu.lang.UCharacter;
19 
20 /**
21  * @hide exposed on OHOS
22  */
23 public class XMLRecordWriter implements RecordWriter {
24     private Writer w;
25     private List<String> nameStack;
26 
XMLRecordWriter(Writer w)27     public XMLRecordWriter(Writer w) {
28         this.w = w;
29         this.nameStack = new ArrayList<String>();
30     }
31 
32     @Override
open(String title)33     public boolean open(String title) {
34         newline();
35         writeString("<" + title + ">");
36         nameStack.add(title);
37         return true;
38     }
39 
40     @Override
close()41     public boolean close() {
42         int ix = nameStack.size() - 1;
43         if (ix >= 0) {
44             String name = nameStack.remove(ix);
45             newline();
46             writeString("</" + name + ">");
47             return true;
48         }
49         return false;
50     }
51 
flush()52     public void flush() {
53         try {
54             w.flush();
55         } catch (IOException e) {
56         }
57     }
58 
59     @Override
bool(String name, boolean value)60     public void bool(String name, boolean value) {
61         internalString(name, String.valueOf(value));
62     }
63 
64     @Override
boolArray(String name, boolean[] values)65     public void boolArray(String name, boolean[] values) {
66         if (values != null) {
67             String[] stringValues = new String[values.length];
68             for (int i = 0; i < values.length; ++i) {
69                 stringValues[i] = String.valueOf(values[i]);
70             }
71             stringArray(name, stringValues);
72         }
73     }
74 
ctos(char value)75     private static String ctos(char value) {
76         if (value == '<') {
77             return "&lt;";
78         }
79         if (value == '&') {
80             return "&amp;";
81         }
82         return String.valueOf(value);
83     }
84 
85     @Override
character(String name, char value)86     public void character(String name, char value) {
87         if (value != '\uffff') {
88             internalString(name, ctos(value));
89         }
90     }
91 
92     @Override
characterArray(String name, char[] values)93     public void characterArray(String name, char[] values) {
94         if (values != null) {
95             String[] stringValues = new String[values.length];
96             for (int i = 0; i < values.length; ++i) {
97                 char value = values[i];
98                 if (value == '\uffff') {
99                     stringValues[i] = NULL_NAME;
100                 } else {
101                     stringValues[i] = ctos(value);
102                 }
103             }
104             internalStringArray(name, stringValues);
105         }
106     }
107 
108     @Override
namedIndex(String name, String[] names, int value)109     public void namedIndex(String name, String[] names, int value) {
110         if (value >= 0) {
111             internalString(name, names[value]);
112         }
113     }
114 
115     @Override
namedIndexArray(String name, String[] names, byte[] values)116     public void namedIndexArray(String name, String[] names, byte[] values) {
117         if (values != null) {
118             String[] stringValues = new String[values.length];
119             for (int i = 0; i < values.length; ++i) {
120                 int value = values[i];
121                 if (value < 0) {
122                     stringValues[i] = NULL_NAME;
123                 } else {
124                     stringValues[i] = names[value];
125                 }
126             }
127             internalStringArray(name, stringValues);
128         }
129     }
130 
normalize(String str)131     public static String normalize(String str) {
132         if (str == null) {
133             return null;
134         }
135         StringBuilder sb = null;
136         boolean inWhitespace = false;
137         char c = '\0';
138         boolean special = false;
139         for (int i = 0; i < str.length(); ++i) {
140             c = str.charAt(i);
141             if (UCharacter.isWhitespace(c)) {
142                 if (sb == null && (inWhitespace || c != ' ')) {
143                     sb = new StringBuilder(str.substring(0, i));
144                 }
145                 if (inWhitespace) {
146                     continue;
147                 }
148                 inWhitespace = true;
149                 special = false;
150                 c = ' ';
151             } else {
152                 inWhitespace = false;
153                 special = c == '<' || c == '&';
154                 if (special && sb == null) {
155                     sb = new StringBuilder(str.substring(0, i));
156                 }
157             }
158             if (sb != null) {
159                 if (special) {
160                     sb.append(c == '<' ? "&lt;" : "&amp;");
161                 } else {
162                     sb.append(c);
163                 }
164             }
165         }
166         if (sb != null) {
167             /*
168              * if (c == ' ') { int len = sb.length(); if (len == 0) { return
169              * " "; } if (len > 1 && c == ' ') { sb.deleteCharAt(len - 1); } }
170              */
171             return sb.toString();
172         }
173         return str;
174     }
175 
internalString(String name, String normalizedValue)176     private void internalString(String name, String normalizedValue) {
177         if (normalizedValue != null) {
178             newline();
179             writeString("<" + name + ">" + normalizedValue + "</" + name + ">");
180         }
181     }
182 
internalStringArray(String name, String[] normalizedValues)183     private void internalStringArray(String name, String[] normalizedValues) {
184         if (normalizedValues != null) {
185             push(name + "List");
186             for (int i = 0; i < normalizedValues.length; ++i) {
187                 String value = normalizedValues[i];
188                 if (value == null) {
189                     value = NULL_NAME;
190                 }
191                 string(name, value);
192             }
193             pop();
194         }
195     }
196 
197     @Override
string(String name, String value)198     public void string(String name, String value) {
199         internalString(name, normalize(value));
200     }
201 
202     @Override
stringArray(String name, String[] values)203     public void stringArray(String name, String[] values) {
204         if (values != null) {
205             push(name + "List");
206             for (int i = 0; i < values.length; ++i) {
207                 String value = normalize(values[i]);
208                 if (value == null) {
209                     value = NULL_NAME;
210                 }
211                 internalString(name, value);
212             }
213             pop();
214         }
215     }
216 
217     @Override
stringTable(String name, String[][] values)218     public void stringTable(String name, String[][] values) {
219         if (values != null) {
220             push(name + "Table");
221             for (int i = 0; i < values.length; ++i) {
222                 String[] rowValues = values[i];
223                 if (rowValues == null) {
224                     internalString(name + "List", NULL_NAME);
225                 } else {
226                     stringArray(name, rowValues);
227                 }
228             }
229             pop();
230         }
231     }
232 
push(String name)233     private void push(String name) {
234         newline();
235         writeString("<" + name + ">");
236         nameStack.add(name);
237     }
238 
pop()239     private void pop() {
240         int ix = nameStack.size() - 1;
241         String name = nameStack.remove(ix);
242         newline();
243         writeString("</" + name + ">");
244     }
245 
newline()246     private void newline() {
247         writeString("\n");
248         for (int i = 0; i < nameStack.size(); ++i) {
249             writeString(INDENT);
250         }
251     }
252 
writeString(String str)253     private void writeString(String str) {
254         if (w != null) {
255             try {
256                 w.write(str);
257             } catch (IOException e) {
258                 // if there's a problem, record it and stop writing
259                 System.err.println(e.getMessage());
260                 w = null;
261             }
262         }
263     }
264 
265     static final String NULL_NAME = "Null";
266     private static final String INDENT = "    ";
267 }
268