Add error display for lost connections

This commit is contained in:
Manfred Karrer 2015-04-17 13:42:29 +02:00
parent 24d29eaa83
commit 0344235a23
9 changed files with 434 additions and 323 deletions

View file

@ -25,11 +25,17 @@ import io.bitsquare.crypto.CryptoService;
import org.bitcoinj.core.AbstractWalletEventListener;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.AddressFormatException;
import org.bitcoinj.core.Block;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.DownloadProgressTracker;
import org.bitcoinj.core.FilteredBlock;
import org.bitcoinj.core.GetDataMessage;
import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.Message;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Peer;
import org.bitcoinj.core.PeerAddress;
import org.bitcoinj.core.PeerEventListener;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionConfidence;
import org.bitcoinj.core.TransactionInput;
@ -63,12 +69,17 @@ import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ReadOnlyDoubleProperty;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import org.jetbrains.annotations.NotNull;
@ -107,6 +118,7 @@ public class WalletService {
private Wallet wallet;
private AddressEntry registrationAddressEntry;
private AddressEntry arbitratorDepositAddressEntry;
private final IntegerProperty numPeers = new SimpleIntegerProperty(0);
///////////////////////////////////////////////////////////////////////////////////////////
@ -184,12 +196,9 @@ public class WalletService {
e.printStackTrace();
log.error(e.toString());
}
// As an example!
// walletAppKit.useTor();
}
else if (params == TestNet3Params.get()) {
walletAppKit.setCheckpoints(getClass().getResourceAsStream("/wallet/checkpoints.testnet"));
//walletAppKit.useTor();
}
walletAppKit.setDownloadListener(downloadListener)
@ -210,7 +219,6 @@ public class WalletService {
}
}, Threading.USER_THREAD);
walletAppKit.startAsync();
return status.timeout(30, TimeUnit.SECONDS);
}
@ -220,6 +228,47 @@ public class WalletService {
addressEntryList.onWalletReady(wallet);
registrationAddressEntry = addressEntryList.getRegistrationAddressEntry();
walletAppKit.peerGroup().addEventListener(new PeerEventListener() {
@Override
public void onPeersDiscovered(Set<PeerAddress> peerAddresses) {
}
@Override
public void onBlocksDownloaded(Peer peer, Block block, FilteredBlock filteredBlock, int blocksLeft) {
}
@Override
public void onChainDownloadStarted(Peer peer, int blocksLeft) {
}
@Override
public void onPeerConnected(Peer peer, int peerCount) {
log.trace("onPeerConnected " + peerCount);
Threading.USER_THREAD.execute(() -> numPeers.set(peerCount));
}
@Override
public void onPeerDisconnected(Peer peer, int peerCount) {
log.trace("onPeerDisconnected " + peerCount);
Threading.USER_THREAD.execute(() -> numPeers.set(peerCount));
}
@Override
public Message onPreMessageReceived(Peer peer, Message m) {
return null;
}
@Override
public void onTransaction(Peer peer, Transaction t) {
}
@Nullable
@Override
public List<Message> getData(Peer peer, GetDataMessage m) {
return null;
}
});
}
public void shutDown() {
@ -534,6 +583,14 @@ public class WalletService {
}
}
public int getNumPeers() {
return numPeers.get();
}
public ReadOnlyIntegerProperty numPeersProperty() {
return numPeers;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Inner classes
///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -29,6 +29,10 @@ public class BaseP2PService implements P2PService {
BaseP2PService.userThread = userThread;
}
public static Executor getUserThread() {
return userThread;
}
protected Executor executor;
protected PeerDHT peerDHT;

View file

@ -21,6 +21,8 @@ import io.bitsquare.p2p.tomp2p.BootstrappedPeerBuilder;
import java.security.KeyPair;
import javafx.beans.property.ReadOnlyIntegerProperty;
import rx.Observable;
public interface ClientNode {
@ -31,4 +33,6 @@ public interface ClientNode {
Node getBootstrapNodeAddress();
Observable<BootstrappedPeerBuilder.State> bootstrap(KeyPair keyPair);
ReadOnlyIntegerProperty numPeersProperty();
}

View file

@ -19,6 +19,7 @@ package io.bitsquare.p2p.tomp2p;
import io.bitsquare.BitsquareException;
import io.bitsquare.common.handlers.ResultHandler;
import io.bitsquare.p2p.BaseP2PService;
import io.bitsquare.p2p.ClientNode;
import io.bitsquare.p2p.Node;
@ -35,8 +36,16 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import net.tomp2p.connection.PeerConnection;
import net.tomp2p.connection.PeerException;
import net.tomp2p.dht.PeerDHT;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerStatusListener;
import net.tomp2p.peers.RTT;
import org.jetbrains.annotations.NotNull;
@ -54,7 +63,8 @@ public class TomP2PNode implements ClientNode {
private BootstrappedPeerBuilder bootstrappedPeerBuilder;
private final Subject<BootstrappedPeerBuilder.State, BootstrappedPeerBuilder.State> bootstrapStateSubject;
private final List<ResultHandler> resultHandlers = new CopyOnWriteArrayList<>();
private final IntegerProperty numPeers = new SimpleIntegerProperty(0);
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@ -92,6 +102,20 @@ public class TomP2PNode implements ClientNode {
public void onSuccess(@Nullable PeerDHT peerDHT) {
if (peerDHT != null) {
TomP2PNode.this.peerDHT = peerDHT;
peerDHT.peerBean().addPeerStatusListener(new PeerStatusListener() {
@Override
public boolean peerFailed(PeerAddress peerAddress, PeerException e) {
return false;
}
@Override
public boolean peerFound(PeerAddress peerAddress, PeerAddress peerAddress1, PeerConnection peerConnection, RTT rtt) {
BaseP2PService.getUserThread().execute(() -> numPeers.set(peerDHT.peerBean().peerMap().size()));
return false;
}
});
resultHandlers.stream().forEach(ResultHandler::handleResult);
bootstrapStateSubject.onCompleted();
}
@ -141,4 +165,12 @@ public class TomP2PNode implements ClientNode {
public void removeResultHandler(ResultHandler resultHandler) {
resultHandlers.remove(resultHandler);
}
public int getNumPeers() {
return numPeers.get();
}
public ReadOnlyIntegerProperty numPeersProperty() {
return numPeers;
}
}