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 "<"; 78 } 79 if (value == '&') { 80 return "&"; 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 == '<' ? "<" : "&"); 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