1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20 package org.apache.myfaces.tobago.internal.util;
21
22 import java.io.IOException;
23 import java.io.Writer;
24
25 /**
26 * Buffering scheme: we use a tremendously simple buffering
27 * scheme that greatly reduces the number of calls into the
28 * Writer/PrintWriter. In practice this has produced significant
29 * measured performance gains (at least in JDK 1.3.1). We only
30 * support adding single characters to the buffer, so anytime
31 * multiple characters need to be written out, the entire buffer
32 * gets flushed. In practice, this is good enough, and keeps
33 * the core simple.
34 */
35 public class ResponseWriterBuffer {
36
37 private static final int BUFFER_SIZE = 64;
38
39 private final char[] buff = new char[BUFFER_SIZE];
40
41 private int bufferIndex;
42
43 private final Writer writer;
44
45 public ResponseWriterBuffer(final Writer writer) {
46 this.writer = writer;
47 }
48
49 /**
50 * Add a character to the buffer, flushing the buffer if the buffer is
51 * full, and returning the new buffer index
52 */
53 public void addToBuffer(final char ch) throws IOException {
54 if (bufferIndex >= BUFFER_SIZE) {
55 writer.write(buff, 0, bufferIndex);
56 bufferIndex = 0;
57 }
58
59 buff[bufferIndex++] = ch;
60 }
61
62 public void addToBuffer(final char[] ch) throws IOException {
63 if (bufferIndex + ch.length >= BUFFER_SIZE) {
64 writer.write(buff, 0, bufferIndex);
65 bufferIndex = 0;
66 }
67
68 System.arraycopy(ch, 0, buff, bufferIndex, ch.length);
69 bufferIndex += ch.length;
70 }
71
72 /**
73 * Flush the contents of the buffer to the output stream
74 * and return the reset buffer index
75 */
76 public void flushBuffer() throws IOException {
77 if (bufferIndex > 0) {
78 writer.write(buff, 0, bufferIndex);
79 }
80 bufferIndex = 0;
81 }
82 }