mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-04-06 21:13:59 -04:00
Refactor error handling for tasks
This commit is contained in:
parent
c8e79bab58
commit
c95ad02f29
@ -37,6 +37,7 @@ import io.bitsquare.trade.TradeManager;
|
||||
import io.bitsquare.trade.TradeMessageService;
|
||||
import io.bitsquare.user.User;
|
||||
import io.bitsquare.util.DSAKeyUtil;
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.core.ECKey;
|
||||
@ -50,8 +51,6 @@ import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
@ -367,10 +366,10 @@ class MainViewModel implements ViewModel {
|
||||
Arbitrator.ID_TYPE.REAL_LIFE_ID,
|
||||
languages,
|
||||
new Reputation(),
|
||||
Coin.parseCoin("0.001"),
|
||||
Coin.parseCoin("0.1"),
|
||||
arbitrationMethods,
|
||||
idVerifications,
|
||||
"https://bitsquare.io/",
|
||||
"https://bitsquare.io",
|
||||
"Bla bla...");
|
||||
|
||||
accountSettings.addAcceptedArbitrator(arbitrator);
|
||||
|
@ -60,7 +60,7 @@
|
||||
<Insets bottom="-15"/>
|
||||
</GridPane.margin>
|
||||
</Label>
|
||||
<CheckBox fx:id="interceptBeforeCheckBox" GridPane.rowIndex="3" GridPane.columnIndex="1">
|
||||
<CheckBox fx:id="interceptBeforeCheckBox" onAction="#onCheckBoxChanged" GridPane.rowIndex="3" GridPane.columnIndex="1">
|
||||
<GridPane.margin>
|
||||
<Insets bottom="-15"/>
|
||||
</GridPane.margin>
|
||||
|
@ -18,6 +18,7 @@
|
||||
package io.bitsquare.gui.main.debug;
|
||||
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol;
|
||||
import io.bitsquare.trade.protocol.availability.tasks.ProcessReportOfferAvailabilityMessage;
|
||||
import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable;
|
||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol;
|
||||
import io.bitsquare.trade.protocol.placeoffer.tasks.AddOfferToRemoteOfferBook;
|
||||
@ -56,15 +57,14 @@ import io.bitsquare.trade.protocol.trade.taker.tasks.SignAndPublishPayoutTx;
|
||||
import io.bitsquare.trade.protocol.trade.taker.tasks.TakerCommitDepositTx;
|
||||
import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOfferFeePayment;
|
||||
import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOffererAccount;
|
||||
import io.bitsquare.util.tasks.TaskInterception;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
import io.bitsquare.viewfx.view.InitializableView;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
import io.bitsquare.viewfx.view.InitializableView;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.fxml.FXML;
|
||||
@ -91,6 +91,7 @@ public class DebugView extends InitializableView {
|
||||
CheckOfferAvailabilityProtocol.class,
|
||||
io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress.class,
|
||||
RequestIsOfferAvailable.class,
|
||||
ProcessReportOfferAvailabilityMessage.class,
|
||||
Boolean.class, /* used as seperator*/
|
||||
|
||||
|
||||
@ -178,11 +179,20 @@ public class DebugView extends InitializableView {
|
||||
void onSelectTask() {
|
||||
Class item = taskComboBox.getSelectionModel().getSelectedItem();
|
||||
if (!item.getSimpleName().contains("Protocol")) {
|
||||
if (interceptBeforeCheckBox.isSelected())
|
||||
TaskInterception.taskToInterceptBeforeRun = item;
|
||||
else
|
||||
TaskInterception.taskToInterceptAfterRun = item;
|
||||
if (interceptBeforeCheckBox.isSelected()) {
|
||||
Task.taskToInterceptBeforeRun = item;
|
||||
Task.taskToInterceptAfterRun = null;
|
||||
}
|
||||
else {
|
||||
Task.taskToInterceptAfterRun = item;
|
||||
Task.taskToInterceptBeforeRun = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
void onCheckBoxChanged() {
|
||||
onSelectTask();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,16 +26,15 @@ import io.bitsquare.gui.main.trade.offerbook.OfferBookView;
|
||||
import io.bitsquare.gui.main.trade.takeoffer.TakeOfferView;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.viewfx.view.ActivatableView;
|
||||
import io.bitsquare.viewfx.view.View;
|
||||
import io.bitsquare.viewfx.view.ViewLoader;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.utils.Fiat;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.bitsquare.viewfx.view.View;
|
||||
import io.bitsquare.viewfx.view.ViewLoader;
|
||||
import io.bitsquare.viewfx.view.ActivatableView;
|
||||
|
||||
import javafx.application.Platform;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.scene.control.*;
|
||||
@ -78,8 +77,7 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
|
||||
// TODO Find a way to do that in the InputTextField directly, but a tab change does not trigger any event...
|
||||
TabPane tabPane = root;
|
||||
tabPane.getSelectionModel().selectedIndexProperty()
|
||||
.addListener((observableValue, oldValue, newValue) ->
|
||||
Platform.runLater(InputTextField::hideErrorMessageDisplay));
|
||||
.addListener((observableValue, oldValue, newValue) -> Platform.runLater(InputTextField::hideErrorMessageDisplay));
|
||||
|
||||
// We want to get informed when a tab get closed
|
||||
tabPane.getTabs().addListener((ListChangeListener<Tab>) change -> {
|
||||
@ -165,7 +163,10 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
|
||||
createOfferView.initWithData(direction, amount, price);
|
||||
createOfferPane = ((CreateOfferView) view).getRoot();
|
||||
final Tab tab = new Tab("Create offer");
|
||||
createOfferView.configCloseHandlers(tab.closableProperty());
|
||||
createOfferView.setCloseHandler(() -> {
|
||||
if (tabPane.getTabs().size() == 2)
|
||||
tabPane.getTabs().remove(1);
|
||||
});
|
||||
tab.setContent(createOfferPane);
|
||||
tabPane.getTabs().add(tab);
|
||||
tabPane.getSelectionModel().select(tab);
|
||||
@ -178,13 +179,17 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
|
||||
takeOfferView.initWithData(direction, amount, offer);
|
||||
takeOfferPane = ((TakeOfferView) view).getRoot();
|
||||
final Tab tab = new Tab("Take offer");
|
||||
takeOfferView.configCloseHandlers(tab.closableProperty());
|
||||
takeOfferView.setCloseHandler(() -> {
|
||||
if (tabPane.getTabs().size() == 2)
|
||||
tabPane.getTabs().remove(1);
|
||||
});
|
||||
tab.setContent(takeOfferPane);
|
||||
tabPane.getTabs().add(tab);
|
||||
tabPane.getSelectionModel().select(tab);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void onCreateOfferViewRemoved() {
|
||||
createOfferView = null;
|
||||
offerBookView.enableCreateOfferButton();
|
||||
@ -205,5 +210,9 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
|
||||
|
||||
void takeOffer(Coin amount, Fiat price, Offer offer);
|
||||
}
|
||||
|
||||
public interface CloseHandler {
|
||||
void close();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,11 +31,12 @@ import io.bitsquare.gui.main.account.content.restrictions.RestrictionsView;
|
||||
import io.bitsquare.gui.main.account.settings.AccountSettingsView;
|
||||
import io.bitsquare.gui.main.help.Help;
|
||||
import io.bitsquare.gui.main.help.HelpId;
|
||||
import io.bitsquare.gui.main.portfolio.PortfolioView;
|
||||
import io.bitsquare.gui.main.portfolio.offer.OffersView;
|
||||
import io.bitsquare.gui.main.trade.TradeView;
|
||||
import io.bitsquare.gui.util.ImageUtil;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.utils.Fiat;
|
||||
@ -45,10 +46,6 @@ import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.geometry.HPos;
|
||||
@ -98,12 +95,12 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
private ImageView expand;
|
||||
private ImageView collapse;
|
||||
private PopOver totalToPayInfoPopover;
|
||||
private BooleanProperty tabIsClosable;
|
||||
private boolean detailsVisible;
|
||||
private boolean advancedScreenInited;
|
||||
|
||||
private final Navigation navigation;
|
||||
private final OverlayManager overlayManager;
|
||||
private TradeView.CloseHandler closeHandler;
|
||||
|
||||
@Inject
|
||||
private CreateOfferView(CreateOfferViewModel model, Navigation navigation,
|
||||
@ -124,7 +121,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
|
||||
@Override
|
||||
protected void doDeactivate() {
|
||||
tabIsClosable.unbind();
|
||||
|
||||
}
|
||||
|
||||
public void initWithData(Direction direction, Coin amount, Fiat price) {
|
||||
@ -136,9 +133,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
imageView.setId("image-sell-large");
|
||||
}
|
||||
|
||||
public void configCloseHandlers(BooleanProperty tabIsClosable) {
|
||||
this.tabIsClosable = tabIsClosable;
|
||||
tabIsClosable.bind(model.tabIsClosable);
|
||||
public void setCloseHandler(TradeView.CloseHandler closeHandler) {
|
||||
this.closeHandler = closeHandler;
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -233,12 +229,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
}
|
||||
|
||||
private void close() {
|
||||
TabPane tabPane = ((TabPane) (root.getParent().getParent()));
|
||||
|
||||
// Might fix #315 Offerbook tab gets closed
|
||||
// tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
|
||||
tabPane.getTabs().remove(1);
|
||||
navigation.navigateTo(MainView.class, PortfolioView.class, OffersView.class);
|
||||
if (closeHandler != null)
|
||||
closeHandler.close();
|
||||
}
|
||||
|
||||
private void setupListeners() {
|
||||
@ -268,24 +260,21 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
// warnings
|
||||
model.showWarningInvalidBtcDecimalPlaces.addListener((o, oldValue, newValue) -> {
|
||||
if (newValue) {
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"),
|
||||
BSResources.get("createOffer.amountPriceBox.warning.invalidBtcDecimalPlaces"));
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.invalidBtcDecimalPlaces"));
|
||||
model.showWarningInvalidBtcDecimalPlaces.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
model.showWarningInvalidFiatDecimalPlaces.addListener((o, oldValue, newValue) -> {
|
||||
if (newValue) {
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"),
|
||||
BSResources.get("createOffer.amountPriceBox.warning.invalidFiatDecimalPlaces"));
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.invalidFiatDecimalPlaces"));
|
||||
model.showWarningInvalidFiatDecimalPlaces.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
model.showWarningAdjustedVolume.addListener((o, oldValue, newValue) -> {
|
||||
if (newValue) {
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"),
|
||||
BSResources.get("createOffer.amountPriceBox.warning.adjustedVolume"));
|
||||
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.adjustedVolume"));
|
||||
model.showWarningAdjustedVolume.set(false);
|
||||
volumeTextField.setText(model.volume.get());
|
||||
}
|
||||
@ -293,9 +282,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
|
||||
|
||||
model.requestPlaceOfferErrorMessage.addListener((o, oldValue, newValue) -> {
|
||||
if (newValue != null) {
|
||||
Popups.openErrorPopup(BSResources.get("shared.error"),
|
||||
BSResources.get("createOffer.amountPriceBox.error.message",
|
||||
model.requestPlaceOfferErrorMessage.get()));
|
||||
Popups.openErrorPopup(BSResources.get("shared.error"), BSResources.get("createOffer.amountPriceBox.error.message",
|
||||
model.requestPlaceOfferErrorMessage.get()));
|
||||
Popups.removeBlurContent();
|
||||
}
|
||||
});
|
||||
|
@ -24,6 +24,8 @@ import io.bitsquare.gui.util.validation.FiatValidator;
|
||||
import io.bitsquare.gui.util.validation.InputValidator;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
|
||||
import org.bitcoinj.core.Address;
|
||||
import org.bitcoinj.core.Coin;
|
||||
@ -31,9 +33,6 @@ import org.bitcoinj.utils.Fiat;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
|
||||
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
@ -80,7 +79,6 @@ class CreateOfferViewModel extends ActivatableWithDataModel<CreateOfferDataModel
|
||||
final BooleanProperty showWarningInvalidFiatDecimalPlaces = new SimpleBooleanProperty();
|
||||
final BooleanProperty showWarningInvalidBtcDecimalPlaces = new SimpleBooleanProperty();
|
||||
final BooleanProperty showTransactionPublishedScreen = new SimpleBooleanProperty();
|
||||
final BooleanProperty tabIsClosable = new SimpleBooleanProperty(true);
|
||||
|
||||
final ObjectProperty<InputValidator.ValidationResult> amountValidationResult = new SimpleObjectProperty<>();
|
||||
final ObjectProperty<InputValidator.ValidationResult> minAmountValidationResult = new
|
||||
@ -295,7 +293,6 @@ class CreateOfferViewModel extends ActivatableWithDataModel<CreateOfferDataModel
|
||||
dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> {
|
||||
if (newValue) {
|
||||
updateButtonDisableState();
|
||||
tabIsClosable.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -33,15 +33,14 @@ import io.bitsquare.gui.util.validation.OptionalFiatValidator;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
@ -222,7 +221,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
||||
if (model.isRegistered()) {
|
||||
if (offer.getDirection() == Direction.BUY) {
|
||||
// reset available state
|
||||
if (offer.getState() != Offer.State.OFFER_REMOVED)
|
||||
if (offer.getState() != Offer.State.REMOVED)
|
||||
offer.setState(Offer.State.UNKNOWN);
|
||||
|
||||
offerActionHandler.takeOffer(model.getAmountAsCoin(), model.getPriceAsCoin(), offer);
|
||||
@ -524,11 +523,13 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
|
||||
case UNKNOWN:
|
||||
iconView.setId("image-offer_state_unknown");
|
||||
break;
|
||||
case OFFER_AVAILABLE:
|
||||
case AVAILABLE:
|
||||
iconView.setId("image-offer_state_available");
|
||||
break;
|
||||
case OFFER_NOT_AVAILABLE:
|
||||
case OFFER_REMOVED:
|
||||
case OFFERER_OFFLINE:
|
||||
case NOT_AVAILABLE:
|
||||
case AVAILABILITY_CHECK_FAILED:
|
||||
case REMOVED:
|
||||
iconView.setId("image-offer_state_not_available");
|
||||
break;
|
||||
}
|
||||
|
@ -31,10 +31,13 @@ import io.bitsquare.gui.main.help.Help;
|
||||
import io.bitsquare.gui.main.help.HelpId;
|
||||
import io.bitsquare.gui.main.portfolio.PortfolioView;
|
||||
import io.bitsquare.gui.main.portfolio.pending.PendingTradesView;
|
||||
import io.bitsquare.gui.main.trade.TradeView;
|
||||
import io.bitsquare.gui.util.ImageUtil;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
||||
@ -43,10 +46,7 @@ import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.view.FxmlView;
|
||||
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
|
||||
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
@ -96,6 +96,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
|
||||
private final Navigation navigation;
|
||||
private final OverlayManager overlayManager;
|
||||
private ChangeListener<Offer.State> offerIsAvailableChangeListener;
|
||||
private TradeView.CloseHandler closeHandler;
|
||||
|
||||
@Inject
|
||||
private TakeOfferView(TakeOfferViewModel model, Navigation navigation,
|
||||
@ -152,27 +153,39 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
|
||||
handleOfferIsAvailableState(model.offerIsAvailable.get());
|
||||
}
|
||||
|
||||
private void handleOfferIsAvailableState(Offer.State state) {
|
||||
if (state == Offer.State.OFFER_AVAILABLE) {
|
||||
isOfferAvailableLabel.setVisible(false);
|
||||
isOfferAvailableLabel.setManaged(false);
|
||||
isOfferAvailableProgressIndicator.setProgress(0);
|
||||
isOfferAvailableProgressIndicator.setVisible(false);
|
||||
isOfferAvailableProgressIndicator.setManaged(false);
|
||||
showPaymentInfoScreenButton.setVisible(true);
|
||||
}
|
||||
else if ((state == Offer.State.OFFER_NOT_AVAILABLE)) {
|
||||
Popups.openWarningPopup("You cannot take that offer", "The offerer is either offline or the offer was already taken by another trader.");
|
||||
close();
|
||||
}
|
||||
else if ((state == Offer.State.OFFER_REMOVED)) {
|
||||
Popups.openWarningPopup("You cannot take that offer", "The offerer has been removed in the meantime.");
|
||||
close();
|
||||
}
|
||||
public void setCloseHandler(TradeView.CloseHandler closeHandler) {
|
||||
this.closeHandler = closeHandler;
|
||||
}
|
||||
|
||||
public void configCloseHandlers(BooleanProperty tabIsClosable) {
|
||||
tabIsClosable.bind(model.tabIsClosable);
|
||||
private void handleOfferIsAvailableState(Offer.State state) {
|
||||
switch (state) {
|
||||
case UNKNOWN:
|
||||
break;
|
||||
case AVAILABLE:
|
||||
isOfferAvailableLabel.setVisible(false);
|
||||
isOfferAvailableLabel.setManaged(false);
|
||||
isOfferAvailableProgressIndicator.setProgress(0);
|
||||
isOfferAvailableProgressIndicator.setVisible(false);
|
||||
isOfferAvailableProgressIndicator.setManaged(false);
|
||||
showPaymentInfoScreenButton.setVisible(true);
|
||||
break;
|
||||
case OFFERER_OFFLINE:
|
||||
Popups.openWarningPopup("You cannot take that offer", "The offerer is offline.");
|
||||
Platform.runLater(this::close);
|
||||
break;
|
||||
case NOT_AVAILABLE:
|
||||
Popups.openWarningPopup("You cannot take that offer", "The offer was already taken by another trader.");
|
||||
Platform.runLater(this::close);
|
||||
break;
|
||||
case AVAILABILITY_CHECK_FAILED:
|
||||
Popups.openWarningPopup("You cannot take that offer", "The check for the offer availability failed.");
|
||||
Platform.runLater(this::close);
|
||||
break;
|
||||
case REMOVED:
|
||||
Popups.openWarningPopup("You cannot take that offer", "The offerer has been removed in the meantime.");
|
||||
Platform.runLater(this::close);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
@ -261,12 +274,8 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
|
||||
}
|
||||
|
||||
private void close() {
|
||||
TabPane tabPane = ((TabPane) (root.getParent().getParent()));
|
||||
|
||||
// Might fix #315 Offerbook tab gets closed
|
||||
//tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
|
||||
if (tabPane != null && tabPane.getTabs() != null && tabPane.getTabs().size() > 1)
|
||||
tabPane.getTabs().remove(1);
|
||||
if (closeHandler != null)
|
||||
closeHandler.close();
|
||||
}
|
||||
|
||||
private void setupListeners() {
|
||||
|
@ -24,15 +24,14 @@ import io.bitsquare.gui.util.validation.InputValidator;
|
||||
import io.bitsquare.locale.BSResources;
|
||||
import io.bitsquare.offer.Direction;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
|
||||
import org.bitcoinj.core.Address;
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import io.bitsquare.viewfx.model.ViewModel;
|
||||
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
|
||||
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
@ -81,7 +80,6 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
||||
final BooleanProperty isTakeOfferSpinnerVisible = new SimpleBooleanProperty(false);
|
||||
final BooleanProperty showWarningInvalidBtcDecimalPlaces = new SimpleBooleanProperty();
|
||||
final BooleanProperty showTransactionPublishedScreen = new SimpleBooleanProperty();
|
||||
final BooleanProperty tabIsClosable = new SimpleBooleanProperty(true);
|
||||
final ObjectProperty<Offer.State> offerIsAvailable = new SimpleObjectProperty<>(Offer.State.UNKNOWN);
|
||||
|
||||
final ObjectProperty<InputValidator.ValidationResult> amountValidationResult = new SimpleObjectProperty<>();
|
||||
@ -272,7 +270,6 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
||||
dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> {
|
||||
if (newValue) {
|
||||
updateButtonDisableState();
|
||||
tabIsClosable.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -48,9 +48,11 @@ public class Offer implements Serializable {
|
||||
|
||||
public enum State {
|
||||
UNKNOWN,
|
||||
OFFER_AVAILABLE,
|
||||
OFFER_NOT_AVAILABLE,
|
||||
OFFER_REMOVED
|
||||
AVAILABLE,
|
||||
OFFERER_OFFLINE,
|
||||
NOT_AVAILABLE,
|
||||
AVAILABILITY_CHECK_FAILED,
|
||||
REMOVED
|
||||
}
|
||||
|
||||
// key attributes for lookup
|
||||
|
@ -91,7 +91,7 @@ public class OfferBook {
|
||||
@Override
|
||||
public void onOfferRemoved(Offer offer) {
|
||||
// Update state in case that that offer is used in the take offer screen, so it gets updated correctly
|
||||
offer.setState(Offer.State.OFFER_REMOVED);
|
||||
offer.setState(Offer.State.REMOVED);
|
||||
|
||||
// clean up possible references in tradeManager
|
||||
tradeManager.onOfferRemovedFromRemoteOfferBook(offer);
|
||||
|
@ -29,8 +29,8 @@ import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.offer.OfferBookService;
|
||||
import io.bitsquare.offer.OpenOffer;
|
||||
import io.bitsquare.persistence.Persistence;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.TransactionResultHandler;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol;
|
||||
@ -119,7 +119,7 @@ public class TradeManager {
|
||||
closedTrades.putAll((Map<String, Trade>) closedTradesObject);
|
||||
}
|
||||
messageHandler = this::handleMessage;
|
||||
|
||||
|
||||
tradeMessageService.addMessageHandler(messageHandler);
|
||||
}
|
||||
|
||||
@ -183,7 +183,9 @@ public class TradeManager {
|
||||
createOffererAsBuyerProtocol(openOffer);
|
||||
resultHandler.handleResult(transaction);
|
||||
},
|
||||
(message, throwable) -> errorMessageHandler.handleErrorMessage(message)
|
||||
(message) -> {
|
||||
errorMessageHandler.handleErrorMessage(message);
|
||||
}
|
||||
);
|
||||
|
||||
placeOfferProtocol.placeOffer();
|
||||
@ -278,6 +280,7 @@ public class TradeManager {
|
||||
tradeMessageService.sendMessage(sender, reportOfferAvailabilityMessage, new SendMessageListener() {
|
||||
@Override
|
||||
public void handleResult() {
|
||||
// Offerer does not do anything at that moment. Peer might only watch the offer and does nto start a trade.
|
||||
log.trace("ReportOfferAvailabilityMessage successfully arrived at peer");
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ import io.bitsquare.network.Message;
|
||||
import io.bitsquare.network.MessageBroker;
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.trade.listeners.GetPeerAddressListener;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
|
||||
import java.security.PublicKey;
|
||||
|
@ -15,7 +15,7 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.trade.listeners;
|
||||
package io.bitsquare.trade.handlers;
|
||||
|
||||
import io.bitsquare.network.Message;
|
||||
import io.bitsquare.network.Peer;
|
@ -22,7 +22,7 @@ import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.TradeMessageService;
|
||||
import io.bitsquare.trade.protocol.trade.OfferMessage;
|
||||
import io.bitsquare.util.handlers.ResultHandler;
|
||||
import io.bitsquare.util.tasks.SharedModel;
|
||||
import io.bitsquare.util.taskrunner.SharedModel;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -20,19 +20,18 @@ package io.bitsquare.trade.protocol.availability;
|
||||
import io.bitsquare.network.Message;
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage;
|
||||
import io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress;
|
||||
import io.bitsquare.trade.protocol.availability.tasks.ProcessReportOfferAvailabilityMessage;
|
||||
import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import javafx.application.Platform;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static io.bitsquare.util.Validator.nonEmptyStringOf;
|
||||
|
||||
public class CheckOfferAvailabilityProtocol {
|
||||
private static final Logger log = LoggerFactory.getLogger(CheckOfferAvailabilityProtocol.class);
|
||||
|
||||
@ -53,7 +52,7 @@ public class CheckOfferAvailabilityProtocol {
|
||||
}
|
||||
|
||||
public void cleanup() {
|
||||
// cannot remove listener in same execution cycle, so we delay it
|
||||
// Cannot remove listener in same execution cycle, so we delay it
|
||||
Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
|
||||
}
|
||||
|
||||
@ -69,8 +68,8 @@ public class CheckOfferAvailabilityProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at onCheckOfferAvailability completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -83,26 +82,34 @@ public class CheckOfferAvailabilityProtocol {
|
||||
public void cancel() {
|
||||
isCanceled = true;
|
||||
sequence.cancel();
|
||||
model.getOffer().setState(Offer.State.UNKNOWN);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Incoming message handling
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private void handleMessage(Message message, Peer sender) {
|
||||
if (!isCanceled) {
|
||||
if (message instanceof ReportOfferAvailabilityMessage) {
|
||||
ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = (ReportOfferAvailabilityMessage) message;
|
||||
nonEmptyStringOf(reportOfferAvailabilityMessage.getOfferId());
|
||||
|
||||
if (model.getOffer().getState() != Offer.State.OFFER_REMOVED) {
|
||||
if (reportOfferAvailabilityMessage.isOfferOpen())
|
||||
model.getOffer().setState(Offer.State.OFFER_AVAILABLE);
|
||||
else
|
||||
model.getOffer().setState(Offer.State.OFFER_NOT_AVAILABLE);
|
||||
}
|
||||
}
|
||||
model.getResultHandler().handleResult();
|
||||
if (message instanceof ReportOfferAvailabilityMessage)
|
||||
handleReportOfferAvailabilityMessage((ReportOfferAvailabilityMessage) message);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleReportOfferAvailabilityMessage(ReportOfferAvailabilityMessage message) {
|
||||
model.setMessage(message);
|
||||
|
||||
sequence = new TaskRunner<>(model,
|
||||
() -> {
|
||||
log.debug("sequence at handleReportOfferAvailabilityMessage completed");
|
||||
model.getResultHandler().handleResult();
|
||||
},
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(ProcessReportOfferAvailabilityMessage.class);
|
||||
sequence.run();
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,11 @@
|
||||
package io.bitsquare.trade.protocol.availability.tasks;
|
||||
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.listeners.GetPeerAddressListener;
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -31,25 +32,31 @@ public class GetPeerAddress extends Task<CheckOfferAvailabilityModel> {
|
||||
|
||||
public GetPeerAddress(TaskRunner taskHandler, CheckOfferAvailabilityModel model) {
|
||||
super(taskHandler, model);
|
||||
|
||||
errorMessage = "DHT lookup for peer address failed. Maybe the offerer was offline for too long time.";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
model.getTradeMessageService().getPeerAddress(model.getOffer().getMessagePublicKey(), new GetPeerAddressListener() {
|
||||
@Override
|
||||
public void onResult(Peer peer) {
|
||||
log.trace("Found peer: " + peer.toString());
|
||||
|
||||
|
||||
model.setPeer(peer);
|
||||
|
||||
complete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailed() {
|
||||
failed("DHT lookup for peer address failed.");
|
||||
failed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyErrorState() {
|
||||
model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.trade.protocol.availability.tasks;
|
||||
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
|
||||
import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import static io.bitsquare.util.Validator.nonEmptyStringOf;
|
||||
|
||||
public class ProcessReportOfferAvailabilityMessage extends Task<CheckOfferAvailabilityModel> {
|
||||
private static final Logger log = LoggerFactory.getLogger(ProcessReportOfferAvailabilityMessage.class);
|
||||
|
||||
public ProcessReportOfferAvailabilityMessage(TaskRunner taskHandler, CheckOfferAvailabilityModel model) {
|
||||
super(taskHandler, model);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doRun() {
|
||||
ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = (ReportOfferAvailabilityMessage) model.getMessage();
|
||||
nonEmptyStringOf(reportOfferAvailabilityMessage.getOfferId());
|
||||
|
||||
if (model.getOffer().getState() != Offer.State.REMOVED) {
|
||||
if (reportOfferAvailabilityMessage.isOfferOpen())
|
||||
model.getOffer().setState(Offer.State.AVAILABLE);
|
||||
else
|
||||
model.getOffer().setState(Offer.State.NOT_AVAILABLE);
|
||||
}
|
||||
|
||||
complete();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyErrorState() {
|
||||
model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
|
||||
}
|
||||
}
|
||||
|
@ -17,11 +17,12 @@
|
||||
|
||||
package io.bitsquare.trade.protocol.availability.tasks;
|
||||
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
|
||||
import io.bitsquare.trade.protocol.availability.messages.RequestIsOfferAvailableMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,20 +35,25 @@ public class RequestIsOfferAvailable extends Task<CheckOfferAvailabilityModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestIsOfferAvailableMessage(model.getOffer().getId()),
|
||||
new SendMessageListener() {
|
||||
@Override
|
||||
public void handleResult() {
|
||||
log.trace("RequestIsOfferAvailableMessage successfully arrived at peer");
|
||||
complete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleFault() {
|
||||
failed("Sending RequestIsOfferAvailableMessage failed.");
|
||||
model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
|
||||
failed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyErrorState() {
|
||||
model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.placeoffer;
|
||||
import io.bitsquare.btc.WalletService;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.offer.OfferBookService;
|
||||
import io.bitsquare.util.tasks.SharedModel;
|
||||
import io.bitsquare.util.taskrunner.SharedModel;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
|
||||
|
@ -22,8 +22,8 @@ import io.bitsquare.trade.protocol.placeoffer.tasks.AddOfferToRemoteOfferBook;
|
||||
import io.bitsquare.trade.protocol.placeoffer.tasks.BroadcastCreateOfferFeeTx;
|
||||
import io.bitsquare.trade.protocol.placeoffer.tasks.CreateOfferFeeTx;
|
||||
import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer;
|
||||
import io.bitsquare.util.handlers.FaultHandler;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -33,7 +33,7 @@ public class PlaceOfferProtocol {
|
||||
|
||||
private final PlaceOfferModel model;
|
||||
private TransactionResultHandler resultHandler;
|
||||
private FaultHandler faultHandle;
|
||||
private ErrorMessageHandler errorMessageHandler;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Constructor
|
||||
@ -41,10 +41,10 @@ public class PlaceOfferProtocol {
|
||||
|
||||
public PlaceOfferProtocol(PlaceOfferModel model,
|
||||
TransactionResultHandler resultHandler,
|
||||
FaultHandler faultHandle) {
|
||||
ErrorMessageHandler errorMessageHandler) {
|
||||
this.model = model;
|
||||
this.resultHandler = resultHandler;
|
||||
this.faultHandle = faultHandle;
|
||||
this.errorMessageHandler = errorMessageHandler;
|
||||
}
|
||||
|
||||
|
||||
@ -58,16 +58,16 @@ public class PlaceOfferProtocol {
|
||||
log.debug("sequence at handleRequestTakeOfferMessage completed");
|
||||
resultHandler.handleResult(model.getTransaction());
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
faultHandle.handleFault(message, throwable);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
errorMessageHandler.handleErrorMessage(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
ValidateOffer.class,
|
||||
CreateOfferFeeTx.class,
|
||||
BroadcastCreateOfferFeeTx.class,
|
||||
AddOfferToRemoteOfferBook.class
|
||||
AddOfferToRemoteOfferBook.class,
|
||||
BroadcastCreateOfferFeeTx.class
|
||||
);
|
||||
|
||||
sequence.run();
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.placeoffer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -29,16 +29,17 @@ public class AddOfferToRemoteOfferBook extends Task<PlaceOfferModel> {
|
||||
|
||||
public AddOfferToRemoteOfferBook(TaskRunner taskHandler, PlaceOfferModel model) {
|
||||
super(taskHandler, model);
|
||||
appendToErrorMessage("Could not add offer to offerbook. Maybe you have connection problems. Please try later again.");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
model.getOfferBookService().addOffer(model.getOffer(),
|
||||
() -> {
|
||||
complete();
|
||||
},
|
||||
(message, throwable) -> {
|
||||
failed(message, throwable);
|
||||
failed(throwable);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.placeoffer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
|
||||
@ -33,33 +33,55 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
|
||||
|
||||
public BroadcastCreateOfferFeeTx(TaskRunner taskHandler, PlaceOfferModel model) {
|
||||
super(taskHandler, model);
|
||||
|
||||
appendToErrorMessage("Broadcast of offer fee payment failed because transaction = null.");
|
||||
appendToErrorMessage("Maybe you have connection problems. Please try later again.");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
try {
|
||||
model.getWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() {
|
||||
@Override
|
||||
public void onSuccess(Transaction transaction) {
|
||||
log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString());
|
||||
if (transaction != null) {
|
||||
// need to write data before storage, otherwise hash is different when removing offer from DHT!
|
||||
model.getOffer().setOfferFeePaymentTxID(model.getTransaction().getHashAsString());
|
||||
|
||||
protected void doRun() {
|
||||
model.getWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() {
|
||||
@Override
|
||||
public void onSuccess(Transaction transaction) {
|
||||
log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString());
|
||||
if (transaction != null) {
|
||||
|
||||
if (model.getTransaction().getHashAsString() == transaction.getHashAsString()) {
|
||||
// No tx malleability happened after broadcast (still not in blockchain)
|
||||
complete();
|
||||
}
|
||||
else {
|
||||
failed("Broadcast of offer fee payment failed because transaction = null.");
|
||||
log.warn("Tx malleability happened after broadcast. We publish the changed offer to the DHT again.");
|
||||
// Tx malleability happened after broadcast. We publish the changed offer to the DHT again.
|
||||
model.getOfferBookService().removeOffer(model.getOffer(),
|
||||
() -> {
|
||||
log.info("We store now the changed txID to the offer and add that again.");
|
||||
// We store now the changed txID to the offer and add that again.
|
||||
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString());
|
||||
model.getOfferBookService().addOffer(model.getOffer(),
|
||||
() -> {
|
||||
complete();
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error("addOffer failed");
|
||||
failed(throwable);
|
||||
});
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error("removeOffer failed");
|
||||
failed(throwable);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable t) {
|
||||
failed(t);
|
||||
else {
|
||||
failed("Fault reason: Transaction = null.");
|
||||
}
|
||||
});
|
||||
} catch (Throwable t) {
|
||||
failed(t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable t) {
|
||||
failed(t);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.placeoffer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
|
||||
@ -34,10 +34,12 @@ public class CreateOfferFeeTx extends Task<PlaceOfferModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
Transaction transaction = model.getWalletService().createOfferFeeTx(model.getOffer().getId());
|
||||
|
||||
|
||||
// We assume there will be no tx malleability. We add a check later in case the published offer has a different hash.
|
||||
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString());
|
||||
model.setTransaction(transaction);
|
||||
|
||||
complete();
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.placeoffer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,7 +32,7 @@ public class ValidateOffer extends Task<PlaceOfferModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
model.getOffer().validate();
|
||||
|
||||
|
@ -24,7 +24,7 @@ import io.bitsquare.crypto.SignatureService;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.trade.TradeMessageService;
|
||||
import io.bitsquare.user.User;
|
||||
import io.bitsquare.util.tasks.SharedModel;
|
||||
import io.bitsquare.util.taskrunner.SharedModel;
|
||||
|
||||
import org.bitcoinj.core.ECKey;
|
||||
|
||||
|
@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.offerer;
|
||||
|
||||
import io.bitsquare.network.Message;
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.protocol.trade.TradeMessage;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateDepositTx;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage;
|
||||
@ -71,8 +71,6 @@ public class BuyerAsOffererProtocol {
|
||||
|
||||
public void cleanup() {
|
||||
model.getTradeMessageService().removeMessageHandler(messageHandler);
|
||||
// cannot remove listener in same execution cycle, so we delay it
|
||||
//Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
|
||||
}
|
||||
|
||||
|
||||
@ -113,8 +111,8 @@ public class BuyerAsOffererProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleRequestTakeOfferMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -131,8 +129,8 @@ public class BuyerAsOffererProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleTakeOfferFeePayedMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -150,8 +148,8 @@ public class BuyerAsOffererProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleRequestOffererPublishDepositTxMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -176,8 +174,8 @@ public class BuyerAsOffererProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleBankTransferStartedUIEvent completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -200,8 +198,8 @@ public class BuyerAsOffererProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handlePayoutTxPublishedMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(ProcessPayoutTxPublishedMessage.class);
|
||||
|
@ -17,12 +17,9 @@
|
||||
|
||||
package io.bitsquare.trade.protocol.trade.offerer;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.util.handlers.FaultHandler;
|
||||
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
||||
import io.bitsquare.util.handlers.ResultHandler;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -30,13 +27,13 @@ import org.slf4j.LoggerFactory;
|
||||
public class BuyerAsOffererTaskRunner<T extends BuyerAsOffererModel> extends TaskRunner<BuyerAsOffererModel> {
|
||||
private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererTaskRunner.class);
|
||||
|
||||
public BuyerAsOffererTaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
|
||||
super(sharedModel, resultHandler, faultHandler);
|
||||
public BuyerAsOffererTaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
super(sharedModel, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
/* @Override
|
||||
public void handleFault(String message, @NotNull Throwable throwable) {
|
||||
sharedModel.getTrade().setState(Trade.State.FAILED);
|
||||
super.handleFault(message, throwable);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.btc.FeePolicy;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.core.InsufficientMoneyException;
|
||||
@ -38,7 +38,7 @@ public class CreateDepositTx extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
String offererPubKey = model.getWalletService().getAddressInfoByTradeID(model.getTrade().getId()).getPubKeyAsHexString();
|
||||
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE);
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
import org.bitcoinj.core.Utils;
|
||||
@ -39,7 +39,7 @@ public class ProcessPayoutTxPublishedMessage extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
String payoutTxAsHex = nonEmptyStringOf(((PayoutTxPublishedMessage) model.getTradeMessage()).getPayoutTxAsHex());
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -36,7 +36,7 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<BuyerAsOf
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class ProcessRequestTakeOfferMessage extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getOffer().getId(), model.getTradeMessage());
|
||||
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -36,7 +36,7 @@ public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
|
||||
|
@ -22,8 +22,8 @@ import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.RespondToTakeOfferRequestMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -36,7 +36,7 @@ public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
boolean takeOfferRequestAccepted = model.getOpenOffer().getState() == OpenOffer.State.OPEN;
|
||||
if (!takeOfferRequestAccepted)
|
||||
log.info("Received take offer request but the offer not marked as open anymore.");
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class SendBankTransferInitedMessage extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
BankTransferStartedMessage tradeMessage = new BankTransferStartedMessage(
|
||||
model.getTrade().getId(),
|
||||
model.getDepositTxAsHex(),
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Utils;
|
||||
|
||||
@ -36,7 +36,7 @@ public class SendDepositTxIdToTaker extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.getTrade().getId(),
|
||||
Utils.HEX.encode(model.getTrade().getDepositTx().bitcoinSerialize()));
|
||||
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class SendTakerDepositPaymentRequest extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
TakerDepositPaymentRequestMessage tradeMessage = new TakerDepositPaymentRequestMessage(
|
||||
model.getTrade().getId(),
|
||||
model.getBankAccount(),
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
import org.bitcoinj.core.TransactionConfidence;
|
||||
@ -37,7 +37,7 @@ public class SetupListenerForBlockChainConfirmation extends Task<BuyerAsOffererM
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
TransactionConfidence confidence = model.getTrade().getDepositTx().getConfidence();
|
||||
confidence.addEventListener(new TransactionConfidence.Listener() {
|
||||
@Override
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
|
||||
@ -39,7 +39,7 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
model.getWalletService().offererSignAndPublishTx(model.getPreparedOffererDepositTxAsHex(),
|
||||
model.getSignedTakerDepositTxAsHex(),
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.core.ECKey;
|
||||
@ -38,7 +38,7 @@ public class SignPayoutTx extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
Trade trade = model.getTrade();
|
||||
Coin securityDeposit = trade.getSecurityDeposit();
|
||||
|
@ -21,8 +21,8 @@ import io.bitsquare.trade.Contract;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.Utilities;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -35,7 +35,7 @@ public class VerifyAndSignContract extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
Trade trade = model.getTrade();
|
||||
|
||||
Contract contract = new Contract(
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,7 +32,7 @@ public class VerifyTakeOfferFeePayment extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
//TODO mocked yet, need a confidence listeners
|
||||
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTakeOfferFeeTxId());
|
||||
/* if (numOfPeersSeenTx > 2) {
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.offerer.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,7 +32,7 @@ public class VerifyTakerAccount extends Task<BuyerAsOffererModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
//TODO mocked yet
|
||||
if (model.getBlockChainService().verifyAccountRegistration()) {
|
||||
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) {
|
||||
|
@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.trade.taker;
|
||||
import io.bitsquare.network.Message;
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.protocol.trade.TradeMessage;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage;
|
||||
@ -75,8 +75,8 @@ public class SellerAsTakerProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleRequestTakeOfferUIEvent completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -88,8 +88,6 @@ public class SellerAsTakerProtocol {
|
||||
|
||||
public void cleanup() {
|
||||
model.getTradeMessageService().removeMessageHandler(messageHandler);
|
||||
// cannot remove listener in same execution cycle, so we delay it
|
||||
// Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
|
||||
}
|
||||
|
||||
|
||||
@ -128,8 +126,8 @@ public class SellerAsTakerProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleRespondToTakeOfferRequestMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -147,8 +145,8 @@ public class SellerAsTakerProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleTakerDepositPaymentRequestMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -168,8 +166,8 @@ public class SellerAsTakerProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleDepositTxPublishedMessage completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
@ -187,8 +185,8 @@ public class SellerAsTakerProtocol {
|
||||
log.debug("sequence at handleBankTransferInitedMessage completed");
|
||||
model.getTrade().setState(Trade.State.FIAT_PAYMENT_STARTED);
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(ProcessBankTransferInitedMessage.class);
|
||||
@ -205,8 +203,8 @@ public class SellerAsTakerProtocol {
|
||||
() -> {
|
||||
log.debug("sequence at handleFiatReceivedUIEvent completed");
|
||||
},
|
||||
(message, throwable) -> {
|
||||
log.error(message);
|
||||
(errorMessage) -> {
|
||||
log.error(errorMessage);
|
||||
}
|
||||
);
|
||||
sequence.addTasks(
|
||||
|
@ -17,12 +17,9 @@
|
||||
|
||||
package io.bitsquare.trade.protocol.trade.taker;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.util.handlers.FaultHandler;
|
||||
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
||||
import io.bitsquare.util.handlers.ResultHandler;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -30,13 +27,13 @@ import org.slf4j.LoggerFactory;
|
||||
public class SellerAsTakerTaskRunner<T extends SellerAsTakerModel> extends TaskRunner<SellerAsTakerModel> {
|
||||
private static final Logger log = LoggerFactory.getLogger(SellerAsTakerTaskRunner.class);
|
||||
|
||||
public SellerAsTakerTaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
|
||||
super(sharedModel, resultHandler, faultHandler);
|
||||
public SellerAsTakerTaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
super(sharedModel, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleFault(String message, @NotNull Throwable throwable) {
|
||||
/* @Override
|
||||
public void handleErrorMessage(String errorMessage) {
|
||||
sharedModel.getTrade().setState(Trade.State.FAILED);
|
||||
super.handleFault(message, throwable);
|
||||
}
|
||||
super.handleErrorMessage(errorMessage);
|
||||
}*/
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ import io.bitsquare.trade.Contract;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.Utilities;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -35,7 +35,7 @@ public class CreateAndSignContract extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
Trade trade = model.getTrade();
|
||||
Contract contract = new Contract(
|
||||
model.getOffer(),
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.network.Peer;
|
||||
import io.bitsquare.trade.listeners.GetPeerAddressListener;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class GetPeerAddress extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
model.getTradeMessageService().getPeerAddress(model.getOffererMessagePublicKey(), new GetPeerAddressListener() {
|
||||
@Override
|
||||
public void onResult(Peer peer) {
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
import org.bitcoinj.core.InsufficientMoneyException;
|
||||
@ -36,7 +36,7 @@ public class PayDeposit extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
Coin amountToPay = model.getTradeAmount().add(model.getSecurityDeposit());
|
||||
Coin msOutputAmount = amountToPay.add(model.getSecurityDeposit());
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.InsufficientMoneyException;
|
||||
import org.bitcoinj.core.Transaction;
|
||||
@ -39,7 +39,7 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
model.getWalletService().payTakeOfferFee(model.getTrade().getId(), new FutureCallback<Transaction>() {
|
||||
@Override
|
||||
@ -51,11 +51,11 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
|
||||
|
||||
@Override
|
||||
public void onFailure(@NotNull Throwable t) {
|
||||
failed("Pay take offer fee caused an exception: ", t);
|
||||
failed(t);
|
||||
}
|
||||
});
|
||||
} catch (InsufficientMoneyException e) {
|
||||
failed("Pay take offer fee caused an exception: ", e);
|
||||
failed(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -35,7 +35,7 @@ public class ProcessBankTransferInitedMessage extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
BankTransferStartedMessage message = (BankTransferStartedMessage) model.getTradeMessage();
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -35,7 +35,7 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
|
||||
@ -44,7 +44,7 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
|
||||
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
failed("Validation for DepositTxPublishedMessage failed.", t);
|
||||
failed(t);
|
||||
}
|
||||
}
|
||||
}
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.RespondToTakeOfferRequestMessage;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -36,7 +36,7 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
|
||||
@ -49,7 +49,7 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
|
||||
failed("Requested offer rejected because it is not available anymore.");
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
failed("Validation for RespondToTakeOfferRequestMessage failed.", t);
|
||||
failed( t);
|
||||
}
|
||||
}
|
||||
}
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -36,7 +36,7 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
|
||||
TakerDepositPaymentRequestMessage message = (TakerDepositPaymentRequestMessage) model.getTradeMessage();
|
||||
@ -48,7 +48,7 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
|
||||
|
||||
complete();
|
||||
} catch (Throwable t) {
|
||||
failed("Validation for TakerDepositPaymentRequestMessage failed.", t);
|
||||
failed(t);
|
||||
}
|
||||
}
|
||||
}
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class RequestTakeOffer extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestTakeOfferMessage(model.getTrade().getId()),
|
||||
new SendMessageListener() {
|
||||
@Override
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class SendPayoutTxToOfferer extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.getTrade().getId(), model.getPayoutTxAsHex());
|
||||
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() {
|
||||
@Override
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
import org.bitcoinj.core.Utils;
|
||||
@ -37,7 +37,7 @@ public class SendSignedTakerDepositTxAsHex extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
Transaction signedTakerDepositTx = model.getSignedTakerDepositTx();
|
||||
long takerTxOutIndex = model.getSignedTakerDepositTx().getInput(1).getOutpoint().getIndex();
|
||||
|
||||
|
@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -34,7 +34,7 @@ public class SendTakeOfferFeePayedMessage extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage(
|
||||
model.getTrade().getId(),
|
||||
model.getTrade().getTakeOfferFeeTxId(),
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.AddressFormatException;
|
||||
import org.bitcoinj.core.Transaction;
|
||||
@ -41,7 +41,7 @@ public class SignAndPublishPayoutTx extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
try {
|
||||
model.getWalletService().takerSignsAndSendsTx(model.getDepositTxAsHex(),
|
||||
model.getOffererSignatureR(),
|
||||
|
@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.Trade;
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.bitcoinj.core.Transaction;
|
||||
|
||||
@ -35,7 +35,7 @@ public class TakerCommitDepositTx extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
Transaction transaction = model.getWalletService().takerCommitDepositTx(model.getDepositTxAsHex());
|
||||
|
||||
model.getTrade().setDepositTx(transaction);
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,7 +32,7 @@ public class VerifyOfferFeePayment extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
//TODO impl. missing
|
||||
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTrade().getTakeOfferFeeTxId());
|
||||
/* if (numOfPeersSeenTx > 2) {
|
||||
|
@ -18,8 +18,8 @@
|
||||
package io.bitsquare.trade.protocol.trade.taker.tasks;
|
||||
|
||||
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
|
||||
import io.bitsquare.util.tasks.Task;
|
||||
import io.bitsquare.util.tasks.TaskRunner;
|
||||
import io.bitsquare.util.taskrunner.Task;
|
||||
import io.bitsquare.util.taskrunner.TaskRunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -32,7 +32,7 @@ public class VerifyOffererAccount extends Task<SellerAsTakerModel> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
protected void doRun() {
|
||||
if (model.getBlockChainService().verifyAccountRegistration()) {
|
||||
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) {
|
||||
failed("Taker is blacklisted.");
|
||||
|
@ -23,7 +23,7 @@ import io.bitsquare.network.tomp2p.TomP2PNode;
|
||||
import io.bitsquare.network.tomp2p.TomP2PPeer;
|
||||
import io.bitsquare.trade.TradeMessageService;
|
||||
import io.bitsquare.trade.listeners.GetPeerAddressListener;
|
||||
import io.bitsquare.trade.listeners.MessageHandler;
|
||||
import io.bitsquare.trade.handlers.MessageHandler;
|
||||
import io.bitsquare.trade.listeners.SendMessageListener;
|
||||
import io.bitsquare.user.User;
|
||||
|
||||
|
@ -15,10 +15,15 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.trade.listeners;
|
||||
package io.bitsquare.util.taskrunner;
|
||||
|
||||
import net.tomp2p.peers.PeerAddress;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public interface TakeOfferRequestListener {
|
||||
void onTakeOfferRequested(String offerId, PeerAddress sender);
|
||||
public class InterceptTaskException extends RuntimeException{
|
||||
private static final Logger log = LoggerFactory.getLogger(InterceptTaskException.class);
|
||||
|
||||
public InterceptTaskException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.util.tasks;
|
||||
package io.bitsquare.util.taskrunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
91
gui/src/main/java/io/bitsquare/util/taskrunner/Task.java
Normal file
91
gui/src/main/java/io/bitsquare/util/taskrunner/Task.java
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.util.taskrunner;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public abstract class Task<T extends SharedModel> {
|
||||
private static final Logger log = LoggerFactory.getLogger(Task.class);
|
||||
public static Class<? extends Task> taskToInterceptBeforeRun;
|
||||
public static Class<? extends Task> taskToInterceptAfterRun;
|
||||
|
||||
private final TaskRunner taskHandler;
|
||||
protected final T model;
|
||||
protected String errorMessage = "An error occurred at: " + getClass().getSimpleName();
|
||||
|
||||
public Task(TaskRunner taskHandler, T model) {
|
||||
this.taskHandler = taskHandler;
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
protected void run() {
|
||||
interceptBeforeRun();
|
||||
try {
|
||||
doRun();
|
||||
} catch (Throwable t) {
|
||||
appendExceptionToErrorMessage(t);
|
||||
failed();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
abstract protected void doRun();
|
||||
|
||||
protected void applyErrorState() {
|
||||
}
|
||||
|
||||
private void interceptBeforeRun() {
|
||||
if (getClass() == taskToInterceptBeforeRun)
|
||||
throw new InterceptTaskException("Task intercepted before run executed: task = " + getClass().getSimpleName());
|
||||
}
|
||||
|
||||
private void interceptBeforeComplete() {
|
||||
if (getClass() == taskToInterceptAfterRun)
|
||||
throw new InterceptTaskException("Task intercepted before complete called: task = " + getClass().getSimpleName());
|
||||
}
|
||||
|
||||
protected void appendToErrorMessage(String message) {
|
||||
errorMessage += "\n" + message;
|
||||
}
|
||||
|
||||
protected void appendExceptionToErrorMessage(Throwable t) {
|
||||
errorMessage += "\n Exception message: " + t.getMessage();
|
||||
}
|
||||
|
||||
protected void complete() {
|
||||
interceptBeforeComplete();
|
||||
taskHandler.handleComplete();
|
||||
}
|
||||
|
||||
protected void failed(String message) {
|
||||
appendToErrorMessage(message);
|
||||
failed();
|
||||
}
|
||||
|
||||
protected void failed(Throwable t) {
|
||||
appendExceptionToErrorMessage(t);
|
||||
failed();
|
||||
}
|
||||
|
||||
protected void failed() {
|
||||
applyErrorState();
|
||||
taskHandler.handleErrorMessage(errorMessage);
|
||||
}
|
||||
|
||||
}
|
@ -15,17 +15,15 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.util.tasks;
|
||||
package io.bitsquare.util.taskrunner;
|
||||
|
||||
import io.bitsquare.util.handlers.FaultHandler;
|
||||
import io.bitsquare.util.handlers.ErrorMessageHandler;
|
||||
import io.bitsquare.util.handlers.ResultHandler;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -35,37 +33,36 @@ public class TaskRunner<T extends SharedModel> {
|
||||
private final Queue<Class> tasks = new LinkedBlockingQueue<>();
|
||||
protected final T sharedModel;
|
||||
private final ResultHandler resultHandler;
|
||||
private final FaultHandler faultHandler;
|
||||
|
||||
private final ErrorMessageHandler errorMessageHandler;
|
||||
private boolean failed = false;
|
||||
|
||||
|
||||
private boolean isCanceled;
|
||||
|
||||
private Class<? extends Task> currentTask;
|
||||
|
||||
public TaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
|
||||
public TaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
this.sharedModel = sharedModel;
|
||||
this.resultHandler = resultHandler;
|
||||
this.faultHandler = faultHandler;
|
||||
this.errorMessageHandler = errorMessageHandler;
|
||||
}
|
||||
|
||||
public void addTasks(Class<? extends Task>... items) {
|
||||
tasks.addAll(Arrays.asList(items));
|
||||
}
|
||||
|
||||
public void run() {
|
||||
next();
|
||||
}
|
||||
|
||||
|
||||
protected void next() {
|
||||
if (!failed && !isCanceled) {
|
||||
if (tasks.size() > 0) {
|
||||
try {
|
||||
currentTask = tasks.poll();
|
||||
interceptBeforeRun(currentTask);
|
||||
log.trace("Run task: " + currentTask.getSimpleName());
|
||||
currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run();
|
||||
interceptAfterRun(currentTask);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
faultHandler.handleFault(t.getMessage(), t);
|
||||
} catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
handleErrorMessage("Error at taskRunner: " + throwable.getMessage());
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -74,44 +71,19 @@ public class TaskRunner<T extends SharedModel> {
|
||||
}
|
||||
}
|
||||
|
||||
protected void interceptBeforeRun(Class<? extends Task> task) {
|
||||
if (task == TaskInterception.taskToInterceptBeforeRun)
|
||||
throw new RuntimeException("Task intercepted before run executed: task = " + task.getSimpleName());
|
||||
}
|
||||
|
||||
protected void interceptAfterRun(Class<? extends Task> task) {
|
||||
if (task == TaskInterception.taskToInterceptAfterRun)
|
||||
throw new RuntimeException("Task intercepted after run executed: task = " + task.getSimpleName());
|
||||
}
|
||||
|
||||
|
||||
public void cancel() {
|
||||
isCanceled = true;
|
||||
}
|
||||
|
||||
public void addTask(Class<? extends Task> task) {
|
||||
tasks.add(task);
|
||||
}
|
||||
|
||||
public void addTasks(Class<? extends Task>... items) {
|
||||
tasks.addAll(Arrays.asList(items));
|
||||
}
|
||||
|
||||
public void complete() {
|
||||
void handleComplete() {
|
||||
log.trace("Task completed: " + currentTask.getSimpleName());
|
||||
next();
|
||||
}
|
||||
|
||||
public void handleFault(String message) {
|
||||
handleFault(message, new Exception(message));
|
||||
}
|
||||
|
||||
public void handleFault(String message, @NotNull Throwable throwable) {
|
||||
void handleErrorMessage(String errorMessage) {
|
||||
log.error("Task failed: " + currentTask.getSimpleName());
|
||||
log.debug(throwable.getMessage());
|
||||
log.error("errorMessage: " + errorMessage);
|
||||
failed = true;
|
||||
faultHandler.handleFault(message, throwable);
|
||||
errorMessageHandler.handleErrorMessage(errorMessage);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.util.tasks;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Task<T extends SharedModel> {
|
||||
private static final Logger log = LoggerFactory.getLogger(Task.class);
|
||||
|
||||
private final TaskRunner taskHandler;
|
||||
protected final T model;
|
||||
|
||||
public Task(TaskRunner taskHandler, T model) {
|
||||
this.taskHandler = taskHandler;
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
protected void run() {
|
||||
}
|
||||
|
||||
protected void complete() {
|
||||
taskHandler.complete();
|
||||
}
|
||||
|
||||
protected void failed(String message) {
|
||||
taskHandler.handleFault(message);
|
||||
}
|
||||
|
||||
protected void failed(String message, @NotNull Throwable throwable) {
|
||||
log.error(message);
|
||||
log.error(throwable.getMessage());
|
||||
taskHandler.handleFault(message, throwable);
|
||||
}
|
||||
|
||||
protected void failed(@NotNull Throwable throwable) {
|
||||
taskHandler.handleFault(throwable.getMessage(), throwable);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user