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