package derms.net.rmulticast; import java.io.Serializable; 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 { private final Queue> received; ReceivedSet() { this.received = new ConcurrentLinkedQueue>(); } void add(Message e) { received.add(e); } // TODO: faster search. Message getByID(MessageID mid) throws NoSuchElementException { for (Message msg : received) if (msg.id().equals(mid)) return msg; throw new NoSuchElementException("message " + mid + " not in received list."); } boolean contains(MessageID mid) { try { Message msg = getByID(mid); return true; } catch (NoSuchElementException e) { return false; } } /** Remove the specified message from the set, if it is present. */ void remove(Message msg) { received.remove(msg); } /** Retrieves, but does not remove, the oldest message, or returns null if the set is empty. */ Message peekOldest() { return received.peek(); } Message mostRecentSentBy(InetAddress member) throws NoSuchElementException { Message recent = null; for (Message 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> allSentBy(InetAddress sender) { List> sent = new ArrayList>(); for (Message msg : received) { if (msg.sender.equals(sender)) sent.add(msg); } return sent; } }