From bb14db3b8df3f5aa5997952f6e81bee156b2cf48 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 13 Mar 2015 12:39:22 +0100 Subject: [PATCH] Add task interception UI --- .../io/bitsquare/app/gui/BitsquareApp.java | 31 ++- .../java/io/bitsquare/btc/Restrictions.java | 2 + .../java/io/bitsquare/gui/main/MainView.java | 3 +- .../bitsquare/gui/main/debug/DebugView.fxml | 82 ++++++++ .../bitsquare/gui/main/debug/DebugView.java | 188 ++++++++++++++++++ .../tomp2p/BootstrappedPeerBuilder.java | 4 +- .../main/java/io/bitsquare/offer/Offer.java | 22 +- .../java/io/bitsquare/trade/TradeManager.java | 8 +- .../CheckOfferAvailabilityModel.java | 2 +- .../CheckOfferAvailabilityProtocol.java | 8 +- .../ReportOfferAvailabilityMessage.java | 2 +- .../RequestIsOfferAvailableMessage.java | 2 +- .../tasks/GetPeerAddress.java | 4 +- .../tasks/RequestIsOfferAvailable.java | 6 +- .../placeoffer/PlaceOfferProtocol.java | 5 +- ...er.java => AddOfferToRemoteOfferBook.java} | 9 +- .../tasks/BroadcastCreateOfferFeeTx.java | 11 +- .../placeoffer/tasks/CreateOfferFeeTx.java | 1 + .../placeoffer/tasks/ValidateOffer.java | 2 +- .../util/tasks/TaskInterception.java | 27 +++ .../io/bitsquare/util/tasks/TaskRunner.java | 34 ++-- 21 files changed, 392 insertions(+), 61 deletions(-) create mode 100644 gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.fxml create mode 100644 gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.java rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/CheckOfferAvailabilityModel.java (97%) rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/CheckOfferAvailabilityProtocol.java (92%) rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/messages/ReportOfferAvailabilityMessage.java (95%) rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/messages/RequestIsOfferAvailableMessage.java (95%) rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/tasks/GetPeerAddress.java (93%) rename gui/src/main/java/io/bitsquare/trade/protocol/{offer => availability}/tasks/RequestIsOfferAvailable.java (89%) rename gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/{AddOffer.java => AddOfferToRemoteOfferBook.java} (80%) create mode 100644 gui/src/main/java/io/bitsquare/util/tasks/TaskInterception.java diff --git a/gui/src/main/java/io/bitsquare/app/gui/BitsquareApp.java b/gui/src/main/java/io/bitsquare/app/gui/BitsquareApp.java index 027e84f56c..c207ea072c 100644 --- a/gui/src/main/java/io/bitsquare/app/gui/BitsquareApp.java +++ b/gui/src/main/java/io/bitsquare/app/gui/BitsquareApp.java @@ -21,6 +21,7 @@ import io.bitsquare.account.AccountSettings; import io.bitsquare.gui.SystemTray; import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.main.MainView; +import io.bitsquare.gui.main.debug.DebugView; import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.persistence.Persistence; import io.bitsquare.user.User; @@ -42,7 +43,9 @@ import javafx.application.Application; import javafx.scene.*; import javafx.scene.image.*; import javafx.scene.input.*; +import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.StageStyle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +61,8 @@ public class BitsquareApp extends Application { private BitsquareAppModule bitsquareAppModule; private Injector injector; + private Stage primaryStage; + private Scene scene; public static void setEnvironment(Environment env) { BitsquareApp.env = env; @@ -65,6 +70,8 @@ public class BitsquareApp extends Application { @Override public void start(Stage primaryStage) throws IOException { + this.primaryStage = primaryStage; + log.trace("BitsquareApp.start"); bitsquareAppModule = new BitsquareAppModule(env, primaryStage); injector = Guice.createInjector(bitsquareAppModule); @@ -92,10 +99,10 @@ public class BitsquareApp extends Application { // load the main view and create the main scene log.trace("viewLoader.load(MainView.class)"); - ViewLoader viewLoader = injector.getInstance(CachingViewLoader.class); + CachingViewLoader viewLoader = injector.getInstance(CachingViewLoader.class); View view = viewLoader.load(MainView.class); - Scene scene = new Scene((Parent) view.getRoot(), 1000, 600); + scene = new Scene((Parent) view.getRoot(), 1000, 600); scene.getStylesheets().setAll( "/io/bitsquare/gui/bitsquare.css", "/io/bitsquare/gui/images.css"); @@ -112,6 +119,8 @@ public class BitsquareApp extends Application { if (new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN).match(keyEvent) || new KeyCodeCombination(KeyCode.Q, KeyCombination.SHORTCUT_DOWN).match(keyEvent)) stop(); + else if (new KeyCodeCombination(KeyCode.D, KeyCombination.SHORTCUT_DOWN).match(keyEvent)) + showDebugWindow(); }); @@ -139,6 +148,24 @@ public class BitsquareApp extends Application { log.trace("primaryStage.show"); primaryStage.show(); + + //TODO just temp. + showDebugWindow(); + } + + private void showDebugWindow() { + ViewLoader viewLoader = injector.getInstance(ViewLoader.class); + View debugView = viewLoader.load(DebugView.class); + Parent parent = (Parent) debugView.getRoot(); + Stage stage = new Stage(); + stage.setScene(new Scene(parent)); + stage.setTitle("Debug window"); + stage.initModality(Modality.NONE); + stage.initStyle(StageStyle.UTILITY); + stage.initOwner(scene.getWindow()); + stage.setX(primaryStage.getX() + primaryStage.getWidth() + 10); + stage.setY(primaryStage.getY()); + stage.show(); } @Override diff --git a/gui/src/main/java/io/bitsquare/btc/Restrictions.java b/gui/src/main/java/io/bitsquare/btc/Restrictions.java index 85f2c40f02..860bb7a632 100644 --- a/gui/src/main/java/io/bitsquare/btc/Restrictions.java +++ b/gui/src/main/java/io/bitsquare/btc/Restrictions.java @@ -23,6 +23,8 @@ import org.bitcoinj.core.Transaction; // Lets see if we get more restriction otherwise move it to other class public class Restrictions { public static final Coin MIN_TRADE_AMOUNT = Coin.parseCoin("0.0001"); + public static final Coin MAX_TRADE_AMOUNT = Coin.parseCoin("10"); + public static final Coin MIN_SECURITY_DEPOSIT = Coin.parseCoin("0.0001"); public static boolean isMinSpendableAmount(Coin amount) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainView.java b/gui/src/main/java/io/bitsquare/gui/main/MainView.java index 2f316cdbae..5f643ad8df 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainView.java @@ -99,8 +99,7 @@ public class MainView extends InitializableView { Pane portfolioButtonHolder = new Pane(portfolioButton); Pane bankAccountComboBoxHolder = new Pane(); - HBox leftNavPane = new HBox( - homeButton, buyButton, sellButton, portfolioButtonHolder, fundsButton, new Pane(msgButton)) {{ + HBox leftNavPane = new HBox(homeButton, buyButton, sellButton, portfolioButtonHolder, fundsButton, new Pane(msgButton)) {{ setSpacing(10); setLeftAnchor(this, 10d); setTopAnchor(this, 0d); diff --git a/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.fxml b/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.fxml new file mode 100644 index 0000000000..cd58f2c2cf --- /dev/null +++ b/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.fxml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.java b/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.java new file mode 100644 index 0000000000..ab7a3da58f --- /dev/null +++ b/gui/src/main/java/io/bitsquare/gui/main/debug/DebugView.java @@ -0,0 +1,188 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.debug; + +import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol; +import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable; +import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol; +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.trade.protocol.trade.offerer.BuyerAsOffererProtocol; +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.ProcessRequestOffererPublishDepositTxMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestTakeOfferMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessTakeOfferFeePayedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.RespondToTakeOfferRequest; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SendBankTransferInitedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SendDepositTxIdToTaker; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SendTakerDepositPaymentRequest; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SetupListenerForBlockChainConfirmation; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyAndSignContract; +import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakeOfferFeePayment; +import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakerAccount; +import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerProtocol; +import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract; +import io.bitsquare.trade.protocol.trade.taker.tasks.PayDeposit; +import io.bitsquare.trade.protocol.trade.taker.tasks.PayTakeOfferFee; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessBankTransferInitedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRespondToTakeOfferRequestMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessTakerDepositPaymentRequestMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.RequestTakeOffer; +import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer; +import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex; +import io.bitsquare.trade.protocol.trade.taker.tasks.SendTakeOfferFeePayedMessage; +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 java.util.Arrays; + +import javax.inject.Inject; + +import viewfx.view.FxmlView; +import viewfx.view.support.InitializableView; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.*; +import javafx.util.StringConverter; + +@FxmlView +public class DebugView extends InitializableView { + + + @FXML ComboBox taskComboBox; + @FXML CheckBox interceptBeforeCheckBox; + + @Inject + public DebugView() { + } + + @Override + public void initialize() { + interceptBeforeCheckBox.setSelected(true); + + final ObservableList items = FXCollections.observableArrayList(Arrays.asList( + /*---- Protocol ----*/ + CheckOfferAvailabilityProtocol.class, + io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress.class, + RequestIsOfferAvailable.class, + Boolean.class, /* used as seperator*/ + + + /*---- Protocol ----*/ + PlaceOfferProtocol.class, + ValidateOffer.class, + CreateOfferFeeTx.class, + BroadcastCreateOfferFeeTx.class, + AddOfferToRemoteOfferBook.class, + Boolean.class, /* used as seperator*/ + + + /*---- Protocol ----*/ + BuyerAsOffererProtocol.class, + ProcessRequestTakeOfferMessage.class, + RespondToTakeOfferRequest.class, + + ProcessTakeOfferFeePayedMessage.class, + CreateDepositTx.class, + SendTakerDepositPaymentRequest.class, + + ProcessRequestOffererPublishDepositTxMessage.class, + VerifyTakerAccount.class, + VerifyAndSignContract.class, + SignAndPublishDepositTx.class, + SetupListenerForBlockChainConfirmation.class, + SendDepositTxIdToTaker.class, + + SignPayoutTx.class, + VerifyTakeOfferFeePayment.class, + SendBankTransferInitedMessage.class, + + ProcessPayoutTxPublishedMessage.class, + Boolean.class, /* used as seperator*/ + + + /*---- Protocol ----*/ + SellerAsTakerProtocol.class, + io.bitsquare.trade.protocol.trade.taker.tasks.GetPeerAddress.class, + RequestTakeOffer.class, + + ProcessRespondToTakeOfferRequestMessage.class, + PayTakeOfferFee.class, + SendTakeOfferFeePayedMessage.class, + + ProcessTakerDepositPaymentRequestMessage.class, + VerifyOffererAccount.class, + CreateAndSignContract.class, + PayDeposit.class, + SendSignedTakerDepositTxAsHex.class, + + ProcessDepositTxPublishedMessage.class, + TakerCommitDepositTx.class, + + ProcessBankTransferInitedMessage.class, + + SignAndPublishPayoutTx.class, + VerifyOfferFeePayment.class, + SendPayoutTxToOfferer.class + ) + ); + + + taskComboBox.setVisibleRowCount(items.size()); + taskComboBox.setItems(items); + taskComboBox.setConverter(new StringConverter() { + @Override + public String toString(Class item) { + if (item.getSimpleName().contains("Protocol")) + return "--- " + item.getSimpleName() + " ---"; + else if (item.getSimpleName().contains("Boolean")) + return ""; + else + return item.getSimpleName(); + } + + @Override + public Class fromString(String s) { + return null; + } + }); + } + + @FXML + void onSelectTask() { + Class item = taskComboBox.getSelectionModel().getSelectedItem(); + if (!item.getSimpleName().contains("Protocol")) { + if (interceptBeforeCheckBox.isSelected()) + TaskInterception.taskToInterceptBeforeRun = item; + else + TaskInterception.taskToInterceptAfterRun = item; + } + } +} + diff --git a/gui/src/main/java/io/bitsquare/network/tomp2p/BootstrappedPeerBuilder.java b/gui/src/main/java/io/bitsquare/network/tomp2p/BootstrappedPeerBuilder.java index eb7218ce67..bbadf3b16a 100644 --- a/gui/src/main/java/io/bitsquare/network/tomp2p/BootstrappedPeerBuilder.java +++ b/gui/src/main/java/io/bitsquare/network/tomp2p/BootstrappedPeerBuilder.java @@ -207,7 +207,7 @@ public class BootstrappedPeerBuilder { futureRelayNAT.addListener(new BaseFutureListener() { @Override - public void operationComplete(BaseFuture future) throws Exception { + public void operationComplete(BaseFuture futureRelayNAT) throws Exception { if (futureDiscover.isSuccess()) { if (useManualPortForwarding) { setState(BootstrapState.DISCOVERY_MANUAL_PORT_FORWARDING_SUCCEEDED, @@ -228,7 +228,7 @@ public class BootstrappedPeerBuilder { bootstrap(); } else { - if (future.isSuccess()) { + if (futureRelayNAT.isSuccess()) { // relay mode succeeded setState(BootstrapState.RELAY_SUCCEEDED, "Bootstrap using relay was successful."); bootstrap(); diff --git a/gui/src/main/java/io/bitsquare/offer/Offer.java b/gui/src/main/java/io/bitsquare/offer/Offer.java index 5ac81ef9f0..b9c831c0c4 100644 --- a/gui/src/main/java/io/bitsquare/offer/Offer.java +++ b/gui/src/main/java/io/bitsquare/offer/Offer.java @@ -19,6 +19,7 @@ package io.bitsquare.offer; import io.bitsquare.arbitrator.Arbitrator; import io.bitsquare.bank.BankAccountType; +import io.bitsquare.btc.Restrictions; import io.bitsquare.locale.Country; import org.bitcoinj.core.Coin; @@ -38,7 +39,6 @@ import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import static com.google.common.base.Preconditions.*; -import static io.bitsquare.btc.Restrictions.MIN_TRADE_AMOUNT; //TODO flatten down? @@ -226,9 +226,9 @@ public class Offer implements Serializable { } public State getState() { - if(state == null) + if (state == null) setState(State.UNKNOWN); - + return state; } @@ -253,17 +253,15 @@ public class Offer implements Serializable { checkNotNull(getMinAmount(), "MinAmount is null"); checkNotNull(getPrice(), "Price is null"); - checkArgument(getMinAmount().compareTo(MIN_TRADE_AMOUNT) >= 0, "MinAmount is less then " + MIN_TRADE_AMOUNT); - checkArgument(getAmount().compareTo(MIN_TRADE_AMOUNT) >= 0, "Amount is less then " + MIN_TRADE_AMOUNT); + checkArgument(getMinAmount().compareTo(Restrictions.MIN_TRADE_AMOUNT) >= 0, "MinAmount is less then " + Restrictions.MIN_TRADE_AMOUNT.toFriendlyString()); + checkArgument(getAmount().compareTo(Restrictions.MAX_TRADE_AMOUNT) <= 0, "Amount is larger then " + Restrictions.MAX_TRADE_AMOUNT.toFriendlyString()); checkArgument(getAmount().compareTo(getMinAmount()) >= 0, "MinAmount is larger then Amount"); - checkArgument(getSecurityDeposit().isPositive(), "SecurityDeposit is not positive"); - checkArgument(getPrice().isPositive(), "Price is 0 or negative"); - // TODO check balance - // securityDeposit - // Coin totalsToFund - // getAddressInfoByTradeID(offerId) - // TODO when offer is flattened continue here... + checkArgument(getSecurityDeposit().compareTo(Restrictions.MIN_SECURITY_DEPOSIT) >= 0, + "SecurityDeposit is less then " + Restrictions.MIN_SECURITY_DEPOSIT.toFriendlyString()); + + checkArgument(getPrice().isPositive(), "Price is not a positive value"); + // TODO check upper and lower bounds for fiat } @Override diff --git a/gui/src/main/java/io/bitsquare/trade/TradeManager.java b/gui/src/main/java/io/bitsquare/trade/TradeManager.java index d414dfd5cb..a6f14fffd1 100644 --- a/gui/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/gui/src/main/java/io/bitsquare/trade/TradeManager.java @@ -31,10 +31,10 @@ import io.bitsquare.offer.OpenOffer; import io.bitsquare.persistence.Persistence; import io.bitsquare.trade.handlers.TransactionResultHandler; import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.offer.CheckOfferAvailabilityModel; -import io.bitsquare.trade.protocol.offer.CheckOfferAvailabilityProtocol; -import io.bitsquare.trade.protocol.offer.messages.ReportOfferAvailabilityMessage; -import io.bitsquare.trade.protocol.offer.messages.RequestIsOfferAvailableMessage; +import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel; +import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityProtocol; +import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage; +import io.bitsquare.trade.protocol.availability.messages.RequestIsOfferAvailableMessage; import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel; import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol; import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityModel.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityModel.java similarity index 97% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityModel.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityModel.java index dbc19b79fe..38001317f1 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityModel.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityModel.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer; +package io.bitsquare.trade.protocol.availability; import io.bitsquare.network.Peer; import io.bitsquare.offer.Offer; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityProtocol.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityProtocol.java similarity index 92% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityProtocol.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityProtocol.java index 9ea766ba36..dcbe45f4ef 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/CheckOfferAvailabilityProtocol.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/CheckOfferAvailabilityProtocol.java @@ -15,14 +15,14 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer; +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.protocol.offer.messages.ReportOfferAvailabilityMessage; -import io.bitsquare.trade.protocol.offer.tasks.GetPeerAddress; -import io.bitsquare.trade.protocol.offer.tasks.RequestIsOfferAvailable; +import io.bitsquare.trade.protocol.availability.messages.ReportOfferAvailabilityMessage; +import io.bitsquare.trade.protocol.availability.tasks.GetPeerAddress; +import io.bitsquare.trade.protocol.availability.tasks.RequestIsOfferAvailable; import io.bitsquare.util.tasks.TaskRunner; import org.slf4j.Logger; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/ReportOfferAvailabilityMessage.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/ReportOfferAvailabilityMessage.java similarity index 95% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/ReportOfferAvailabilityMessage.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/ReportOfferAvailabilityMessage.java index 0160d85797..6bb1e1917b 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/ReportOfferAvailabilityMessage.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/ReportOfferAvailabilityMessage.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer.messages; +package io.bitsquare.trade.protocol.availability.messages; import io.bitsquare.trade.protocol.trade.OfferMessage; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/RequestIsOfferAvailableMessage.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/RequestIsOfferAvailableMessage.java similarity index 95% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/RequestIsOfferAvailableMessage.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/RequestIsOfferAvailableMessage.java index 9e174350db..fb78d41719 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/messages/RequestIsOfferAvailableMessage.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/messages/RequestIsOfferAvailableMessage.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer.messages; +package io.bitsquare.trade.protocol.availability.messages; import io.bitsquare.trade.protocol.trade.OfferMessage; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/GetPeerAddress.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java similarity index 93% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/GetPeerAddress.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java index d81bca781f..d72f3aee36 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/GetPeerAddress.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java @@ -15,11 +15,11 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer.tasks; +package io.bitsquare.trade.protocol.availability.tasks; import io.bitsquare.network.Peer; import io.bitsquare.trade.listeners.GetPeerAddressListener; -import io.bitsquare.trade.protocol.offer.CheckOfferAvailabilityModel; +import io.bitsquare.trade.protocol.availability.CheckOfferAvailabilityModel; import io.bitsquare.util.tasks.Task; import io.bitsquare.util.tasks.TaskRunner; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/RequestIsOfferAvailable.java b/gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java similarity index 89% rename from gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/RequestIsOfferAvailable.java rename to gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java index 324c7f1e71..c34aa22bab 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/offer/tasks/RequestIsOfferAvailable.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java @@ -15,11 +15,11 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.offer.tasks; +package io.bitsquare.trade.protocol.availability.tasks; import io.bitsquare.trade.listeners.SendMessageListener; -import io.bitsquare.trade.protocol.offer.CheckOfferAvailabilityModel; -import io.bitsquare.trade.protocol.offer.messages.RequestIsOfferAvailableMessage; +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; diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java index 551ae6301d..4e20139767 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java @@ -18,7 +18,7 @@ package io.bitsquare.trade.protocol.placeoffer; import io.bitsquare.trade.handlers.TransactionResultHandler; -import io.bitsquare.trade.protocol.placeoffer.tasks.AddOffer; +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; @@ -67,8 +67,9 @@ public class PlaceOfferProtocol { ValidateOffer.class, CreateOfferFeeTx.class, BroadcastCreateOfferFeeTx.class, - AddOffer.class + AddOfferToRemoteOfferBook.class ); + sequence.run(); } } diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOffer.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java similarity index 80% rename from gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOffer.java rename to gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java index 3f3778668c..29c91c1599 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOffer.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java @@ -24,18 +24,15 @@ import io.bitsquare.util.tasks.TaskRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AddOffer extends Task { - private static final Logger log = LoggerFactory.getLogger(AddOffer.class); +public class AddOfferToRemoteOfferBook extends Task { + private static final Logger log = LoggerFactory.getLogger(AddOfferToRemoteOfferBook.class); - public AddOffer(TaskRunner taskHandler, PlaceOfferModel model) { + public AddOfferToRemoteOfferBook(TaskRunner taskHandler, PlaceOfferModel model) { super(taskHandler, model); } @Override protected void run() { - // need to write data before storage, otherwise hash is different when removing offer! - model.getOffer().setOfferFeePaymentTxID(model.getTransaction().getHashAsString()); - model.getOfferBookService().addOffer(model.getOffer(), () -> { complete(); diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java index 0b5d12b4e7..6186ced9d3 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java @@ -42,10 +42,15 @@ public class BroadcastCreateOfferFeeTx extends Task { @Override public void onSuccess(Transaction transaction) { log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString()); - if (transaction == null) - failed("Broadcast of offer fee payment failed because transaction = null."); - else + if (transaction != null) { + // need to write data before storage, otherwise hash is different when removing offer from DHT! + model.getOffer().setOfferFeePaymentTxID(model.getTransaction().getHashAsString()); + complete(); + } + else { + failed("Broadcast of offer fee payment failed because transaction = null."); + } } @Override diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java index b9cf7f4026..fc31ceaabd 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java @@ -37,6 +37,7 @@ public class CreateOfferFeeTx extends Task { protected void run() { try { Transaction transaction = model.getWalletService().createOfferFeeTx(model.getOffer().getId()); + model.setTransaction(transaction); complete(); diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java index 3710b45ed6..5e4fd44918 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java @@ -35,7 +35,7 @@ public class ValidateOffer extends Task { protected void run() { try { model.getOffer().validate(); - + complete(); } catch (Exception e) { failed(e); diff --git a/gui/src/main/java/io/bitsquare/util/tasks/TaskInterception.java b/gui/src/main/java/io/bitsquare/util/tasks/TaskInterception.java new file mode 100644 index 0000000000..95678215ec --- /dev/null +++ b/gui/src/main/java/io/bitsquare/util/tasks/TaskInterception.java @@ -0,0 +1,27 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bitsquare is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bitsquare. If not, see . + */ + +package io.bitsquare.util.tasks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TaskInterception { + private static final Logger log = LoggerFactory.getLogger(TaskInterception.class); + public static Class taskToInterceptBeforeRun; + public static Class taskToInterceptAfterRun; +} diff --git a/gui/src/main/java/io/bitsquare/util/tasks/TaskRunner.java b/gui/src/main/java/io/bitsquare/util/tasks/TaskRunner.java index add2a7b098..b7b691dd93 100644 --- a/gui/src/main/java/io/bitsquare/util/tasks/TaskRunner.java +++ b/gui/src/main/java/io/bitsquare/util/tasks/TaskRunner.java @@ -38,10 +38,10 @@ public class TaskRunner { private final FaultHandler faultHandler; private boolean failed = false; - private Class currentTask; - private Class previousTask; + private boolean isCanceled; + private Class currentTask; public TaskRunner(T sharedModel, ResultHandler resultHandler, FaultHandler faultHandler) { this.sharedModel = sharedModel; @@ -53,18 +53,16 @@ public class TaskRunner { next(); } - public Class getCurrentTask() { - return currentTask; - } protected void next() { if (!failed && !isCanceled) { if (tasks.size() > 0) { try { - setCurrentTask(tasks.poll()); + currentTask = tasks.poll(); + interceptBeforeRun(currentTask); log.trace("Run task: " + currentTask.getSimpleName()); currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run(); - setPreviousTask(currentTask); + interceptAfterRun(currentTask); } catch (Throwable t) { t.printStackTrace(); faultHandler.handleFault(t.getMessage(), t); @@ -76,18 +74,21 @@ public class TaskRunner { } } + protected void interceptBeforeRun(Class task) { + if (task == TaskInterception.taskToInterceptBeforeRun) + throw new RuntimeException("Task intercepted before run executed: task = " + task.getSimpleName()); + } + + protected void interceptAfterRun(Class task) { + if (task == TaskInterception.taskToInterceptAfterRun) + throw new RuntimeException("Task intercepted after run executed: task = " + task.getSimpleName()); + } + + public void cancel() { isCanceled = true; } - protected void setPreviousTask(Class task) { - previousTask = task; - } - - protected void setCurrentTask(Class task) { - currentTask = task; - } - public void addTask(Class task) { tasks.add(task); } @@ -97,6 +98,7 @@ public class TaskRunner { } public void complete() { + log.trace("Task completed: " + currentTask.getSimpleName()); next(); } @@ -105,9 +107,11 @@ public class TaskRunner { } public void handleFault(String message, @NotNull Throwable throwable) { + log.error("Task failed: " + currentTask.getSimpleName()); log.debug(throwable.getMessage()); failed = true; faultHandler.handleFault(message, throwable); } + }