1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.handler;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.io.OutputStream;
25 import java.net.SocketTimeoutException;
26
27 import org.apache.mina.common.ByteBuffer;
28 import org.apache.mina.common.IdleStatus;
29 import org.apache.mina.common.IoHandler;
30 import org.apache.mina.common.IoHandlerAdapter;
31 import org.apache.mina.common.IoSession;
32 import org.apache.mina.handler.support.IoSessionInputStream;
33 import org.apache.mina.handler.support.IoSessionOutputStream;
34 import org.apache.mina.util.SessionLog;
35
36
37
38
39
40
41
42
43
44
45
46
47 public abstract class StreamIoHandler extends IoHandlerAdapter {
48 private static final String KEY_IN = StreamIoHandler.class.getName()
49 + ".in";
50
51 private static final String KEY_OUT = StreamIoHandler.class.getName()
52 + ".out";
53
54 private int readTimeout;
55
56 private int writeTimeout;
57
58 protected StreamIoHandler() {
59 }
60
61
62
63
64
65
66 protected abstract void processStreamIo(IoSession session, InputStream in,
67 OutputStream out);
68
69
70
71
72
73 public int getReadTimeout() {
74 return readTimeout;
75 }
76
77
78
79
80
81 public void setReadTimeout(int readTimeout) {
82 this.readTimeout = readTimeout;
83 }
84
85
86
87
88
89 public int getWriteTimeout() {
90 return writeTimeout;
91 }
92
93
94
95
96
97 public void setWriteTimeout(int writeTimeout) {
98 this.writeTimeout = writeTimeout;
99 }
100
101
102
103
104 public void sessionOpened(IoSession session) {
105
106 session.setWriteTimeout(writeTimeout);
107 session.setIdleTime(IdleStatus.READER_IDLE, readTimeout);
108
109
110 InputStream in = new IoSessionInputStream();
111 OutputStream out = new IoSessionOutputStream(session);
112 session.setAttribute(KEY_IN, in);
113 session.setAttribute(KEY_OUT, out);
114 processStreamIo(session, in, out);
115 }
116
117
118
119
120 public void sessionClosed(IoSession session) throws Exception {
121 final InputStream in = (InputStream) session.getAttribute(KEY_IN);
122 final OutputStream out = (OutputStream) session.getAttribute(KEY_OUT);
123 try {
124 in.close();
125 } finally {
126 out.close();
127 }
128 }
129
130
131
132
133 public void messageReceived(IoSession session, Object buf) {
134 final IoSessionInputStream in = (IoSessionInputStream) session
135 .getAttribute(KEY_IN);
136 in.write((ByteBuffer) buf);
137 }
138
139
140
141
142 public void exceptionCaught(IoSession session, Throwable cause) {
143 final IoSessionInputStream in = (IoSessionInputStream) session
144 .getAttribute(KEY_IN);
145
146 IOException e = null;
147 if (cause instanceof StreamIoException) {
148 e = (IOException) cause.getCause();
149 } else if (cause instanceof IOException) {
150 e = (IOException) cause;
151 }
152
153 if (e != null && in != null) {
154 in.throwException(e);
155 } else {
156 SessionLog.warn(session, "Unexpected exception.", cause);
157 session.close();
158 }
159 }
160
161
162
163
164 public void sessionIdle(IoSession session, IdleStatus status) {
165 if (status == IdleStatus.READER_IDLE) {
166 throw new StreamIoException(new SocketTimeoutException(
167 "Read timeout"));
168 }
169 }
170
171 private static class StreamIoException extends RuntimeException {
172 private static final long serialVersionUID = 3976736960742503222L;
173
174 public StreamIoException(IOException cause) {
175 super(cause);
176 }
177 }
178 }