Fix mailbox behaviour, renamings

This commit is contained in:
Manfred Karrer 2016-01-27 01:56:56 +01:00
parent 7b87c39ffd
commit a91822803f
24 changed files with 122 additions and 111 deletions

View file

@ -26,7 +26,7 @@ import io.bitsquare.common.crypto.KeyRing;
import io.bitsquare.common.handlers.ErrorMessageHandler; import io.bitsquare.common.handlers.ErrorMessageHandler;
import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.common.handlers.ResultHandler;
import io.bitsquare.common.util.Utilities; import io.bitsquare.common.util.Utilities;
import io.bitsquare.p2p.NetWorkReadyListener; import io.bitsquare.p2p.BootstrapListener;
import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.storage.HashMapChangedListener; import io.bitsquare.p2p.storage.HashMapChangedListener;
@ -89,7 +89,7 @@ public class ArbitratorManager {
)); ));
private static final String publicKeyForTesting = "027a381b5333a56e1cc3d90d3a7d07f26509adf7029ed06fc997c656621f8da1ee"; private static final String publicKeyForTesting = "027a381b5333a56e1cc3d90d3a7d07f26509adf7029ed06fc997c656621f8da1ee";
private final boolean isDevTest; private final boolean isDevTest;
private NetWorkReadyListener netWorkReadyListener; private BootstrapListener bootstrapListener;
private ScheduledThreadPoolExecutor republishArbitratorExecutor; private ScheduledThreadPoolExecutor republishArbitratorExecutor;
@Inject @Inject
@ -121,14 +121,14 @@ public class ArbitratorManager {
if (user.getRegisteredArbitrator() != null) { if (user.getRegisteredArbitrator() != null) {
P2PService p2PService = arbitratorService.getP2PService(); P2PService p2PService = arbitratorService.getP2PService();
if (!p2PService.isNetworkReady()) { if (!p2PService.isBootstrapped()) {
netWorkReadyListener = new NetWorkReadyListener() { bootstrapListener = new BootstrapListener() {
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
republishArbitrator(); republishArbitrator();
} }
}; };
p2PService.addP2PServiceListener(netWorkReadyListener); p2PService.addP2PServiceListener(bootstrapListener);
} else { } else {
republishArbitrator(); republishArbitrator();
@ -144,8 +144,8 @@ public class ArbitratorManager {
} }
private void republishArbitrator() { private void republishArbitrator() {
if (netWorkReadyListener != null) if (bootstrapListener != null)
arbitratorService.getP2PService().removeP2PServiceListener(netWorkReadyListener); arbitratorService.getP2PService().removeP2PServiceListener(bootstrapListener);
Arbitrator registeredArbitrator = user.getRegisteredArbitrator(); Arbitrator registeredArbitrator = user.getRegisteredArbitrator();
if (registeredArbitrator != null) { if (registeredArbitrator != null) {

View file

@ -27,8 +27,8 @@ import io.bitsquare.btc.exceptions.TransactionVerificationException;
import io.bitsquare.btc.exceptions.WalletException; import io.bitsquare.btc.exceptions.WalletException;
import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.common.crypto.KeyRing;
import io.bitsquare.common.crypto.PubKeyRing; import io.bitsquare.common.crypto.PubKeyRing;
import io.bitsquare.p2p.BootstrapListener;
import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Message;
import io.bitsquare.p2p.NetWorkReadyListener;
import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.messaging.DecryptedMsgWithPubKey; import io.bitsquare.p2p.messaging.DecryptedMsgWithPubKey;
@ -68,7 +68,7 @@ public class DisputeManager {
private final DisputeList<Dispute> disputes; private final DisputeList<Dispute> disputes;
transient private final ObservableList<Dispute> disputesObservableList; transient private final ObservableList<Dispute> disputesObservableList;
private final String disputeInfo; private final String disputeInfo;
private final NetWorkReadyListener netWorkReadyListener; private final BootstrapListener bootstrapListener;
private final CopyOnWriteArraySet<DecryptedMsgWithPubKey> decryptedMailboxMessageWithPubKeys = new CopyOnWriteArraySet<>(); private final CopyOnWriteArraySet<DecryptedMsgWithPubKey> decryptedMailboxMessageWithPubKeys = new CopyOnWriteArraySet<>();
private final CopyOnWriteArraySet<DecryptedMsgWithPubKey> decryptedDirectMessageWithPubKeys = new CopyOnWriteArraySet<>(); private final CopyOnWriteArraySet<DecryptedMsgWithPubKey> decryptedDirectMessageWithPubKeys = new CopyOnWriteArraySet<>();
@ -105,24 +105,25 @@ public class DisputeManager {
"Please read more in detail about the dispute process in our wiki:\nhttps://github" + "Please read more in detail about the dispute process in our wiki:\nhttps://github" +
".com/bitsquare/bitsquare/wiki/Dispute-process"; ".com/bitsquare/bitsquare/wiki/Dispute-process";
// We get first the message handler called then the onBootstrapped
p2PService.addDecryptedDirectMessageListener((decryptedMessageWithPubKey, senderAddress) -> { p2PService.addDecryptedDirectMessageListener((decryptedMessageWithPubKey, senderAddress) -> {
decryptedDirectMessageWithPubKeys.add(decryptedMessageWithPubKey); decryptedDirectMessageWithPubKeys.add(decryptedMessageWithPubKey);
if (p2PService.isNetworkReady()) if (p2PService.isBootstrapped())
applyMessages(); applyMessages();
}); });
p2PService.addDecryptedMailboxListener((decryptedMessageWithPubKey, senderAddress) -> { p2PService.addDecryptedMailboxListener((decryptedMessageWithPubKey, senderAddress) -> {
decryptedMailboxMessageWithPubKeys.add(decryptedMessageWithPubKey); decryptedMailboxMessageWithPubKeys.add(decryptedMessageWithPubKey);
if (p2PService.isNetworkReady()) if (p2PService.isBootstrapped())
applyMessages(); applyMessages();
}); });
netWorkReadyListener = new NetWorkReadyListener() { bootstrapListener = new BootstrapListener() {
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
applyMessages(); applyMessages();
} }
}; };
p2PService.addP2PServiceListener(netWorkReadyListener); p2PService.addP2PServiceListener(bootstrapListener);
} }
private void applyMessages() { private void applyMessages() {
@ -138,13 +139,12 @@ public class DisputeManager {
log.debug("decryptedMessageWithPubKey.message " + message); log.debug("decryptedMessageWithPubKey.message " + message);
if (message instanceof DisputeMessage) { if (message instanceof DisputeMessage) {
dispatchMessage((DisputeMessage) message); dispatchMessage((DisputeMessage) message);
//TODO p2PService.removeEntryFromMailbox(decryptedMessageWithPubKey);
//p2PService.removeEntryFromMailbox(decryptedMessageWithPubKey);
} }
}); });
decryptedMailboxMessageWithPubKeys.clear(); decryptedMailboxMessageWithPubKeys.clear();
p2PService.removeP2PServiceListener(netWorkReadyListener); p2PService.removeP2PServiceListener(bootstrapListener);
} }

View file

@ -26,8 +26,8 @@ import io.bitsquare.btc.WalletService;
import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.common.crypto.KeyRing;
import io.bitsquare.common.handlers.FaultHandler; import io.bitsquare.common.handlers.FaultHandler;
import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.common.handlers.ResultHandler;
import io.bitsquare.p2p.BootstrapListener;
import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Message;
import io.bitsquare.p2p.NetWorkReadyListener;
import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.messaging.DecryptedDirectMessageListener; import io.bitsquare.p2p.messaging.DecryptedDirectMessageListener;
@ -80,7 +80,7 @@ public class TradeManager {
private final Storage<TradableList<Trade>> tradableListStorage; private final Storage<TradableList<Trade>> tradableListStorage;
private final TradableList<Trade> trades; private final TradableList<Trade> trades;
private final BooleanProperty pendingTradesInitialized = new SimpleBooleanProperty(); private final BooleanProperty pendingTradesInitialized = new SimpleBooleanProperty();
private final NetWorkReadyListener netWorkReadyListener; private final BootstrapListener bootstrapListener;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -141,21 +141,23 @@ public class TradeManager {
log.trace("Received TradeMessage: " + message); log.trace("Received TradeMessage: " + message);
String tradeId = ((TradeMessage) message).tradeId; String tradeId = ((TradeMessage) message).tradeId;
Optional<Trade> tradeOptional = trades.stream().filter(e -> e.getId().equals(tradeId)).findAny(); Optional<Trade> tradeOptional = trades.stream().filter(e -> e.getId().equals(tradeId)).findAny();
// The mailbox message will be removed inside the tasks after they are processed successfully
if (tradeOptional.isPresent()) if (tradeOptional.isPresent())
tradeOptional.get().setMailboxMessage(decryptedMsgWithPubKey); tradeOptional.get().setMailboxMessage(decryptedMsgWithPubKey);
} }
} }
}); });
netWorkReadyListener = new NetWorkReadyListener() { bootstrapListener = new BootstrapListener() {
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
Log.traceCall("onNetworkReady"); Log.traceCall("onNetworkReady");
// Get called after onMailboxMessageAdded from initial data request // Get called after onMailboxMessageAdded from initial data request
// The mailbox message will be removed inside the tasks after they are processed successfully
initPendingTrades(); initPendingTrades();
} }
}; };
p2PService.addP2PServiceListener(netWorkReadyListener); p2PService.addP2PServiceListener(bootstrapListener);
} }
@ -165,7 +167,7 @@ public class TradeManager {
private void initPendingTrades() { private void initPendingTrades() {
Log.traceCall(); Log.traceCall();
if (netWorkReadyListener != null) p2PService.removeP2PServiceListener(netWorkReadyListener); p2PService.removeP2PServiceListener(bootstrapListener);
//List<Trade> failedTrades = new ArrayList<>(); //List<Trade> failedTrades = new ArrayList<>();
for (Trade trade : trades) { for (Trade trade : trades) {
@ -180,13 +182,7 @@ public class TradeManager {
trade.updateDepositTxFromWallet(tradeWalletService); trade.updateDepositTxFromWallet(tradeWalletService);
initTrade(trade); initTrade(trade);
// after network is ready we remove mailbox messages.
DecryptedMsgWithPubKey mailboxMessage = trade.getMailboxMessage();
if (mailboxMessage != null) {
log.trace("initPendingTrades/removeEntryFromMailbox mailboxMessage = " + mailboxMessage);
p2PService.removeEntryFromMailbox(mailboxMessage);
trade.setMailboxMessage(null);
}
// } // }
} }
pendingTradesInitialized.set(true); pendingTradesInitialized.set(true);

View file

@ -24,8 +24,8 @@ import io.bitsquare.common.UserThread;
import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.common.crypto.KeyRing;
import io.bitsquare.common.handlers.ErrorMessageHandler; import io.bitsquare.common.handlers.ErrorMessageHandler;
import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.common.handlers.ResultHandler;
import io.bitsquare.p2p.BootstrapListener;
import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Message;
import io.bitsquare.p2p.NetWorkReadyListener;
import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.messaging.SendDirectMessageListener; import io.bitsquare.p2p.messaging.SendDirectMessageListener;
@ -67,7 +67,7 @@ public class OpenOfferManager {
private final TradableList<OpenOffer> openOffers; private final TradableList<OpenOffer> openOffers;
private final Storage<TradableList<OpenOffer>> openOffersStorage; private final Storage<TradableList<OpenOffer>> openOffersStorage;
private boolean shutDownRequested; private boolean shutDownRequested;
private NetWorkReadyListener netWorkReadyListener; private BootstrapListener bootstrapListener;
private final Timer timer = new Timer(); private final Timer timer = new Timer();
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -126,14 +126,14 @@ public class OpenOfferManager {
// Before the TTL is reached we re-publish our offers // Before the TTL is reached we re-publish our offers
// If offer removal at shutdown fails we don't want to have long term dangling dead offers, so we set // If offer removal at shutdown fails we don't want to have long term dangling dead offers, so we set
// TTL quite short and use re-publish as strategy. Offerers need to be online anyway. // TTL quite short and use re-publish as strategy. Offerers need to be online anyway.
if (!p2PService.isNetworkReady()) { if (!p2PService.isBootstrapped()) {
netWorkReadyListener = new NetWorkReadyListener() { bootstrapListener = new BootstrapListener() {
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
startRePublishThread(); startRePublishThread();
} }
}; };
p2PService.addP2PServiceListener(netWorkReadyListener); p2PService.addP2PServiceListener(bootstrapListener);
} else { } else {
startRePublishThread(); startRePublishThread();
@ -141,8 +141,8 @@ public class OpenOfferManager {
} }
private void startRePublishThread() { private void startRePublishThread() {
if (netWorkReadyListener != null) if (bootstrapListener != null)
p2PService.removeP2PServiceListener(netWorkReadyListener); p2PService.removeP2PServiceListener(bootstrapListener);
long period = (long) (Offer.TTL * 0.8); // republish sufficiently before offer would expire long period = (long) (Offer.TTL * 0.8); // republish sufficiently before offer would expire
TimerTask timerTask = new TimerTask() { TimerTask timerTask = new TimerTask() {

View file

@ -239,7 +239,7 @@ public class MainViewModel implements ViewModel {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
updateP2pNetworkInfoWithPeersChanged(p2PService.getNumConnectedPeers().get()); updateP2pNetworkInfoWithPeersChanged(p2PService.getNumConnectedPeers().get());
splashP2PNetworkProgress.set(1); splashP2PNetworkProgress.set(1);
} }
@ -566,14 +566,14 @@ public class MainViewModel implements ViewModel {
if (!trade.isHalfTradePeriodReachedWarningDisplayed()) { if (!trade.isHalfTradePeriodReachedWarningDisplayed()) {
new Popup().warning("Your trade with ID " + trade.getShortId() + new Popup().warning("Your trade with ID " + trade.getShortId() +
" has reached the half of the max. allowed trading period and " + " has reached the half of the max. allowed trading period and " +
"is still not completed.\nPlease check your trade state at Portfolio/open trades for further information.").show(); "is still not completed.\nPlease check your trade state at \"Portfolio/Open trades\" for further information.").show();
trade.setHalfTradePeriodReachedWarningDisplayed(true); trade.setHalfTradePeriodReachedWarningDisplayed(true);
} }
break; break;
case TRADE_PERIOD_OVER: case TRADE_PERIOD_OVER:
if (!trade.isTradePeriodOverWarningDisplayed()) { if (!trade.isTradePeriodOverWarningDisplayed()) {
new Popup().warning("Your trade with ID " + trade.getShortId() + " has reached the max. allowed trading period and is " + new Popup().warning("Your trade with ID " + trade.getShortId() + " has reached the max. allowed trading period and is " +
"not completed.\nPlease check your trade at Portfolio/Open trades for contacting the arbitrator.").show(); "not completed.\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.").show();
trade.setTradePeriodOverWarningDisplayed(true); trade.setTradePeriodOverWarningDisplayed(true);
} }
break; break;

View file

@ -219,7 +219,7 @@ public class ArbitratorRegistrationView extends ActivatableViewAndModel<VBox, Ar
} }
private void onRevoke() { private void onRevoke() {
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
model.onRevoke( model.onRevoke(
() -> new Popup().information("You have successfully removed your arbitrator from the P2P network.").show(), () -> new Popup().information("You have successfully removed your arbitrator from the P2P network.").show(),
(errorMessage) -> new Popup().error("Could not remove arbitrator.\nError message: " + errorMessage).show()); (errorMessage) -> new Popup().error("Could not remove arbitrator.\nError message: " + errorMessage).show());
@ -230,7 +230,7 @@ public class ArbitratorRegistrationView extends ActivatableViewAndModel<VBox, Ar
} }
private void onRegister() { private void onRegister() {
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
model.onRegister( model.onRegister(
() -> new Popup().information("You have successfully registered your arbitrator to the P2P network.").show(), () -> new Popup().information("You have successfully registered your arbitrator to the P2P network.").show(),
(errorMessage) -> new Popup().error("Could not register arbitrator.\nError message: " + errorMessage).show()); (errorMessage) -> new Popup().error("Could not register arbitrator.\nError message: " + errorMessage).show());

View file

@ -183,7 +183,7 @@ class ArbitratorRegistrationViewModel extends ActivatableViewModel {
revokeButtonDisabled.set(!allDataValid || myArbitratorProperty.get() == null); revokeButtonDisabled.set(!allDataValid || myArbitratorProperty.get() == null);
} }
boolean isNetworkReady() { boolean isBootstrapped() {
return p2PService.isNetworkReady(); return p2PService.isBootstrapped();
} }
} }

View file

@ -199,7 +199,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void onPlaceOffer() { private void onPlaceOffer() {
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
Offer offer = model.createAndGetOffer(); Offer offer = model.createAndGetOffer();
if (model.getShowPlaceOfferConfirmation()) { if (model.getShowPlaceOfferConfirmation()) {
offerDetailsPopup.onPlaceOffer(o -> model.onPlaceOffer(o)).show(offer); offerDetailsPopup.onPlaceOffer(o -> model.onPlaceOffer(o)).show(offer);

View file

@ -485,8 +485,8 @@ class CreateOfferViewModel extends ActivatableWithDataModel<CreateOfferDataModel
return dataModel.hasAcceptedArbitrators(); return dataModel.hasAcceptedArbitrators();
} }
boolean isNetworkReady() { boolean isBootstrapped() {
return p2PService.isNetworkReady(); return p2PService.isBootstrapped();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -230,7 +230,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
} }
private void onTakeOffer(Offer offer) { private void onTakeOffer(Offer offer) {
if (model.isNetworkReady()) if (model.isBootstrapped())
offerActionHandler.onTakeOffer(offer); offerActionHandler.onTakeOffer(offer);
else else
new Popup().warning("You need to wait until your client is bootstrapped in the network.\n" + new Popup().warning("You need to wait until your client is bootstrapped in the network.\n" +
@ -238,7 +238,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
} }
private void onRemoveOpenOffer(Offer offer) { private void onRemoveOpenOffer(Offer offer) {
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
new Popup().warning("Are you sure you want to remove that offer?\n" + new Popup().warning("Are you sure you want to remove that offer?\n" +
"The offer fee you have paid will be lost if you remove that offer.") "The offer fee you have paid will be lost if you remove that offer.")
.actionButtonText("Remove offer") .actionButtonText("Remove offer")

View file

@ -157,8 +157,8 @@ class OfferBookViewModel extends ActivatableViewModel {
return list; return list;
} }
boolean isNetworkReady() { boolean isBootstrapped() {
return p2PService.isNetworkReady(); return p2PService.isBootstrapped();
} }
public TradeCurrency getTradeCurrency() { public TradeCurrency getTradeCurrency() {

View file

@ -73,7 +73,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
} }
private void onRemoveOpenOffer(OpenOffer openOffer) { private void onRemoveOpenOffer(OpenOffer openOffer) {
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
new Popup().warning("Are you sure you want to remove that offer?\n" + new Popup().warning("Are you sure you want to remove that offer?\n" +
"The offer fee you have paid will be lost if you remove that offer.") "The offer fee you have paid will be lost if you remove that offer.")
.actionButtonText("Remove offer") .actionButtonText("Remove offer")

View file

@ -73,7 +73,7 @@ class OpenOffersViewModel extends ActivatableWithDataModel<OpenOffersDataModel>
return formatter.formatDateTime(item.getOffer().getDate()); return formatter.formatDateTime(item.getOffer().getDate());
} }
boolean isNetworkReady() { boolean isBootstrapped() {
return p2PService.isNetworkReady(); return p2PService.isBootstrapped();
} }
} }

View file

@ -114,6 +114,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
} }
private void onListChanged() { private void onListChanged() {
Log.traceCall();
list.clear(); list.clear();
list.addAll(tradeManager.getTrades().stream().map(PendingTradesListItem::new).collect(Collectors.toList())); list.addAll(tradeManager.getTrades().stream().map(PendingTradesListItem::new).collect(Collectors.toList()));

View file

@ -26,6 +26,7 @@ import io.bitsquare.trade.Trade;
import javafx.beans.property.ReadOnlyBooleanProperty; import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.ListChangeListener;
import javafx.event.EventHandler; import javafx.event.EventHandler;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Scene; import javafx.scene.Scene;
@ -71,6 +72,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
private ChangeListener<Trade> currentTradeChangeListener; private ChangeListener<Trade> currentTradeChangeListener;
private EventHandler<KeyEvent> keyEventEventHandler; private EventHandler<KeyEvent> keyEventEventHandler;
private Scene scene; private Scene scene;
private ListChangeListener<PendingTradesListItem> listChangeListener;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -101,6 +103,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
if (newValue != null) if (newValue != null)
setNewSubView(newValue.getTrade()); setNewSubView(newValue.getTrade());
}; };
listChangeListener = c -> updateSelectedItem();
appFocusChangeListener = (observable, oldValue, newValue) -> { appFocusChangeListener = (observable, oldValue, newValue) -> {
if (newValue && model.getSelectedItem() != null) { if (newValue && model.getSelectedItem() != null) {
@ -134,6 +137,15 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
//setNewSubView(model.currentTrade().get()); //setNewSubView(model.currentTrade().get());
table.setItems(model.getList()); table.setItems(model.getList());
table.getSelectionModel().selectedItemProperty().addListener(selectedItemChangeListener); table.getSelectionModel().selectedItemProperty().addListener(selectedItemChangeListener);
updateSelectedItem();
if (model.getSelectedItem() == null)
model.getList().addListener(listChangeListener);
scene.addEventHandler(KeyEvent.KEY_RELEASED, keyEventEventHandler);
}
private void updateSelectedItem() {
PendingTradesListItem selectedItem = model.getSelectedItem(); PendingTradesListItem selectedItem = model.getSelectedItem();
if (selectedItem != null) { if (selectedItem != null) {
// Select and focus selectedItem from model // Select and focus selectedItem from model
@ -144,13 +156,14 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
UserThread.execute(() -> table.getFocusModel().focus(index)); UserThread.execute(() -> table.getFocusModel().focus(index));
}); });
} }
scene.addEventHandler(KeyEvent.KEY_RELEASED, keyEventEventHandler);
} }
@Override @Override
protected void deactivate() { protected void deactivate() {
table.getSelectionModel().selectedItemProperty().removeListener(selectedItemChangeListener); table.getSelectionModel().selectedItemProperty().removeListener(selectedItemChangeListener);
model.getList().removeListener(listChangeListener);
if (model.currentTrade() != null) if (model.currentTrade() != null)
model.currentTrade().removeListener(currentTradeChangeListener); model.currentTrade().removeListener(currentTradeChangeListener);

View file

@ -221,8 +221,8 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
return btcAddressValidator; return btcAddressValidator;
} }
public boolean isNetworkReady() { public boolean isBootstrapped() {
return p2PService.isNetworkReady(); return p2PService.isBootstrapped();
} }
// columns // columns

View file

@ -107,7 +107,7 @@ public class ConfirmPaymentReceivedView extends TradeStepDetailsView {
private void onPaymentReceived(ActionEvent actionEvent) { private void onPaymentReceived(ActionEvent actionEvent) {
log.debug("onPaymentReceived"); log.debug("onPaymentReceived");
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
Preferences preferences = model.dataModel.getPreferences(); Preferences preferences = model.dataModel.getPreferences();
String key = PopupId.PAYMENT_RECEIVED; String key = PopupId.PAYMENT_RECEIVED;
if (preferences.showAgain(key) && !BitsquareApp.DEV_MODE) { if (preferences.showAgain(key) && !BitsquareApp.DEV_MODE) {

View file

@ -140,7 +140,7 @@ public class StartPaymentView extends TradeStepDetailsView {
private void onPaymentStarted(ActionEvent actionEvent) { private void onPaymentStarted(ActionEvent actionEvent) {
log.debug("onPaymentStarted"); log.debug("onPaymentStarted");
if (model.isNetworkReady()) { if (model.isBootstrapped()) {
String key = PopupId.PAYMENT_SENT; String key = PopupId.PAYMENT_SENT;
if (preferences.showAgain(key) && !BitsquareApp.DEV_MODE) { if (preferences.showAgain(key) && !BitsquareApp.DEV_MODE) {
new Popup().headLine("Confirmation") new Popup().headLine("Confirmation")

View file

@ -107,13 +107,12 @@ public class NetworkSettingsView extends ActivatableViewAndModel<GridPane, Activ
return null; return null;
} }
}); });
p2PServiceListener = new P2PServiceListener() {
@Override
public void onHiddenServicePublished() {
onionAddress.setText(p2PService.getAddress().getFullAddress());
} }
@Override
public void activate() {
NodeAddress nodeAddress = p2PService.getAddress();
if (nodeAddress == null) {
p2PServiceListener = new P2PServiceListener() {
@Override @Override
public void onRequestingDataCompleted() { public void onRequestingDataCompleted() {
} }
@ -127,22 +126,23 @@ public class NetworkSettingsView extends ActivatableViewAndModel<GridPane, Activ
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
} }
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {
} }
@Override
public void onHiddenServicePublished() {
onionAddress.setText(p2PService.getAddress().getFullAddress());
}
@Override @Override
public void onSetupFailed(Throwable throwable) { public void onSetupFailed(Throwable throwable) {
} }
}; };
}
@Override
public void activate() {
NodeAddress nodeAddress = p2PService.getAddress();
if (nodeAddress == null) {
p2PService.addP2PServiceListener(p2PServiceListener); p2PService.addP2PServiceListener(p2PServiceListener);
} else { } else {
onionAddress.setText(nodeAddress.getFullAddress()); onionAddress.setText(nodeAddress.getFullAddress());

View file

@ -1,7 +1,7 @@
package io.bitsquare.p2p; package io.bitsquare.p2p;
public abstract class NetWorkReadyListener implements P2PServiceListener { public abstract class BootstrapListener implements P2PServiceListener {
@Override @Override
public void onTorNodeReady() { public void onTorNodeReady() {
} }
@ -27,5 +27,5 @@ public abstract class NetWorkReadyListener implements P2PServiceListener {
} }
@Override @Override
abstract public void onBootstrapped(); abstract public void onBootstrapComplete();
} }

View file

@ -79,6 +79,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
private boolean shutDownComplete; private boolean shutDownComplete;
private ChangeListener<NodeAddress> connectionNodeAddressListener; private ChangeListener<NodeAddress> connectionNodeAddressListener;
private Subscription networkReadySubscription; private Subscription networkReadySubscription;
private boolean isBootstrapped;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -266,7 +267,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
"seedNodeOfPreliminaryDataRequest must be present"); "seedNodeOfPreliminaryDataRequest must be present");
peerExchangeManager.requestReportedPeers(seedNodeOfPreliminaryDataRequest.get()); peerExchangeManager.requestReportedPeers(seedNodeOfPreliminaryDataRequest.get());
p2pServiceListeners.stream().forEach(P2PServiceListener::onBootstrapped); isBootstrapped = true;
p2pServiceListeners.stream().forEach(P2PServiceListener::onBootstrapComplete);
} }
@Override @Override
@ -377,7 +379,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
SendDirectMessageListener sendDirectMessageListener) { SendDirectMessageListener sendDirectMessageListener) {
Log.traceCall(); Log.traceCall();
checkNotNull(peerNodeAddress, "PeerAddress must not be null (sendEncryptedDirectMessage)"); checkNotNull(peerNodeAddress, "PeerAddress must not be null (sendEncryptedDirectMessage)");
if (isNetworkReady()) { if (isBootstrapped()) {
doSendEncryptedDirectMessage(peerNodeAddress, pubKeyRing, message, sendDirectMessageListener); doSendEncryptedDirectMessage(peerNodeAddress, pubKeyRing, message, sendDirectMessageListener);
} else { } else {
throw new NetworkNotReadyException(); throw new NetworkNotReadyException();
@ -473,7 +475,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
checkArgument(optionalEncryptionService.isPresent(), checkArgument(optionalEncryptionService.isPresent(),
"EncryptionService not set. Seems that is called on a seed node which must not happen."); "EncryptionService not set. Seems that is called on a seed node which must not happen.");
if (isNetworkReady()) { if (isBootstrapped()) {
if (!networkNode.getAllConnections().isEmpty()) { if (!networkNode.getAllConnections().isEmpty()) {
try { try {
log.info("\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" + log.info("\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" +
@ -527,7 +529,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
checkArgument(optionalKeyRing.isPresent(), checkArgument(optionalKeyRing.isPresent(),
"keyRing not set. Seems that is called on a seed node which must not happen."); "keyRing not set. Seems that is called on a seed node which must not happen.");
if (isNetworkReady()) { if (isBootstrapped()) {
if (!networkNode.getAllConnections().isEmpty()) { if (!networkNode.getAllConnections().isEmpty()) {
try { try {
ProtectedMailboxData protectedMailboxData = p2PDataStorage.getMailboxDataWithSignedSeqNr( ProtectedMailboxData protectedMailboxData = p2PDataStorage.getMailboxDataWithSignedSeqNr(
@ -571,7 +573,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
public void removeEntryFromMailbox(DecryptedMsgWithPubKey decryptedMsgWithPubKey) { public void removeEntryFromMailbox(DecryptedMsgWithPubKey decryptedMsgWithPubKey) {
Log.traceCall(); Log.traceCall();
checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen."); checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen.");
if (isNetworkReady()) { if (isBootstrapped()) {
if (mailboxMap.containsKey(decryptedMsgWithPubKey)) { if (mailboxMap.containsKey(decryptedMsgWithPubKey)) {
ProtectedMailboxData mailboxData = mailboxMap.get(decryptedMsgWithPubKey); ProtectedMailboxData mailboxData = mailboxMap.get(decryptedMsgWithPubKey);
if (mailboxData != null && mailboxData.expirablePayload instanceof ExpirableMailboxPayload) { if (mailboxData != null && mailboxData.expirablePayload instanceof ExpirableMailboxPayload) {
@ -620,7 +622,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
private boolean doAddData(ExpirablePayload expirablePayload, boolean rePublish) { private boolean doAddData(ExpirablePayload expirablePayload, boolean rePublish) {
Log.traceCall(); Log.traceCall();
checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen."); checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen.");
if (isNetworkReady()) { if (isBootstrapped()) {
try { try {
ProtectedData protectedData = p2PDataStorage.getDataWithSignedSeqNr(expirablePayload, optionalKeyRing.get().getSignatureKeyPair()); ProtectedData protectedData = p2PDataStorage.getDataWithSignedSeqNr(expirablePayload, optionalKeyRing.get().getSignatureKeyPair());
if (rePublish) if (rePublish)
@ -639,7 +641,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
public boolean removeData(ExpirablePayload expirablePayload) { public boolean removeData(ExpirablePayload expirablePayload) {
Log.traceCall(); Log.traceCall();
checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen."); checkArgument(optionalKeyRing.isPresent(), "keyRing not set. Seems that is called on a seed node which must not happen.");
if (isNetworkReady()) { if (isBootstrapped()) {
try { try {
ProtectedData protectedData = p2PDataStorage.getDataWithSignedSeqNr(expirablePayload, optionalKeyRing.get().getSignatureKeyPair()); ProtectedData protectedData = p2PDataStorage.getDataWithSignedSeqNr(expirablePayload, optionalKeyRing.get().getSignatureKeyPair());
return p2PDataStorage.remove(protectedData, networkNode.getNodeAddress()); return p2PDataStorage.remove(protectedData, networkNode.getNodeAddress());
@ -686,8 +688,8 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
// Getters // Getters
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public boolean isNetworkReady() { public boolean isBootstrapped() {
return hiddenServicePublished.get() && preliminaryDataReceived.get(); return isBootstrapped;
} }
public NetworkNode getNetworkNode() { public NetworkNode getNetworkNode() {
@ -710,7 +712,6 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis
return p2PDataStorage.getMap(); return p2PDataStorage.getMap();
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Private // Private
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -11,5 +11,5 @@ public interface P2PServiceListener extends SetupListener {
void onNoPeersAvailable(); void onNoPeersAvailable();
void onBootstrapped(); void onBootstrapComplete();
} }

View file

@ -95,7 +95,7 @@ public class TestUtils {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
} }
@Override @Override
@ -148,7 +148,7 @@ public class TestUtils {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
latch.countDown(); latch.countDown();
} }

View file

@ -104,7 +104,7 @@ public class PeerManagerTest {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
} }
@Override @Override
@ -155,7 +155,7 @@ public class PeerManagerTest {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
latch.countDown(); latch.countDown();
} }
@ -193,7 +193,7 @@ public class PeerManagerTest {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
latch.countDown(); latch.countDown();
} }
@ -430,7 +430,7 @@ public class PeerManagerTest {
} }
@Override @Override
public void onBootstrapped() { public void onBootstrapComplete() {
} }
@Override @Override