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