Return-Path: Delivered-To: apmail-commons-commits-archive@locus.apache.org Received: (qmail 24115 invoked from network); 6 Feb 2008 20:17:19 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Feb 2008 20:17:19 -0000 Received: (qmail 18478 invoked by uid 500); 6 Feb 2008 20:17:10 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 18400 invoked by uid 500); 6 Feb 2008 20:17:10 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 18391 invoked by uid 99); 6 Feb 2008 20:17:10 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Feb 2008 12:17:10 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Feb 2008 20:16:49 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 748FB1A9832; Wed, 6 Feb 2008 12:16:56 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r619141 - in /commons/proper/io/trunk/src: java/org/apache/commons/io/output/StringBuilderWriter.java test/org/apache/commons/io/output/StringBuilderWriterTest.java Date: Wed, 06 Feb 2008 20:16:56 -0000 To: commits@commons.apache.org From: niallp@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080206201656.748FB1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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; + +/** + * {@link Writer} implementation that outputs to a {@link StringBuilder}. + *

+ * NOTE: This implementation, as an alternative to + * java.io.StringWriter, provides an un-synchronized + * (i.e. for use in a single thread) implementation for better performance. + * For safe usage with multiple {@link Thread}s then + * java.io.StringWriter should be used. + * + * @version $Revision$ $Date$ + * @since IO 2.0 + */ +public class StringBuilderWriter extends Writer implements Serializable { + + private final StringBuilder builder; + + /** + * Construct a new {@link StringBuilder} instance with default capacity. + */ + public StringBuilderWriter() { + this.builder = new StringBuilder(); + } + + /** + * Construct a new {@link StringBuilder} instance with the specified capacity. + * + * @param capacity The initial capacity of the underlying {@link StringBuilder} + */ + public StringBuilderWriter(int capacity) { + this.builder = new StringBuilder(capacity); + } + + /** + * Construct a new instance with the specified {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link StringBuilderWriter} constructor. */ + public void testAppendConstructCapacity() throws IOException { + Writer writer = new StringBuilderWriter(100); + writer.append("Foo"); + assertEquals("Foo", writer.toString()); + } + + /** Test {@link 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 {@link StringBuilderWriter} constructor. */ + public void testAppendConstructNull() throws IOException { + Writer writer = new StringBuilderWriter((StringBuilder)null); + writer.append("Foo"); + assertEquals("Foo", writer.toString()); + } + + /** Test {@link Writer#append(char)}. */ + public void testAppendChar() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.append('F').append('o').append('o'); + assertEquals("Foo", writer.toString()); + } + + /** Test {@link Writer#append(CharSequence)}. */ + public void testAppendCharSequence() throws IOException { + Writer writer = new StringBuilderWriter(); + writer.append("Foo").append("Bar"); + assertEquals("FooBar", writer.toString()); + } + + /** Test {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link 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 {@link 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