diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-15 13:23:06 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-15 13:23:06 -0500 |
| commit | f02bf05c7b639f5edb86388c96dbb209a4622be9 (patch) | |
| tree | fd0bef88337129bc8bf188860172c79729df2b3a /src/main/java/derms/net/rmulticast/ReceivedSet.java | |
| parent | b767b34d97fdacd891702b041cc5eb1fdcb0b0a3 (diff) | |
| download | soen423-f02bf05c7b639f5edb86388c96dbb209a4622be9.zip | |
reliable multicast: prune received list
Diffstat (limited to 'src/main/java/derms/net/rmulticast/ReceivedSet.java')
| -rw-r--r-- | src/main/java/derms/net/rmulticast/ReceivedSet.java | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/src/main/java/derms/net/rmulticast/ReceivedSet.java b/src/main/java/derms/net/rmulticast/ReceivedSet.java index 339a714..963b321 100644 --- a/src/main/java/derms/net/rmulticast/ReceivedSet.java +++ b/src/main/java/derms/net/rmulticast/ReceivedSet.java @@ -1,14 +1,18 @@ package derms.net.rmulticast; import java.io.Serializable; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; class ReceivedSet<T extends Serializable & Hashable> { - private final Set<Message<T>> received; + private final Queue<Message<T>> received; ReceivedSet() { - this.received = new ConcurrentHashMap<Message<T>, Void>().keySet(); + this.received = new ConcurrentLinkedQueue<Message<T>>(); } void add(Message<T> e) { @@ -16,10 +20,49 @@ class ReceivedSet<T extends Serializable & Hashable> { } // TODO: faster search. - boolean contains(MessageID mid) { + Message<T> getByID(MessageID mid) throws NoSuchElementException { for (Message<T> msg : received) if (msg.id().equals(mid)) - return true; - return false; + return msg; + throw new NoSuchElementException("message " + mid + " not in received list."); + } + + boolean contains(MessageID mid) { + try { + Message<T> msg = getByID(mid); + return true; + } catch (NoSuchElementException e) { + return false; + } + } + + /** Remove the specified message from the set, if it is present. */ + void remove(Message<T> msg) { + received.remove(msg); + } + + /** Retrieves, but does not remove, the oldest message, or returns null if the set is empty. */ + Message<T> peekOldest() { + return received.peek(); + } + + Message<T> mostRecentSentBy(InetAddress member) throws NoSuchElementException { + Message<T> recent = null; + for (Message<T> msg : received) { + if (msg.sender.equals(member)) + recent = msg; + } + if (recent == null) + throw new NoSuchElementException("no message from " + member + " in received list."); + return recent; + } + + List<Message<T>> allSentBy(InetAddress sender) { + List<Message<T>> sent = new ArrayList<Message<T>>(); + for (Message<T> msg : received) { + if (msg.sender.equals(sender)) + sent.add(msg); + } + return sent; } } |