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.util;
21
22 import org.apache.mina.core.filterchain.IoFilter;
23 import org.apache.mina.core.filterchain.IoFilterAdapter;
24 import org.apache.mina.core.session.IoEventType;
25 import org.apache.mina.core.session.IoSession;
26 import org.apache.mina.core.write.WriteRequest;
27 import org.apache.mina.core.write.WriteRequestWrapper;
28
29
30
31
32
33
34
35
36
37 public abstract class WriteRequestFilter extends IoFilterAdapter {
38
39 @Override
40 public void exceptionCaught(NextFilter nextFilter, IoSession session,
41 Throwable cause) throws Exception {
42 nextFilter.exceptionCaught(session, cause);
43 }
44
45 @Override
46 public void filterWrite(NextFilter nextFilter, IoSession session,
47 WriteRequest writeRequest) throws Exception {
48 Object filteredMessage = doFilterWrite(nextFilter, session, writeRequest);
49 if (filteredMessage != null && filteredMessage != writeRequest.getMessage()) {
50 nextFilter.filterWrite(
51 session, new FilteredWriteRequest(
52 filteredMessage, writeRequest));
53 } else {
54 nextFilter.filterWrite(session, writeRequest);
55 }
56 }
57
58 @Override
59 public void messageSent(NextFilter nextFilter, IoSession session,
60 WriteRequest writeRequest) throws Exception {
61 if (writeRequest instanceof FilteredWriteRequest) {
62 FilteredWriteRequest req = (FilteredWriteRequest) writeRequest;
63 if (req.getParent() == this) {
64 nextFilter.messageSent(session, req.getParentRequest());
65 return;
66 }
67 }
68
69 nextFilter.messageSent(session, writeRequest);
70 }
71
72 protected abstract Object doFilterWrite(
73 NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception;
74
75 private class FilteredWriteRequest extends WriteRequestWrapper {
76 private final Object filteredMessage;
77
78 public FilteredWriteRequest(Object filteredMessage, WriteRequest writeRequest) {
79 super(writeRequest);
80
81 if (filteredMessage == null) {
82 throw new NullPointerException("filteredMessage");
83 }
84 this.filteredMessage = filteredMessage;
85 }
86
87 public WriteRequestFilter getParent() {
88 return WriteRequestFilter.this;
89 }
90
91 @Override
92 public Object getMessage() {
93 return filteredMessage;
94 }
95 }
96 }