1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.mina.io.datagram;
20
21 import java.net.SocketAddress;
22 import java.nio.channels.DatagramChannel;
23 import java.nio.channels.SelectionKey;
24
25 import org.apache.mina.common.BaseSession;
26 import org.apache.mina.common.ByteBuffer;
27 import org.apache.mina.common.SessionConfig;
28 import org.apache.mina.common.TransportType;
29 import org.apache.mina.io.IoHandler;
30 import org.apache.mina.io.IoFilterChain;
31 import org.apache.mina.io.IoSession;
32 import org.apache.mina.io.IoSessionFilterChain;
33 import org.apache.mina.io.IoSessionManager;
34 import org.apache.mina.io.IoSessionManagerFilterChain;
35 import org.apache.mina.util.Queue;
36
37 /***
38 * An {@link IoSession} for datagram transport (UDP/IP).
39 *
40 * @author Trustin Lee (trustin@apache.org)
41 * @version $Rev: 210062 $, $Date: 2005-07-11 12:52:38 +0900 $
42 */
43 class DatagramSession extends BaseSession implements IoSession
44 {
45 private final IoSessionManagerFilterChain managerFilterChain;
46
47 private final IoSessionFilterChain filterChain;
48
49 private final DatagramChannel ch;
50
51 private final DatagramSessionConfig config;
52
53 private final Queue writeBufferQueue;
54
55 private final Queue writeMarkerQueue;
56
57 private final IoHandler handler;
58
59 private final SocketAddress localAddress;
60
61 private SocketAddress remoteAddress;
62
63 private SelectionKey key;
64
65 private boolean disposed;
66
67 /***
68 * Creates a new instance.
69 */
70 DatagramSession( IoSessionManagerFilterChain managerFilterChain,
71 DatagramChannel ch, IoHandler defaultHandler )
72 {
73 this.managerFilterChain = managerFilterChain;
74 this.filterChain = new IoSessionFilterChain( managerFilterChain );
75 this.ch = ch;
76 this.config = new DatagramSessionConfig( ch );
77 this.writeBufferQueue = new Queue();
78 this.writeMarkerQueue = new Queue();
79 this.handler = defaultHandler;
80 this.remoteAddress = ch.socket().getRemoteSocketAddress();
81 this.localAddress = ch.socket().getLocalSocketAddress();
82 }
83
84 IoSessionManagerFilterChain getManagerFilterChain()
85 {
86 return managerFilterChain;
87 }
88
89 public IoFilterChain getFilterChain()
90 {
91 return filterChain;
92 }
93
94 DatagramChannel getChannel()
95 {
96 return ch;
97 }
98
99 SelectionKey getSelectionKey()
100 {
101 return key;
102 }
103
104 void setSelectionKey( SelectionKey key )
105 {
106 this.key = key;
107 }
108
109 public IoHandler getHandler()
110 {
111 return handler;
112 }
113
114 synchronized void notifyClose()
115 {
116 if( !disposed )
117 {
118 disposed = true;
119 notify();
120 }
121 }
122
123 public synchronized void close( boolean wait )
124 {
125 if( disposed )
126 {
127 return;
128 }
129
130 IoSessionManager manager = managerFilterChain.getManager();
131 if( manager instanceof DatagramConnector )
132 {
133 ( ( DatagramConnector ) manager ).closeSession( this );
134 if( wait )
135 {
136 while( disposed )
137 {
138 try
139 {
140 wait();
141 }
142 catch( InterruptedException e )
143 {
144 }
145 }
146 }
147 }
148 }
149
150 Queue getWriteBufferQueue()
151 {
152 return writeBufferQueue;
153 }
154
155 Queue getWriteMarkerQueue()
156 {
157 return writeMarkerQueue;
158 }
159
160 public void write( ByteBuffer buf, Object marker )
161 {
162 filterChain.filterWrite( this, buf, marker );
163 }
164
165 public int getScheduledWriteRequests()
166 {
167 synchronized( writeBufferQueue )
168 {
169 return writeBufferQueue.size();
170 }
171 }
172
173 public TransportType getTransportType()
174 {
175 return TransportType.DATAGRAM;
176 }
177
178 public boolean isConnected()
179 {
180 return ch.isConnected();
181 }
182
183 public SessionConfig getConfig()
184 {
185 return config;
186 }
187
188 public SocketAddress getRemoteAddress()
189 {
190 return remoteAddress;
191 }
192
193 void setRemoteAddress( SocketAddress remoteAddress )
194 {
195 this.remoteAddress = remoteAddress;
196 }
197
198 public SocketAddress getLocalAddress()
199 {
200 return localAddress;
201 }
202 }