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 = " ";