From bcb22ddaa3b8545d669132f1ae4d659f276c454d Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 5 Apr 2015 02:00:38 +0200 Subject: [PATCH] Add new tab for funds --- .../java/io/bitsquare/BitsquareException.java | 1 - .../common/taskrunner/TaskRunner.java | 14 +- .../bitsquare/gui/main/funds/FundsView.fxml | 1 + .../bitsquare/gui/main/funds/FundsView.java | 19 +- .../main/funds/reserved/ReservedListItem.java | 170 +++++++++++++ .../gui/main/funds/reserved/ReservedView.fxml | 44 ++++ .../gui/main/funds/reserved/ReservedView.java | 234 ++++++++++++++++++ .../main/funds/withdrawal/WithdrawalView.java | 14 +- .../gui/main/portfolio/PortfolioView.java | 2 - .../closed/ClosedTradesDataModel.java | 2 +- .../closed/ClosedTradesViewModel.java | 2 +- .../pending/PendingTradesDataModel.java | 177 +++++++------ .../pending/PendingTradesListItem.java | 2 +- .../portfolio/pending/PendingTradesView.java | 45 ++-- .../pending/PendingTradesViewModel.java | 142 ++++++----- .../main/portfolio/pending/TradeSubView.java | 16 +- .../pending/steps/CompletedView.java | 53 +--- .../steps/ConfirmFiatReceivedView.java | 13 +- .../pending/steps/StartFiatView.java | 7 +- .../pending/steps/TradeStepDetailsView.java | 2 - .../pending/steps/WaitFiatReceivedView.java | 8 +- .../pending/steps/WaitTxInBlockchainView.java | 8 +- .../java/io/bitsquare/offer/OfferBook.java | 2 +- .../offer/tomp2p/TomP2POfferBookService.java | 18 +- .../p2p/tomp2p/BootstrappedPeerBuilder.java | 2 +- .../bitsquare/trade/BuyerAsOffererTrade.java | 64 +---- .../io/bitsquare/trade/BuyerAsTakerTrade.java | 75 +----- .../java/io/bitsquare/trade/OffererTrade.java | 77 +++++- .../bitsquare/trade/SellerAsOffererTrade.java | 68 +---- .../bitsquare/trade/SellerAsTakerTrade.java | 72 +----- .../java/io/bitsquare/trade/TakerTrade.java | 87 ++++++- .../main/java/io/bitsquare/trade/Trade.java | 8 +- .../java/io/bitsquare/trade/TradeManager.java | 2 +- .../trade/BuyerAsOffererProtocol.java | 13 +- .../protocol/trade/BuyerAsTakerProtocol.java | 14 +- .../protocol/trade/BuyerProtocol.java} | 14 +- .../protocol/trade/OffererProtocol.java} | 13 +- .../trade/SellerAsOffererProtocol.java | 13 +- .../protocol/trade/SellerAsTakerProtocol.java | 16 +- .../trade/protocol/trade/SellerProtocol.java | 22 ++ .../trade/protocol/trade/TakerProtocol.java | 22 ++ .../trade/protocol/trade/TradeTaskRunner.java | 35 +++ .../seller/SendPayoutTxPublishedMessage.java | 2 +- core/src/main/resources/logback.xml | 3 +- 44 files changed, 1008 insertions(+), 610 deletions(-) create mode 100644 core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedListItem.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.fxml create mode 100644 core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.java rename core/src/main/java/io/bitsquare/{gui/main/portfolio/pending/NoTradeFoundException.java => trade/protocol/trade/BuyerProtocol.java} (69%) rename core/src/main/java/io/bitsquare/{gui/main/portfolio/pending/MissingTradeException.java => trade/protocol/trade/OffererProtocol.java} (66%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/SellerProtocol.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/TakerProtocol.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/TradeTaskRunner.java diff --git a/core/src/main/java/io/bitsquare/BitsquareException.java b/core/src/main/java/io/bitsquare/BitsquareException.java index 36e704d4d5..945c910af4 100644 --- a/core/src/main/java/io/bitsquare/BitsquareException.java +++ b/core/src/main/java/io/bitsquare/BitsquareException.java @@ -17,7 +17,6 @@ package io.bitsquare; -@SuppressWarnings("serializable") public class BitsquareException extends RuntimeException { private static final long serialVersionUID = 556191645860856173L; diff --git a/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java b/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java index edd6aabc8b..8dc5ff240b 100644 --- a/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java +++ b/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java @@ -33,6 +33,7 @@ public class TaskRunner { private final Queue> tasks = new LinkedBlockingQueue<>(); protected final T sharedModel; + private final Class sharedModelClass; private final ResultHandler resultHandler; private final ErrorMessageHandler errorMessageHandler; private boolean failed = false; @@ -40,10 +41,16 @@ public class TaskRunner { private Class currentTask; + public TaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + this(sharedModel, sharedModel.getClass(), resultHandler, errorMessageHandler); + } + + public TaskRunner(T sharedModel, Class sharedModelClass, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { this.sharedModel = sharedModel; this.resultHandler = resultHandler; this.errorMessageHandler = errorMessageHandler; + this.sharedModelClass = sharedModelClass; } public final void addTasks(Class>... items) { @@ -61,12 +68,7 @@ public class TaskRunner { try { currentTask = tasks.poll(); log.trace("Run task: " + currentTask.getSimpleName()); - // We use also super class as type ein tasks, so we need to support both variants - try { - currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run(); - } catch (Throwable throwable) { - currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass().getSuperclass()).newInstance(this, sharedModel).run(); - } + currentTask.getDeclaredConstructor(TaskRunner.class, sharedModelClass).newInstance(this, sharedModel).run(); } catch (Throwable throwable) { throwable.printStackTrace(); handleErrorMessage("Error at taskRunner: " + throwable.getMessage()); diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.fxml b/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.fxml index 42e9c13722..51135ab6ac 100644 --- a/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.fxml +++ b/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.fxml @@ -23,6 +23,7 @@ AnchorPane.topAnchor="0.0" xmlns:fx="http://javafx.com/fxml"> + diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.java b/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.java index 3ba412083c..ee28ae2305 100644 --- a/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.java +++ b/core/src/main/java/io/bitsquare/gui/main/funds/FundsView.java @@ -25,6 +25,7 @@ import io.bitsquare.common.viewfx.view.View; import io.bitsquare.common.viewfx.view.ViewLoader; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.main.MainView; +import io.bitsquare.gui.main.funds.reserved.ReservedView; import io.bitsquare.gui.main.funds.transactions.TransactionsView; import io.bitsquare.gui.main.funds.withdrawal.WithdrawalView; @@ -37,7 +38,7 @@ import javafx.scene.control.*; @FxmlView public class FundsView extends ActivatableViewAndModel { - @FXML Tab withdrawalTab, transactionsTab; + @FXML Tab reservedTab, withdrawalTab, transactionsTab; private Navigation.Listener navigationListener; private ChangeListener tabChangeListener; @@ -60,7 +61,9 @@ public class FundsView extends ActivatableViewAndModel { }; tabChangeListener = (ov, oldValue, newValue) -> { - if (newValue == withdrawalTab) + if (newValue == reservedTab) + navigation.navigateTo(MainView.class, FundsView.class, ReservedView.class); + else if (newValue == withdrawalTab) navigation.navigateTo(MainView.class, FundsView.class, WithdrawalView.class); else if (newValue == transactionsTab) navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class); @@ -72,10 +75,12 @@ public class FundsView extends ActivatableViewAndModel { root.getSelectionModel().selectedItemProperty().addListener(tabChangeListener); navigation.addListener(navigationListener); - if (root.getSelectionModel().getSelectedItem() == transactionsTab) - navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class); - else + if (root.getSelectionModel().getSelectedItem() == reservedTab) + navigation.navigateTo(MainView.class, FundsView.class, ReservedView.class); + else if (root.getSelectionModel().getSelectedItem() == withdrawalTab) navigation.navigateTo(MainView.class, FundsView.class, WithdrawalView.class); + else if (root.getSelectionModel().getSelectedItem() == transactionsTab) + navigation.navigateTo(MainView.class, FundsView.class, TransactionsView.class); } @Override @@ -92,7 +97,9 @@ public class FundsView extends ActivatableViewAndModel { View view = viewLoader.load(viewClass); - if (view instanceof WithdrawalView) + if (view instanceof ReservedView) + currentTab = reservedTab; + else if (view instanceof WithdrawalView) currentTab = withdrawalTab; else if (view instanceof TransactionsView) currentTab = transactionsTab; diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedListItem.java b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedListItem.java new file mode 100644 index 0000000000..743a8a3cfa --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedListItem.java @@ -0,0 +1,170 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.funds.reserved; + +import io.bitsquare.btc.AddressEntry; +import io.bitsquare.btc.WalletService; +import io.bitsquare.btc.listeners.AddressConfidenceListener; +import io.bitsquare.btc.listeners.BalanceListener; +import io.bitsquare.gui.components.confidence.ConfidenceProgressIndicator; +import io.bitsquare.gui.util.BSFormatter; + +import org.bitcoinj.core.Address; +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.TransactionConfidence; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.control.*; + +import static com.google.common.base.Preconditions.checkNotNull; + +public class ReservedListItem { + private final StringProperty addressString = new SimpleStringProperty(); + private final BalanceListener balanceListener; + + private final Label balanceLabel; + + private final AddressEntry addressEntry; + + private final WalletService walletService; + private final BSFormatter formatter; + private final AddressConfidenceListener confidenceListener; + + private final ConfidenceProgressIndicator progressIndicator; + + private final Tooltip tooltip; + + private Coin balance; + + public ReservedListItem(AddressEntry addressEntry, WalletService walletService, BSFormatter formatter) { + this.addressEntry = addressEntry; + this.walletService = walletService; + this.formatter = formatter; + this.addressString.set(getAddress().toString()); + + // confidence + progressIndicator = new ConfidenceProgressIndicator(); + progressIndicator.setId("funds-confidence"); + tooltip = new Tooltip("Not used yet"); + progressIndicator.setProgress(0); + progressIndicator.setPrefSize(24, 24); + Tooltip.install(progressIndicator, tooltip); + + confidenceListener = walletService.addAddressConfidenceListener(new AddressConfidenceListener(getAddress()) { + @Override + public void onTransactionConfidenceChanged(TransactionConfidence confidence) { + updateConfidence(confidence); + } + }); + + updateConfidence(walletService.getConfidenceForAddress(getAddress())); + + + // balance + balanceLabel = new Label(); + balanceListener = walletService.addBalanceListener(new BalanceListener(getAddress()) { + @Override + public void onBalanceChanged(Coin balance) { + updateBalance(balance); + } + }); + + updateBalance(walletService.getBalanceForAddress(getAddress())); + } + + public void cleanup() { + walletService.removeAddressConfidenceListener(confidenceListener); + walletService.removeBalanceListener(balanceListener); + } + + private void updateBalance(Coin balance) { + this.balance = balance; + if (balance != null) { + balanceLabel.setText(formatter.formatCoin(balance)); + } + } + + private void updateConfidence(TransactionConfidence confidence) { + if (confidence != null) { + //log.debug("Type numBroadcastPeers getDepthInBlocks " + confidence.getConfidenceType() + " / " + + // confidence.numBroadcastPeers() + " / " + confidence.getDepthInBlocks()); + switch (confidence.getConfidenceType()) { + case UNKNOWN: + tooltip.setText("Unknown transaction status"); + progressIndicator.setProgress(0); + break; + case PENDING: + tooltip.setText("Seen by " + confidence.numBroadcastPeers() + " peer(s) / 0 confirmations"); + progressIndicator.setProgress(-1.0); + break; + case BUILDING: + tooltip.setText("Confirmed in " + confidence.getDepthInBlocks() + " block(s)"); + progressIndicator.setProgress(Math.min(1, (double) confidence.getDepthInBlocks() / 6.0)); + break; + case DEAD: + tooltip.setText("Transaction is invalid."); + progressIndicator.setProgress(0); + break; + } + } + } + + + public final String getLabel() { + switch (addressEntry.getContext()) { + case REGISTRATION_FEE: + return "Registration fee"; + case TRADE: + checkNotNull(addressEntry.getOfferId()); + return "Offer ID: " + addressEntry.getOfferId(); + case ARBITRATOR_DEPOSIT: + return "Arbitration deposit"; + } + return ""; + } + + + public final StringProperty addressStringProperty() { + return this.addressString; + } + + Address getAddress() { + return addressEntry.getAddress(); + } + + + public AddressEntry getAddressEntry() { + return addressEntry; + } + + + public ConfidenceProgressIndicator getProgressIndicator() { + return progressIndicator; + } + + + public Label getBalanceLabel() { + return balanceLabel; + } + + + public Coin getBalance() { + return balance; + } +} diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.fxml b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.fxml new file mode 100644 index 0000000000..c45f61260f --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.fxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.java b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.java new file mode 100644 index 0000000000..2ef4fec787 --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/funds/reserved/ReservedView.java @@ -0,0 +1,234 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.funds.reserved; + +import io.bitsquare.btc.WalletService; +import io.bitsquare.btc.listeners.BalanceListener; +import io.bitsquare.common.viewfx.view.ActivatableViewAndModel; +import io.bitsquare.common.viewfx.view.FxmlView; +import io.bitsquare.gui.util.BSFormatter; +import io.bitsquare.trade.TradeManager; +import io.bitsquare.util.Utilities; + +import org.bitcoinj.core.Coin; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.inject.Inject; + +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.util.Callback; + +import de.jensd.fx.fontawesome.AwesomeDude; +import de.jensd.fx.fontawesome.AwesomeIcon; + +@FxmlView +public class ReservedView extends ActivatableViewAndModel { + + @FXML TableView table; + @FXML TableColumn labelColumn, addressColumn, balanceColumn, copyColumn, + confidenceColumn; + + private final WalletService walletService; + private final TradeManager tradeManager; + private final BSFormatter formatter; + private final ObservableList addressList = FXCollections.observableArrayList(); + + @Inject + private ReservedView(WalletService walletService, TradeManager tradeManager, BSFormatter formatter) { + this.walletService = walletService; + this.tradeManager = tradeManager; + this.formatter = formatter; + } + + + @Override + public void initialize() { + table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); + table.setPlaceholder(new Label("No funded are reserved in open offers or trades")); + + setLabelColumnCellFactory(); + setBalanceColumnCellFactory(); + setCopyColumnCellFactory(); + setConfidenceColumnCellFactory(); + } + + @Override + public void doActivate() { + fillList(); + table.setItems(addressList); + + walletService.addBalanceListener(new BalanceListener() { + @Override + public void onBalanceChanged(Coin balance) { + fillList(); + } + }); + } + + @Override + public void doDeactivate() { + addressList.forEach(ReservedListItem::cleanup); + } + + + private void fillList() { + addressList.clear(); + addressList.addAll(Stream.concat(tradeManager.getOpenOfferTrades().stream(), tradeManager.getPendingTrades().stream()) + .map(trade -> new ReservedListItem(walletService.getAddressEntry(trade.getId()), walletService, formatter)) + .collect(Collectors.toList())); + + // List addressEntryList = walletService.getAddressEntryList(); + /* addressList.addAll(addressEntryList.stream() + .filter(e -> walletService.getBalanceForAddress(e.getAddress()).isPositive()) + .map(anAddressEntryList -> new ReservedListItem(anAddressEntryList, walletService, formatter)) + .collect(Collectors.toList()));*/ + } + + private void setLabelColumnCellFactory() { + labelColumn.setCellValueFactory((addressListItem) -> new ReadOnlyObjectWrapper<>(addressListItem.getValue())); + labelColumn.setCellFactory(new Callback, + TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + + private Hyperlink hyperlink; + + @Override + public void updateItem(final ReservedListItem item, boolean empty) { + super.updateItem(item, empty); + + if (item != null && !empty) { + hyperlink = new Hyperlink(item.getLabel()); + hyperlink.setId("id-link"); + if (item.getAddressEntry().getOfferId() != null) { + Tooltip tooltip = new Tooltip(item.getAddressEntry().getOfferId()); + Tooltip.install(hyperlink, tooltip); + + hyperlink.setOnAction(event -> log.info("Show trade details " + item.getAddressEntry + ().getOfferId())); + } + setGraphic(hyperlink); + } + else { + setGraphic(null); + setId(null); + } + } + }; + } + }); + } + + private void setBalanceColumnCellFactory() { + balanceColumn.setCellValueFactory((addressListItem) -> new ReadOnlyObjectWrapper<>(addressListItem.getValue())); + balanceColumn.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + @Override + public void updateItem(final ReservedListItem item, boolean empty) { + super.updateItem(item, empty); + setGraphic((item != null && !empty) ? item.getBalanceLabel() : null); + } + }; + } + }); + } + + private void setCopyColumnCellFactory() { + copyColumn.setCellValueFactory((addressListItem) -> new ReadOnlyObjectWrapper<>(addressListItem.getValue())); + copyColumn.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + final Label copyIcon = new Label(); + + { + copyIcon.getStyleClass().add("copy-icon"); + AwesomeDude.setIcon(copyIcon, AwesomeIcon.COPY); + Tooltip.install(copyIcon, new Tooltip("Copy address to clipboard")); + } + + @Override + public void updateItem(final ReservedListItem item, boolean empty) { + super.updateItem(item, empty); + + if (item != null && !empty) { + setGraphic(copyIcon); + copyIcon.setOnMouseClicked(e -> Utilities.copyToClipboard(item + .addressStringProperty().get())); + + } + else { + setGraphic(null); + } + } + }; + } + }); + } + + private void setConfidenceColumnCellFactory() { + confidenceColumn.setCellValueFactory((addressListItem) -> + new ReadOnlyObjectWrapper<>(addressListItem.getValue())); + confidenceColumn.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + + @Override + public void updateItem(final ReservedListItem item, boolean empty) { + super.updateItem(item, empty); + + if (item != null && !empty) { + setGraphic(item.getProgressIndicator()); + } + else { + setGraphic(null); + } + } + }; + } + }); + } + +} + + diff --git a/core/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java b/core/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java index b293113536..a55db006f7 100644 --- a/core/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java +++ b/core/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java @@ -26,6 +26,7 @@ import io.bitsquare.common.viewfx.view.ActivatableViewAndModel; import io.bitsquare.common.viewfx.view.FxmlView; import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.util.BSFormatter; +import io.bitsquare.trade.TradeManager; import io.bitsquare.util.Utilities; import org.bitcoinj.core.AddressFormatException; @@ -37,6 +38,7 @@ import com.google.common.util.concurrent.FutureCallback; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.inject.Inject; @@ -64,12 +66,14 @@ public class WithdrawalView extends ActivatableViewAndModel { confidenceColumn; private final WalletService walletService; + private TradeManager tradeManager; private final BSFormatter formatter; private final ObservableList addressList = FXCollections.observableArrayList(); @Inject - private WithdrawalView(WalletService walletService, BSFormatter formatter) { + private WithdrawalView(WalletService walletService, TradeManager tradeManager, BSFormatter formatter) { this.walletService = walletService; + this.tradeManager = tradeManager; this.formatter = formatter; } @@ -77,7 +81,7 @@ public class WithdrawalView extends ActivatableViewAndModel { @Override public void initialize() { table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); - table.setPlaceholder(new Label("No funded wallets for withdrawal available")); + table.setPlaceholder(new Label("No funds for withdrawal available")); setLabelColumnCellFactory(); setBalanceColumnCellFactory(); @@ -176,8 +180,14 @@ public class WithdrawalView extends ActivatableViewAndModel { private void fillList() { addressList.clear(); List addressEntryList = walletService.getAddressEntryList(); + + List reservedTrades = Stream.concat(tradeManager.getOpenOfferTrades().stream(), tradeManager.getPendingTrades().stream()) + .map(trade -> trade.getId()) + .collect(Collectors.toList()); + addressList.addAll(addressEntryList.stream() .filter(e -> walletService.getBalanceForAddress(e.getAddress()).isPositive()) + .filter(e -> !reservedTrades.contains(e.getOfferId())) .map(anAddressEntryList -> new WithdrawalListItem(anAddressEntryList, walletService, formatter)) .collect(Collectors.toList())); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java index ecbb592f03..7a50b9b38e 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/PortfolioView.java @@ -76,8 +76,6 @@ public class PortfolioView extends ActivatableViewAndModel root.getSelectionModel().selectedItemProperty().addListener(tabChangeListener); navigation.addListener(navigationListener); - // navigation.navigateTo(MainView.class, PortfolioView.class, PendingTradesView.class); - /* if (tradeManager.getPendingTrades().size() == 0) navigation.navigateTo(MainView.class, PortfolioView.class, OffersView.class); else diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java index e26872b606..219f04f890 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesDataModel.java @@ -74,7 +74,7 @@ class ClosedTradesDataModel implements Activatable, DataModel { list.addAll(tradeManager.getClosedTrades().stream().map(ClosedTradesListItem::new).collect(Collectors.toList())); // we sort by date, earliest first - list.sort((o1, o2) -> o2.getTrade().getTakeOfferDate().compareTo(o1.getTrade().getTakeOfferDate())); + list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate())); } } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java index eb0eba68fc..d6a908cac6 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java @@ -65,7 +65,7 @@ class ClosedTradesViewModel extends ActivatableWithDataModel list = FXCollections.observableArrayList(); - private PendingTradesListItem selectedItem; - private boolean isOfferer; - private final ListChangeListener tradesListChangeListener; + private boolean isOffererRole; - final StringProperty txId = new SimpleStringProperty(); + private final ObjectProperty sellerProcessState = new SimpleObjectProperty<>(); + private final ObjectProperty buyerProcessState = new SimpleObjectProperty<>(); + private final ObjectProperty tradeProperty = new SimpleObjectProperty<>(); + private final StringProperty txId = new SimpleStringProperty(); + private Trade trade; - final ObjectProperty sellerProcessState = new SimpleObjectProperty<>(); - final ObjectProperty buyerProcessState = new SimpleObjectProperty<>(); - final ObjectProperty currentTrade = new SimpleObjectProperty<>(); + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, initialization + /////////////////////////////////////////////////////////////////////////////////////////// @Inject public PendingTradesDataModel(TradeManager tradeManager, WalletService walletService, User user, Navigation navigation) { @@ -102,23 +106,26 @@ class PendingTradesDataModel implements Activatable, DataModel { list.addAll(tradeManager.getPendingTrades().stream().map(PendingTradesListItem::new).collect(Collectors.toList())); // we sort by date, earliest first - list.sort((o1, o2) -> o2.getTrade().getTakeOfferDate().compareTo(o1.getTrade().getTakeOfferDate())); + list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate())); log.debug("onListChanged {}", list.size()); if (list.size() > 0) - selectTrade(list.get(0)); + onSelectTrade(list.get(0)); else if (list.size() == 0) - selectTrade(null); + onSelectTrade(null); } - boolean isBuyOffer() throws NoTradeFoundException { - if (getTrade() != null) - return getTrade().getOffer().getDirection() == Offer.Direction.BUY; - else - throw new NoTradeFoundException(); + private void unbindStates() { + sellerProcessState.unbind(); + buyerProcessState.unbind(); } - void selectTrade(PendingTradesListItem item) { + + /////////////////////////////////////////////////////////////////////////////////////////// + // UI actions + /////////////////////////////////////////////////////////////////////////////////////////// + + void onSelectTrade(PendingTradesListItem item) { log.debug("selectTrade {} {}", item != null, item != null ? item.getTrade().getId() : "null"); // clean up previous selectedItem unbindStates(); @@ -126,13 +133,14 @@ class PendingTradesDataModel implements Activatable, DataModel { selectedItem = item; if (item == null) { - currentTrade.set(null); + trade = null; + tradeProperty.set(null); } else { - currentTrade.set(item.getTrade()); + trade = item.getTrade(); + tradeProperty.set(trade); - Trade trade = item.getTrade(); - isOfferer = trade.getOffer().getP2pSigPubKey().equals(user.getP2pSigPubKey()); + isOffererRole = trade.getOffer().getP2pSigPubKey().equals(user.getP2pSigPubKey()); if (trade instanceof SellerTrade) sellerProcessState.bind(trade.processStateProperty()); @@ -144,37 +152,32 @@ class PendingTradesDataModel implements Activatable, DataModel { } } - void fiatPaymentStarted() { - try { - if (getTrade() instanceof BuyerTrade) - ((BuyerTrade) getTrade()).onFiatPaymentStarted(); - } catch (NoTradeFoundException e) { - throw new MissingTradeException(); - } + + void onFiatPaymentStarted() { + assert trade != null; + if (trade instanceof BuyerTrade) + ((BuyerTrade) trade).onFiatPaymentStarted(); } - void fiatPaymentReceived() { - try { - if (getTrade() instanceof SellerTrade) - ((SellerTrade) getTrade()).onFiatPaymentReceived(); - } catch (NoTradeFoundException e) { - throw new MissingTradeException(); - } + void onFiatPaymentReceived() { + assert trade != null; + if (trade instanceof SellerTrade) + ((SellerTrade) trade).onFiatPaymentReceived(); } - void withdraw(String toAddress) { - try { - if (getTrade() != null) { - tradeManager.requestWithdraw(toAddress, - getTrade(), - () -> { - log.debug("requestWithdraw was successful"); - Platform.runLater(() -> navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class)); - }, - (errorMessage, throwable) -> { - log.error(errorMessage); - Popups.openExceptionPopup(throwable); - }); + void onWithdrawRequest(String toAddress) { + assert trade != null; + tradeManager.onWithdrawRequest( + toAddress, + trade, + () -> { + log.debug("requestWithdraw was successful"); + Platform.runLater(() -> navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class)); + }, + (errorMessage, throwable) -> { + log.error(errorMessage); + Popups.openExceptionPopup(throwable); + }); /* @@ -203,27 +206,27 @@ class PendingTradesDataModel implements Activatable, DataModel { Popups.openErrorPopup("Wrong inputs", "Please check the inputs."); } }*/ - } - } catch (NoTradeFoundException e) { - throw new MissingTradeException(); - } } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Getters + /////////////////////////////////////////////////////////////////////////////////////////// + ObservableList getList() { return list; } - boolean isOfferer() { - return isOfferer; + boolean isBuyOffer() { + return trade.getOffer().getDirection() == Offer.Direction.BUY; } - /* @Nullable - Trade getTrade() { - return selectedItem != null ? selectedItem.getTrade() : null; - }*/ + boolean isOffererRole() { + return isOffererRole; + } Coin getTotalFees() { - return FeePolicy.TX_FEE.add(isOfferer() ? FeePolicy.CREATE_OFFER_FEE : FeePolicy.TAKE_OFFER_FEE); + return FeePolicy.TX_FEE.add(isOffererRole() ? FeePolicy.CREATE_OFFER_FEE : FeePolicy.TAKE_OFFER_FEE); } WalletService getWalletService() { @@ -235,56 +238,48 @@ class PendingTradesDataModel implements Activatable, DataModel { } String getCurrencyCode() { - return selectedItem.getTrade().getOffer().getCurrencyCode(); + return trade.getOffer().getCurrencyCode(); } Throwable getTradeException() { - try { - return getTrade().getThrowable(); - } catch (NoTradeFoundException e) { - return null; - } + return trade.getThrowable(); } String getErrorMessage() { - try { - return getTrade().getErrorMessage(); - } catch (NoTradeFoundException e) { - return null; - } + return trade.getErrorMessage(); } public Offer.Direction getDirection(Offer offer) { - return offer.getP2pSigPubKey().equals(user.getP2pSigPubKey()) ? - offer.getDirection() : offer.getMirroredDirection(); + return isOffererRole ? offer.getDirection() : offer.getMirroredDirection(); } - private void unbindStates() { - sellerProcessState.unbind(); - buyerProcessState.unbind(); + Coin getPayoutAmount() { + return trade.getPayoutAmount(); } - public Coin getPayoutAmount() { - try { - return getTrade().getPayoutAmount(); - } catch (NoTradeFoundException e) { - return Coin.ZERO; - } + Contract getContract() { + return trade.getContract(); } - public Contract getContract() { - try { - return getTrade().getContract(); - } catch (NoTradeFoundException e) { - throw new MissingTradeException(); - } + Trade getTrade() { + return trade; } - public Trade getTrade() throws NoTradeFoundException { - if (currentTrade.get() != null) - return currentTrade.get(); - else - throw new NoTradeFoundException(); + ReadOnlyObjectProperty getSellerProcessState() { + return sellerProcessState; } + + ReadOnlyObjectProperty getBuyerProcessState() { + return buyerProcessState; + } + + ReadOnlyObjectProperty getTradeProperty() { + return tradeProperty; + } + + ReadOnlyStringProperty getTxId() { + return txId; + } + } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java index 7b9e780a76..870992fdb0 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java @@ -65,7 +65,7 @@ public class PendingTradesListItem { } public Date getDate() { - return trade.getTakeOfferDate(); + return trade.getDate(); } public String getId() { diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java index 8b1d6bb132..5dc5e24c4c 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java @@ -45,9 +45,7 @@ import javafx.util.StringConverter; public class PendingTradesView extends ActivatableViewAndModel { @FXML AnchorPane tradeStepPane; - @FXML TableView table; - @FXML TableColumn priceColumn; @FXML TableColumn tradeVolumeColumn; @FXML TableColumn directionColumn; @@ -61,6 +59,7 @@ public class PendingTradesView extends ActivatableViewAndModel currentTradeChangeListener; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, Initialisation /////////////////////////////////////////////////////////////////////////////////////////// @@ -83,8 +82,7 @@ public class PendingTradesView extends ActivatableViewAndModel { - log.debug("selectedItemChangeListener {}", newValue); - model.selectTrade(newValue); + model.onSelectTrade(newValue); if (newValue != null) addSubView(); @@ -93,7 +91,6 @@ public class PendingTradesView extends ActivatableViewAndModel { - log.debug("appFocusChangeListener {}", newValue); if (newValue && model.getSelectedItem() != null) { // Focus selectedItem from model int index = table.getItems().indexOf(model.getSelectedItem()); @@ -105,7 +102,6 @@ public class PendingTradesView extends ActivatableViewAndModel { - log.debug("currentTradeChangeListener {} {}", newValue, model.getList().size()); if (newValue != null) addSubView(); else @@ -113,7 +109,6 @@ public class PendingTradesView extends ActivatableViewAndModel viewState = new SimpleObjectProperty<>(ViewState.UNDEFINED); + private final StringProperty txId = new SimpleStringProperty(); + private final BooleanProperty withdrawalButtonDisable = new SimpleBooleanProperty(true); - public final StringProperty txId = new SimpleStringProperty(); - public final BooleanProperty withdrawalButtonDisable = new SimpleBooleanProperty(true); - final ObjectProperty viewState = new SimpleObjectProperty<>(ViewState.UNDEFINED); + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, initialization + /////////////////////////////////////////////////////////////////////////////////////////// @Inject public PendingTradesViewModel(PendingTradesDataModel dataModel, BSFormatter formatter, @@ -92,46 +96,67 @@ public class PendingTradesViewModel extends ActivatableWithDataModel getViewState() { + return viewState; + } + + public ReadOnlyStringProperty getTxId() { + return txId; + } + + public ReadOnlyBooleanProperty getWithdrawalButtonDisable() { + return withdrawalButtonDisable; + } + + boolean isBuyOffer() { return dataModel.isBuyOffer(); } - ObjectProperty currentTrade() { - return dataModel.currentTrade; + ReadOnlyObjectProperty currentTrade() { + return dataModel.getTradeProperty(); } public void fiatPaymentStarted() { - dataModel.fiatPaymentStarted(); + dataModel.onFiatPaymentStarted(); } public void fiatPaymentReceived() { - dataModel.fiatPaymentReceived(); + dataModel.onFiatPaymentReceived(); } - public void withdraw(String withdrawToAddress) { - dataModel.withdraw(withdrawToAddress); + public void onWithdrawRequest(String withdrawToAddress) { + dataModel.onWithdrawRequest(withdrawToAddress); } public void withdrawAddressFocusOut(String text) { @@ -147,7 +172,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel offererStateChangeListener; protected VBox leftVBox; protected AnchorPane contentPane; - protected PendingTradesViewModel model; protected TradeStepDetailsView tradeStepDetailsView; - protected ChangeListener offererStateChangeListener; /////////////////////////////////////////////////////////////////////////////////////////// @@ -51,14 +51,12 @@ public abstract class TradeSubView extends HBox { } public void activate() { - log.debug("activate"); - model.viewState.addListener(offererStateChangeListener); - applyState(model.viewState.get()); + model.getViewState().addListener(offererStateChangeListener); + applyState(model.getViewState().get()); } public void deactivate() { - log.debug("deactivate"); - model.viewState.removeListener(offererStateChangeListener); + model.getViewState().removeListener(offererStateChangeListener); if (tradeStepDetailsView != null) tradeStepDetailsView.deactivate(); @@ -71,7 +69,7 @@ public abstract class TradeSubView extends HBox { protected abstract void applyState(PendingTradesViewModel.ViewState state); - protected void buildViews() { + private void buildViews() { addLeftBox(); addContentPane(); addWizards(); @@ -84,7 +82,7 @@ public abstract class TradeSubView extends HBox { abstract protected void addWizards(); - protected void createAndAddTradeStepView(Class viewClass) { + private void createAndAddTradeStepView(Class viewClass) { try { tradeStepDetailsView = viewClass.getDeclaredConstructor(PendingTradesViewModel.class).newInstance(model); } catch (Exception e) { diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java index 7be104fb07..4bd82b5d88 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java @@ -35,6 +35,8 @@ import static io.bitsquare.gui.util.ComponentBuilder.*; public class CompletedView extends TradeStepDetailsView { private static final Logger log = LoggerFactory.getLogger(WaitTxInBlockchainView.class); + private final ChangeListener focusedPropertyListener; + private Label btcTradeAmountLabel; private TextField btcTradeAmountTextField; private Label fiatTradeAmountLabel; @@ -44,13 +46,10 @@ public class CompletedView extends TradeStepDetailsView { private Label securityDepositLabel; private TextField securityDepositTextField; private InfoDisplay summaryInfoDisplay; - private InputTextField withdrawAddressTextField; private TextField withdrawAmountTextField; private Button withdrawButton; - private ChangeListener focusedPropertyListener; - /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, Initialisation @@ -63,23 +62,6 @@ public class CompletedView extends TradeStepDetailsView { if (oldValue && !newValue) model.withdrawAddressFocusOut(withdrawAddressTextField.getText()); }; - - /* statusTextField.setText("Congratulations! Trade has successfully completed."); - infoDisplay.setText("The trade is now completed and you can withdraw your Bitcoin to any external" + - "wallet. To protect your privacy you should take care that your trades are not merged " + - "in " + - "that external wallet. For more information about privacy see our help pages.");*/ - - /* btcTradeAmountLabel.setText("You have bought:"); - fiatTradeAmountLabel.setText("You have paid:"); - btcTradeAmountTextField.setText(model.getTradeVolume()); - fiatTradeAmountTextField.setText(model.getFiatVolume()); - feesTextField.setText(model.getTotalFees()); - securityDepositTextField.setText(model.getSecurityDeposit()); - summaryInfoDisplay.setText("Your security deposit has been refunded to you. " + - "You can review the details to that trade any time in the closed trades screen.");*/ - - // withdrawAmountTextField.setText(model.getAmountToWithdraw()); } @Override @@ -87,7 +69,7 @@ public class CompletedView extends TradeStepDetailsView { super.activate(); withdrawAddressTextField.focusedProperty().addListener(focusedPropertyListener); withdrawAddressTextField.setValidator(model.getBtcAddressValidator()); - withdrawButton.disableProperty().bind(model.withdrawalButtonDisable); + withdrawButton.disableProperty().bind(model.getWithdrawalButtonDisable()); // We need to handle both cases: Address not set and address already set (when returning from other view) // We get address validation after focus out, so first make sure we loose focus and then set it again as hint for user to put address in @@ -114,9 +96,8 @@ public class CompletedView extends TradeStepDetailsView { // UI Handlers /////////////////////////////////////////////////////////////////////////////////////////// - private void onWithdraw(ActionEvent actionEvent) { - log.debug("onWithdraw"); - model.withdraw(withdrawAddressTextField.getText()); + private void onWithdrawRequest(ActionEvent actionEvent) { + model.onWithdrawRequest(withdrawAddressTextField.getText()); } @@ -148,24 +129,12 @@ public class CompletedView extends TradeStepDetailsView { getAndAddTitledGroupBg(gridPane, gridRow, 2, "Withdraw your bitcoins", Layout.GROUP_DISTANCE); withdrawAmountTextField = getAndAddLabelTextFieldPair(gridPane, gridRow++, "Amount to withdraw:", Layout.FIRST_ROW_AND_GROUP_DISTANCE).textField; withdrawAddressTextField = getAndAddLabelInputTextFieldPair(gridPane, gridRow++, "Withdraw to address:").inputTextField; - withdrawButton = getAndAddButton(gridPane, gridRow++, "Withdraw to external wallet", this::onWithdraw); - + withdrawButton = getAndAddButton(gridPane, gridRow++, "Withdraw to external wallet", this::onWithdrawRequest); //TODO just temp for testing withdrawAddressTextField.setText("mxmKZruv9x9JLcEj6rZx6Hnm4LLAcQHtcr"); } - - /* fiatTradeAmountLabel.setText("You have received:"); - btcTradeAmountTextField.setText(model.getTradeVolume()); - fiatTradeAmountTextField.setText(model.getFiatVolume()); - feesTextField.setText(model.getTotalFees()); - securityDepositTextField.setText(model.getSecurityDeposit()); - summaryInfoDisplay.setText("Your security deposit has been refunded to you. "+ - "You can review the details to that trade any time in the closed trades screen."); - - withdrawAmountTextField.setText(model.getAmountToWithdraw());*/ - public void setBtcTradeAmountLabelText(String text) { btcTradeAmountLabel.setText(text); } @@ -198,14 +167,4 @@ public class CompletedView extends TradeStepDetailsView { withdrawAmountTextField.setText(text); } - /* completedView.setBtcTradeAmountLabelText("You have sold:"); - completedView.setFiatTradeAmountLabelText("You have received:"); - completedView.setBtcTradeAmountTextFieldText(model.getTradeVolume()); - completedView.setFiatTradeAmountTextFieldText(model.getFiatVolume()); - completedView.setFeesTextFieldText(model.getTotalFees()); - completedView.setSecurityDepositTextFieldText(model.getSecurityDeposit()); - completedView.setSummaryInfoDisplayText("Your security deposit has been refunded to you. "+ - "You can review the details to that trade any time in the closed trades screen."); - - completedView.setWithdrawAmountTextFieldText(model.getAmountToWithdraw());*/ } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatReceivedView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatReceivedView.java index 7adb39c9c1..a3c744553a 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatReceivedView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatReceivedView.java @@ -35,10 +35,11 @@ import static io.bitsquare.gui.util.ComponentBuilder.*; public class ConfirmFiatReceivedView extends TradeStepDetailsView { private static final Logger log = LoggerFactory.getLogger(ConfirmFiatReceivedView.class); + private final ChangeListener txIdChangeListener; + private TxIdTextField txIdTextField; private Label infoLabel; private InfoDisplay infoDisplay; - private final ChangeListener txIdChangeListener; private Button confirmFiatReceivedButton; private Label statusLabel; private ProgressIndicator statusProgressIndicator; @@ -59,17 +60,16 @@ public class ConfirmFiatReceivedView extends TradeStepDetailsView { public void activate() { super.activate(); - model.txId.addListener(txIdChangeListener); - txIdTextField.setup(model.getWalletService(), model.txId.get()); + model.getTxId().addListener(txIdChangeListener); + txIdTextField.setup(model.getWalletService(), model.getTxId().get()); } @Override public void deactivate() { super.deactivate(); - model.txId.removeListener(txIdChangeListener); + model.getTxId().removeListener(txIdChangeListener); txIdTextField.cleanup(); - statusLabel.setText("Publishing transaction..."); if (root != null) root.setMouseTransparent(false); } @@ -82,11 +82,12 @@ public class ConfirmFiatReceivedView extends TradeStepDetailsView { private void onPaymentReceived(ActionEvent actionEvent) { log.debug("onPaymentReceived"); model.fiatPaymentReceived(); - confirmFiatReceivedButton.setDisable(true); + statusLabel.setText("Publishing transaction..."); statusProgressIndicator.setVisible(true); statusProgressIndicator.setProgress(-1); root = statusProgressIndicator.getScene().getRoot(); + // We deactivate mouse interaction to avoid that user leaves screen root.setMouseTransparent(true); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java index 18d2dcc14d..abfa4e0989 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java @@ -86,15 +86,15 @@ public class StartFiatView extends TradeStepDetailsView { log.debug("activate ##"); super.activate(); - model.txId.addListener(txIdChangeListener); - txIdTextField.setup(model.getWalletService(), model.txId.get()); + model.getTxId().addListener(txIdChangeListener); + txIdTextField.setup(model.getWalletService(), model.getTxId().get()); } @Override public void deactivate() { super.deactivate(); - model.txId.removeListener(txIdChangeListener); + model.getTxId().removeListener(txIdChangeListener); txIdTextField.cleanup(); if (root != null) root.setMouseTransparent(false); @@ -112,6 +112,7 @@ public class StartFiatView extends TradeStepDetailsView { statusProgressIndicator.setProgress(-1); statusLabel.setText("Sending message to trading partner..."); root = statusProgressIndicator.getScene().getRoot(); + // We deactivate mouse interaction to avoid that user leaves screen root.setMouseTransparent(true); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/TradeStepDetailsView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/TradeStepDetailsView.java index 5e0ccd6a91..4fe8fdcafe 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/TradeStepDetailsView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/TradeStepDetailsView.java @@ -56,11 +56,9 @@ public abstract class TradeStepDetailsView extends AnchorPane { // That is called at every state change! public void activate() { - log.debug("activate"); } public void deactivate() { - log.debug("deactivate"); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitFiatReceivedView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitFiatReceivedView.java index 727fdc4e2d..f994b41162 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitFiatReceivedView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitFiatReceivedView.java @@ -33,10 +33,10 @@ import static io.bitsquare.gui.util.ComponentBuilder.*; public class WaitFiatReceivedView extends TradeStepDetailsView { private static final Logger log = LoggerFactory.getLogger(WaitFiatReceivedView.class); + private final ChangeListener txIdChangeListener; private TxIdTextField txIdTextField; private Label infoLabel; private InfoDisplay infoDisplay; - private final ChangeListener txIdChangeListener; /////////////////////////////////////////////////////////////////////////////////////////// @@ -53,15 +53,15 @@ public class WaitFiatReceivedView extends TradeStepDetailsView { public void activate() { super.activate(); - model.txId.addListener(txIdChangeListener); - txIdTextField.setup(model.getWalletService(), model.txId.get()); + model.getTxId().addListener(txIdChangeListener); + txIdTextField.setup(model.getWalletService(), model.getTxId().get()); } @Override public void deactivate() { super.deactivate(); - model.txId.removeListener(txIdChangeListener); + model.getTxId().removeListener(txIdChangeListener); txIdTextField.cleanup(); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitTxInBlockchainView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitTxInBlockchainView.java index fa232db9b5..e2197404e7 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitTxInBlockchainView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitTxInBlockchainView.java @@ -33,10 +33,10 @@ import static io.bitsquare.gui.util.ComponentBuilder.*; public class WaitTxInBlockchainView extends TradeStepDetailsView { private static final Logger log = LoggerFactory.getLogger(WaitTxInBlockchainView.class); + private final ChangeListener txIdChangeListener; private TxIdTextField txIdTextField; private Label infoLabel; private InfoDisplay infoDisplay; - private final ChangeListener txIdChangeListener; /////////////////////////////////////////////////////////////////////////////////////////// @@ -53,15 +53,15 @@ public class WaitTxInBlockchainView extends TradeStepDetailsView { public void activate() { super.activate(); - model.txId.addListener(txIdChangeListener); - txIdTextField.setup(model.getWalletService(), model.txId.get()); + model.getTxId().addListener(txIdChangeListener); + txIdTextField.setup(model.getWalletService(), model.getTxId().get()); } @Override public void deactivate() { super.deactivate(); - model.txId.removeListener(txIdChangeListener); + model.getTxId().removeListener(txIdChangeListener); txIdTextField.cleanup(); } diff --git a/core/src/main/java/io/bitsquare/offer/OfferBook.java b/core/src/main/java/io/bitsquare/offer/OfferBook.java index d3739d8844..95fece8291 100644 --- a/core/src/main/java/io/bitsquare/offer/OfferBook.java +++ b/core/src/main/java/io/bitsquare/offer/OfferBook.java @@ -49,7 +49,7 @@ import static com.google.common.base.Preconditions.checkArgument; public class OfferBook { private static final Logger log = LoggerFactory.getLogger(OfferBook.class); - private static final int POLLING_INTERVAL = 1000; + private static final int POLLING_INTERVAL = 5000; // in ms private final OfferBookService offerBookService; private final User user; diff --git a/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java b/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java index 66b5f95e2a..7e2db74be3 100644 --- a/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java +++ b/core/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBookService.java @@ -181,8 +181,10 @@ public class TomP2POfferBookService extends TomP2PDHTService implements OfferBoo futureGet.addListener(new BaseFutureAdapter() { @Override public void operationComplete(BaseFuture future) throws Exception { + final Map dataMap = futureGet.dataMap(); if (future.isSuccess()) { - final Map dataMap = futureGet.dataMap(); + log.trace("Get offers from DHT was successful. Received data: [key: " + locationKey + + ", values: " + futureGet.dataMap() + "]"); final List offers = new ArrayList<>(); if (dataMap != null) { for (Data offerData : dataMap.values()) { @@ -199,12 +201,8 @@ public class TomP2POfferBookService extends TomP2PDHTService implements OfferBoo executor.execute(() -> offerRepositoryListeners.stream().forEach(listener -> listener.onOffersReceived(offers))); } - - log.trace("Get offers from DHT was successful. Received data: [key: " + locationKey - + ", values: " + futureGet.dataMap() + "]"); } else { - final Map dataMap = futureGet.dataMap(); if (dataMap == null || dataMap.size() == 0) { log.trace("Get offers from DHT delivered empty dataMap."); executor.execute(() -> offerRepositoryListeners.stream().forEach(listener -> @@ -282,14 +280,18 @@ public class TomP2POfferBookService extends TomP2PDHTService implements OfferBoo invalidationTimestamp.set(timeStamp); }); } + else if (data == null) { + // OK for an empty list + // log.trace("Get invalidationTimestamp from DHT returns null. That is ok for an empty list."); + } else if (data != null) { log.error("Get invalidationTimestamp from DHT failed. Data = " + data); } } - /*else if (futureGet.data() == null) { + else if (futureGet.data() == null) { // OK as nothing is set at the moment - log.trace("Get invalidationTimestamp from DHT returns null. That is ok for the startup."); - }*/ + // log.trace("Get invalidationTimestamp from DHT returns null. That is ok for the startup."); + } else { log.error("Get invalidationTimestamp from DHT failed with reason:" + futureGet.failedReason()); } diff --git a/core/src/main/java/io/bitsquare/p2p/tomp2p/BootstrappedPeerBuilder.java b/core/src/main/java/io/bitsquare/p2p/tomp2p/BootstrappedPeerBuilder.java index 9c2fe6d879..7986f9b62a 100644 --- a/core/src/main/java/io/bitsquare/p2p/tomp2p/BootstrappedPeerBuilder.java +++ b/core/src/main/java/io/bitsquare/p2p/tomp2p/BootstrappedPeerBuilder.java @@ -121,7 +121,7 @@ public class BootstrappedPeerBuilder { public SettableFuture start() { try { - DefaultEventExecutorGroup eventExecutorGroup = new DefaultEventExecutorGroup(250); + DefaultEventExecutorGroup eventExecutorGroup = new DefaultEventExecutorGroup(20); ChannelClientConfiguration clientConf = PeerBuilder.createDefaultChannelClientConfiguration(); clientConf.pipelineFilter(new PeerBuilder.EventExecutorGroupFilter(eventExecutorGroup)); diff --git a/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java b/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java index 824df2532e..26b737e0fb 100644 --- a/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/BuyerAsOffererTrade.java @@ -20,8 +20,7 @@ package io.bitsquare.trade; import io.bitsquare.offer.Offer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.protocol.trade.BuyerAsOffererProtocol; -import io.bitsquare.trade.states.OffererTradeState; -import io.bitsquare.trade.states.TradeState; +import io.bitsquare.trade.protocol.trade.BuyerProtocol; import org.bitcoinj.core.Coin; @@ -32,7 +31,7 @@ import java.io.Serializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class BuyerAsOffererTrade extends Trade implements OffererTrade, BuyerTrade, Serializable { +public class BuyerAsOffererTrade extends OffererTrade implements BuyerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. private static final long serialVersionUID = 1L; @@ -61,13 +60,6 @@ public class BuyerAsOffererTrade extends Trade implements OffererTrade, BuyerTra tradeProtocol = new BuyerAsOffererProtocol(this); } - @Override - protected void initStates() { - processState = OffererTradeState.ProcessState.UNDEFINED; - lifeCycleState = OffererTradeState.LifeCycleState.OFFER_OPEN; - initStateProperties(); - } - /////////////////////////////////////////////////////////////////////////////////////////// // API @@ -75,8 +67,8 @@ public class BuyerAsOffererTrade extends Trade implements OffererTrade, BuyerTra @Override public void onFiatPaymentStarted() { - assert tradeProtocol instanceof BuyerAsOffererProtocol; - ((BuyerAsOffererProtocol) tradeProtocol).onFiatPaymentStarted(); + assert tradeProtocol instanceof BuyerProtocol; + ((BuyerProtocol) tradeProtocol).onFiatPaymentStarted(); } @Override @@ -84,52 +76,4 @@ public class BuyerAsOffererTrade extends Trade implements OffererTrade, BuyerTra return getSecurityDeposit().add(getTradeAmount()); } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Setter for Mutable objects - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void setProcessState(TradeState.ProcessState processState) { - super.setProcessState(processState); - - switch ((OffererTradeState.ProcessState) processState) { - case EXCEPTION: - disposeProtocol(); - setLifeCycleState(OffererTradeState.LifeCycleState.FAILED); - break; - } - } - - @Override - public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { - super.setLifeCycleState(lifeCycleState); - - switch ((OffererTradeState.LifeCycleState) lifeCycleState) { - case FAILED: - disposeProtocol(); - break; - case COMPLETED: - disposeProtocol(); - break; - } - } - - @Override - public void setThrowable(Throwable throwable) { - super.setThrowable(throwable); - - setProcessState(OffererTradeState.ProcessState.EXCEPTION); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Protected - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void handleConfidenceResult() { - if (((OffererTradeState.ProcessState) processState).ordinal() < OffererTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) - setProcessState(OffererTradeState.ProcessState.DEPOSIT_CONFIRMED); - } } diff --git a/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java b/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java index a59d2887af..549bc9fe52 100644 --- a/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/BuyerAsTakerTrade.java @@ -21,18 +21,18 @@ import io.bitsquare.offer.Offer; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.protocol.trade.BuyerAsTakerProtocol; -import io.bitsquare.trade.states.TakerTradeState; -import io.bitsquare.trade.states.TradeState; +import io.bitsquare.trade.protocol.trade.BuyerProtocol; import org.bitcoinj.core.Coin; import java.io.IOException; +import java.io.ObjectInputStream; import java.io.Serializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class BuyerAsTakerTrade extends Trade implements TakerTrade, BuyerTrade, Serializable { +public class BuyerAsTakerTrade extends TakerTrade implements BuyerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. private static final long serialVersionUID = 1L; @@ -48,7 +48,7 @@ public class BuyerAsTakerTrade extends Trade implements TakerTrade, BuyerTrade, log.trace("Created by constructor"); } - private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); log.trace("Created from serialized form."); @@ -57,14 +57,7 @@ public class BuyerAsTakerTrade extends Trade implements TakerTrade, BuyerTrade, } @Override - protected void initStates() { - processState = TakerTradeState.ProcessState.UNDEFINED; - lifeCycleState = TakerTradeState.LifeCycleState.PENDING; - initStateProperties(); - } - - @Override - public void createProtocol() { + protected void createProtocol() { tradeProtocol = new BuyerAsTakerProtocol(this); } @@ -73,68 +66,14 @@ public class BuyerAsTakerTrade extends Trade implements TakerTrade, BuyerTrade, // API /////////////////////////////////////////////////////////////////////////////////////////// - @Override - public void takeAvailableOffer() { - assert tradeProtocol instanceof BuyerAsTakerProtocol; - ((BuyerAsTakerProtocol) tradeProtocol).takeAvailableOffer(); - } - @Override public void onFiatPaymentStarted() { - assert tradeProtocol instanceof BuyerAsTakerProtocol; - ((BuyerAsTakerProtocol) tradeProtocol).onFiatPaymentStarted(); + assert tradeProtocol instanceof BuyerProtocol; + ((BuyerProtocol) tradeProtocol).onFiatPaymentStarted(); } @Override public Coin getPayoutAmount() { return getSecurityDeposit().add(getTradeAmount()); } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Setter for Mutable objects - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void setProcessState(TradeState.ProcessState processState) { - super.setProcessState(processState); - - switch ((TakerTradeState.ProcessState) processState) { - case EXCEPTION: - disposeProtocol(); - setLifeCycleState(TakerTradeState.LifeCycleState.FAILED); - break; - } - } - - @Override - public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { - super.setLifeCycleState(lifeCycleState); - - switch ((TakerTradeState.LifeCycleState) lifeCycleState) { - case FAILED: - disposeProtocol(); - break; - case COMPLETED: - disposeProtocol(); - break; - } - } - - @Override - public void setThrowable(Throwable throwable) { - super.setThrowable(throwable); - - setProcessState(TakerTradeState.ProcessState.EXCEPTION); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Protected - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void handleConfidenceResult() { - if (((TakerTradeState.ProcessState) processState).ordinal() < TakerTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) - setProcessState(TakerTradeState.ProcessState.DEPOSIT_CONFIRMED); - } } diff --git a/core/src/main/java/io/bitsquare/trade/OffererTrade.java b/core/src/main/java/io/bitsquare/trade/OffererTrade.java index 5e204f7f23..526ea54120 100644 --- a/core/src/main/java/io/bitsquare/trade/OffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/OffererTrade.java @@ -17,5 +17,80 @@ package io.bitsquare.trade; -public interface OffererTrade { +import io.bitsquare.offer.Offer; +import io.bitsquare.storage.Storage; +import io.bitsquare.trade.states.OffererTradeState; +import io.bitsquare.trade.states.TradeState; + +import java.io.Serializable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class OffererTrade extends Trade implements Serializable { + // That object is saved to disc. We need to take care of changes to not break deserialization. + private static final long serialVersionUID = 1L; + + transient private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererTrade.class); + + public OffererTrade(Offer offer, Storage storage) { + super(offer, storage); + log.trace("Created by constructor"); + } + + @Override + protected void initStates() { + processState = OffererTradeState.ProcessState.UNDEFINED; + lifeCycleState = OffererTradeState.LifeCycleState.OFFER_OPEN; + initStateProperties(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setter for Mutable objects + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void setProcessState(TradeState.ProcessState processState) { + super.setProcessState(processState); + + switch ((OffererTradeState.ProcessState) processState) { + case EXCEPTION: + disposeProtocol(); + setLifeCycleState(OffererTradeState.LifeCycleState.FAILED); + break; + } + } + + @Override + public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { + super.setLifeCycleState(lifeCycleState); + + switch ((OffererTradeState.LifeCycleState) lifeCycleState) { + case FAILED: + disposeProtocol(); + break; + case COMPLETED: + disposeProtocol(); + break; + } + } + + @Override + public void setThrowable(Throwable throwable) { + super.setThrowable(throwable); + + setProcessState(OffererTradeState.ProcessState.EXCEPTION); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Protected + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void handleConfidenceResult() { + if (((OffererTradeState.ProcessState) processState).ordinal() < OffererTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) + setProcessState(OffererTradeState.ProcessState.DEPOSIT_CONFIRMED); + } } diff --git a/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java b/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java index 0e08947cd6..d1dbd9681a 100644 --- a/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java +++ b/core/src/main/java/io/bitsquare/trade/SellerAsOffererTrade.java @@ -20,8 +20,7 @@ package io.bitsquare.trade; import io.bitsquare.offer.Offer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.protocol.trade.SellerAsOffererProtocol; -import io.bitsquare.trade.states.OffererTradeState; -import io.bitsquare.trade.states.TradeState; +import io.bitsquare.trade.protocol.trade.SellerProtocol; import java.io.IOException; import java.io.ObjectInputStream; @@ -30,7 +29,7 @@ import java.io.Serializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SellerAsOffererTrade extends Trade implements OffererTrade, SellerTrade, Serializable { +public class SellerAsOffererTrade extends OffererTrade implements SellerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. private static final long serialVersionUID = 1L; @@ -59,13 +58,6 @@ public class SellerAsOffererTrade extends Trade implements OffererTrade, SellerT tradeProtocol = new SellerAsOffererProtocol(this); } - @Override - protected void initStates() { - processState = OffererTradeState.ProcessState.UNDEFINED; - lifeCycleState = OffererTradeState.LifeCycleState.OFFER_OPEN; - initStateProperties(); - } - /////////////////////////////////////////////////////////////////////////////////////////// // API @@ -73,57 +65,7 @@ public class SellerAsOffererTrade extends Trade implements OffererTrade, SellerT @Override public void onFiatPaymentReceived() { - assert tradeProtocol instanceof SellerAsOffererProtocol; - ((SellerAsOffererProtocol) tradeProtocol).onFiatPaymentReceived(); + assert tradeProtocol instanceof SellerProtocol; + ((SellerProtocol) tradeProtocol).onFiatPaymentReceived(); } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Setter for Mutable objects - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void setProcessState(TradeState.ProcessState processState) { - super.setProcessState(processState); - - switch ((OffererTradeState.ProcessState) processState) { - case EXCEPTION: - disposeProtocol(); - setLifeCycleState(OffererTradeState.LifeCycleState.FAILED); - break; - } - } - - @Override - public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { - super.setLifeCycleState(lifeCycleState); - - switch ((OffererTradeState.LifeCycleState) lifeCycleState) { - case FAILED: - disposeProtocol(); - break; - case COMPLETED: - disposeProtocol(); - break; - } - } - - @Override - public void setThrowable(Throwable throwable) { - super.setThrowable(throwable); - - setProcessState(OffererTradeState.ProcessState.EXCEPTION); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Protected - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void handleConfidenceResult() { - if (((OffererTradeState.ProcessState) processState).ordinal() < OffererTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) - setProcessState(OffererTradeState.ProcessState.DEPOSIT_CONFIRMED); - } - -} +} \ No newline at end of file diff --git a/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java b/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java index 0955b21886..d43459a1e5 100644 --- a/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/SellerAsTakerTrade.java @@ -21,8 +21,8 @@ import io.bitsquare.offer.Offer; import io.bitsquare.p2p.Peer; import io.bitsquare.storage.Storage; import io.bitsquare.trade.protocol.trade.SellerAsTakerProtocol; +import io.bitsquare.trade.protocol.trade.SellerProtocol; import io.bitsquare.trade.states.TakerTradeState; -import io.bitsquare.trade.states.TradeState; import org.bitcoinj.core.Coin; @@ -32,7 +32,7 @@ import java.io.Serializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SellerAsTakerTrade extends Trade implements TakerTrade, SellerTrade, Serializable { +public class SellerAsTakerTrade extends TakerTrade implements SellerTrade, Serializable { // That object is saved to disc. We need to take care of changes to not break deserialization. private static final long serialVersionUID = 1L; @@ -57,28 +57,7 @@ public class SellerAsTakerTrade extends Trade implements TakerTrade, SellerTrade } @Override - public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { - super.setLifeCycleState(lifeCycleState); - - switch ((TakerTradeState.LifeCycleState) lifeCycleState) { - case FAILED: - disposeProtocol(); - break; - case COMPLETED: - disposeProtocol(); - break; - } - } - - @Override - protected void initStates() { - processState = TakerTradeState.ProcessState.UNDEFINED; - lifeCycleState = TakerTradeState.LifeCycleState.PENDING; - initStateProperties(); - } - - @Override - public void createProtocol() { + protected void createProtocol() { tradeProtocol = new SellerAsTakerProtocol(this); } @@ -87,50 +66,9 @@ public class SellerAsTakerTrade extends Trade implements TakerTrade, SellerTrade // API /////////////////////////////////////////////////////////////////////////////////////////// - @Override - public void takeAvailableOffer() { - assert tradeProtocol instanceof SellerAsTakerProtocol; - ((SellerAsTakerProtocol) tradeProtocol).takeAvailableOffer(); - } - @Override public void onFiatPaymentReceived() { - assert tradeProtocol instanceof SellerAsTakerProtocol; - ((SellerAsTakerProtocol) tradeProtocol).onFiatPaymentReceived(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Setter for Mutable objects - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void setProcessState(TradeState.ProcessState processState) { - super.setProcessState(processState); - - switch ((TakerTradeState.ProcessState) processState) { - case EXCEPTION: - disposeProtocol(); - setLifeCycleState(TakerTradeState.LifeCycleState.FAILED); - break; - } - } - - @Override - public void setThrowable(Throwable throwable) { - super.setThrowable(throwable); - - setProcessState(TakerTradeState.ProcessState.EXCEPTION); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Protected - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void handleConfidenceResult() { - if (((TakerTradeState.ProcessState) processState).ordinal() < TakerTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) - setProcessState(TakerTradeState.ProcessState.DEPOSIT_CONFIRMED); + assert tradeProtocol instanceof SellerProtocol; + ((SellerProtocol) tradeProtocol).onFiatPaymentReceived(); } } diff --git a/core/src/main/java/io/bitsquare/trade/TakerTrade.java b/core/src/main/java/io/bitsquare/trade/TakerTrade.java index f13b7d4775..bc15d1a84b 100644 --- a/core/src/main/java/io/bitsquare/trade/TakerTrade.java +++ b/core/src/main/java/io/bitsquare/trade/TakerTrade.java @@ -17,6 +17,89 @@ package io.bitsquare.trade; -public interface TakerTrade { - void takeAvailableOffer(); +import io.bitsquare.offer.Offer; +import io.bitsquare.p2p.Peer; +import io.bitsquare.storage.Storage; +import io.bitsquare.trade.protocol.trade.TakerProtocol; +import io.bitsquare.trade.states.TakerTradeState; +import io.bitsquare.trade.states.TradeState; + +import org.bitcoinj.core.Coin; + +import java.io.Serializable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class TakerTrade extends Trade implements Serializable { + // That object is saved to disc. We need to take care of changes to not break deserialization. + private static final long serialVersionUID = 1L; + + transient private static final Logger log = LoggerFactory.getLogger(BuyerAsTakerTrade.class); + + public TakerTrade(Offer offer, Coin tradeAmount, Peer tradingPeer, Storage storage) { + super(offer, tradeAmount, tradingPeer, storage); + log.trace("Created by constructor"); + } + + @Override + protected void initStates() { + processState = TakerTradeState.ProcessState.UNDEFINED; + lifeCycleState = TakerTradeState.LifeCycleState.PENDING; + initStateProperties(); + } + + public void takeAvailableOffer() { + assert tradeProtocol instanceof TakerProtocol; + ((TakerProtocol) tradeProtocol).takeAvailableOffer(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setter for Mutable objects + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void setProcessState(TradeState.ProcessState processState) { + super.setProcessState(processState); + + switch ((TakerTradeState.ProcessState) processState) { + case EXCEPTION: + disposeProtocol(); + setLifeCycleState(TakerTradeState.LifeCycleState.FAILED); + break; + } + } + + @Override + public void setLifeCycleState(TradeState.LifeCycleState lifeCycleState) { + super.setLifeCycleState(lifeCycleState); + + switch ((TakerTradeState.LifeCycleState) lifeCycleState) { + case FAILED: + disposeProtocol(); + break; + case COMPLETED: + disposeProtocol(); + break; + } + } + + @Override + public void setThrowable(Throwable throwable) { + super.setThrowable(throwable); + + setProcessState(TakerTradeState.ProcessState.EXCEPTION); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Protected + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void handleConfidenceResult() { + if (((TakerTradeState.ProcessState) processState).ordinal() < TakerTradeState.ProcessState.DEPOSIT_CONFIRMED.ordinal()) + setProcessState(TakerTradeState.ProcessState.DEPOSIT_CONFIRMED); + } } diff --git a/core/src/main/java/io/bitsquare/trade/Trade.java b/core/src/main/java/io/bitsquare/trade/Trade.java index c9d6ded0af..460b7e4f37 100644 --- a/core/src/main/java/io/bitsquare/trade/Trade.java +++ b/core/src/main/java/io/bitsquare/trade/Trade.java @@ -91,6 +91,7 @@ abstract public class Trade implements Model, Serializable { // Immutable private final Offer offer; private final ProcessModel processModel; + private final Date creationDate; // Mutable private Date takeOfferDate; @@ -124,6 +125,9 @@ abstract public class Trade implements Model, Serializable { initStates(); initStateProperties(); + + // That will only be used in case of a canceled open offer trade + creationDate = new Date(); } // taker @@ -306,8 +310,8 @@ abstract public class Trade implements Model, Serializable { // Getter/Setter for Mutable objects /////////////////////////////////////////////////////////////////////////////////////////// - public Date getTakeOfferDate() { - return takeOfferDate; + public Date getDate() { + return takeOfferDate != null ? takeOfferDate : creationDate; } public void setTakeOfferDate(Date takeOfferDate) { diff --git a/core/src/main/java/io/bitsquare/trade/TradeManager.java b/core/src/main/java/io/bitsquare/trade/TradeManager.java index 45c208f5c5..fc990245d9 100644 --- a/core/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/core/src/main/java/io/bitsquare/trade/TradeManager.java @@ -406,7 +406,7 @@ public class TradeManager { // Trade /////////////////////////////////////////////////////////////////////////////////////////// - public void requestWithdraw(String toAddress, Trade trade, ResultHandler resultHandler, FaultHandler faultHandler) { + public void onWithdrawRequest(String toAddress, Trade trade, ResultHandler resultHandler, FaultHandler faultHandler) { AddressEntry addressEntry = walletService.getAddressEntry(trade.getId()); String fromAddress = addressEntry.getAddressString(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java index e42ed35e48..cf46526d92 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsOffererProtocol.java @@ -17,13 +17,11 @@ package io.bitsquare.trade.protocol.trade; -import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Peer; import io.bitsquare.p2p.listener.SendMessageListener; import io.bitsquare.trade.BuyerAsOffererTrade; -import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage; import io.bitsquare.trade.protocol.availability.messages.RequestIsOfferAvailableMessage; import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; @@ -50,7 +48,7 @@ import org.slf4j.LoggerFactory; import static io.bitsquare.util.Validator.*; -public class BuyerAsOffererProtocol extends TradeProtocol { +public class BuyerAsOffererProtocol extends TradeProtocol implements BuyerProtocol, OffererProtocol { private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererProtocol.class); private final BuyerAsOffererTrade buyerAsOffererTrade; @@ -128,7 +126,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol { buyerAsOffererTrade.setLifeCycleState(OffererTradeState.LifeCycleState.OFFER_RESERVED); - TaskRunner taskRunner = new TaskRunner<>(buyerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsOffererTrade, () -> log.debug("taskRunner at handleRequestDepositTxInputsMessage completed"), this::handleTaskRunnerFault); taskRunner.addTasks( @@ -144,7 +142,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol { stopTimeout(); processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(buyerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsOffererTrade, () -> log.debug("taskRunner at handleRequestPublishDepositTxMessage completed"), this::handleTaskRunnerFault); taskRunner.addTasks( @@ -163,8 +161,9 @@ public class BuyerAsOffererProtocol extends TradeProtocol { /////////////////////////////////////////////////////////////////////////////////////////// // User clicked the "bank transfer started" button + @Override public void onFiatPaymentStarted() { - TaskRunner taskRunner = new TaskRunner<>(buyerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsOffererTrade, () -> log.debug("taskRunner at handleBankTransferStartedUIEvent completed"), this::handleTaskRunnerFault); taskRunner.addTasks( @@ -183,7 +182,7 @@ public class BuyerAsOffererProtocol extends TradeProtocol { private void handle(PayoutTxPublishedMessage tradeMessage) { processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(buyerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsOffererTrade, () -> { log.debug("taskRunner at handlePayoutTxPublishedMessage completed"); // we are done! diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java index f33b7e634e..70cc0c7540 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerAsTakerProtocol.java @@ -17,12 +17,10 @@ package io.bitsquare.trade.protocol.trade; -import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Peer; import io.bitsquare.trade.BuyerAsTakerTrade; -import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.RequestPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.messages.TradeMessage; @@ -46,7 +44,7 @@ import org.slf4j.LoggerFactory; import static io.bitsquare.util.Validator.nonEmptyStringOf; -public class BuyerAsTakerProtocol extends TradeProtocol { +public class BuyerAsTakerProtocol extends TradeProtocol implements BuyerProtocol, TakerProtocol { private static final Logger log = LoggerFactory.getLogger(BuyerAsTakerProtocol.class); private final BuyerAsTakerTrade buyerAsTakerTrade; @@ -82,8 +80,9 @@ public class BuyerAsTakerProtocol extends TradeProtocol { } } + @Override public void takeAvailableOffer() { - TaskRunner taskRunner = new TaskRunner<>(buyerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade, () -> log.debug("taskRunner at takeAvailableOffer completed"), this::handleTaskRunnerFault); @@ -106,7 +105,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol { stopTimeout(); processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(buyerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade, () -> log.debug("taskRunner at handleRequestPublishDepositTxMessage completed"), this::handleTaskRunnerFault); taskRunner.addTasks( @@ -125,8 +124,9 @@ public class BuyerAsTakerProtocol extends TradeProtocol { /////////////////////////////////////////////////////////////////////////////////////////// // User clicked the "bank transfer started" button + @Override public void onFiatPaymentStarted() { - TaskRunner taskRunner = new TaskRunner<>(buyerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade, () -> log.debug("taskRunner at onFiatPaymentStarted completed"), this::handleTaskRunnerFault); taskRunner.addTasks( @@ -145,7 +145,7 @@ public class BuyerAsTakerProtocol extends TradeProtocol { private void handle(PayoutTxPublishedMessage tradeMessage) { processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(buyerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(buyerAsTakerTrade, () -> { log.debug("taskRunner at handlePayoutTxPublishedMessage completed"); // we are done! diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/NoTradeFoundException.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerProtocol.java similarity index 69% rename from core/src/main/java/io/bitsquare/gui/main/portfolio/pending/NoTradeFoundException.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerProtocol.java index a991254c93..190bdad403 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/NoTradeFoundException.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/BuyerProtocol.java @@ -15,16 +15,8 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.gui.main.portfolio.pending; +package io.bitsquare.trade.protocol.trade; -// That is used if trade is null and it is a valid state -public class NoTradeFoundException extends Throwable { - - public NoTradeFoundException(String msg) { - super(msg); - } - - public NoTradeFoundException() { - super("Trade is null"); - } +public interface BuyerProtocol { + void onFiatPaymentStarted(); } diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/MissingTradeException.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/OffererProtocol.java similarity index 66% rename from core/src/main/java/io/bitsquare/gui/main/portfolio/pending/MissingTradeException.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/OffererProtocol.java index e0aac02bf9..d933b37d5e 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/MissingTradeException.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/OffererProtocol.java @@ -15,16 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.gui.main.portfolio.pending; +package io.bitsquare.trade.protocol.trade; -// That is used if trade is null but must not be null in that state -public class MissingTradeException extends RuntimeException { - - public MissingTradeException(String msg) { - super(msg); - } - - public MissingTradeException() { - super("Trade is null.That must not happen."); - } +public interface OffererProtocol { } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java index efb0b90412..8df7765dc0 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsOffererProtocol.java @@ -17,13 +17,11 @@ package io.bitsquare.trade.protocol.trade; -import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Peer; import io.bitsquare.p2p.listener.SendMessageListener; import io.bitsquare.trade.SellerAsOffererTrade; -import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage; import io.bitsquare.trade.protocol.availability.messages.RequestIsOfferAvailableMessage; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; @@ -48,7 +46,7 @@ import org.slf4j.LoggerFactory; import static io.bitsquare.util.Validator.*; -public class SellerAsOffererProtocol extends TradeProtocol { +public class SellerAsOffererProtocol extends TradeProtocol implements SellerProtocol, OffererProtocol { private static final Logger log = LoggerFactory.getLogger(SellerAsOffererProtocol.class); private final SellerAsOffererTrade sellerAsOffererTrade; @@ -136,7 +134,7 @@ public class SellerAsOffererProtocol extends TradeProtocol { sellerAsOffererTrade.setTradingPeer(sender); - TaskRunner taskRunner = new TaskRunner<>(sellerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsOffererTrade, () -> log.debug("taskRunner at handleTakerDepositPaymentRequestMessage completed"), this::handleTaskRunnerFault); @@ -155,7 +153,7 @@ public class SellerAsOffererProtocol extends TradeProtocol { stopTimeout(); processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(sellerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsOffererTrade, () -> log.debug("taskRunner at handleDepositTxPublishedMessage completed"), this::handleTaskRunnerFault); @@ -174,7 +172,7 @@ public class SellerAsOffererProtocol extends TradeProtocol { private void handle(FiatTransferStartedMessage tradeMessage) { processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(sellerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsOffererTrade, () -> log.debug("taskRunner at handleFiatTransferStartedMessage completed"), this::handleTaskRunnerFault); @@ -188,10 +186,11 @@ public class SellerAsOffererProtocol extends TradeProtocol { /////////////////////////////////////////////////////////////////////////////////////////// // User clicked the "bank transfer received" button, so we release the funds for pay out + @Override public void onFiatPaymentReceived() { sellerAsOffererTrade.setProcessState(OffererTradeState.ProcessState.FIAT_PAYMENT_RECEIVED); - TaskRunner taskRunner = new TaskRunner<>(sellerAsOffererTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsOffererTrade, () -> { log.debug("taskRunner at handleFiatReceivedUIEvent completed"); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java index 240d44b7d1..b358929222 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerAsTakerProtocol.java @@ -17,12 +17,10 @@ package io.bitsquare.trade.protocol.trade; -import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.p2p.MailboxMessage; import io.bitsquare.p2p.Message; import io.bitsquare.p2p.Peer; import io.bitsquare.trade.SellerAsTakerTrade; -import io.bitsquare.trade.Trade; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.FiatTransferStartedMessage; import io.bitsquare.trade.protocol.trade.messages.RequestPayDepositMessage; @@ -48,7 +46,7 @@ import org.slf4j.LoggerFactory; import static io.bitsquare.util.Validator.nonEmptyStringOf; -public class SellerAsTakerProtocol extends TradeProtocol { +public class SellerAsTakerProtocol extends TradeProtocol implements SellerProtocol, TakerProtocol { private static final Logger log = LoggerFactory.getLogger(SellerAsTakerProtocol.class); private final SellerAsTakerTrade sellerAsTakerTrade; @@ -87,8 +85,9 @@ public class SellerAsTakerProtocol extends TradeProtocol { } } + @Override public void takeAvailableOffer() { - TaskRunner taskRunner = new TaskRunner<>(sellerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade, () -> log.debug("taskRunner at takeAvailableOffer completed"), this::handleTaskRunnerFault); @@ -111,7 +110,7 @@ public class SellerAsTakerProtocol extends TradeProtocol { stopTimeout(); processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(sellerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade, () -> log.debug("taskRunner at handleTakerDepositPaymentRequestMessage completed"), this::handleTaskRunnerFault); @@ -130,7 +129,7 @@ public class SellerAsTakerProtocol extends TradeProtocol { stopTimeout(); processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(sellerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade, () -> log.debug("taskRunner at handleDepositTxPublishedMessage completed"), this::handleTaskRunnerFault); @@ -149,7 +148,7 @@ public class SellerAsTakerProtocol extends TradeProtocol { private void handle(FiatTransferStartedMessage tradeMessage) { processModel.setTradeMessage(tradeMessage); - TaskRunner taskRunner = new TaskRunner<>(sellerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade, () -> log.debug("taskRunner at handleFiatTransferStartedMessage completed"), this::handleTaskRunnerFault); @@ -163,10 +162,11 @@ public class SellerAsTakerProtocol extends TradeProtocol { /////////////////////////////////////////////////////////////////////////////////////////// // User clicked the "bank transfer received" button, so we release the funds for pay out + @Override public void onFiatPaymentReceived() { sellerAsTakerTrade.setProcessState(TakerTradeState.ProcessState.FIAT_PAYMENT_RECEIVED); - TaskRunner taskRunner = new TaskRunner<>(sellerAsTakerTrade, + TradeTaskRunner taskRunner = new TradeTaskRunner(sellerAsTakerTrade, () -> { log.debug("taskRunner at handleFiatReceivedUIEvent completed"); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerProtocol.java new file mode 100644 index 0000000000..5356de4490 --- /dev/null +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/SellerProtocol.java @@ -0,0 +1,22 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.trade.protocol.trade; + +public interface SellerProtocol { + void onFiatPaymentReceived(); +} diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/TakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/TakerProtocol.java new file mode 100644 index 0000000000..d627d2fd35 --- /dev/null +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/TakerProtocol.java @@ -0,0 +1,22 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.trade.protocol.trade; + +public interface TakerProtocol { + void takeAvailableOffer(); +} diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeTaskRunner.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeTaskRunner.java new file mode 100644 index 0000000000..e963082b34 --- /dev/null +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/TradeTaskRunner.java @@ -0,0 +1,35 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.trade.protocol.trade; + +import io.bitsquare.common.handlers.ErrorMessageHandler; +import io.bitsquare.common.handlers.ResultHandler; +import io.bitsquare.common.taskrunner.Model; +import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TradeTaskRunner extends TaskRunner { + private static final Logger log = LoggerFactory.getLogger(TradeTaskRunner.class); + + public TradeTaskRunner(Trade sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + super(sharedModel, (Class) sharedModel.getClass().getSuperclass().getSuperclass(), resultHandler, errorMessageHandler); + } +} diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/seller/SendPayoutTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/seller/SendPayoutTxPublishedMessage.java index e722fd6edd..08942e7384 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/seller/SendPayoutTxPublishedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/tasks/seller/SendPayoutTxPublishedMessage.java @@ -55,7 +55,7 @@ public class SendPayoutTxPublishedMessage extends TradeTask { trade.setProcessState(TakerTradeState.ProcessState.PAYOUT_PUBLISHED_MSG_SENT); else if (trade instanceof OffererTrade) trade.setProcessState(OffererTradeState.ProcessState.PAYOUT_PUBLISHED_MSG_SENT); - + complete(); } diff --git a/core/src/main/resources/logback.xml b/core/src/main/resources/logback.xml index 0e3e96b92a..7157d3e71a 100644 --- a/core/src/main/resources/logback.xml +++ b/core/src/main/resources/logback.xml @@ -32,11 +32,10 @@ - - +