1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.core.service;
21
22 import java.net.SocketAddress;
23 import java.util.concurrent.Executor;
24 import java.util.concurrent.Executors;
25
26 import org.apache.mina.core.future.ConnectFuture;
27 import org.apache.mina.core.future.IoFuture;
28 import org.apache.mina.core.future.IoFutureListener;
29 import org.apache.mina.core.session.IdleStatus;
30 import org.apache.mina.core.session.IoSession;
31 import org.apache.mina.core.session.IoSessionConfig;
32 import org.apache.mina.core.session.IoSessionInitializer;
33
34
35
36
37
38
39 public abstract class AbstractIoConnector
40 extends AbstractIoService implements IoConnector {
41
42
43
44 private long connectTimeoutCheckInterval = 50L;
45 private long connectTimeoutInMillis = 60 * 1000L;
46 private SocketAddress defaultRemoteAddress;
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 protected AbstractIoConnector(IoSessionConfig sessionConfig, Executor executor) {
63 super(sessionConfig, executor);
64 }
65
66
67
68
69
70
71
72
73 public long getConnectTimeoutCheckInterval() {
74 return connectTimeoutCheckInterval;
75 }
76
77 public void setConnectTimeoutCheckInterval(long minimumConnectTimeout) {
78 if( getConnectTimeoutMillis() < minimumConnectTimeout ){
79 this.connectTimeoutInMillis = minimumConnectTimeout;
80 }
81
82 this.connectTimeoutCheckInterval = minimumConnectTimeout;
83 }
84
85
86
87
88
89 public final int getConnectTimeout() {
90 return (int)connectTimeoutInMillis/1000;
91 }
92
93
94
95
96 public final long getConnectTimeoutMillis() {
97 return connectTimeoutInMillis;
98 }
99
100
101
102
103
104 public final void setConnectTimeout(int connectTimeout) {
105
106 setConnectTimeoutMillis( connectTimeout * 1000L );
107 }
108
109
110
111
112
113 public final void setConnectTimeoutMillis(long connectTimeoutInMillis) {
114 if (connectTimeoutInMillis <= connectTimeoutCheckInterval) {
115 this.connectTimeoutCheckInterval = connectTimeoutInMillis;
116 }
117 this.connectTimeoutInMillis = connectTimeoutInMillis;
118 }
119
120
121
122
123 public SocketAddress getDefaultRemoteAddress() {
124 return defaultRemoteAddress;
125 }
126
127
128
129
130 public final void setDefaultRemoteAddress(SocketAddress defaultRemoteAddress) {
131 if (defaultRemoteAddress == null) {
132 throw new NullPointerException("defaultRemoteAddress");
133 }
134
135 if (!getTransportMetadata().getAddressType().isAssignableFrom(
136 defaultRemoteAddress.getClass())) {
137 throw new IllegalArgumentException("defaultRemoteAddress type: "
138 + defaultRemoteAddress.getClass() + " (expected: "
139 + getTransportMetadata().getAddressType() + ")");
140 }
141 this.defaultRemoteAddress = defaultRemoteAddress;
142 }
143
144
145
146
147 public final ConnectFuture connect() {
148 SocketAddress defaultRemoteAddress = getDefaultRemoteAddress();
149 if (defaultRemoteAddress == null) {
150 throw new IllegalStateException("defaultRemoteAddress is not set.");
151 }
152
153 return connect(defaultRemoteAddress, null, null);
154 }
155
156
157
158
159 public ConnectFuture connect(IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
160 SocketAddress defaultRemoteAddress = getDefaultRemoteAddress();
161 if (defaultRemoteAddress == null) {
162 throw new IllegalStateException("defaultRemoteAddress is not set.");
163 }
164
165 return connect(defaultRemoteAddress, null, sessionInitializer);
166 }
167
168
169
170
171 public final ConnectFuture connect(SocketAddress remoteAddress) {
172 return connect(remoteAddress, null, null);
173 }
174
175
176
177
178 public ConnectFuture connect(SocketAddress remoteAddress,
179 IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
180 return connect(remoteAddress, null, sessionInitializer);
181 }
182
183
184
185
186 public ConnectFuture connect(SocketAddress remoteAddress,
187 SocketAddress localAddress) {
188 return connect(remoteAddress, localAddress, null);
189 }
190
191
192
193
194 public final ConnectFuture connect(SocketAddress remoteAddress,
195 SocketAddress localAddress, IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
196 if (isDisposing()) {
197 throw new IllegalStateException("Already disposed.");
198 }
199
200 if (remoteAddress == null) {
201 throw new NullPointerException("remoteAddress");
202 }
203
204 if (!getTransportMetadata().getAddressType().isAssignableFrom(
205 remoteAddress.getClass())) {
206 throw new IllegalArgumentException("remoteAddress type: "
207 + remoteAddress.getClass() + " (expected: "
208 + getTransportMetadata().getAddressType() + ")");
209 }
210
211 if (localAddress != null
212 && !getTransportMetadata().getAddressType().isAssignableFrom(
213 localAddress.getClass())) {
214 throw new IllegalArgumentException("localAddress type: "
215 + localAddress.getClass() + " (expected: "
216 + getTransportMetadata().getAddressType() + ")");
217 }
218
219 if (getHandler() == null) {
220 if (getSessionConfig().isUseReadOperation()) {
221 setHandler(new IoHandler() {
222 public void exceptionCaught(IoSession session,
223 Throwable cause) throws Exception {
224
225 }
226
227 public void messageReceived(IoSession session,
228 Object message) throws Exception {
229
230 }
231
232 public void messageSent(IoSession session, Object message)
233 throws Exception {
234
235 }
236
237 public void sessionClosed(IoSession session)
238 throws Exception {
239
240 }
241
242 public void sessionCreated(IoSession session)
243 throws Exception {
244
245 }
246
247 public void sessionIdle(IoSession session, IdleStatus status)
248 throws Exception {
249
250 }
251
252 public void sessionOpened(IoSession session)
253 throws Exception {
254
255 }
256 });
257 } else {
258 throw new IllegalStateException("handler is not set.");
259 }
260 }
261
262 return connect0(remoteAddress, localAddress, sessionInitializer);
263 }
264
265
266
267
268
269
270 protected abstract ConnectFuture connect0(SocketAddress remoteAddress,
271 SocketAddress localAddress, IoSessionInitializer<? extends ConnectFuture> sessionInitializer);
272
273
274
275
276
277
278
279
280 @Override
281 protected final void finishSessionInitialization0(
282 final IoSession session, IoFuture future) {
283
284
285
286 future.addListener(new IoFutureListener<ConnectFuture>() {
287 public void operationComplete(ConnectFuture future) {
288 if (future.isCanceled()) {
289 session.close(true);
290 }
291 }
292 });
293 }
294
295
296
297
298 @Override
299 public String toString() {
300 TransportMetadata m = getTransportMetadata();
301 return '(' + m.getProviderName() + ' ' + m.getName() + " connector: " +
302 "managedSessionCount: " + getManagedSessionCount() + ')';
303 }
304 }