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.compression;
21
22 import java.io.IOException;
23
24 import org.apache.mina.core.buffer.IoBuffer;
25 import org.apache.mina.core.filterchain.IoFilter;
26 import org.apache.mina.core.filterchain.IoFilterAdapter;
27 import org.apache.mina.core.filterchain.IoFilterChain;
28 import org.apache.mina.core.session.AttributeKey;
29 import org.apache.mina.core.session.IoSession;
30 import org.apache.mina.core.write.WriteRequest;
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
57
58 public class CompressionFilter extends IoFilterAdapter {
59
60
61
62
63 public static final int COMPRESSION_MAX = Zlib.COMPRESSION_MAX;
64
65
66
67
68 public static final int COMPRESSION_MIN = Zlib.COMPRESSION_MIN;
69
70
71
72
73 public static final int COMPRESSION_NONE = Zlib.COMPRESSION_NONE;
74
75
76
77
78
79 public static final int COMPRESSION_DEFAULT = Zlib.COMPRESSION_DEFAULT;
80
81
82
83
84 private final AttributeKeyibuteKey.html#AttributeKey">AttributeKey DEFLATER = new AttributeKey(getClass(), "deflater");
85
86
87
88
89 private final AttributeKeyibuteKey.html#AttributeKey">AttributeKey INFLATER = new AttributeKey(getClass(), "inflater");
90
91
92
93
94 public static final AttributeKeytributeKey">AttributeKey DISABLE_COMPRESSION_ONCE = new AttributeKey(CompressionFilter.class, "disableOnce");
95
96 private boolean compressInbound = true;
97
98 private boolean compressOutbound = true;
99
100 private int compressionLevel;
101
102
103
104
105
106 public CompressionFilter() {
107 this(true, true, COMPRESSION_DEFAULT);
108 }
109
110
111
112
113
114
115
116
117
118
119
120 public CompressionFilter(final int compressionLevel) {
121 this(true, true, compressionLevel);
122 }
123
124
125
126
127
128
129
130
131
132
133
134
135 public CompressionFilter(final boolean compressInbound, final boolean compressOutbound, final int compressionLevel) {
136 this.compressionLevel = compressionLevel;
137 this.compressInbound = compressInbound;
138 this.compressOutbound = compressOutbound;
139 }
140
141
142
143
144 @Override
145 public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
146 Object compressedMessage = doFilterWrite(nextFilter, session, writeRequest);
147
148 if (compressedMessage != null && compressedMessage != writeRequest.getMessage()) {
149 writeRequest.setMessage( compressedMessage );
150 }
151
152 nextFilter.filterWrite(session, writeRequest);
153 }
154
155 @Override
156 public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
157 if (!compressInbound || !(message instanceof IoBuffer)) {
158 nextFilter.messageReceived(session, message);
159 return;
160 }
161
162 Zlib../../../../../org/apache/mina/filter/compression/Zlib.html#Zlib">Zlib inflater = (Zlib) session.getAttribute(INFLATER);
163
164 if (inflater == null) {
165 throw new IllegalStateException();
166 }
167
168 IoBuffer./../../../org/apache/mina/core/buffer/IoBuffer.html#IoBuffer">IoBuffer inBuffer = (IoBuffer) message;
169 nextFilter.messageReceived(session, inflater.inflate(inBuffer));
170 }
171
172
173
174
175 protected Object doFilterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest)
176 throws IOException {
177 if (!compressOutbound) {
178 return null;
179 }
180
181 if (session.containsAttribute(DISABLE_COMPRESSION_ONCE)) {
182
183 session.removeAttribute(DISABLE_COMPRESSION_ONCE);
184 return null;
185 }
186
187 Zlib../../../../../org/apache/mina/filter/compression/Zlib.html#Zlib">Zlib deflater = (Zlib) session.getAttribute(DEFLATER);
188
189 if (deflater == null) {
190 throw new IllegalStateException();
191 }
192
193 IoBuffer./../../../org/apache/mina/core/buffer/IoBuffer.html#IoBuffer">IoBuffer inBuffer = (IoBuffer) writeRequest.getMessage();
194
195 if (!inBuffer.hasRemaining()) {
196
197 return null;
198 } else {
199 return deflater.deflate(inBuffer);
200 }
201 }
202
203 @Override
204 public void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
205 if (parent.contains(CompressionFilter.class)) {
206 throw new IllegalStateException("Only one " + CompressionFilter.class + " is permitted.");
207 }
208
209 Zlibmpression/Zlib.html#Zlib">Zlib deflater = new Zlib(compressionLevel, Zlib.MODE_DEFLATER);
210 Zlibmpression/Zlib.html#Zlib">Zlib inflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER);
211
212 IoSession session = parent.getSession();
213
214 session.setAttribute(DEFLATER, deflater);
215 session.setAttribute(INFLATER, inflater);
216 }
217
218
219
220
221 public boolean isCompressInbound() {
222 return compressInbound;
223 }
224
225
226
227
228
229
230 public void setCompressInbound(boolean compressInbound) {
231 this.compressInbound = compressInbound;
232 }
233
234
235
236
237 public boolean isCompressOutbound() {
238 return compressOutbound;
239 }
240
241
242
243
244
245
246 public void setCompressOutbound(boolean compressOutbound) {
247 this.compressOutbound = compressOutbound;
248 }
249
250 @Override
251 public void onPostRemove(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
252 super.onPostRemove(parent, name, nextFilter);
253 IoSession session = parent.getSession();
254 if (session == null) {
255 return;
256 }
257
258 Zlib../../../../../org/apache/mina/filter/compression/Zlib.html#Zlib">Zlib inflater = (Zlib) session.getAttribute(INFLATER);
259 Zlib../../../../../org/apache/mina/filter/compression/Zlib.html#Zlib">Zlib deflater = (Zlib) session.getAttribute(DEFLATER);
260 if (deflater != null) {
261 deflater.cleanUp();
262 }
263
264 if (inflater != null) {
265 inflater.cleanUp();
266 }
267 }
268 }