1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.ldap.client.api.future;
21
22
23 import java.util.concurrent.BlockingQueue;
24 import java.util.concurrent.LinkedBlockingQueue;
25 import java.util.concurrent.TimeUnit;
26
27 import org.apache.directory.api.i18n.I18n;
28 import org.apache.directory.api.ldap.model.message.Response;
29 import org.apache.directory.ldap.client.api.LdapConnection;
30
31
32
33
34
35
36
37
38 public abstract class MultipleResponseFuture<R extends Response> implements ResponseFuture<R>
39 {
40
41 protected BlockingQueue<R> queue;
42
43
44 protected boolean cancelled = false;
45
46
47 protected Throwable cause;
48
49
50 protected int messageId;
51
52
53 protected LdapConnection connection;
54
55
56
57
58
59
60
61
62 public MultipleResponseFuture( LdapConnection connection, int messageId )
63 {
64 queue = new LinkedBlockingQueue<>();
65 this.messageId = messageId;
66 this.connection = connection;
67 }
68
69
70
71
72
73 @Override
74 public boolean cancel( boolean mayInterruptIfRunning )
75 {
76 if ( !cancelled )
77 {
78
79 cancelled = true;
80
81
82 if ( !connection.isRequestCompleted( messageId ) )
83 {
84 connection.abandon( messageId );
85 }
86
87
88
89 queue.clear();
90 }
91
92 return cancelled;
93 }
94
95
96
97
98
99
100 @Override
101 public R get() throws InterruptedException
102 {
103 return queue.take();
104 }
105
106
107
108
109
110
111
112
113 @Override
114 public void set( R response ) throws InterruptedException
115 {
116 queue.add( response );
117 }
118
119
120
121
122
123
124 @Override
125 public R get( long timeout, TimeUnit unit ) throws InterruptedException
126 {
127 return queue.poll( timeout, unit );
128 }
129
130
131
132
133
134 @Override
135 public boolean isCancelled()
136 {
137 return cancelled;
138 }
139
140
141
142
143
144
145
146 @Override
147 public boolean isDone()
148 {
149 throw new UnsupportedOperationException( I18n.err( I18n.ERR_04106_OPERATION_NOT_SUPPORTED ) );
150 }
151
152
153
154
155
156 public Throwable getCause()
157 {
158 return cause;
159 }
160
161
162
163
164
165
166 public void setCause( Throwable cause )
167 {
168 this.cause = cause;
169 }
170
171
172
173
174
175
176 public void cancel()
177 {
178
179 cancelled = true;
180 }
181
182
183
184
185
186 @Override
187 public String toString()
188 {
189 StringBuilder sb = new StringBuilder();
190
191 sb.append( "[msgId : " ).append( messageId ).append( ", " );
192 sb.append( "size : " ).append( queue.size() ).append( ", " );
193 sb.append( "Canceled :" ).append( cancelled ).append( "]" );
194
195 return sb.toString();
196 }
197 }