aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/gnunet/requests/MatchingRequestContainer.java
blob: 656d162358c0358afc656164803e4d06675cc22c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package org.gnunet.requests;

import com.google.common.collect.Maps;
import org.gnunet.mq.MessageQueue;
import org.gnunet.util.Cancelable;

import java.util.Map;


public class MatchingRequestContainer<K, T extends RequestContainer.Request> extends RequestContainer {
    private Map<K,T> requests = Maps.newHashMap();
    private final MessageQueue mq;

    public MatchingRequestContainer(MessageQueue mq) {
        this.mq = mq;
    }

    public Cancelable addRequest(K key, final T request) {
        if (requests.containsKey(key))
            throw new AssertionError("key already present in request container");
        requests.put(key, request);
        mq.send(request.assembleRequest());
        return new Cancelable() {
            @Override
            public void cancel() {
                setRequestCancelled(request);
                if (isRequestTransmitting(request)) {
                    cancelRequestTransmission(request);
                } else {
                    request.cancel();
                }
            }
        };
    }

    @Override
    public void restart() {
        Map<K,T> requestsOld = requests;
        requests = Maps.newHashMap();
        for (Map.Entry<K,T> e : requestsOld.entrySet()) {
            if (!isRequestCancelled(e.getValue())) {
                setRequestTransmitting(e.getValue(), false);
                addRequest(e.getKey(), e.getValue());
            }
        }
    }

    public T getRequest(K key) {
        return requests.get(key);
    }
}