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