diff options
Diffstat (limited to 'src/main/java/org/gnunet/requests/MatchingRequestContainer.java')
-rw-r--r-- | src/main/java/org/gnunet/requests/MatchingRequestContainer.java | 51 |
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 @@ | |||
1 | package org.gnunet.requests; | ||
2 | |||
3 | import com.google.common.collect.Maps; | ||
4 | import org.gnunet.mq.MessageQueue; | ||
5 | import org.gnunet.util.Cancelable; | ||
6 | |||
7 | import java.util.Map; | ||
8 | |||
9 | |||
10 | public 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 | } | ||