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