View Javadoc

    1   /***
    2    *
    3    * Copyright 2004 Hiram Chirino
    4    *
    5    *  Licensed under the Apache License, Version 2.0 (the "License");
    6    *  you may not use this file except in compliance with the License.
    7    *  You may obtain a copy of the License at
    8    *
    9    *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   *  Unless required by applicable law or agreed to in writing, software
    12   *  distributed under the License is distributed on an "AS IS" BASIS,
    13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   *  See the License for the specific language governing permissions and
    15   *  limitations under the License.
    16   */
    17  package org.activeio.filter;
    18
    19  import java.io.IOException;
    20
    21  import org.activeio.AsynchChannel;
    22  import org.activeio.FilterAsynchChannel;
    23  import org.activeio.Packet;
    24  import org.activeio.packet.ByteArrayPacket;
    25
    26  /***
    27   */
    28  public class WriteBufferedAsynchChannel extends FilterAsynchChannel {
    29
    30      private static final int DEFAULT_BUFFER_SIZE = 1024*64;
    31      private final Packet buffer;
    32      private final boolean enableDirectWrites;
    33
    34      public WriteBufferedAsynchChannel(AsynchChannel channel) {
    35          this(channel, new ByteArrayPacket(new byte[DEFAULT_BUFFER_SIZE]));
    36      }
    37
    38      public WriteBufferedAsynchChannel(AsynchChannel channel, Packet buffer) {
    39          this(channel, buffer, true);
    40      }
    41
    42      public WriteBufferedAsynchChannel(AsynchChannel channel, Packet buffer, boolean enableDirectWrites) {
    43          super(channel);
    44          this.buffer = buffer;
    45          this.enableDirectWrites = enableDirectWrites;
    46      }
    47
    48      public void write(Packet packet) throws IOException {
    49
    50          while( packet.hasRemaining() ) {
    51  	        packet.read(buffer);
    52  	        if( !buffer.hasRemaining() ) {
    53  	            flush();
    54
    55  	            // Should we just direct write the rest?
    56  	            if( enableDirectWrites && packet.remaining() > buffer.capacity()) {
    57  	                getNext().write(packet);
    58  	                return;
    59  	            }
    60  	        }
    61          }
    62
    63      }
    64
    65      public void flush() throws IOException {
    66          buffer.flip();
    67          getNext().write(buffer);
    68          buffer.clear();
    69      }
    70  }