aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/gnunet/requests/MatchingRequestContainer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/gnunet/requests/MatchingRequestContainer.java')
-rw-r--r--src/main/java/org/gnunet/requests/MatchingRequestContainer.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main/java/org/gnunet/requests/MatchingRequestContainer.java b/src/main/java/org/gnunet/requests/MatchingRequestContainer.java
new file mode 100644
index 0000000..656d162
--- /dev/null
+++ b/src/main/java/org/gnunet/requests/MatchingRequestContainer.java
@@ -0,0 +1,51 @@
1package org.gnunet.requests;
2
3import com.google.common.collect.Maps;
4import org.gnunet.mq.MessageQueue;
5import org.gnunet.util.Cancelable;
6
7import java.util.Map;
8
9
10public class MatchingRequestContainer<K, T extends RequestContainer.Request> extends RequestContainer {
11 private Map<K,T> requests = Maps.newHashMap();
12 private final MessageQueue mq;
13
14 public MatchingRequestContainer(MessageQueue mq) {
15 this.mq = mq;
16 }
17
18 public Cancelable addRequest(K key, final T request) {
19 if (requests.containsKey(key))
20 throw new AssertionError("key already present in request container");
21 requests.put(key, request);
22 mq.send(request.assembleRequest());
23 return new Cancelable() {
24 @Override
25 public void cancel() {
26 setRequestCancelled(request);
27 if (isRequestTransmitting(request)) {
28 cancelRequestTransmission(request);
29 } else {
30 request.cancel();
31 }
32 }
33 };
34 }
35
36 @Override
37 public void restart() {
38 Map<K,T> requestsOld = requests;
39 requests = Maps.newHashMap();
40 for (Map.Entry<K,T> e : requestsOld.entrySet()) {
41 if (!isRequestCancelled(e.getValue())) {
42 setRequestTransmitting(e.getValue(), false);
43 addRequest(e.getKey(), e.getValue());
44 }
45 }
46 }
47
48 public T getRequest(K key) {
49 return requests.get(key);
50 }
51}