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