1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.proxy.event;
21
22 import java.util.LinkedList;
23 import java.util.Queue;
24
25 import org.apache.mina.proxy.handlers.socks.SocksProxyRequest;
26 import org.apache.mina.proxy.session.ProxyIoSession;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
31
32
33
34
35
36
37 public class IoSessionEventQueue {
38 private final static Logger logger = LoggerFactory
39 .getLogger(IoSessionEventQueue.class);
40
41
42
43
44 private ProxyIoSession proxyIoSession;
45
46
47
48
49 private Queue<IoSessionEvent> sessionEventsQueue = new LinkedList<IoSessionEvent>();
50
51 public IoSessionEventQueue(ProxyIoSession proxyIoSession) {
52 this.proxyIoSession = proxyIoSession;
53 }
54
55
56
57
58 private void discardSessionQueueEvents() {
59 synchronized (sessionEventsQueue) {
60
61 sessionEventsQueue.clear();
62 logger.debug("Event queue CLEARED");
63 }
64 }
65
66
67
68
69
70
71
72
73
74
75
76
77 public void enqueueEventIfNecessary(final IoSessionEvent evt) {
78 logger.debug("??? >> Enqueue {}", evt);
79
80 if (proxyIoSession.getRequest() instanceof SocksProxyRequest) {
81
82 evt.deliverEvent();
83 return;
84 }
85
86 if (proxyIoSession.getHandler().isHandshakeComplete()) {
87 evt.deliverEvent();
88 } else {
89 if (evt.getType() == IoSessionEventType.CLOSED) {
90 if (proxyIoSession.isAuthenticationFailed()) {
91 proxyIoSession.getConnector().cancelConnectFuture();
92 discardSessionQueueEvents();
93 evt.deliverEvent();
94 } else {
95 discardSessionQueueEvents();
96 }
97 } else if (evt.getType() == IoSessionEventType.OPENED) {
98
99
100 enqueueSessionEvent(evt);
101 evt.deliverEvent();
102 } else {
103 enqueueSessionEvent(evt);
104 }
105 }
106 }
107
108
109
110
111
112
113 public void flushPendingSessionEvents() throws Exception {
114 synchronized (sessionEventsQueue) {
115 IoSessionEvent evt;
116
117 while ((evt = sessionEventsQueue.poll()) != null) {
118 logger.debug(" Flushing buffered event: {}", evt);
119 evt.deliverEvent();
120 }
121 }
122 }
123
124
125
126
127
128
129 private void enqueueSessionEvent(final IoSessionEvent evt) {
130 synchronized (sessionEventsQueue) {
131 logger.debug("Enqueuing event: {}", evt);
132 sessionEventsQueue.offer(evt);
133 }
134 }
135 }