2 ******************************************************************************
\r
3 * Copyright (C) 2007, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 ******************************************************************************
\r
8 package com.ibm.icu.impl.duration.impl;
\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
15 import com.ibm.icu.lang.UCharacter;
\r
17 public class XMLRecordWriter implements RecordWriter {
\r
19 private List nameStack;
\r
21 public XMLRecordWriter(Writer w) {
\r
23 this.nameStack = new ArrayList();
\r
26 public boolean open(String title) {
\r
28 writeString("<" + title + ">");
\r
29 nameStack.add(title);
\r
33 public boolean close() {
\r
34 int ix = nameStack.size() - 1;
\r
36 String name = (String) nameStack.remove(ix);
\r
38 writeString("</" + name + ">");
\r
44 public void flush() {
\r
48 catch (IOException e) {
\r
52 public void bool(String name, boolean value) {
\r
53 internalString(name, String.valueOf(value));
\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
62 stringArray(name, stringValues);
\r
66 private static String ctos(char value) {
\r
73 return String.valueOf(value);
\r
76 public void character(String name, char value) {
\r
77 if (value != '\uffff') {
\r
78 internalString(name, ctos(value));
\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
90 stringValues[i] = ctos(value);
\r
93 internalStringArray(name, stringValues);
\r
97 public void namedIndex(String name, String[] names, int value) {
\r
99 internalString(name, names[value]);
\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
109 stringValues[i] = NULL_NAME;
\r
111 stringValues[i] = names[value];
\r
114 internalStringArray(name, stringValues);
\r
118 public static String normalize(String str) {
\r
122 StringBuffer sb = null;
\r
123 boolean inWhitespace = false;
\r
125 boolean special = false;
\r
126 for (int i = 0; i < str.length(); ++i) {
\r
128 if (UCharacter.isWhitespace(c)) {
\r
129 if (sb == null && (inWhitespace || c != ' ')) {
\r
130 sb = new StringBuffer(str.substring(0, i));
\r
132 if (inWhitespace) {
\r
135 inWhitespace = true;
\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
147 sb.append(c == '<' ? "<" : "&");
\r
156 int len = sb.length();
\r
160 if (len > 1 && c == ' ') {
\r
161 sb.deleteCharAt(len - 1);
\r
165 return sb.toString();
\r
170 private void internalString(String name, String normalizedValue) {
\r
171 if (normalizedValue != null) {
\r
173 writeString("<" + name + ">" + normalizedValue + "</" + name + ">");
\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
185 string(name, value);
\r
191 public void string(String name, String value) {
\r
192 internalString(name, normalize(value));
\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
203 internalString(name, value);
\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
217 stringArray(name, rowValues);
\r
224 private void push(String name) {
\r
226 writeString("<" + name + ">");
\r
227 nameStack.add(name);
\r
230 private void pop() {
\r
231 int ix = nameStack.size() - 1;
\r
232 String name = (String) nameStack.remove(ix);
\r
234 writeString("</" + name + ">");
\r
237 private void newline() {
\r
239 for (int i = 0; i < nameStack.size(); ++i) {
\r
240 writeString(INDENT);
\r
244 private void writeString(String str) {
\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
257 static final String NULL_NAME = "Null";
\r
258 private static final String INDENT = " ";
\r