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.user.User;
import io.bitsquare.util.DSAKeyUtil;
import io.bitsquare.viewfx.model.ViewModel;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey;
@ -50,8 +51,6 @@ import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeoutException;
import io.bitsquare.viewfx.model.ViewModel;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
@ -367,10 +366,10 @@ class MainViewModel implements ViewModel {
Arbitrator.ID_TYPE.REAL_LIFE_ID,
languages,
new Reputation(),
Coin.parseCoin("0.001"),
Coin.parseCoin("0.1"),
arbitrationMethods,
idVerifications,
"https://bitsquare.io/",
"https://bitsquare.io",
"Bla bla...");
accountSettings.addAcceptedArbitrator(arbitrator);

View File

@ -60,7 +60,7 @@
<Insets bottom="-15"/>
</GridPane.margin>
</Label>
<CheckBox fx:id="interceptBeforeCheckBox" GridPane.rowIndex="3" GridPane.columnIndex="1">
<CheckBox fx:id="interceptBeforeCheckBox" onAction="#onCheckBoxChanged" GridPane.rowIndex="3" GridPane.columnIndex="1">
<GridPane.margin>
<Insets bottom="-15"/>
</GridPane.margin>

View File

@ -18,6 +18,7 @@
package io.bitsquare.gui.main.debug;
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol;
import io.bitsquare.trade.protocol.availability.tasks.ProcessReportOfferAvailabilityMessage;
import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol;
import io.bitsquare.trade.protocol.placeoffer.tasks.AddOfferToRemoteOfferBook;
@ -56,15 +57,14 @@ import io.bitsquare.trade.protocol.trade.taker.tasks.SignAndPublishPayoutTx;
import io.bitsquare.trade.protocol.trade.taker.tasks.TakerCommitDepositTx;
import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOfferFeePayment;
import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOffererAccount;
import io.bitsquare.util.tasks.TaskInterception;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.viewfx.view.FxmlView;
import io.bitsquare.viewfx.view.InitializableView;
import java.util.Arrays;
import javax.inject.Inject;
import io.bitsquare.viewfx.view.FxmlView;
import io.bitsquare.viewfx.view.InitializableView;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
@ -91,6 +91,7 @@ public class DebugView extends InitializableView {
CheckOfferAvailabilityProtocol.class,
io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress.class,
RequestIsOfferAvailable.class,
ProcessReportOfferAvailabilityMessage.class,
Boolean.class, /* used as seperator*/
@ -178,11 +179,20 @@ public class DebugView extends InitializableView {
void onSelectTask() {
Class item = taskComboBox.getSelectionModel().getSelectedItem();
if (!item.getSimpleName().contains("Protocol")) {
if (interceptBeforeCheckBox.isSelected())
TaskInterception.taskToInterceptBeforeRun = item;
else
TaskInterception.taskToInterceptAfterRun = item;
if (interceptBeforeCheckBox.isSelected()) {
Task.taskToInterceptBeforeRun = item;
Task.taskToInterceptAfterRun = null;
}
else {
Task.taskToInterceptAfterRun = item;
Task.taskToInterceptBeforeRun = null;
}
}
}
@FXML
void onCheckBoxChanged() {
onSelectTask();
}
}

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.offer.Direction;
import io.bitsquare.offer.Offer;
import io.bitsquare.viewfx.view.ActivatableView;
import io.bitsquare.viewfx.view.View;
import io.bitsquare.viewfx.view.ViewLoader;
import org.bitcoinj.core.Coin;
import org.bitcoinj.utils.Fiat;
import java.util.List;
import io.bitsquare.viewfx.view.View;
import io.bitsquare.viewfx.view.ViewLoader;
import io.bitsquare.viewfx.view.ActivatableView;
import javafx.application.Platform;
import javafx.collections.ListChangeListener;
import javafx.scene.control.*;
@ -78,8 +77,7 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
// TODO Find a way to do that in the InputTextField directly, but a tab change does not trigger any event...
TabPane tabPane = root;
tabPane.getSelectionModel().selectedIndexProperty()
.addListener((observableValue, oldValue, newValue) ->
Platform.runLater(InputTextField::hideErrorMessageDisplay));
.addListener((observableValue, oldValue, newValue) -> Platform.runLater(InputTextField::hideErrorMessageDisplay));
// We want to get informed when a tab get closed
tabPane.getTabs().addListener((ListChangeListener<Tab>) change -> {
@ -165,7 +163,10 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
createOfferView.initWithData(direction, amount, price);
createOfferPane = ((CreateOfferView) view).getRoot();
final Tab tab = new Tab("Create offer");
createOfferView.configCloseHandlers(tab.closableProperty());
createOfferView.setCloseHandler(() -> {
if (tabPane.getTabs().size() == 2)
tabPane.getTabs().remove(1);
});
tab.setContent(createOfferPane);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);
@ -178,13 +179,17 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
takeOfferView.initWithData(direction, amount, offer);
takeOfferPane = ((TakeOfferView) view).getRoot();
final Tab tab = new Tab("Take offer");
takeOfferView.configCloseHandlers(tab.closableProperty());
takeOfferView.setCloseHandler(() -> {
if (tabPane.getTabs().size() == 2)
tabPane.getTabs().remove(1);
});
tab.setContent(takeOfferPane);
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);
}
}
private void onCreateOfferViewRemoved() {
createOfferView = null;
offerBookView.enableCreateOfferButton();
@ -205,5 +210,9 @@ public abstract class TradeView extends ActivatableView<TabPane, Void> {
void takeOffer(Coin amount, Fiat price, Offer offer);
}
public interface CloseHandler {
void close();
}
}

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.help.Help;
import io.bitsquare.gui.main.help.HelpId;
import io.bitsquare.gui.main.portfolio.PortfolioView;
import io.bitsquare.gui.main.portfolio.offer.OffersView;
import io.bitsquare.gui.main.trade.TradeView;
import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.locale.BSResources;
import io.bitsquare.offer.Direction;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import io.bitsquare.viewfx.view.FxmlView;
import org.bitcoinj.core.Coin;
import org.bitcoinj.utils.Fiat;
@ -45,10 +46,6 @@ import java.util.List;
import javax.inject.Inject;
import io.bitsquare.viewfx.view.FxmlView;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import javafx.beans.property.BooleanProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.geometry.HPos;
@ -98,12 +95,12 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
private ImageView expand;
private ImageView collapse;
private PopOver totalToPayInfoPopover;
private BooleanProperty tabIsClosable;
private boolean detailsVisible;
private boolean advancedScreenInited;
private final Navigation navigation;
private final OverlayManager overlayManager;
private TradeView.CloseHandler closeHandler;
@Inject
private CreateOfferView(CreateOfferViewModel model, Navigation navigation,
@ -124,7 +121,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
@Override
protected void doDeactivate() {
tabIsClosable.unbind();
}
public void initWithData(Direction direction, Coin amount, Fiat price) {
@ -136,9 +133,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
imageView.setId("image-sell-large");
}
public void configCloseHandlers(BooleanProperty tabIsClosable) {
this.tabIsClosable = tabIsClosable;
tabIsClosable.bind(model.tabIsClosable);
public void setCloseHandler(TradeView.CloseHandler closeHandler) {
this.closeHandler = closeHandler;
}
@FXML
@ -233,12 +229,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
}
private void close() {
TabPane tabPane = ((TabPane) (root.getParent().getParent()));
// Might fix #315 Offerbook tab gets closed
// tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
tabPane.getTabs().remove(1);
navigation.navigateTo(MainView.class, PortfolioView.class, OffersView.class);
if (closeHandler != null)
closeHandler.close();
}
private void setupListeners() {
@ -268,24 +260,21 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
// warnings
model.showWarningInvalidBtcDecimalPlaces.addListener((o, oldValue, newValue) -> {
if (newValue) {
Popups.openWarningPopup(BSResources.get("shared.warning"),
BSResources.get("createOffer.amountPriceBox.warning.invalidBtcDecimalPlaces"));
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.invalidBtcDecimalPlaces"));
model.showWarningInvalidBtcDecimalPlaces.set(false);
}
});
model.showWarningInvalidFiatDecimalPlaces.addListener((o, oldValue, newValue) -> {
if (newValue) {
Popups.openWarningPopup(BSResources.get("shared.warning"),
BSResources.get("createOffer.amountPriceBox.warning.invalidFiatDecimalPlaces"));
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.invalidFiatDecimalPlaces"));
model.showWarningInvalidFiatDecimalPlaces.set(false);
}
});
model.showWarningAdjustedVolume.addListener((o, oldValue, newValue) -> {
if (newValue) {
Popups.openWarningPopup(BSResources.get("shared.warning"),
BSResources.get("createOffer.amountPriceBox.warning.adjustedVolume"));
Popups.openWarningPopup(BSResources.get("shared.warning"), BSResources.get("createOffer.amountPriceBox.warning.adjustedVolume"));
model.showWarningAdjustedVolume.set(false);
volumeTextField.setText(model.volume.get());
}
@ -293,9 +282,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
model.requestPlaceOfferErrorMessage.addListener((o, oldValue, newValue) -> {
if (newValue != null) {
Popups.openErrorPopup(BSResources.get("shared.error"),
BSResources.get("createOffer.amountPriceBox.error.message",
model.requestPlaceOfferErrorMessage.get()));
Popups.openErrorPopup(BSResources.get("shared.error"), BSResources.get("createOffer.amountPriceBox.error.message",
model.requestPlaceOfferErrorMessage.get()));
Popups.removeBlurContent();
}
});

View File

@ -24,6 +24,8 @@ import io.bitsquare.gui.util.validation.FiatValidator;
import io.bitsquare.gui.util.validation.InputValidator;
import io.bitsquare.locale.BSResources;
import io.bitsquare.offer.Direction;
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
import io.bitsquare.viewfx.model.ViewModel;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
@ -31,9 +33,6 @@ import org.bitcoinj.utils.Fiat;
import javax.inject.Inject;
import io.bitsquare.viewfx.model.ViewModel;
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.BooleanProperty;
@ -80,7 +79,6 @@ class CreateOfferViewModel extends ActivatableWithDataModel<CreateOfferDataModel
final BooleanProperty showWarningInvalidFiatDecimalPlaces = new SimpleBooleanProperty();
final BooleanProperty showWarningInvalidBtcDecimalPlaces = new SimpleBooleanProperty();
final BooleanProperty showTransactionPublishedScreen = new SimpleBooleanProperty();
final BooleanProperty tabIsClosable = new SimpleBooleanProperty(true);
final ObjectProperty<InputValidator.ValidationResult> amountValidationResult = new SimpleObjectProperty<>();
final ObjectProperty<InputValidator.ValidationResult> minAmountValidationResult = new
@ -295,7 +293,6 @@ class CreateOfferViewModel extends ActivatableWithDataModel<CreateOfferDataModel
dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> {
if (newValue) {
updateButtonDisableState();
tabIsClosable.set(false);
}
});

View File

@ -33,15 +33,14 @@ import io.bitsquare.gui.util.validation.OptionalFiatValidator;
import io.bitsquare.locale.BSResources;
import io.bitsquare.offer.Direction;
import io.bitsquare.offer.Offer;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import io.bitsquare.viewfx.view.FxmlView;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import io.bitsquare.viewfx.view.FxmlView;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ChangeListener;
@ -222,7 +221,7 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
if (model.isRegistered()) {
if (offer.getDirection() == Direction.BUY) {
// reset available state
if (offer.getState() != Offer.State.OFFER_REMOVED)
if (offer.getState() != Offer.State.REMOVED)
offer.setState(Offer.State.UNKNOWN);
offerActionHandler.takeOffer(model.getAmountAsCoin(), model.getPriceAsCoin(), offer);
@ -524,11 +523,13 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
case UNKNOWN:
iconView.setId("image-offer_state_unknown");
break;
case OFFER_AVAILABLE:
case AVAILABLE:
iconView.setId("image-offer_state_available");
break;
case OFFER_NOT_AVAILABLE:
case OFFER_REMOVED:
case OFFERER_OFFLINE:
case NOT_AVAILABLE:
case AVAILABILITY_CHECK_FAILED:
case REMOVED:
iconView.setId("image-offer_state_not_available");
break;
}

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.portfolio.PortfolioView;
import io.bitsquare.gui.main.portfolio.pending.PendingTradesView;
import io.bitsquare.gui.main.trade.TradeView;
import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.locale.BSResources;
import io.bitsquare.offer.Direction;
import io.bitsquare.offer.Offer;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import io.bitsquare.viewfx.view.FxmlView;
import org.bitcoinj.core.Coin;
@ -43,10 +46,7 @@ import java.util.List;
import javax.inject.Inject;
import io.bitsquare.viewfx.view.FxmlView;
import io.bitsquare.viewfx.view.ActivatableViewAndModel;
import javafx.beans.property.BooleanProperty;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
@ -96,6 +96,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
private final Navigation navigation;
private final OverlayManager overlayManager;
private ChangeListener<Offer.State> offerIsAvailableChangeListener;
private TradeView.CloseHandler closeHandler;
@Inject
private TakeOfferView(TakeOfferViewModel model, Navigation navigation,
@ -152,27 +153,39 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
handleOfferIsAvailableState(model.offerIsAvailable.get());
}
private void handleOfferIsAvailableState(Offer.State state) {
if (state == Offer.State.OFFER_AVAILABLE) {
isOfferAvailableLabel.setVisible(false);
isOfferAvailableLabel.setManaged(false);
isOfferAvailableProgressIndicator.setProgress(0);
isOfferAvailableProgressIndicator.setVisible(false);
isOfferAvailableProgressIndicator.setManaged(false);
showPaymentInfoScreenButton.setVisible(true);
}
else if ((state == Offer.State.OFFER_NOT_AVAILABLE)) {
Popups.openWarningPopup("You cannot take that offer", "The offerer is either offline or the offer was already taken by another trader.");
close();
}
else if ((state == Offer.State.OFFER_REMOVED)) {
Popups.openWarningPopup("You cannot take that offer", "The offerer has been removed in the meantime.");
close();
}
public void setCloseHandler(TradeView.CloseHandler closeHandler) {
this.closeHandler = closeHandler;
}
public void configCloseHandlers(BooleanProperty tabIsClosable) {
tabIsClosable.bind(model.tabIsClosable);
private void handleOfferIsAvailableState(Offer.State state) {
switch (state) {
case UNKNOWN:
break;
case AVAILABLE:
isOfferAvailableLabel.setVisible(false);
isOfferAvailableLabel.setManaged(false);
isOfferAvailableProgressIndicator.setProgress(0);
isOfferAvailableProgressIndicator.setVisible(false);
isOfferAvailableProgressIndicator.setManaged(false);
showPaymentInfoScreenButton.setVisible(true);
break;
case OFFERER_OFFLINE:
Popups.openWarningPopup("You cannot take that offer", "The offerer is offline.");
Platform.runLater(this::close);
break;
case NOT_AVAILABLE:
Popups.openWarningPopup("You cannot take that offer", "The offer was already taken by another trader.");
Platform.runLater(this::close);
break;
case AVAILABILITY_CHECK_FAILED:
Popups.openWarningPopup("You cannot take that offer", "The check for the offer availability failed.");
Platform.runLater(this::close);
break;
case REMOVED:
Popups.openWarningPopup("You cannot take that offer", "The offerer has been removed in the meantime.");
Platform.runLater(this::close);
break;
}
}
@FXML
@ -261,12 +274,8 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
}
private void close() {
TabPane tabPane = ((TabPane) (root.getParent().getParent()));
// Might fix #315 Offerbook tab gets closed
//tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedItem());
if (tabPane != null && tabPane.getTabs() != null && tabPane.getTabs().size() > 1)
tabPane.getTabs().remove(1);
if (closeHandler != null)
closeHandler.close();
}
private void setupListeners() {

View File

@ -24,15 +24,14 @@ import io.bitsquare.gui.util.validation.InputValidator;
import io.bitsquare.locale.BSResources;
import io.bitsquare.offer.Direction;
import io.bitsquare.offer.Offer;
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
import io.bitsquare.viewfx.model.ViewModel;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Coin;
import javax.inject.Inject;
import io.bitsquare.viewfx.model.ViewModel;
import io.bitsquare.viewfx.model.ActivatableWithDataModel;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
@ -81,7 +80,6 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
final BooleanProperty isTakeOfferSpinnerVisible = new SimpleBooleanProperty(false);
final BooleanProperty showWarningInvalidBtcDecimalPlaces = new SimpleBooleanProperty();
final BooleanProperty showTransactionPublishedScreen = new SimpleBooleanProperty();
final BooleanProperty tabIsClosable = new SimpleBooleanProperty(true);
final ObjectProperty<Offer.State> offerIsAvailable = new SimpleObjectProperty<>(Offer.State.UNKNOWN);
final ObjectProperty<InputValidator.ValidationResult> amountValidationResult = new SimpleObjectProperty<>();
@ -272,7 +270,6 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> {
if (newValue) {
updateButtonDisableState();
tabIsClosable.set(false);
}
});

View File

@ -48,9 +48,11 @@ public class Offer implements Serializable {
public enum State {
UNKNOWN,
OFFER_AVAILABLE,
OFFER_NOT_AVAILABLE,
OFFER_REMOVED
AVAILABLE,
OFFERER_OFFLINE,
NOT_AVAILABLE,
AVAILABILITY_CHECK_FAILED,
REMOVED
}
// key attributes for lookup

View File

@ -91,7 +91,7 @@ public class OfferBook {
@Override
public void onOfferRemoved(Offer offer) {
// Update state in case that that offer is used in the take offer screen, so it gets updated correctly
offer.setState(Offer.State.OFFER_REMOVED);
offer.setState(Offer.State.REMOVED);
// clean up possible references in tradeManager
tradeManager.onOfferRemovedFromRemoteOfferBook(offer);

View File

@ -29,8 +29,8 @@ import io.bitsquare.offer.Offer;
import io.bitsquare.offer.OfferBookService;
import io.bitsquare.offer.OpenOffer;
import io.bitsquare.persistence.Persistence;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.handlers.TransactionResultHandler;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol;
@ -119,7 +119,7 @@ public class TradeManager {
closedTrades.putAll((Map<String, Trade>) closedTradesObject);
}
messageHandler = this::handleMessage;
tradeMessageService.addMessageHandler(messageHandler);
}
@ -183,7 +183,9 @@ public class TradeManager {
createOffererAsBuyerProtocol(openOffer);
resultHandler.handleResult(transaction);
},
(message, throwable) -> errorMessageHandler.handleErrorMessage(message)
(message) -> {
errorMessageHandler.handleErrorMessage(message);
}
);
placeOfferProtocol.placeOffer();
@ -278,6 +280,7 @@ public class TradeManager {
tradeMessageService.sendMessage(sender, reportOfferAvailabilityMessage, new SendMessageListener() {
@Override
public void handleResult() {
// Offerer does not do anything at that moment. Peer might only watch the offer and does nto start a trade.
log.trace("ReportOfferAvailabilityMessage successfully arrived at peer");
}

View File

@ -21,7 +21,7 @@ import io.bitsquare.network.Message;
import io.bitsquare.network.MessageBroker;
import io.bitsquare.network.Peer;
import io.bitsquare.trade.listeners.GetPeerAddressListener;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.listeners.SendMessageListener;
import java.security.PublicKey;

View File

@ -15,7 +15,7 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.trade.listeners;
package io.bitsquare.trade.handlers;
import io.bitsquare.network.Message;
import io.bitsquare.network.Peer;

View File

@ -22,7 +22,7 @@ import io.bitsquare.offer.Offer;
import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.OfferMessage;
import io.bitsquare.util.handlers.ResultHandler;
import io.bitsquare.util.tasks.SharedModel;
import io.bitsquare.util.taskrunner.SharedModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@ -20,19 +20,18 @@ package io.bitsquare.trade.protocol.availability;
import io.bitsquare.network.Message;
import io.bitsquare.network.Peer;
import io.bitsquare.offer.Offer;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage;
import io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress;
import io.bitsquare.trade.protocol.availability.tasks.ProcessReportOfferAvailabilityMessage;
import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.TaskRunner;
import javafx.application.Platform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static io.bitsquare.util.Validator.nonEmptyStringOf;
public class CheckOfferAvailabilityProtocol {
private static final Logger log = LoggerFactory.getLogger(CheckOfferAvailabilityProtocol.class);
@ -53,7 +52,7 @@ public class CheckOfferAvailabilityProtocol {
}
public void cleanup() {
// cannot remove listener in same execution cycle, so we delay it
// Cannot remove listener in same execution cycle, so we delay it
Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
}
@ -69,8 +68,8 @@ public class CheckOfferAvailabilityProtocol {
() -> {
log.debug("sequence at onCheckOfferAvailability completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -83,26 +82,34 @@ public class CheckOfferAvailabilityProtocol {
public void cancel() {
isCanceled = true;
sequence.cancel();
model.getOffer().setState(Offer.State.UNKNOWN);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Incoming message handling
///////////////////////////////////////////////////////////////////////////////////////////
private void handleMessage(Message message, Peer sender) {
if (!isCanceled) {
if (message instanceof ReportOfferAvailabilityMessage) {
ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = (ReportOfferAvailabilityMessage) message;
nonEmptyStringOf(reportOfferAvailabilityMessage.getOfferId());
if (model.getOffer().getState() != Offer.State.OFFER_REMOVED) {
if (reportOfferAvailabilityMessage.isOfferOpen())
model.getOffer().setState(Offer.State.OFFER_AVAILABLE);
else
model.getOffer().setState(Offer.State.OFFER_NOT_AVAILABLE);
}
}
model.getResultHandler().handleResult();
if (message instanceof ReportOfferAvailabilityMessage)
handleReportOfferAvailabilityMessage((ReportOfferAvailabilityMessage) message);
}
}
private void handleReportOfferAvailabilityMessage(ReportOfferAvailabilityMessage message) {
model.setMessage(message);
sequence = new TaskRunner<>(model,
() -> {
log.debug("sequence at handleReportOfferAvailabilityMessage completed");
model.getResultHandler().handleResult();
},
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(ProcessReportOfferAvailabilityMessage.class);
sequence.run();
}
}

View File

@ -18,10 +18,11 @@
package io.bitsquare.trade.protocol.availability.tasks;
import io.bitsquare.network.Peer;
import io.bitsquare.offer.Offer;
import io.bitsquare.trade.listeners.GetPeerAddressListener;
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -31,25 +32,31 @@ public class GetPeerAddress extends Task<CheckOfferAvailabilityModel> {
public GetPeerAddress(TaskRunner taskHandler, CheckOfferAvailabilityModel model) {
super(taskHandler, model);
errorMessage = "DHT lookup for peer address failed. Maybe the offerer was offline for too long time.";
}
@Override
protected void run() {
protected void doRun() {
model.getTradeMessageService().getPeerAddress(model.getOffer().getMessagePublicKey(), new GetPeerAddressListener() {
@Override
public void onResult(Peer peer) {
log.trace("Found peer: " + peer.toString());
model.setPeer(peer);
complete();
}
@Override
public void onFailed() {
failed("DHT lookup for peer address failed.");
failed();
}
});
}
@Override
protected void applyErrorState() {
model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
}
}

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;
import io.bitsquare.offer.Offer;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel;
import io.bitsquare.trade.protocol.availability.messages.RequestIsOfferAvailableMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,20 +35,25 @@ public class RequestIsOfferAvailable extends Task<CheckOfferAvailabilityModel> {
}
@Override
protected void run() {
protected void doRun() {
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestIsOfferAvailableMessage(model.getOffer().getId()),
new SendMessageListener() {
@Override
public void handleResult() {
log.trace("RequestIsOfferAvailableMessage successfully arrived at peer");
complete();
}
@Override
public void handleFault() {
failed("Sending RequestIsOfferAvailableMessage failed.");
model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
failed();
}
});
}
@Override
protected void applyErrorState() {
model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
}
}

View File

@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.placeoffer;
import io.bitsquare.btc.WalletService;
import io.bitsquare.offer.Offer;
import io.bitsquare.offer.OfferBookService;
import io.bitsquare.util.tasks.SharedModel;
import io.bitsquare.util.taskrunner.SharedModel;
import org.bitcoinj.core.Transaction;

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.CreateOfferFeeTx;
import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer;
import io.bitsquare.util.handlers.FaultHandler;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.handlers.ErrorMessageHandler;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -33,7 +33,7 @@ public class PlaceOfferProtocol {
private final PlaceOfferModel model;
private TransactionResultHandler resultHandler;
private FaultHandler faultHandle;
private ErrorMessageHandler errorMessageHandler;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@ -41,10 +41,10 @@ public class PlaceOfferProtocol {
public PlaceOfferProtocol(PlaceOfferModel model,
TransactionResultHandler resultHandler,
FaultHandler faultHandle) {
ErrorMessageHandler errorMessageHandler) {
this.model = model;
this.resultHandler = resultHandler;
this.faultHandle = faultHandle;
this.errorMessageHandler = errorMessageHandler;
}
@ -58,16 +58,16 @@ public class PlaceOfferProtocol {
log.debug("sequence at handleRequestTakeOfferMessage completed");
resultHandler.handleResult(model.getTransaction());
},
(message, throwable) -> {
log.error(message);
faultHandle.handleFault(message, throwable);
(errorMessage) -> {
log.error(errorMessage);
errorMessageHandler.handleErrorMessage(errorMessage);
}
);
sequence.addTasks(
ValidateOffer.class,
CreateOfferFeeTx.class,
BroadcastCreateOfferFeeTx.class,
AddOfferToRemoteOfferBook.class
AddOfferToRemoteOfferBook.class,
BroadcastCreateOfferFeeTx.class
);
sequence.run();

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -29,16 +29,17 @@ public class AddOfferToRemoteOfferBook extends Task<PlaceOfferModel> {
public AddOfferToRemoteOfferBook(TaskRunner taskHandler, PlaceOfferModel model) {
super(taskHandler, model);
appendToErrorMessage("Could not add offer to offerbook. Maybe you have connection problems. Please try later again.");
}
@Override
protected void run() {
protected void doRun() {
model.getOfferBookService().addOffer(model.getOffer(),
() -> {
complete();
},
(message, throwable) -> {
failed(message, throwable);
failed(throwable);
});
}
}

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
@ -33,33 +33,55 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
public BroadcastCreateOfferFeeTx(TaskRunner taskHandler, PlaceOfferModel model) {
super(taskHandler, model);
appendToErrorMessage("Broadcast of offer fee payment failed because transaction = null.");
appendToErrorMessage("Maybe you have connection problems. Please try later again.");
}
@Override
protected void run() {
try {
model.getWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() {
@Override
public void onSuccess(Transaction transaction) {
log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString());
if (transaction != null) {
// need to write data before storage, otherwise hash is different when removing offer from DHT!
model.getOffer().setOfferFeePaymentTxID(model.getTransaction().getHashAsString());
protected void doRun() {
model.getWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() {
@Override
public void onSuccess(Transaction transaction) {
log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString());
if (transaction != null) {
if (model.getTransaction().getHashAsString() == transaction.getHashAsString()) {
// No tx malleability happened after broadcast (still not in blockchain)
complete();
}
else {
failed("Broadcast of offer fee payment failed because transaction = null.");
log.warn("Tx malleability happened after broadcast. We publish the changed offer to the DHT again.");
// Tx malleability happened after broadcast. We publish the changed offer to the DHT again.
model.getOfferBookService().removeOffer(model.getOffer(),
() -> {
log.info("We store now the changed txID to the offer and add that again.");
// We store now the changed txID to the offer and add that again.
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString());
model.getOfferBookService().addOffer(model.getOffer(),
() -> {
complete();
},
(message, throwable) -> {
log.error("addOffer failed");
failed(throwable);
});
},
(message, throwable) -> {
log.error("removeOffer failed");
failed(throwable);
});
}
}
@Override
public void onFailure(Throwable t) {
failed(t);
else {
failed("Fault reason: Transaction = null.");
}
});
} catch (Throwable t) {
failed(t);
}
}
@Override
public void onFailure(Throwable t) {
failed(t);
}
});
}
}

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
@ -34,10 +34,12 @@ public class CreateOfferFeeTx extends Task<PlaceOfferModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
Transaction transaction = model.getWalletService().createOfferFeeTx(model.getOffer().getId());
// We assume there will be no tx malleability. We add a check later in case the published offer has a different hash.
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString());
model.setTransaction(transaction);
complete();

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,7 +32,7 @@ public class ValidateOffer extends Task<PlaceOfferModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
model.getOffer().validate();

View File

@ -24,7 +24,7 @@ import io.bitsquare.crypto.SignatureService;
import io.bitsquare.offer.Offer;
import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.user.User;
import io.bitsquare.util.tasks.SharedModel;
import io.bitsquare.util.taskrunner.SharedModel;
import org.bitcoinj.core.ECKey;

View File

@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.offerer;
import io.bitsquare.network.Message;
import io.bitsquare.network.Peer;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateDepositTx;
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage;
@ -71,8 +71,6 @@ public class BuyerAsOffererProtocol {
public void cleanup() {
model.getTradeMessageService().removeMessageHandler(messageHandler);
// cannot remove listener in same execution cycle, so we delay it
//Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
}
@ -113,8 +111,8 @@ public class BuyerAsOffererProtocol {
() -> {
log.debug("sequence at handleRequestTakeOfferMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -131,8 +129,8 @@ public class BuyerAsOffererProtocol {
() -> {
log.debug("sequence at handleTakeOfferFeePayedMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -150,8 +148,8 @@ public class BuyerAsOffererProtocol {
() -> {
log.debug("sequence at handleRequestOffererPublishDepositTxMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -176,8 +174,8 @@ public class BuyerAsOffererProtocol {
() -> {
log.debug("sequence at handleBankTransferStartedUIEvent completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -200,8 +198,8 @@ public class BuyerAsOffererProtocol {
() -> {
log.debug("sequence at handlePayoutTxPublishedMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(ProcessPayoutTxPublishedMessage.class);

View File

@ -17,12 +17,9 @@
package io.bitsquare.trade.protocol.trade.offerer;
import io.bitsquare.trade.Trade;
import io.bitsquare.util.handlers.FaultHandler;
import io.bitsquare.util.handlers.ErrorMessageHandler;
import io.bitsquare.util.handlers.ResultHandler;
import io.bitsquare.util.tasks.TaskRunner;
import org.jetbrains.annotations.NotNull;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -30,13 +27,13 @@ import org.slf4j.LoggerFactory;
public class BuyerAsOffererTaskRunner<T extends BuyerAsOffererModel> extends TaskRunner<BuyerAsOffererModel> {
private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererTaskRunner.class);
public BuyerAsOffererTaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
super(sharedModel, resultHandler, faultHandler);
public BuyerAsOffererTaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
super(sharedModel, resultHandler, errorMessageHandler);
}
@Override
/* @Override
public void handleFault(String message, @NotNull Throwable throwable) {
sharedModel.getTrade().setState(Trade.State.FAILED);
super.handleFault(message, throwable);
}
}*/
}

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.btc.FeePolicy;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.InsufficientMoneyException;
@ -38,7 +38,7 @@ public class CreateDepositTx extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
String offererPubKey = model.getWalletService().getAddressInfoByTradeID(model.getTrade().getId()).getPubKeyAsHexString();
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE);

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.Utils;
@ -39,7 +39,7 @@ public class ProcessPayoutTxPublishedMessage extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
String payoutTxAsHex = nonEmptyStringOf(((PayoutTxPublishedMessage) model.getTradeMessage()).getPayoutTxAsHex());

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.taker.messages.RequestOffererPublishDepositTxMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -36,7 +36,7 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<BuyerAsOf
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class ProcessRequestTakeOfferMessage extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getOffer().getId(), model.getTradeMessage());

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -36,7 +36,7 @@ public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());

View File

@ -22,8 +22,8 @@ import io.bitsquare.trade.Trade;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.RespondToTakeOfferRequestMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -36,7 +36,7 @@ public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
boolean takeOfferRequestAccepted = model.getOpenOffer().getState() == OpenOffer.State.OPEN;
if (!takeOfferRequestAccepted)
log.info("Received take offer request but the offer not marked as open anymore.");

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class SendBankTransferInitedMessage extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
BankTransferStartedMessage tradeMessage = new BankTransferStartedMessage(
model.getTrade().getId(),
model.getDepositTxAsHex(),

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Utils;
@ -36,7 +36,7 @@ public class SendDepositTxIdToTaker extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.getTrade().getId(),
Utils.HEX.encode(model.getTrade().getDepositTx().bitcoinSerialize()));

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class SendTakerDepositPaymentRequest extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
TakerDepositPaymentRequestMessage tradeMessage = new TakerDepositPaymentRequestMessage(
model.getTrade().getId(),
model.getBankAccount(),

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionConfidence;
@ -37,7 +37,7 @@ public class SetupListenerForBlockChainConfirmation extends Task<BuyerAsOffererM
}
@Override
protected void run() {
protected void doRun() {
TransactionConfidence confidence = model.getTrade().getDepositTx().getConfidence();
confidence.addEventListener(new TransactionConfidence.Listener() {
@Override

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
@ -39,7 +39,7 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
model.getWalletService().offererSignAndPublishTx(model.getPreparedOffererDepositTxAsHex(),
model.getSignedTakerDepositTxAsHex(),

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey;
@ -38,7 +38,7 @@ public class SignPayoutTx extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
Trade trade = model.getTrade();
Coin securityDeposit = trade.getSecurityDeposit();

View File

@ -21,8 +21,8 @@ import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.Utilities;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,7 +35,7 @@ public class VerifyAndSignContract extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
Trade trade = model.getTrade();
Contract contract = new Contract(

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,7 +32,7 @@ public class VerifyTakeOfferFeePayment extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
//TODO mocked yet, need a confidence listeners
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTakeOfferFeeTxId());
/* if (numOfPeersSeenTx > 2) {

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,7 +32,7 @@ public class VerifyTakerAccount extends Task<BuyerAsOffererModel> {
}
@Override
protected void run() {
protected void doRun() {
//TODO mocked yet
if (model.getBlockChainService().verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) {

View File

@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.trade.taker;
import io.bitsquare.network.Message;
import io.bitsquare.network.Peer;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage;
@ -75,8 +75,8 @@ public class SellerAsTakerProtocol {
() -> {
log.debug("sequence at handleRequestTakeOfferUIEvent completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -88,8 +88,6 @@ public class SellerAsTakerProtocol {
public void cleanup() {
model.getTradeMessageService().removeMessageHandler(messageHandler);
// cannot remove listener in same execution cycle, so we delay it
// Platform.runLater(() -> model.getTradeMessageService().removeMessageHandler(messageHandler));
}
@ -128,8 +126,8 @@ public class SellerAsTakerProtocol {
() -> {
log.debug("sequence at handleRespondToTakeOfferRequestMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -147,8 +145,8 @@ public class SellerAsTakerProtocol {
() -> {
log.debug("sequence at handleTakerDepositPaymentRequestMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -168,8 +166,8 @@ public class SellerAsTakerProtocol {
() -> {
log.debug("sequence at handleDepositTxPublishedMessage completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(
@ -187,8 +185,8 @@ public class SellerAsTakerProtocol {
log.debug("sequence at handleBankTransferInitedMessage completed");
model.getTrade().setState(Trade.State.FIAT_PAYMENT_STARTED);
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(ProcessBankTransferInitedMessage.class);
@ -205,8 +203,8 @@ public class SellerAsTakerProtocol {
() -> {
log.debug("sequence at handleFiatReceivedUIEvent completed");
},
(message, throwable) -> {
log.error(message);
(errorMessage) -> {
log.error(errorMessage);
}
);
sequence.addTasks(

View File

@ -17,12 +17,9 @@
package io.bitsquare.trade.protocol.trade.taker;
import io.bitsquare.trade.Trade;
import io.bitsquare.util.handlers.FaultHandler;
import io.bitsquare.util.handlers.ErrorMessageHandler;
import io.bitsquare.util.handlers.ResultHandler;
import io.bitsquare.util.tasks.TaskRunner;
import org.jetbrains.annotations.NotNull;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -30,13 +27,13 @@ import org.slf4j.LoggerFactory;
public class SellerAsTakerTaskRunner<T extends SellerAsTakerModel> extends TaskRunner<SellerAsTakerModel> {
private static final Logger log = LoggerFactory.getLogger(SellerAsTakerTaskRunner.class);
public SellerAsTakerTaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
super(sharedModel, resultHandler, faultHandler);
public SellerAsTakerTaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
super(sharedModel, resultHandler, errorMessageHandler);
}
@Override
public void handleFault(String message, @NotNull Throwable throwable) {
/* @Override
public void handleErrorMessage(String errorMessage) {
sharedModel.getTrade().setState(Trade.State.FAILED);
super.handleFault(message, throwable);
}
super.handleErrorMessage(errorMessage);
}*/
}

View File

@ -21,8 +21,8 @@ import io.bitsquare.trade.Contract;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.Utilities;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,7 +35,7 @@ public class CreateAndSignContract extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
Trade trade = model.getTrade();
Contract contract = new Contract(
model.getOffer(),

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.network.Peer;
import io.bitsquare.trade.listeners.GetPeerAddressListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class GetPeerAddress extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
model.getTradeMessageService().getPeerAddress(model.getOffererMessagePublicKey(), new GetPeerAddressListener() {
@Override
public void onResult(Peer peer) {

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.InsufficientMoneyException;
@ -36,7 +36,7 @@ public class PayDeposit extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
Coin amountToPay = model.getTradeAmount().add(model.getSecurityDeposit());
Coin msOutputAmount = amountToPay.add(model.getSecurityDeposit());

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.Transaction;
@ -39,7 +39,7 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
model.getWalletService().payTakeOfferFee(model.getTrade().getId(), new FutureCallback<Transaction>() {
@Override
@ -51,11 +51,11 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
@Override
public void onFailure(@NotNull Throwable t) {
failed("Pay take offer fee caused an exception: ", t);
failed(t);
}
});
} catch (InsufficientMoneyException e) {
failed("Pay take offer fee caused an exception: ", e);
failed(e);
}
}
}

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.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,7 +35,7 @@ public class ProcessBankTransferInitedMessage extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
BankTransferStartedMessage message = (BankTransferStartedMessage) model.getTradeMessage();

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.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,7 +35,7 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
@ -44,7 +44,7 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
complete();
} catch (Throwable t) {
failed("Validation for DepositTxPublishedMessage failed.", t);
failed(t);
}
}
}

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.messages.RespondToTakeOfferRequestMessage;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -36,7 +36,7 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
@ -49,7 +49,7 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
failed("Requested offer rejected because it is not available anymore.");
}
} catch (Throwable t) {
failed("Validation for RespondToTakeOfferRequestMessage failed.", t);
failed( t);
}
}
}

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.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -36,7 +36,7 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
}
@Override
protected void run() {
protected void doRun() {
try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage());
TakerDepositPaymentRequestMessage message = (TakerDepositPaymentRequestMessage) model.getTradeMessage();
@ -48,7 +48,7 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
complete();
} catch (Throwable t) {
failed("Validation for TakerDepositPaymentRequestMessage failed.", t);
failed(t);
}
}
}

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class RequestTakeOffer extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestTakeOfferMessage(model.getTrade().getId()),
new SendMessageListener() {
@Override

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class SendPayoutTxToOfferer extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.getTrade().getId(), model.getPayoutTxAsHex());
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() {
@Override

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.Utils;
@ -37,7 +37,7 @@ public class SendSignedTakerDepositTxAsHex extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
Transaction signedTakerDepositTx = model.getSignedTakerDepositTx();
long takerTxOutIndex = model.getSignedTakerDepositTx().getInput(1).getOutpoint().getIndex();

View File

@ -20,8 +20,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class SendTakeOfferFeePayedMessage extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage(
model.getTrade().getId(),
model.getTrade().getTakeOfferFeeTxId(),

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.AddressFormatException;
import org.bitcoinj.core.Transaction;
@ -41,7 +41,7 @@ public class SignAndPublishPayoutTx extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
try {
model.getWalletService().takerSignsAndSendsTx(model.getDepositTxAsHex(),
model.getOffererSignatureR(),

View File

@ -19,8 +19,8 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Transaction;
@ -35,7 +35,7 @@ public class TakerCommitDepositTx extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
Transaction transaction = model.getWalletService().takerCommitDepositTx(model.getDepositTxAsHex());
model.getTrade().setDepositTx(transaction);

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,7 +32,7 @@ public class VerifyOfferFeePayment extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
//TODO impl. missing
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTrade().getTakeOfferFeeTxId());
/* if (numOfPeersSeenTx > 2) {

View File

@ -18,8 +18,8 @@
package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.tasks.Task;
import io.bitsquare.util.tasks.TaskRunner;
import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -32,7 +32,7 @@ public class VerifyOffererAccount extends Task<SellerAsTakerModel> {
}
@Override
protected void run() {
protected void doRun() {
if (model.getBlockChainService().verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) {
failed("Taker is blacklisted.");

View File

@ -23,7 +23,7 @@ import io.bitsquare.network.tomp2p.TomP2PNode;
import io.bitsquare.network.tomp2p.TomP2PPeer;
import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.listeners.GetPeerAddressListener;
import io.bitsquare.trade.listeners.MessageHandler;
import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.user.User;

View File

@ -15,10 +15,15 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.trade.listeners;
package io.bitsquare.util.taskrunner;
import net.tomp2p.peers.PeerAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public interface TakeOfferRequestListener {
void onTakeOfferRequested(String offerId, PeerAddress sender);
public class InterceptTaskException extends RuntimeException{
private static final Logger log = LoggerFactory.getLogger(InterceptTaskException.class);
public InterceptTaskException(String message) {
super(message);
}
}

View File

@ -15,7 +15,7 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.util.tasks;
package io.bitsquare.util.taskrunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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/>.
*/
package io.bitsquare.util.tasks;
package io.bitsquare.util.taskrunner;
import io.bitsquare.util.handlers.FaultHandler;
import io.bitsquare.util.handlers.ErrorMessageHandler;
import io.bitsquare.util.handlers.ResultHandler;
import java.util.Arrays;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,37 +33,36 @@ public class TaskRunner<T extends SharedModel> {
private final Queue<Class> tasks = new LinkedBlockingQueue<>();
protected final T sharedModel;
private final ResultHandler resultHandler;
private final FaultHandler faultHandler;
private final ErrorMessageHandler errorMessageHandler;
private boolean failed = false;
private boolean isCanceled;
private Class<? extends Task> currentTask;
public TaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) {
public TaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
this.sharedModel = sharedModel;
this.resultHandler = resultHandler;
this.faultHandler = faultHandler;
this.errorMessageHandler = errorMessageHandler;
}
public void addTasks(Class<? extends Task>... items) {
tasks.addAll(Arrays.asList(items));
}
public void run() {
next();
}
protected void next() {
if (!failed && !isCanceled) {
if (tasks.size() > 0) {
try {
currentTask = tasks.poll();
interceptBeforeRun(currentTask);
log.trace("Run task: " + currentTask.getSimpleName());
currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run();
interceptAfterRun(currentTask);
} catch (Throwable t) {
t.printStackTrace();
faultHandler.handleFault(t.getMessage(), t);
} catch (Throwable throwable) {
throwable.printStackTrace();
handleErrorMessage("Error at taskRunner: " + throwable.getMessage());
}
}
else {
@ -74,44 +71,19 @@ public class TaskRunner<T extends SharedModel> {
}
}
protected void interceptBeforeRun(Class<? extends Task> task) {
if (task == TaskInterception.taskToInterceptBeforeRun)
throw new RuntimeException("Task intercepted before run executed: task = " + task.getSimpleName());
}
protected void interceptAfterRun(Class<? extends Task> task) {
if (task == TaskInterception.taskToInterceptAfterRun)
throw new RuntimeException("Task intercepted after run executed: task = " + task.getSimpleName());
}
public void cancel() {
isCanceled = true;
}
public void addTask(Class<? extends Task> task) {
tasks.add(task);
}
public void addTasks(Class<? extends Task>... items) {
tasks.addAll(Arrays.asList(items));
}
public void complete() {
void handleComplete() {
log.trace("Task completed: " + currentTask.getSimpleName());
next();
}
public void handleFault(String message) {
handleFault(message, new Exception(message));
}
public void handleFault(String message, @NotNull Throwable throwable) {
void handleErrorMessage(String errorMessage) {
log.error("Task failed: " + currentTask.getSimpleName());
log.debug(throwable.getMessage());
log.error("errorMessage: " + errorMessage);
failed = true;
faultHandler.handleFault(message, throwable);
errorMessageHandler.handleErrorMessage(errorMessage);
}
}

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