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