Author: niallp Date: Wed Feb 6 12:16:55 2008 New Revision: 619141 URL: http://svn.apache.org/viewvc?rev=619141&view=rev Log: IO-139 Add StringBuilder Writer implementation
Added: commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java (with props) commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java (with props) Added: commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java?rev=619141&view=auto ============================================================================== --- commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java (added) +++ commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java Wed Feb 6 12:16:55 2008 @@ -0,0 +1,152 @@ +/* + * 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.commons.io.output; + +import java.io.Serializable; +import java.io.Writer; + +/** + * [EMAIL PROTECTED] Writer} implementation that outputs to a [EMAIL PROTECTED] StringBuilder}. + * <p> + * <strong>NOTE:</strong> This implementation, as an alternative to + * <code>java.io.StringWriter</code>, provides an <i>un-synchronized</i> + * (i.e. for use in a single thread) implementation for better performance. + * For safe usage with multiple [EMAIL PROTECTED] Thread}s then + * <code>java.io.StringWriter</code> should be used. + * + * @version $Revision$ $Date$ + * @since IO 2.0 + */ +public class StringBuilderWriter extends Writer implements Serializable { + + private final StringBuilder builder; + + /** + * Construct a new [EMAIL PROTECTED] StringBuilder} instance with default capacity. + */ + public StringBuilderWriter() { + this.builder = new StringBuilder(); + } + + /** + * Construct a new [EMAIL PROTECTED] StringBuilder} instance with the specified capacity. + * + * @param capacity The initial capacity of the underlying [EMAIL PROTECTED] StringBuilder} + */ + public StringBuilderWriter(int capacity) { + this.builder = new StringBuilder(capacity); + } + + /** + * Construct a new instance with the specified [EMAIL PROTECTED] StringBuilder}. + * + * @param builder The String builder + */ + public StringBuilderWriter(StringBuilder builder) { + this.builder = (builder != null ? builder : new StringBuilder()); + } + + /** + * Append a single character to this Writer. + * + * @param value The character to append + * @return This writer instance + */ + public Writer append(char value) { + builder.append(value); + return this; + } + + /** + * Append a character sequence to this Writer. + * + * @param value The character to append + * @return This writer instance + */ + public Writer append(CharSequence value) { + builder.append(value); + return this; + } + + /** + * Append a portion of a character sequence to the [EMAIL PROTECTED] StringBuilder}. + * + * @param value The character to append + * @param start The index of the first character + * @param end The index of the last character + 1 + * @return This writer instance + */ + public Writer append(CharSequence value, int start, int end) { + builder.append(value, start, end); + return this; + } + + /** + * Closing this writer has no effect. + */ + public void close() { + } + + /** + * Flushing this writer has no effect. + */ + public void flush() { + } + + + /** + * Write a String to the [EMAIL PROTECTED] StringBuilder}. + * + * @param value The value to write + */ + public void write(String value) { + if (value != null) { + builder.append(value); + } + } + + /** + * Write a portion of a character array to the [EMAIL PROTECTED] StringBuilder}. + * + * @param value The value to write + * @param offset The index of the first character + * @param length The number of characters to write + */ + public void write(char[] value, int offset, int length) { + if (value != null) { + builder.append(value, offset, length); + } + } + + /** + * Return the underlying builder. + * + * @return The underlying builder + */ + public StringBuilder getBuilder() { + return builder; + } + + /** + * Returns [EMAIL PROTECTED] StringBuilder#toString()}. + * + * @return The contents of the String builder. + */ + public String toString() { + return builder.toString(); + } +} Propchange: commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/io/trunk/src/java/org/apache/commons/io/output/StringBuilderWriter.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Added: commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java?rev=619141&view=auto ============================================================================== --- commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java (added) +++ commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java Wed Feb 6 12:16:55 2008 @@ -0,0 +1,143 @@ +/* + * 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.commons.io.output; + +import java.io.IOException; +import java.io.Writer; +import junit.framework.TestCase; + +/** + * Test case for [EMAIL PROTECTED] StringBuilderWriter}. + * + * @version $Revision$ $Date$ + */ +public class StringBuilderWriterTest extends TestCase { + private static final char[] FOOBAR_CHARS = new char[] {'F', 'o', 'o', 'B', 'a', 'r'}; + + /** + * Contruct a new test case. + * @param name The name of the test + */ + public StringBuilderWriterTest(String name) { + super(name); + } + + /** Test [EMAIL PROTECTED] StringBuilderWriter} constructor. */ + public void testAppendConstructCapacity() throws IOException { + Writer writer = new StringBuilderWriter(100); + writer.append("Foo"); + assertEquals("Foo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] StringBuilderWriter} constructor. */ + public void testAppendConstructStringBuilder() throws IOException { + StringBuilder builder = new StringBuilder("Foo"); + StringBuilderWriter writer = new StringBuilderWriter(builder); + writer.append("Bar"); + assertEquals("FooBar", writer.toString()); + assertTrue(builder == writer.getBuilder()); + } + + /** Test [EMAIL PROTECTED] StringBuilderWriter} constructor. */ + public void testAppendConstructNull() throws IOException { + Writer writer = new StringBuilderWriter((StringBuilder)null); + writer.append("Foo"); + assertEquals("Foo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#append(char)}. */ + public void testAppendChar() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.append('F').append('o').append('o'); + assertEquals("Foo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#append(CharSequence)}. */ + public void testAppendCharSequence() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.append("Foo").append("Bar"); + assertEquals("FooBar", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#append(CharSequence, int, int)}. */ + public void testAppendCharSequencePortion() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.append("FooBar", 3, 6).append(new StringBuffer("FooBar"), 0, 3); + assertEquals("BarFoo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#close()}. */ + public void testClose() { + Writer writer = new StringBuilderWriter(); + try { + writer.append("Foo"); + writer.close(); + writer.append("Bar"); + } catch (Throwable t) { + fail("Threw: " + t); + } + assertEquals("FooBar", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#write(int)}. */ + public void testWriteChar() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.write('F'); + assertEquals("F", writer.toString()); + writer.write('o'); + assertEquals("Fo", writer.toString()); + writer.write('o'); + assertEquals("Foo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#write(char[])}. */ + public void testWriteCharArray() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.write(new char[] {'F', 'o', 'o'}); + assertEquals("Foo", writer.toString()); + writer.write(new char[] {'B', 'a', 'r'}); + assertEquals("FooBar", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#write(char[], int, int)}. */ + public void testWriteCharArrayPortion() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.write(FOOBAR_CHARS, 3, 3); + assertEquals("Bar", writer.toString()); + writer.write(FOOBAR_CHARS, 0, 3); + assertEquals("BarFoo", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#write(String)}. */ + public void testWriteString() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.write("Foo"); + assertEquals("Foo", writer.toString()); + writer.write("Bar"); + assertEquals("FooBar", writer.toString()); + } + + /** Test [EMAIL PROTECTED] Writer#write(String, int, int)}. */ + public void testWriteStringPortion() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.write("FooBar", 3, 3); + assertEquals("Bar", writer.toString()); + writer.write("FooBar", 0, 3); + assertEquals("BarFoo", writer.toString()); + } + +} Propchange: commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/io/trunk/src/test/org/apache/commons/io/output/StringBuilderWriterTest.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL