1e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/* 2e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * contributor license agreements. See the NOTICE file distributed with 4e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * this work for additional information regarding copyright ownership. 5e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * (the "License"); you may not use this file except in compliance with 7e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * the License. You may obtain a copy of the License at 8e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 9e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 11e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Unless required by applicable law or agreed to in writing, software 12e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * See the License for the specific language governing permissions and 15e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * limitations under the License. 16e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */ 17e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 18e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespackage tests.support; 19e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 20e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.IOException; 21e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.Writer; 22e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 23e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespublic class Support_StringWriter extends Writer { 248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private StringBuffer buf; 25e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Constructs a new StringWriter which has a StringBuffer allocated with the 288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * default size of 16 characters. The StringBuffer is also the 298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * <code>lock</code> used to synchronize access to this Writer. 308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public Support_StringWriter() { 328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath super(); 338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath buf = new StringBuffer(16); 348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lock = buf; 358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 36e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Constructs a new StringWriter which has a StringBuffer allocated with the 398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * size of <code>initialSize</code> characters. The StringBuffer is also 408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * the <code>lock</code> used to synchronize access to this Writer. 418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public Support_StringWriter(int initialSize) { 438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (initialSize >= 0) { 448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath buf = new StringBuffer(initialSize); 458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lock = buf; 468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 47e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes throw new IllegalArgumentException(); 48e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 50e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Close this Writer. This is the concrete implementation required. This 538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * particular implementation does nothing. 548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @throws java.io.IOException If an IO error occurs closing this StringWriter. 568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 58e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void close() throws IOException { 598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 60e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Flush this Writer. This is the concrete implementation required. This 638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * particular implementation does nothing. 648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 66e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void flush() { 678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 68e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Answer the contents of this StringWriter as a StringBuffer. Any changes 718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * made to the StringBuffer by the receiver or the caller are reflected in 728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * this StringWriter. 738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @return this StringWriters local StringBuffer. 758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public StringBuffer getBuffer() { 778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return buf; 798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 81e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Answer the contents of this StringWriter as a String. Any changes made to 848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * the StringBuffer by the receiver after returning will not be reflected in 858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * the String returned to the caller. 868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @return this StringWriters current contents as a String. 888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 90e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public String toString() { 918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return buf.toString(); 938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 95e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Writes <code>count</code> characters starting at <code>offset</code> 988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * in <code>buf</code> to this StringWriter. 998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param buf the non-null array containing characters to write. 1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param offset offset in buf to retrieve characters 1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param count maximum number of characters to write 1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @throws java.lang.ArrayIndexOutOfBoundsException 1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * If offset or count are outside of bounds. 1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 107e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void write(char[] buf, int offset, int count) { 1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // avoid int overflow 1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (0 <= offset && offset <= buf.length && 0 <= count 1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath && count <= buf.length - offset) { 1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.buf.append(buf, offset, count); 1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes throw new ArrayIndexOutOfBoundsException(); 116e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 118e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Writes the specified character <code>oneChar</code> to this 1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * StringWriter. This implementation writes the low order two bytes to the 1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Stream. 1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param oneChar The character to write 1258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 127e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void write(int oneChar) { 1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath buf.append((char) oneChar); 1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 132e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Writes the characters from the String <code>str</code> to this 1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * StringWriter. 1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param str the non-null String containing the characters to write. 1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 140e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void write(String str) { 1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath buf.append(str); 1438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 145e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Writes <code>count</code> number of characters starting at 1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * <code>offset</code> from the String <code>str</code> to this 1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * StringWriter. 1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param str the non-null String containing the characters to write. 1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param offset the starting point to retrieve characters. 1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param count the number of characters to retrieve and write. 1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @throws java.lang.ArrayIndexOutOfBoundsException 1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * If offset or count are outside of bounds. 1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath @Override 158e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes public void write(String str, int offset, int count) { 1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String sub = str.substring(offset, offset + count); 1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath buf.append(sub); 1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 164e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes} 165