package io.bitsquare.p2p.peers; import io.bitsquare.app.Log; import io.bitsquare.common.util.Utilities; import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.network.NetworkNode; import io.bitsquare.p2p.storage.messages.BroadcastMessage; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; public class Broadcaster implements BroadcastHandler.ResultHandler { private static final Logger log = LoggerFactory.getLogger(Broadcaster.class); private final NetworkNode networkNode; private PeerManager peerManager; private Set<BroadcastHandler> broadcastHandlers = new CopyOnWriteArraySet<>(); /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// public Broadcaster(NetworkNode networkNode, PeerManager peerManager) { this.networkNode = networkNode; this.peerManager = peerManager; } public void shutDown() { broadcastHandlers.stream().forEach(BroadcastHandler::cancel); broadcastHandlers.clear(); } /////////////////////////////////////////////////////////////////////////////////////////// // API /////////////////////////////////////////////////////////////////////////////////////////// public void broadcast(BroadcastMessage message, @Nullable NodeAddress sender, @Nullable BroadcastHandler.Listener listener, boolean isDataOwner) { Log.traceCall("Sender=" + sender + "\n\t" + "Message=" + Utilities.toTruncatedString(message)); BroadcastHandler broadcastHandler = new BroadcastHandler(networkNode, peerManager); broadcastHandler.broadcast(message, sender, this, listener, isDataOwner); broadcastHandlers.add(broadcastHandler); } /////////////////////////////////////////////////////////////////////////////////////////// // BroadcastHandler.ResultHandler implementation /////////////////////////////////////////////////////////////////////////////////////////// @Override public void onCompleted(BroadcastHandler broadcastHandler) { broadcastHandlers.remove(broadcastHandler); } @Override public void onFault(BroadcastHandler broadcastHandler) { broadcastHandlers.remove(broadcastHandler); } }