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 @Override
39 public void filterWrite(NextFilter nextFilter, IoSession session,
40 WriteRequest writeRequest) throws Exception {
41 Object filteredMessage = doFilterWrite(nextFilter, session, writeRequest);
42 if (filteredMessage != null && filteredMessage != writeRequest.getMessage()) {
43 nextFilter.filterWrite(
44 session, new FilteredWriteRequest(
45 filteredMessage, writeRequest));
46 } else {
47 nextFilter.filterWrite(session, writeRequest);
48 }
49 }
50
51 @Override
52 public void messageSent(NextFilter nextFilter, IoSession session,
53 WriteRequest writeRequest) throws Exception {
54 if (writeRequest instanceof FilteredWriteRequest) {
55 FilteredWriteRequest req = (FilteredWriteRequest) writeRequest;
56 if (req.getParent() == this) {
57 nextFilter.messageSent(session, req.getParentRequest());
58 return;
59 }
60 }
61
62 nextFilter.messageSent(session, writeRequest);
63 }
64
65 protected abstract Object doFilterWrite(
66 NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception;
67
68 private class FilteredWriteRequest extends WriteRequestWrapper {
69 private final Object filteredMessage;
70
71 public FilteredWriteRequest(Object filteredMessage, WriteRequest writeRequest) {
72 super(writeRequest);
73
74 if (filteredMessage == null) {
75 throw new NullPointerException("filteredMessage");
76 }
77 this.filteredMessage = filteredMessage;
78 }
79
80 public WriteRequestFilter getParent() {
81 return WriteRequestFilter.this;
82 }
83
84 @Override
85 public Object getMessage() {
86 return filteredMessage;
87 }
88 }
89 }