Refactor error handling for tasks

This commit is contained in:
Manfred Karrer 2015-03-13 20:04:49 +01:00
parent c8e79bab58
commit c95ad02f29
67 changed files with 550 additions and 430 deletions

View file

@ -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);

View file

@ -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>

View file

@ -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();
}
}

View file

@ -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();
}
} }

View file

@ -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();
} }

View file

@ -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);
} }
}); });

View file

@ -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;
} }

View file

@ -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() {

View file

@ -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);
} }
}); });

View file

@ -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

View file

@ -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);

View file

@ -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");
} }

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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();
} }
} }

View file

@ -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);
}
} }

View file

@ -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);
}
}

View file

@ -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);
}
} }

View file

@ -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;

View file

@ -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();

View file

@ -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);
}); });
} }
} }

View file

@ -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);
}
} }
} }

View file

@ -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();

View file

@ -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();

View file

@ -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;

View file

@ -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);

View file

@ -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);
} }*/
} }

View file

@ -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);

View file

@ -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());

View file

@ -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());

View file

@ -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());

View file

@ -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());

View file

@ -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.");

View file

@ -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(),

View file

@ -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()));

View file

@ -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(),

View file

@ -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

View file

@ -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(),

View file

@ -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();

View file

@ -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(

View file

@ -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) {

View file

@ -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())) {

View file

@ -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(

View file

@ -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);
} }*/
} }

View file

@ -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(),

View file

@ -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) {

View file

@ -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());

View file

@ -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);
} }
} }
} }

View file

@ -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();

View file

@ -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);
} }
} }
} }

View file

@ -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);
} }
} }
} }

View file

@ -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);
} }
} }
} }

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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(),

View file

@ -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(),

View file

@ -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);

View file

@ -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) {

View file

@ -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.");

View file

@ -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;

View file

@ -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);
}
} }

View file

@ -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;

View 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);
}
}

View file

@ -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);
} }
} }

View file

@ -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);
}
}