1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.io;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport junit.framework.TestSuite;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport org.apache.harmony.testframework.CharSinkTester;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport org.apache.harmony.testframework.CharWrapperTester;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport tests.support.Streams;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.BufferedWriter;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.CharArrayWriter;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.File;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FileReader;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FileWriter;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FilterWriter;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStreamWriter;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PipedReader;
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PipedWriter;
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PrintWriter;
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.StringWriter;
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.Writer;
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Callable;
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.ExecutorService;
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Executors;
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Future;
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/**
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * Tests basic {@link Writer} behaviors for the luni implementations of the type.
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class WriterTesterTest {
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
49ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamath    // TODO: Rewrite this test so that id doesn't need a suite().
50ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamath    private static junit.framework.Test suite() {
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        TestSuite suite = new TestSuite();
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // sink tests
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FileWriterCharSinkTester(true).createTests());
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FileWriterCharSinkTester(false).createTests());
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new CharArrayWriterCharSinkTester().setThrowsExceptions(false).createTests());
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new StringWriterCharSinkTester().setThrowsExceptions(false).createTests());
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new PipedWriterCharSinkTester().createTests());
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // wrapper tests
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedWriterCharSinkTester(1).createTests());
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedWriterCharSinkTester(5).createTests());
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedWriterCharSinkTester(1024).createTests());
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FilterWriterCharSinkTester().createTests());
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new PrintWriterCharSinkTester().setThrowsExceptions(false).createTests());
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new OutputStreamWriterCharSinkTester().createTests());
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return suite;
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class FileWriterCharSinkTester extends CharSinkTester {
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private final boolean append;
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private File file;
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public FileWriterCharSinkTester(boolean append) {
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            this.append = append;
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create() throws Exception {
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            file = File.createTempFile("FileOutputStreamSinkTester", "tmp");
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            file.deleteOnExit();
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new FileWriter(file, append);
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] getChars() throws Exception {
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return Streams.streamToString(new FileReader(file)).toCharArray();
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class CharArrayWriterCharSinkTester extends CharSinkTester {
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private CharArrayWriter writer;
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create() throws Exception {
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            writer = new CharArrayWriter();
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return writer;
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] getChars() throws Exception {
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return writer.toCharArray();
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class PipedWriterCharSinkTester extends CharSinkTester {
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private ExecutorService executor;
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private Future<char[]> future;
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create() throws IOException {
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            final PipedReader in = new PipedReader();
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            PipedWriter out = new PipedWriter(in);
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            executor = Executors.newSingleThreadExecutor();
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            future = executor.submit(new Callable<char[]>() {
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                final CharArrayWriter chars = new CharArrayWriter();
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                public char[] call() throws Exception {
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    char[] buffer = new char[256];
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    int count;
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    while ((count = in.read(buffer)) != -1) {
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        chars.write(buffer, 0, count);
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    return chars.toCharArray();
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            });
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return out;
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] getChars() throws Exception {
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            executor.shutdown();
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return future.get();
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class StringWriterCharSinkTester extends CharSinkTester {
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private StringWriter writer;
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create() throws Exception {
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            writer = new StringWriter();
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return writer;
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] getChars() throws Exception {
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return writer.toString().toCharArray();
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class BufferedWriterCharSinkTester extends CharWrapperTester {
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private final int bufferSize;
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private BufferedWriterCharSinkTester(int bufferSize) {
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            this.bufferSize = bufferSize;
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create(Writer delegate) throws Exception {
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new BufferedWriter(delegate, bufferSize);
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] decode(char[] delegateChars) throws Exception {
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateChars;
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class FilterWriterCharSinkTester extends CharWrapperTester {
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create(Writer delegate) throws Exception {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new FilterWriter(delegate) {
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            };
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] decode(char[] delegateChars) throws Exception {
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateChars;
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class PrintWriterCharSinkTester extends CharWrapperTester {
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create(Writer delegate) throws Exception {
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new PrintWriter(delegate) {
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            };
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] decode(char[] delegateChars) throws Exception {
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateChars;
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class OutputStreamWriterCharSinkTester extends CharSinkTester {
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private ByteArrayOutputStream out;
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public Writer create() throws Exception {
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            out = new ByteArrayOutputStream();
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new OutputStreamWriter(out, "UTF-8");
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public char[] getChars() throws Exception {
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new String(out.toByteArray(), "UTF-8").toCharArray();
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
214