blob: 9998f639094e150b4ec8374f5e00dcbb74f85590 [file] [log] [blame]
/*
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.i18n.phonenumbers;
import java.util.Iterator;
/**
* A sequence of elements representing a JavaScript Array. The principal operation on a
* JSArrayBuilder is the append method that appends an element to the array. To facilitate nesting
* beginArray and endArray are also supported. Example of a JSArray: ["a", ["b', "c"]].
*
* @author Nikolaos Trogkanis
*/
public class JSArrayBuilder implements CharSequence {
// Internal representation.
private StringBuilder data = new StringBuilder();
// Flag that keeps track whether the element being added to the array is the first element.
private boolean isFirstElement = true;
/**
* Begin a new element.
*/
private void beginElement() {
if (!isFirstElement) {
data.append(',');
}
isFirstElement = false;
}
/**
* Begin a new array.
*/
public JSArrayBuilder beginArray() {
beginElement();
data.append('[');
isFirstElement = true;
return this;
}
/**
* End an array.
*/
public JSArrayBuilder endArray() {
trimTrailingCommas();
data.append("]\n");
isFirstElement = false;
return this;
}
/**
* Add a number to the array.
*/
public JSArrayBuilder append(int number) {
return append(Integer.toString(number), false);
}
/**
* Add a string to the array.
*/
public JSArrayBuilder append(String string) {
return append(string, true);
}
/**
* Add a collection of strings to the array.
*/
public final JSArrayBuilder appendIterator(Iterator<String> iterator) {
while (iterator.hasNext()) {
append(iterator.next());
}
return this;
}
// Adds a string to the array with an option to escape the string or not.
private JSArrayBuilder append(String string, boolean escapeString) {
beginElement();
if (string != null) {
if (escapeString) {
escape(string, data);
} else {
data.append(string);
}
}
return this;
}
// Returns a string representing the data in this JSArray.
@Override public String toString() {
return data.toString();
}
// Double quotes a string and replaces "\" with "\\".
private static void escape(String str, StringBuilder out) {
out.append('"');
out.append(str.replaceAll("\\\\", "\\\\\\\\"));
out.append('"');
}
// Trims trailing commas.
private void trimTrailingCommas() {
int i = data.length();
while (i > 0 && data.charAt(i - 1) == ',') {
i--;
}
if (i < data.length()) {
data.delete(i, data.length());
}
}
@Override public char charAt(int index) {
return data.charAt(index);
}
@Override public int length() {
return data.length();
}
@Override public CharSequence subSequence(int start, int end) {
return data.subSequence(start, end);
}
}