/*
|
|
* 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);
|
|
}
|
|
}
|