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   **/
18  package org.activeio.net;
19  
20  import java.io.IOException;
21  import java.net.InetAddress;
22  import java.net.InetSocketAddress;
23  import java.net.URI;
24  import java.net.URISyntaxException;
25  import java.nio.channels.ServerSocketChannel;
26  import java.nio.channels.SocketChannel;
27  
28  import org.activeio.SynchChannel;
29  import org.activeio.SynchChannelFactory;
30  import org.activeio.SynchChannelServer;
31  import org.activeio.filter.WriteBufferedSynchChannel;
32  import org.activeio.packet.ByteBufferPacket;
33  
34  /***
35   * A TcpSynchChannelFactory creates {@see org.activeio.net.TcpSynchChannel}
36   * and {@see org.activeio.net.TcpSynchChannelServer} objects.
37   * 
38   * @version $Revision$
39   */
40  public class NIOSynchChannelFactory implements SynchChannelFactory {
41  
42      protected static final int DEFAULT_BUFFER_SIZE = Integer.parseInt(System.getProperty("org.activeio.net.nio.BufferSize", ""+(64*1024)));
43  
44      protected static final int DEFAULT_BACKLOG = 500;
45      boolean useDirectBuffers = true;
46      private final boolean createWriteBufferedChannels;
47      private int backlog = DEFAULT_BACKLOG;
48      
49      public NIOSynchChannelFactory() {
50          this(true);
51      }
52      
53      public NIOSynchChannelFactory(boolean createWriteBufferedChannels) {
54          this.createWriteBufferedChannels = createWriteBufferedChannels;
55      }
56      
57      
58      /***
59       * Uses the {@param location}'s host and port to create a tcp connection to a remote host.
60       * 
61       * @see org.activeio.SynchChannelFactory#openSynchChannel(java.net.URI)
62       */
63      public SynchChannel openSynchChannel(URI location) throws IOException {
64          SocketChannel channel = SocketChannel.open();
65          channel.connect(new InetSocketAddress(location.getHost(), location.getPort()));
66          return createSynchChannel(channel);
67      }
68  
69      /***
70       * @param channel
71       * @return
72       * @throws IOException
73       */
74      protected SynchChannel createSynchChannel(SocketChannel socketChannel) throws IOException {
75          SynchChannel channel = new NIOSynchChannel(socketChannel);
76          if( createWriteBufferedChannels ) {
77              channel = new WriteBufferedSynchChannel(channel, ByteBufferPacket.createDefaultBuffer(useDirectBuffers));
78          }
79          return channel;
80      }
81  
82      /***
83       * Binds a server socket a the {@param location}'s port. 
84       * 
85       * @see org.activeio.SynchChannelFactory#bindSynchChannel(java.net.URI)
86       */
87      public SynchChannelServer bindSynchChannel(URI bindURI) throws IOException {
88          
89          String host = bindURI.getHost();
90          InetSocketAddress address;
91          if ( host == null || host.length() == 0 || host.equals("localhost") || host.equals("0.0.0.0") ) {
92              address = new InetSocketAddress(bindURI.getPort());
93          } else {
94              address = new InetSocketAddress(bindURI.getHost(), bindURI.getPort());
95          }
96          
97          ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
98          serverSocketChannel.socket().bind(address,backlog);
99          
100         URI connectURI = bindURI;
101         try {
102             connectURI = URISupport.changeHost(connectURI, InetAddress.getLocalHost().getHostName());
103             connectURI = URISupport.changePort(connectURI, serverSocketChannel.socket().getLocalPort());
104         } catch (URISyntaxException e) {
105             throw (IOException)new IOException("Could not build connect URI: "+e).initCause(e);
106         }
107         
108         return new NIOSynchChannelServer(serverSocketChannel, bindURI, connectURI, createWriteBufferedChannels, useDirectBuffers);
109     }
110     
111     /***
112      * @return Returns the backlog.
113      */
114     public int getBacklog() {
115         return backlog;
116     }
117 
118     /***
119      * @param backlog
120      *            The backlog to set.
121      */
122     public void setBacklog(int backlog) {
123         this.backlog = backlog;
124     }
125 
126 
127 }