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.support;
21
22 import java.io.IOException;
23 import java.io.OutputStream;
24
25 import org.apache.mina.common.ByteBuffer;
26 import org.apache.mina.common.IoSession;
27 import org.apache.mina.common.WriteFuture;
28
29
30
31
32
33
34
35
36 public class IoSessionOutputStream extends OutputStream {
37 private final IoSession session;
38
39 private WriteFuture lastWriteFuture;
40
41 public IoSessionOutputStream(IoSession session) {
42 this.session = session;
43 }
44
45 @Override
46 public void close() throws IOException {
47 try {
48 flush();
49 } finally {
50 session.close().join();
51 }
52 }
53
54 private void checkClosed() throws IOException {
55 if (!session.isConnected()) {
56 throw new IOException("The session has been closed.");
57 }
58 }
59
60 private synchronized void write(ByteBuffer buf) throws IOException {
61 checkClosed();
62 lastWriteFuture = session.write(buf);
63 }
64
65 @Override
66 public void write(byte[] b, int off, int len) throws IOException {
67 write(ByteBuffer.wrap(b.clone(), off, len));
68 }
69
70 @Override
71 public void write(int b) throws IOException {
72 ByteBuffer buf = ByteBuffer.allocate(1);
73 buf.put((byte) b);
74 buf.flip();
75 write(buf);
76 }
77
78 @Override
79 public synchronized void flush() throws IOException {
80 if (lastWriteFuture == null) {
81 return;
82 }
83
84 lastWriteFuture.join();
85 if (!lastWriteFuture.isWritten()) {
86 throw new IOException(
87 "The bytes could not be written to the session");
88 }
89 }
90 }