// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
// * to you 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 org.apache.juneau.internal;

import java.io.*;

/**
 * Similar to {@link StringWriter}, but uses a {@link StringBuilder} instead to avoid synchronization overhead.
 *
 * <p>
 * Note that this class is NOT thread safe.
 */
public final class StringBuilderWriter extends Writer {

	private StringBuilder sb;

	/**
	 * Create a new string writer using the default initial string-builder size.
	 */
	public StringBuilderWriter() {
		sb = new StringBuilder();
		lock = null;
	}

	/**
	 * Create a new string writer around an existing string builder.
	 *
	 * @param sb The string builder being wrapped.
	 */
	public StringBuilderWriter(StringBuilder sb) {
		this.sb = sb;
		lock = null;
	}

	/**
	 * Create a new string writer using the specified initial string-builder size.
	 *
	 * @param initialSize
	 * 	The number of <tt>char</tt> values that will fit into this buffer before it is automatically expanded.
	 * @throws IllegalArgumentException If <tt>initialSize</tt> is negative.
	 */
	public StringBuilderWriter(int initialSize) {
		sb = new StringBuilder(initialSize);
		lock = null;
	}

	@Override /* Writer */
	public void write(int c) {
		sb.append((char) c);
	}

	@Override /* Writer */
	public void write(char cbuf[], int start, int length) {
		sb.append(cbuf, start, length);
	}

	@Override /* Writer */
	public void write(String str) {
		sb.append(str);
	}

	@Override /* Writer */
	public void write(String str, int off, int len) {
		sb.append(str.substring(off, off + len));
	}

	@Override /* Writer */
	public StringBuilderWriter append(CharSequence csq) {
		if (csq == null)
			write("null");
		else
			write(csq.toString());
		return this;
	}

	@Override /* Writer */
	public StringBuilderWriter append(CharSequence csq, int start, int end) {
		CharSequence cs = (csq == null ? "null" : csq);
		write(cs.subSequence(start, end).toString());
		return this;
	}

	@Override /* Writer */
	public StringBuilderWriter append(char c) {
		write(c);
		return this;
	}

	@Override /* Object */
	public String toString() {
		return sb.toString();
	}

	@Override /* Writer */
	public void flush() {}

	@Override /* Writer */
	public void close() throws IOException {}
}
