1 /*
2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 6856817
27  * @summary optimize the Writer.append(CharSequence) method
28  */
29 import java.io.File;
30 import java.io.FileOutputStream;
31 import java.io.FileReader;
32 import java.io.IOException;
33 import java.io.OutputStream;
34 import java.io.OutputStreamWriter;
35 import java.nio.ByteBuffer;
36 import java.nio.CharBuffer;
37 
38 /**
39  *
40  * @author vyom.tewari@oacle.com
41  */
42 public class Bug6856817 {
43 
44     private static final String str = "This is just a test string that i am using it to test the CharBuffer.append(CharSequence csq)  for little bit performance improvement.";
45     private static final int BUF_SIZE = 1024;
46 
47     /**
48      *
49      * @param args
50      */
main(String args[])51     public static void main(String args[]) {
52         CharBuffer charBuffer = CharBuffer.allocate(BUF_SIZE);
53         File file = new File("temp.txt");
54         file.deleteOnExit();
55 
56         charBuffer.put(str);
57         charBuffer.flip();
58         checkFileContent(charBuffer, file, str);
59         charBuffer.position(10);
60         checkFileContent(charBuffer, file, str.substring(10));
61         charBuffer.position(charBuffer.limit());
62         checkFileContent(charBuffer, file, str.substring(charBuffer.limit()));
63 
64         char arr[] = new char[BUF_SIZE];
65         charBuffer = CharBuffer.wrap(arr);
66         charBuffer.put(str);
67         charBuffer.flip();
68         checkFileContent(charBuffer, file, str);
69         charBuffer.position(10);
70         checkFileContent(charBuffer, file, str.substring(10));
71         charBuffer.position(charBuffer.limit());
72         checkFileContent(charBuffer, file, str.substring(charBuffer.limit()));
73 
74         char secArr[] = new char[BUF_SIZE];
75         charBuffer = CharBuffer.wrap(secArr);
76         charBuffer.put(str);
77         charBuffer.position(5);
78         charBuffer.limit(str.length() - 7);
79         charBuffer = charBuffer.slice();
80         checkFileContent(charBuffer, file, str.substring(5, (str.length() - 7)));
81         charBuffer.position(10);
82         checkFileContent(charBuffer, file, str.substring(15, (str.length() - 7)));
83         charBuffer.position(charBuffer.limit());
84         checkFileContent(charBuffer, file, str.substring(charBuffer.limit()));
85 
86         charBuffer = ByteBuffer.allocate(BUF_SIZE).asCharBuffer();
87         charBuffer.put(str);
88         charBuffer.flip();
89         checkFileContent(charBuffer, file, str);
90         charBuffer.position(10);
91         checkFileContent(charBuffer, file, str.substring(10));
92         charBuffer.position(charBuffer.limit());
93         checkFileContent(charBuffer, file, str.substring(charBuffer.limit()));
94 
95         charBuffer = ByteBuffer.allocateDirect(1024).asCharBuffer();
96         charBuffer.put(str);
97         charBuffer.flip();
98         checkFileContent(charBuffer, file, str);
99         charBuffer.position(10);
100         checkFileContent(charBuffer, file, str.substring(10));
101         charBuffer.position(charBuffer.limit());
102         checkFileContent(charBuffer, file, str.substring(charBuffer.limit()));
103     }
104 
checkFileContent(CharBuffer charBuffer, File file, String expectedValue)105     private static void checkFileContent(CharBuffer charBuffer, File file, String expectedValue) {
106         OutputStreamWriter writer = null;
107         FileReader reader = null;
108         int position, limit;
109         position = charBuffer.position();
110         limit = charBuffer.limit();
111         try {
112             OutputStream outputStream = new FileOutputStream(file);
113             writer = new OutputStreamWriter(outputStream);
114             writer.append(charBuffer);
115             writer.close();
116             if (!isEqual(position, charBuffer.position())) {
117                 System.out.println(": failed");
118                 throw new RuntimeException("buffer position before write: " + position + " and position after write: " + charBuffer.position());
119             }
120             if (!isEqual(limit, charBuffer.limit())) {
121                 System.out.println(": failed");
122                 throw new RuntimeException("buffer limit before write: " + limit + " and limit after write: " + charBuffer.limit());
123             }
124             reader = new FileReader(file);
125             char arr[] = new char[BUF_SIZE];
126             int byteRead = reader.read(arr);
127             if (byteRead != -1) {
128                 String stringRead = new String(arr, 0, byteRead);
129                 if (expectedValue.equals(stringRead)) {
130                     System.out.println(": passed");
131                 } else {
132                     System.out.println(": failed");
133                     throw new RuntimeException("expected :" + expectedValue + " and got:" + stringRead);
134                 }
135             }
136         } catch (IOException ex) {
137             ex.printStackTrace();
138             throw new RuntimeException(ex);
139         } finally {
140             try {
141                 if (writer != null) {
142                     writer.close();
143                 }
144                 if (reader != null) {
145                     reader.close();
146                 }
147             } catch (IOException ex) {
148                 throw new RuntimeException(ex);
149             }
150         }
151     }
152 
isEqual(final int first, final int second)153     private static boolean isEqual(final int first, final int second) {
154         return (first == second);
155     }
156 }
157