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  }