3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-07 06:44:16 +00:00

Clean up Peer callback API.

Resolves issue 220.
This commit is contained in:
Miron Cuperman 2012-07-18 11:44:55 -07:00
parent 4d58ea5111
commit 0a9f529f72
3 changed files with 29 additions and 11 deletions

View File

@ -37,6 +37,13 @@ import java.util.concurrent.*;
* <p>{@link Peer#getHandler()} is part of a Netty Pipeline with a Bitcoin serializer downstream of it.
*/
public class Peer {
public interface PeerLifecycleListener {
/** Called when the peer is connected */
public void onPeerConnected(Peer peer);
/** Called when the peer is disconnected */
public void onPeerDisconnected(Peer peer);
}
private static final Logger log = LoggerFactory.getLogger(Peer.class);
public static final int CONNECT_TIMEOUT_MSEC = 60000;
@ -48,6 +55,7 @@ public class Peer {
private final List<GetDataFuture<Block>> pendingGetBlockFutures;
private PeerAddress address;
private List<PeerEventListener> eventListeners;
private List<PeerLifecycleListener> lifecycleListeners;
// Whether to try and download blocks and transactions from this peer. Set to false by PeerGroup if not the
// primary peer. This is to avoid redundant work and concurrency problems with downloading the same chain
// in parallel.
@ -86,6 +94,7 @@ public class Peer {
this.versionMessage = ver;
this.pendingGetBlockFutures = new ArrayList<GetDataFuture<Block>>();
this.eventListeners = new CopyOnWriteArrayList<PeerEventListener>();
this.lifecycleListeners = new CopyOnWriteArrayList<PeerLifecycleListener>();
this.fastCatchupTimeSecs = params.genesisBlock.getTimeSeconds();
this.isAcked = false;
this.handler = new PeerHandler();
@ -109,6 +118,14 @@ public class Peer {
return eventListeners.remove(listener);
}
public synchronized void addLifecycleListener(PeerLifecycleListener listener) {
lifecycleListeners.add(listener);
}
public synchronized boolean removeLifecycleListener(PeerLifecycleListener listener) {
return lifecycleListeners.remove(listener);
}
/**
* Tells the peer to insert received transactions/transaction announcements into the given {@link MemoryPool}.
* This is normally done for you by the {@link PeerGroup} so you don't have to think about it. Transactions stored
@ -132,9 +149,9 @@ public class Peer {
}
private void notifyDisconnect() {
for (PeerEventListener listener : eventListeners) {
for (PeerLifecycleListener listener : lifecycleListeners) {
synchronized (listener) {
listener.onPeerDisconnected(Peer.this, 0);
listener.onPeerDisconnected(Peer.this);
}
}
}
@ -204,10 +221,11 @@ public class Peer {
processAlert((AlertMessage)m);
} else if (m instanceof VersionMessage) {
peerVersionMessage = (VersionMessage)m;
EventListenerInvoker.invoke(eventListeners, new EventListenerInvoker<PeerEventListener>() {
EventListenerInvoker.invoke(lifecycleListeners,
new EventListenerInvoker<PeerLifecycleListener>() {
@Override
public void invoke(PeerEventListener listener) {
listener.onPeerConnected(Peer.this, 1);
public void invoke(PeerLifecycleListener listener) {
listener.onPeerConnected(Peer.this);
}
});
} else if (m instanceof VersionAck) {

View File

@ -95,14 +95,14 @@ public class PeerGroup {
private ClientBootstrap bootstrap;
private class PeerStartupListener extends AbstractPeerEventListener {
public void onPeerConnected(Peer peer, int peerCount) {
private class PeerStartupListener implements Peer.PeerLifecycleListener {
public void onPeerConnected(Peer peer) {
pendingPeers.remove(peer);
peers.add(peer);
handleNewPeer(peer);
}
public void onPeerDisconnected(Peer peer, int peerCount) {
public void onPeerDisconnected(Peer peer) {
pendingPeers.remove(peer);
peers.remove(peer);
channelFutures.remove(peer);
@ -111,7 +111,7 @@ public class PeerGroup {
}
// Visible for testing
PeerEventListener startupListener = new PeerStartupListener();
Peer.PeerLifecycleListener startupListener = new PeerStartupListener();
/**
* Creates a PeerGroup with the given parameters and a default 5 second connection timeout. If you don't care
@ -189,7 +189,7 @@ public class PeerGroup {
ChannelPipeline p = Channels.pipeline();
Peer peer = new Peer(params, chain, ver);
peer.addEventListener(startupListener);
peer.addLifecycleListener(startupListener);
pendingPeers.add(peer);
TCPNetworkConnection codec =
new TCPNetworkConnection(params,

View File

@ -71,7 +71,7 @@ public class PeerGroupTest extends TestWithNetworkConnections {
ChannelPipeline p = Channels.pipeline();
Peer peer = new Peer(params, blockChain, ver);
peer.addEventListener(peerGroup.startupListener);
peer.addLifecycleListener(peerGroup.startupListener);
p.addLast("peer", peer.getHandler());
return p;
}