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 }