1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.impl.nio.reactor;
29
30 import java.io.IOException;
31
32 import org.apache.http.nio.reactor.IOEventDispatch;
33 import org.apache.http.nio.reactor.IOSession;
34 import org.apache.http.nio.reactor.ssl.SSLIOSession;
35 import org.apache.http.util.Asserts;
36
37
38
39
40
41
42
43
44 public abstract class AbstractIODispatch<T> implements IOEventDispatch {
45
46 protected abstract T createConnection(IOSession session);
47
48 protected abstract void onConnected(T conn);
49
50 protected abstract void onClosed(T conn);
51
52 protected abstract void onException(T conn, IOException ex);
53
54 protected abstract void onInputReady(T conn);
55
56 protected abstract void onOutputReady(T conn);
57
58 protected abstract void onTimeout(T conn);
59
60 private void ensureNotNull(final T conn) {
61 Asserts.notNull(conn, "HTTP connection");
62 }
63
64 @Override
65 public void connected(final IOSession session) {
66 @SuppressWarnings("unchecked")
67 T conn = (T) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
68 try {
69 if (conn == null) {
70 conn = createConnection(session);
71 session.setAttribute(IOEventDispatch.CONNECTION_KEY, conn);
72 }
73 onConnected(conn);
74 final SSLIOSession../../org/apache/http/nio/reactor/ssl/SSLIOSession.html#SSLIOSession">SSLIOSession sslioSession = (SSLIOSession) session.getAttribute(
75 SSLIOSession.SESSION_KEY);
76 if (sslioSession != null) {
77 try {
78 synchronized (sslioSession) {
79 if (!sslioSession.isInitialized()) {
80 sslioSession.initialize();
81 }
82 }
83 } catch (final IOException ex) {
84 onException(conn, ex);
85 sslioSession.shutdown();
86 }
87 }
88 } catch (final RuntimeException ex) {
89 session.shutdown();
90 throw ex;
91 }
92 }
93
94 @Override
95 public void disconnected(final IOSession session) {
96 @SuppressWarnings("unchecked")
97 final
98 T conn = (T) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
99 if (conn != null) {
100 onClosed(conn);
101 }
102 }
103
104 @Override
105 public void inputReady(final IOSession session) {
106 @SuppressWarnings("unchecked")
107 final
108 T conn = (T) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
109 try {
110 ensureNotNull(conn);
111 final SSLIOSession../../org/apache/http/nio/reactor/ssl/SSLIOSession.html#SSLIOSession">SSLIOSession sslioSession = (SSLIOSession) session.getAttribute(
112 SSLIOSession.SESSION_KEY);
113 if (sslioSession == null) {
114 onInputReady(conn);
115 } else {
116 try {
117 if (!sslioSession.isInitialized()) {
118 sslioSession.initialize();
119 }
120 if (sslioSession.isAppInputReady()) {
121 onInputReady(conn);
122 }
123 sslioSession.inboundTransport();
124 } catch (final IOException ex) {
125 onException(conn, ex);
126 sslioSession.shutdown();
127 }
128 }
129 } catch (final RuntimeException ex) {
130 session.shutdown();
131 throw ex;
132 }
133 }
134
135 @Override
136 public void outputReady(final IOSession session) {
137 @SuppressWarnings("unchecked")
138 final
139 T conn = (T) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
140 try {
141 ensureNotNull(conn);
142 final SSLIOSession../../org/apache/http/nio/reactor/ssl/SSLIOSession.html#SSLIOSession">SSLIOSession sslioSession = (SSLIOSession) session.getAttribute(
143 SSLIOSession.SESSION_KEY);
144 if (sslioSession == null) {
145 onOutputReady(conn);
146 } else {
147 try {
148 if (!sslioSession.isInitialized()) {
149 sslioSession.initialize();
150 }
151 if (sslioSession.isAppOutputReady()) {
152 onOutputReady(conn);
153 }
154 sslioSession.outboundTransport();
155 } catch (final IOException ex) {
156 onException(conn, ex);
157 sslioSession.shutdown();
158 }
159 }
160 } catch (final RuntimeException ex) {
161 session.shutdown();
162 throw ex;
163 }
164 }
165
166 @Override
167 public void timeout(final IOSession session) {
168 @SuppressWarnings("unchecked")
169 final
170 T conn = (T) session.getAttribute(IOEventDispatch.CONNECTION_KEY);
171 try {
172 final SSLIOSession../../org/apache/http/nio/reactor/ssl/SSLIOSession.html#SSLIOSession">SSLIOSession sslioSession = (SSLIOSession) session.getAttribute(
173 SSLIOSession.SESSION_KEY);
174 ensureNotNull(conn);
175 onTimeout(conn);
176 if (sslioSession != null) {
177 synchronized (sslioSession) {
178 if (sslioSession.isOutboundDone() && !sslioSession.isInboundDone()) {
179
180 sslioSession.shutdown();
181 }
182 }
183 }
184 } catch (final RuntimeException ex) {
185 session.shutdown();
186 throw ex;
187 }
188 }
189
190 }