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  
19  package org.activeio.net;
20  
21  import java.io.IOException;
22  import java.net.InetAddress;
23  import java.net.Socket;
24  import java.net.SocketAddress;
25  import java.net.SocketException;
26  import java.nio.ByteBuffer;
27  import java.nio.channels.SocketChannel;
28  
29  import org.activeio.Disposable;
30  import org.activeio.packet.ByteBufferPacket;
31  
32  /***
33   * Base class for the Asynch and Synch implementations of NIO channels.
34   * 
35   * @version $Revision$
36   */
37  public class NIOBaseChannel implements SocketMetadata, Disposable {
38  
39  	protected final SocketChannel socketChannel;
40      protected final Socket socket;
41  	private final boolean useDirect;
42      private int curentSoTimeout;
43  	private boolean disposed;
44      private final String name;
45  
46      protected NIOBaseChannel(SocketChannel socketChannel, boolean useDirect) throws IOException {
47          this.socketChannel = socketChannel;
48  		this.useDirect = useDirect;
49  		this.socket = this.socketChannel.socket();
50  
51          if( useDirect ) {
52              socket.setSendBufferSize(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
53              socket.setReceiveBufferSize(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
54          } else {
55              socket.setSendBufferSize(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
56              socket.setReceiveBufferSize(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
57          }		
58  
59          this.name = "NIO Socket Connection: "+getLocalSocketAddress()+" -> "+getRemoteSocketAddress();
60      }
61      
62      protected ByteBuffer allocateBuffer() {
63          if( useDirect ) {
64              return ByteBuffer.allocateDirect(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
65          } else {
66              return ByteBuffer.allocate(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
67          }
68      }
69  
70      protected void setSoTimeout(int i) throws SocketException {
71          if( curentSoTimeout != i ) {
72              socket.setSoTimeout(i);
73              curentSoTimeout = i;
74          }
75      }
76      public Object narrow(Class target) {
77          if( target.isAssignableFrom(getClass()) ) {
78              return this;
79          }
80          return null;
81      }
82  
83      public String toString() {
84          return name;
85      }
86  
87  	public void dispose() {
88          if (disposed)
89              return;
90  
91          try {
92              socketChannel.close();
93          } catch (IOException ignore) {
94          }
95          disposed = true;
96  	}
97  
98      /***
99       * @see org.activeio.Channel#flush()
100      */
101     public void flush() throws IOException {
102     }
103     
104     public InetAddress getInetAddress() {
105         return socket.getInetAddress();
106     }
107     public boolean getKeepAlive() throws SocketException {
108         return socket.getKeepAlive();
109     }
110     public InetAddress getLocalAddress() {
111         return socket.getLocalAddress();
112     }
113     public int getLocalPort() {
114         return socket.getLocalPort();
115     }
116     public SocketAddress getLocalSocketAddress() {
117         return socket.getLocalSocketAddress();
118     }
119     public boolean getOOBInline() throws SocketException {
120         return socket.getOOBInline();
121     }
122     public int getPort() {
123         return socket.getPort();
124     }
125     public int getReceiveBufferSize() throws SocketException {
126         return socket.getReceiveBufferSize();
127     }
128     public SocketAddress getRemoteSocketAddress() {
129         return socket.getRemoteSocketAddress();
130     }
131     public boolean getReuseAddress() throws SocketException {
132         return socket.getReuseAddress();
133     }
134     public int getSendBufferSize() throws SocketException {
135         return socket.getSendBufferSize();
136     }
137     public int getSoLinger() throws SocketException {
138         return socket.getSoLinger();
139     }
140     public int getSoTimeout() throws SocketException {
141         return socket.getSoTimeout();
142     }
143     public boolean getTcpNoDelay() throws SocketException {
144         return socket.getTcpNoDelay();
145     }
146     public int getTrafficClass() throws SocketException {
147         return socket.getTrafficClass();
148     }
149     public boolean isBound() {
150         return socket.isBound();
151     }
152     public boolean isClosed() {
153         return socket.isClosed();
154     }
155     public boolean isConnected() {
156         return socket.isConnected();
157     }
158     public void setKeepAlive(boolean on) throws SocketException {
159         socket.setKeepAlive(on);
160     }
161     public void setOOBInline(boolean on) throws SocketException {
162         socket.setOOBInline(on);
163     }
164     public void setReceiveBufferSize(int size) throws SocketException {
165         socket.setReceiveBufferSize(size);
166     }
167     public void setReuseAddress(boolean on) throws SocketException {
168         socket.setReuseAddress(on);
169     }
170     public void setSendBufferSize(int size) throws SocketException {
171         socket.setSendBufferSize(size);
172     }
173     public void setSoLinger(boolean on, int linger) throws SocketException {
174         socket.setSoLinger(on, linger);
175     }
176     public void setTcpNoDelay(boolean on) throws SocketException {
177         socket.setTcpNoDelay(on);
178     }
179     public void setTrafficClass(int tc) throws SocketException {
180         socket.setTrafficClass(tc);
181     }    
182 }