1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.filter;
21
22 import java.io.IOException;
23 import java.io.InputStream;
24
25 import org.apache.mina.common.ByteBuffer;
26 import org.apache.mina.common.IoFilterAdapter;
27 import org.apache.mina.common.IoSession;
28 import org.apache.mina.common.WriteFuture;
29 import org.apache.mina.util.Queue;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public class StreamWriteFilter extends IoFilterAdapter {
57
58
59
60 public static final int DEFAULT_STREAM_BUFFER_SIZE = 4096;
61
62
63
64
65 public static final String CURRENT_STREAM = StreamWriteFilter.class
66 .getName()
67 + ".stream";
68
69 protected static final String WRITE_REQUEST_QUEUE = StreamWriteFilter.class
70 .getName()
71 + ".queue";
72
73 protected static final String INITIAL_WRITE_FUTURE = StreamWriteFilter.class
74 .getName()
75 + ".future";
76
77 private int writeBufferSize = DEFAULT_STREAM_BUFFER_SIZE;
78
79 public void filterWrite(NextFilter nextFilter, IoSession session,
80 WriteRequest writeRequest) throws Exception {
81
82 if (session.getAttribute(CURRENT_STREAM) != null) {
83 Queue queue = (Queue) session.getAttribute(WRITE_REQUEST_QUEUE);
84 if (queue == null) {
85 queue = new Queue();
86 session.setAttribute(WRITE_REQUEST_QUEUE, queue);
87 }
88 queue.push(writeRequest);
89 return;
90 }
91
92 Object message = writeRequest.getMessage();
93
94 if (message instanceof InputStream) {
95
96 InputStream inputStream = (InputStream) message;
97
98 ByteBuffer byteBuffer = getNextByteBuffer(inputStream);
99 if (byteBuffer == null) {
100
101 writeRequest.getFuture().setWritten(true);
102 nextFilter.messageSent(session, message);
103 } else {
104 session.setAttribute(CURRENT_STREAM, inputStream);
105 session.setAttribute(INITIAL_WRITE_FUTURE, writeRequest
106 .getFuture());
107
108 nextFilter.filterWrite(session, new WriteRequest(byteBuffer));
109 }
110
111 } else {
112 nextFilter.filterWrite(session, writeRequest);
113 }
114 }
115
116 public void messageSent(NextFilter nextFilter, IoSession session,
117 Object message) throws Exception {
118 InputStream inputStream = (InputStream) session
119 .getAttribute(CURRENT_STREAM);
120
121 if (inputStream == null) {
122 nextFilter.messageSent(session, message);
123 } else {
124 ByteBuffer byteBuffer = getNextByteBuffer(inputStream);
125
126 if (byteBuffer == null) {
127
128 session.removeAttribute(CURRENT_STREAM);
129 WriteFuture writeFuture = (WriteFuture) session
130 .removeAttribute(INITIAL_WRITE_FUTURE);
131
132
133 Queue queue = (Queue) session
134 .removeAttribute(WRITE_REQUEST_QUEUE);
135 if (queue != null) {
136 WriteRequest wr = (WriteRequest) queue.pop();
137 while (wr != null) {
138 filterWrite(nextFilter, session, wr);
139 wr = (WriteRequest) queue.pop();
140 }
141 }
142
143 writeFuture.setWritten(true);
144 nextFilter.messageSent(session, inputStream);
145 } else {
146 nextFilter.filterWrite(session, new WriteRequest(byteBuffer));
147 }
148 }
149 }
150
151 private ByteBuffer getNextByteBuffer(InputStream is) throws IOException {
152 byte[] bytes = new byte[writeBufferSize];
153
154 int off = 0;
155 int n = 0;
156 while (off < bytes.length
157 && (n = is.read(bytes, off, bytes.length - off)) != -1) {
158 off += n;
159 }
160
161 if (n == -1 && off == 0) {
162 return null;
163 }
164
165 ByteBuffer buffer = ByteBuffer.wrap(bytes, 0, off);
166
167 return buffer;
168 }
169
170
171
172
173
174
175
176 public int getWriteBufferSize() {
177 return writeBufferSize;
178 }
179
180
181
182
183
184
185
186 public void setWriteBufferSize(int writeBufferSize) {
187 if (writeBufferSize < 1) {
188 throw new IllegalArgumentException(
189 "writeBufferSize must be at least 1");
190 }
191 this.writeBufferSize = writeBufferSize;
192 }
193
194 }