2 ******************************************************************************
3 * Copyright (C) 2007-2010, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 ******************************************************************************
8 package com.ibm.icu.impl.duration.impl;
10 import java.io.IOException;
11 import java.io.Writer;
12 import java.util.ArrayList;
13 import java.util.List;
15 import com.ibm.icu.lang.UCharacter;
17 public class XMLRecordWriter implements RecordWriter {
19 private List<String> nameStack;
21 public XMLRecordWriter(Writer w) {
23 this.nameStack = new ArrayList<String>();
26 public boolean open(String title) {
28 writeString("<" + title + ">");
33 public boolean close() {
34 int ix = nameStack.size() - 1;
36 String name = nameStack.remove(ix);
38 writeString("</" + name + ">");
47 } catch (IOException e) {
51 public void bool(String name, boolean value) {
52 internalString(name, String.valueOf(value));
55 public void boolArray(String name, boolean[] values) {
57 String[] stringValues = new String[values.length];
58 for (int i = 0; i < values.length; ++i) {
59 stringValues[i] = String.valueOf(values[i]);
61 stringArray(name, stringValues);
65 private static String ctos(char value) {
72 return String.valueOf(value);
75 public void character(String name, char value) {
76 if (value != '\uffff') {
77 internalString(name, ctos(value));
81 public void characterArray(String name, char[] values) {
83 String[] stringValues = new String[values.length];
84 for (int i = 0; i < values.length; ++i) {
85 char value = values[i];
86 if (value == '\uffff') {
87 stringValues[i] = NULL_NAME;
89 stringValues[i] = ctos(value);
92 internalStringArray(name, stringValues);
96 public void namedIndex(String name, String[] names, int value) {
98 internalString(name, names[value]);
102 public void namedIndexArray(String name, String[] names, byte[] values) {
103 if (values != null) {
104 String[] stringValues = new String[values.length];
105 for (int i = 0; i < values.length; ++i) {
106 int value = values[i];
108 stringValues[i] = NULL_NAME;
110 stringValues[i] = names[value];
113 internalStringArray(name, stringValues);
117 public static String normalize(String str) {
121 StringBuilder sb = null;
122 boolean inWhitespace = false;
124 boolean special = false;
125 for (int i = 0; i < str.length(); ++i) {
127 if (UCharacter.isWhitespace(c)) {
128 if (sb == null && (inWhitespace || c != ' ')) {
129 sb = new StringBuilder(str.substring(0, i));
138 inWhitespace = false;
139 special = c == '<' || c == '&';
140 if (special && sb == null) {
141 sb = new StringBuilder(str.substring(0, i));
146 sb.append(c == '<' ? "<" : "&");
154 * if (c == ' ') { int len = sb.length(); if (len == 0) { return
155 * " "; } if (len > 1 && c == ' ') { sb.deleteCharAt(len - 1); } }
157 return sb.toString();
162 private void internalString(String name, String normalizedValue) {
163 if (normalizedValue != null) {
165 writeString("<" + name + ">" + normalizedValue + "</" + name + ">");
169 private void internalStringArray(String name, String[] normalizedValues) {
170 if (normalizedValues != null) {
172 for (int i = 0; i < normalizedValues.length; ++i) {
173 String value = normalizedValues[i];
183 public void string(String name, String value) {
184 internalString(name, normalize(value));
187 public void stringArray(String name, String[] values) {
188 if (values != null) {
190 for (int i = 0; i < values.length; ++i) {
191 String value = normalize(values[i]);
195 internalString(name, value);
201 public void stringTable(String name, String[][] values) {
202 if (values != null) {
203 push(name + "Table");
204 for (int i = 0; i < values.length; ++i) {
205 String[] rowValues = values[i];
206 if (rowValues == null) {
207 internalString(name + "List", NULL_NAME);
209 stringArray(name, rowValues);
216 private void push(String name) {
218 writeString("<" + name + ">");
223 int ix = nameStack.size() - 1;
224 String name = nameStack.remove(ix);
226 writeString("</" + name + ">");
229 private void newline() {
231 for (int i = 0; i < nameStack.size(); ++i) {
236 private void writeString(String str) {
240 } catch (IOException e) {
241 // if there's a problem, record it and stop writing
242 System.err.println(e.getMessage());
248 static final String NULL_NAME = "Null";
249 private static final String INDENT = " ";