From 3b35774b4badfea70047e07c53af1de122d1bea3 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 8 Mar 2015 00:44:55 +0100 Subject: [PATCH] Fix Remove offer bug. Add handlers to remove offer. Rename delegate to dataModel. --- .../content/fiat/FiatAccountViewModel.java | 72 ++++----- .../content/irc/IrcAccountViewModel.java | 32 ++-- .../registration/RegistrationViewModel.java | 36 ++--- .../restrictions/RestrictionsViewModel.java | 40 ++--- .../closed/ClosedTradesViewModel.java | 12 +- .../main/portfolio/offer/OffersDataModel.java | 2 +- .../main/portfolio/offer/OffersViewModel.java | 14 +- .../pending/PendingTradesViewModel.java | 70 ++++----- .../application/PreferencesViewModel.java | 16 +- .../createoffer/CreateOfferViewModel.java | 140 +++++++++--------- .../trade/offerbook/OfferBookDataModel.java | 6 +- .../trade/offerbook/OfferBookViewModel.java | 64 ++++---- .../trade/takeoffer/TakeOfferViewModel.java | 86 +++++------ .../main/java/io/bitsquare/offer/Offer.java | 1 + .../io/bitsquare/offer/RemoteOfferBook.java | 2 +- .../offer/tomp2p/TomP2POfferBook.java | 12 +- .../java/io/bitsquare/trade/TradeManager.java | 41 +++-- .../PlaceOfferProtocol.java} | 20 +-- ...ate.java => ActivatableWithDataModel.java} | 10 +- .../{WithDelegate.java => WithDataModel.java} | 8 +- .../view/support/CachingViewLoader.java | 8 +- .../PlaceOfferProtocolTest.java} | 38 ++--- 22 files changed, 372 insertions(+), 358 deletions(-) rename gui/src/main/java/io/bitsquare/trade/protocol/{createoffer/CreateOfferProtocol.java => placeoffer/PlaceOfferProtocol.java} (89%) rename gui/src/main/java/viewfx/model/support/{ActivatableWithDelegate.java => ActivatableWithDataModel.java} (79%) rename gui/src/main/java/viewfx/model/support/{WithDelegate.java => WithDataModel.java} (79%) rename gui/src/test/java/io/bitsquare/trade/protocol/{createoffer/CreateOfferProtocolTest.java => placeoffer/PlaceOfferProtocolTest.java} (88%) diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiat/FiatAccountViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiat/FiatAccountViewModel.java index 8b35f33dec..bfd55c8d14 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/fiat/FiatAccountViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/fiat/FiatAccountViewModel.java @@ -30,7 +30,7 @@ import com.google.inject.Inject; import java.util.Currency; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -42,7 +42,7 @@ import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.util.StringConverter; -class FiatAccountViewModel extends ActivatableWithDelegate implements ViewModel { +class FiatAccountViewModel extends ActivatableWithDataModel implements ViewModel { private final BankAccountNumberValidator bankAccountNumberValidator; @@ -61,26 +61,26 @@ class FiatAccountViewModel extends ActivatableWithDelegate @Inject - public FiatAccountViewModel(FiatAccountDataModel delegate, BankAccountNumberValidator bankAccountNumberValidator) { - super(delegate); + public FiatAccountViewModel(FiatAccountDataModel dataModel, BankAccountNumberValidator bankAccountNumberValidator) { + super(dataModel); this.bankAccountNumberValidator = bankAccountNumberValidator; // input - title.bindBidirectional(delegate.title); - holderName.bindBidirectional(delegate.holderName); - primaryID.bindBidirectional(delegate.primaryID); - secondaryID.bindBidirectional(delegate.secondaryID); - type.bindBidirectional(delegate.type); - country.bindBidirectional(delegate.country); - currency.bindBidirectional(delegate.currency); + title.bindBidirectional(dataModel.title); + holderName.bindBidirectional(dataModel.holderName); + primaryID.bindBidirectional(dataModel.primaryID); + secondaryID.bindBidirectional(dataModel.secondaryID); + type.bindBidirectional(dataModel.type); + country.bindBidirectional(dataModel.country); + currency.bindBidirectional(dataModel.currency); - primaryIDPrompt.bind(delegate.primaryIDPrompt); - secondaryIDPrompt.bind(delegate.secondaryIDPrompt); + primaryIDPrompt.bind(dataModel.primaryIDPrompt); + secondaryIDPrompt.bind(dataModel.secondaryIDPrompt); selectionPrompt.set("No bank account available"); selectionDisable.set(true); - delegate.title.addListener((ov, oldValue, newValue) -> validateInput()); + dataModel.title.addListener((ov, oldValue, newValue) -> validateInput()); holderName.addListener((ov, oldValue, newValue) -> validateInput()); primaryID.addListener((ov, oldValue, newValue) -> validateInput()); secondaryID.addListener((ov, oldValue, newValue) -> validateInput()); @@ -88,7 +88,7 @@ class FiatAccountViewModel extends ActivatableWithDelegate @Override public void doActivate() { - delegate.allBankAccounts.addListener((ListChangeListener) change -> applyAllBankAccounts()); + dataModel.allBankAccounts.addListener((ListChangeListener) change -> applyAllBankAccounts()); applyAllBankAccounts(); } @@ -96,21 +96,21 @@ class FiatAccountViewModel extends ActivatableWithDelegate InputValidator.ValidationResult requestSaveBankAccount() { InputValidator.ValidationResult result = validateInput(); if (result.isValid) { - delegate.saveBankAccount(); + dataModel.saveBankAccount(); } return result; } void removeBankAccount() { - delegate.removeBankAccount(); + dataModel.removeBankAccount(); } void addCountryToAcceptedCountriesList() { - delegate.addCountryToAcceptedCountriesList(); + dataModel.addCountryToAcceptedCountriesList(); } void selectBankAccount(BankAccount bankAccount) { - delegate.selectBankAccount(bankAccount); + dataModel.selectBankAccount(bankAccount); } @@ -188,27 +188,27 @@ class FiatAccountViewModel extends ActivatableWithDelegate ObservableList getAllTypes() { - return delegate.allTypes; + return dataModel.allTypes; } ObservableList getAllBankAccounts() { - return delegate.allBankAccounts; + return dataModel.allBankAccounts; } ObservableList getAllCurrencies() { - return delegate.allCurrencies; + return dataModel.allCurrencies; } ObservableList getAllRegions() { - return delegate.allRegions; + return dataModel.allRegions; } BooleanProperty getCountryNotInAcceptedCountriesList() { - return delegate.countryNotInAcceptedCountriesList; + return dataModel.countryNotInAcceptedCountriesList; } ObservableList getAllCountriesFor(Region selectedRegion) { - return delegate.getAllCountriesFor(selectedRegion); + return dataModel.getAllCountriesFor(selectedRegion); } BankAccountNumberValidator getBankAccountNumberValidator() { @@ -217,23 +217,23 @@ class FiatAccountViewModel extends ActivatableWithDelegate void setType(BankAccountType type) { - delegate.setType(type); + dataModel.setType(type); validateInput(); } void setCountry(Country country) { - delegate.setCountry(country); + dataModel.setCountry(country); validateInput(); } void setCurrency(Currency currency) { - delegate.setCurrency(currency); + dataModel.setCurrency(currency); validateInput(); } private void applyAllBankAccounts() { - if (delegate.allBankAccounts.isEmpty()) { + if (dataModel.allBankAccounts.isEmpty()) { selectionPrompt.set("No bank account available"); selectionDisable.set(true); } @@ -244,23 +244,23 @@ class FiatAccountViewModel extends ActivatableWithDelegate } private InputValidator.ValidationResult validateInput() { - InputValidator.ValidationResult result = bankAccountNumberValidator.validate(delegate.title.get()); + InputValidator.ValidationResult result = bankAccountNumberValidator.validate(dataModel.title.get()); if (result.isValid) { - result = bankAccountNumberValidator.validate(delegate.holderName.get()); + result = bankAccountNumberValidator.validate(dataModel.holderName.get()); if (result.isValid) { - result = bankAccountNumberValidator.validate(delegate.primaryID.get()); + result = bankAccountNumberValidator.validate(dataModel.primaryID.get()); if (result.isValid) { - result = bankAccountNumberValidator.validate(delegate.secondaryID.get()); + result = bankAccountNumberValidator.validate(dataModel.secondaryID.get()); if (result.isValid) { - if (delegate.currency.get() == null) + if (dataModel.currency.get() == null) result = new InputValidator.ValidationResult(false, "You have not selected a currency"); if (result.isValid) { - if (delegate.country.get() == null) + if (dataModel.country.get() == null) result = new InputValidator.ValidationResult(false, "You have not selected a country of the payments account"); if (result.isValid) { - if (delegate.type.get() == null) + if (dataModel.type.get() == null) result = new InputValidator.ValidationResult(false, "You have not selected a payments method"); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountViewModel.java index 253b33d08d..ed0f160c39 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountViewModel.java @@ -27,7 +27,7 @@ import com.google.inject.Inject; import java.util.Currency; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -38,7 +38,7 @@ import javafx.beans.property.StringProperty; import javafx.collections.ObservableList; import javafx.util.StringConverter; -class IrcAccountViewModel extends ActivatableWithDelegate implements ViewModel { +class IrcAccountViewModel extends ActivatableWithDataModel implements ViewModel { private final InputValidator nickNameValidator; @@ -49,23 +49,23 @@ class IrcAccountViewModel extends ActivatableWithDelegate i @Inject - public IrcAccountViewModel(IrcAccountDataModel delegate, BankAccountNumberValidator nickNameValidator) { - super(delegate); + public IrcAccountViewModel(IrcAccountDataModel dataModel, BankAccountNumberValidator nickNameValidator) { + super(dataModel); this.nickNameValidator = nickNameValidator; // input - ircNickName.bindBidirectional(delegate.nickName); - type.bindBidirectional(delegate.type); - currency.bindBidirectional(delegate.currency); + ircNickName.bindBidirectional(dataModel.nickName); + type.bindBidirectional(dataModel.type); + currency.bindBidirectional(dataModel.currency); - delegate.nickName.addListener((ov, oldValue, newValue) -> validateInput()); + dataModel.nickName.addListener((ov, oldValue, newValue) -> validateInput()); } InputValidator.ValidationResult requestSaveBankAccount() { InputValidator.ValidationResult result = validateInput(); if (result.isValid) { - delegate.saveBankAccount(); + dataModel.saveBankAccount(); } return result; } @@ -104,11 +104,11 @@ class IrcAccountViewModel extends ActivatableWithDelegate i ObservableList getAllTypes() { - return delegate.allTypes; + return dataModel.allTypes; } ObservableList getAllCurrencies() { - return delegate.allCurrencies; + return dataModel.allCurrencies; } InputValidator getNickNameValidator() { @@ -117,24 +117,24 @@ class IrcAccountViewModel extends ActivatableWithDelegate i void setType(BankAccountType type) { - delegate.setType(type); + dataModel.setType(type); validateInput(); } void setCurrency(Currency currency) { - delegate.setCurrency(currency); + dataModel.setCurrency(currency); validateInput(); } private InputValidator.ValidationResult validateInput() { - InputValidator.ValidationResult result = nickNameValidator.validate(delegate.nickName.get()); - if (delegate.currency.get() == null) + InputValidator.ValidationResult result = nickNameValidator.validate(dataModel.nickName.get()); + if (dataModel.currency.get() == null) result = new InputValidator.ValidationResult(false, "You have not selected a currency"); if (result.isValid) { - if (delegate.type.get() == null) + if (dataModel.type.get() == null) result = new InputValidator.ValidationResult(false, "You have not selected a payments method"); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/registration/RegistrationViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/registration/RegistrationViewModel.java index 596d101aa3..4cb49cfb23 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/registration/RegistrationViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/registration/RegistrationViewModel.java @@ -27,7 +27,7 @@ import org.bitcoinj.core.Coin; import com.google.inject.Inject; import viewfx.model.ViewModel; -import viewfx.model.support.WithDelegate; +import viewfx.model.support.WithDataModel; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -37,7 +37,7 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -class RegistrationViewModel extends WithDelegate implements ViewModel { +class RegistrationViewModel extends WithDataModel implements ViewModel { final BooleanProperty isPayButtonDisabled = new SimpleBooleanProperty(true); final StringProperty requestPlaceOfferErrorMessage = new SimpleStringProperty(); @@ -50,27 +50,27 @@ class RegistrationViewModel extends WithDelegate implemen @Inject - public RegistrationViewModel(RegistrationDataModel delegate, BSFormatter formatter) { - super(delegate); + public RegistrationViewModel(RegistrationDataModel dataModel, BSFormatter formatter) { + super(dataModel); this.formatter = formatter; - if (delegate.getAddressEntry() != null) { - address.set(delegate.getAddressEntry().getAddress()); + if (dataModel.getAddressEntry() != null) { + address.set(dataModel.getAddressEntry().getAddress()); } - delegate.isWalletFunded.addListener((ov, oldValue, newValue) -> { + dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> { if (newValue) validateInput(); }); validateInput(); - delegate.payFeeSuccess.addListener((ov, oldValue, newValue) -> { + dataModel.payFeeSuccess.addListener((ov, oldValue, newValue) -> { isPayButtonDisabled.set(newValue); showTransactionPublishedScreen.set(newValue); isPaymentSpinnerVisible.set(false); }); - delegate.payFeeErrorMessage.addListener((ov, oldValue, newValue) -> { + dataModel.payFeeErrorMessage.addListener((ov, oldValue, newValue) -> { if (newValue != null) { requestPlaceOfferErrorMessage.set(newValue); isPaymentSpinnerVisible.set(false); @@ -79,18 +79,18 @@ class RegistrationViewModel extends WithDelegate implemen } void payFee() { - delegate.payFeeErrorMessage.set(null); - delegate.payFeeSuccess.set(false); + dataModel.payFeeErrorMessage.set(null); + dataModel.payFeeSuccess.set(false); isPayButtonDisabled.set(true); isPaymentSpinnerVisible.set(true); - delegate.payFee(); + dataModel.payFee(); } WalletService getWalletService() { - return delegate.getWalletService(); + return dataModel.getWalletService(); } BSFormatter getFormatter() { @@ -98,11 +98,11 @@ class RegistrationViewModel extends WithDelegate implemen } Coin getFeeAsCoin() { - return delegate.getFeeAsCoin(); + return dataModel.getFeeAsCoin(); } String getAddressAsString() { - return delegate.getAddressEntry() != null ? delegate.getAddressEntry().getAddress().toString() : ""; + return dataModel.getAddressEntry() != null ? dataModel.getAddressEntry().getAddress().toString() : ""; } String getPaymentLabel() { @@ -110,16 +110,16 @@ class RegistrationViewModel extends WithDelegate implemen } String getFeeAsString() { - return formatter.formatCoinWithCode(delegate.getFeeAsCoin()); + return formatter.formatCoinWithCode(dataModel.getFeeAsCoin()); } String getTransactionId() { - return delegate.getTransactionId(); + return dataModel.getTransactionId(); } private void validateInput() { - isPayButtonDisabled.set(!(delegate.isWalletFunded.get())); + isPayButtonDisabled.set(!(dataModel.isWalletFunded.get())); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewModel.java index cf9b20b14a..7be450ff59 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/restrictions/RestrictionsViewModel.java @@ -26,20 +26,20 @@ import com.google.inject.Inject; import java.util.Locale; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.collections.ObservableList; -class RestrictionsViewModel extends ActivatableWithDelegate implements ViewModel { +class RestrictionsViewModel extends ActivatableWithDataModel implements ViewModel { final BooleanProperty doneButtonDisable = new SimpleBooleanProperty(true); @Inject - public RestrictionsViewModel(RestrictionsDataModel delegate) { - super(delegate); + public RestrictionsViewModel(RestrictionsDataModel dataModel) { + super(dataModel); } @@ -49,70 +49,70 @@ class RestrictionsViewModel extends ActivatableWithDelegate getListWithAllEuroCountries() { - return delegate.getListWithAllEuroCountries(); + return dataModel.getListWithAllEuroCountries(); } ObservableList getAllCountriesFor(Region selectedRegion) { - return delegate.getAllCountriesFor(selectedRegion); + return dataModel.getAllCountriesFor(selectedRegion); } ObservableList getLanguageList() { - return delegate.languageList; + return dataModel.languageList; } ObservableList getAllRegions() { - return delegate.allRegions; + return dataModel.allRegions; } ObservableList getAllLanguages() { - return delegate.allLanguages; + return dataModel.allLanguages; } ObservableList getCountryList() { - return delegate.countryList; + return dataModel.countryList; } ObservableList getArbitratorList() { - return delegate.arbitratorList; + return dataModel.arbitratorList; } //TODO Revert size() > -1 to 0(2 later). For mock testing disabled arbitratorList test private void updateDoneButtonDisableState() { - boolean isValid = delegate.languageList != null && delegate.languageList.size() > 0 && - delegate.countryList != null && delegate.countryList.size() > 0 && - delegate.arbitratorList != null && delegate.arbitratorList.size() > -1; + boolean isValid = dataModel.languageList != null && dataModel.languageList.size() > 0 && + dataModel.countryList != null && dataModel.countryList.size() > 0 && + dataModel.arbitratorList != null && dataModel.arbitratorList.size() > -1; doneButtonDisable.set(!isValid); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java index 1bc584b16d..84e32950e1 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java @@ -22,24 +22,24 @@ import io.bitsquare.gui.util.BSFormatter; import com.google.inject.Inject; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.collections.ObservableList; -class ClosedTradesViewModel extends ActivatableWithDelegate implements ViewModel { +class ClosedTradesViewModel extends ActivatableWithDataModel implements ViewModel { private final BSFormatter formatter; @Inject - public ClosedTradesViewModel(ClosedTradesDataModel delegate, BSFormatter formatter) { - super(delegate); + public ClosedTradesViewModel(ClosedTradesDataModel dataModel, BSFormatter formatter) { + super(dataModel); this.formatter = formatter; } public ObservableList getList() { - return delegate.getList(); + return dataModel.getList(); } String getTradeId(ClosedTradesListItem item) { @@ -59,7 +59,7 @@ class ClosedTradesViewModel extends ActivatableWithDelegate implements ViewModel { +class OffersViewModel extends ActivatableWithDataModel implements ViewModel { private final BSFormatter formatter; @Inject - public OffersViewModel(OffersDataModel delegate, BSFormatter formatter) { - super(delegate); + public OffersViewModel(OffersDataModel dataModel, BSFormatter formatter) { + super(dataModel); this.formatter = formatter; } void removeOffer(OfferListItem item) { - delegate.removeOffer(item); + dataModel.removeOffer(item); } public ObservableList getList() { - return delegate.getList(); + return dataModel.getList(); } String getTradeId(OfferListItem item) { @@ -65,7 +65,7 @@ class OffersViewModel extends ActivatableWithDelegate implement } String getDirectionLabel(OfferListItem item) { - return (item != null) ? formatter.formatDirection(delegate.getDirection(item.getOffer())) : ""; + return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getOffer())) : ""; } String getDate(OfferListItem item) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java index 0ac5b322aa..83d5ca8017 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java @@ -31,7 +31,7 @@ import com.google.inject.Inject; import java.util.Date; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.InvalidationListener; import javafx.beans.property.BooleanProperty; @@ -45,7 +45,7 @@ import javafx.collections.ObservableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -class PendingTradesViewModel extends ActivatableWithDelegate implements ViewModel { +class PendingTradesViewModel extends ActivatableWithDataModel implements ViewModel { private static final Logger log = LoggerFactory.getLogger(PendingTradesViewModel.class); enum State { @@ -71,9 +71,9 @@ class PendingTradesViewModel extends ActivatableWithDelegate getList() { - return delegate.getList(); + return dataModel.getList(); } boolean isOfferer() { - return delegate.isOfferer(); + return dataModel.isOfferer(); } WalletService getWalletService() { - return delegate.getWalletService(); + return dataModel.getWalletService(); } PendingTradesListItem getSelectedItem() { - return delegate.getSelectedItem(); + return dataModel.getSelectedItem(); } String getCurrencyCode() { - return delegate.getCurrencyCode(); + return dataModel.getCurrencyCode(); } // columns @@ -161,7 +161,7 @@ class PendingTradesViewModel extends ActivatableWithDelegate implements ViewModel { +class PreferencesViewModel extends ActivatableWithDataModel implements ViewModel { @Inject - public PreferencesViewModel(PreferencesDataModel delegate) { - super(delegate); + public PreferencesViewModel(PreferencesDataModel dataModel) { + super(dataModel); } public ObservableList getBtcDenominationItems() { - return delegate.btcDenominations; + return dataModel.btcDenominations; } BooleanProperty useAnimations() { - return delegate.useAnimations; + return dataModel.useAnimations; } BooleanProperty useEffects() { - return delegate.useEffects; + return dataModel.useEffects; } StringProperty btcDenomination() { - return delegate.btcDenomination; + return dataModel.btcDenomination; } diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewModel.java index 6d6ec6c8de..4bd1dcf7c0 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferViewModel.java @@ -32,7 +32,7 @@ import org.bitcoinj.utils.Fiat; import javax.inject.Inject; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.Observable; import javafx.beans.binding.Bindings; @@ -45,7 +45,7 @@ import javafx.beans.property.StringProperty; import static javafx.beans.binding.Bindings.createStringBinding; -class CreateOfferViewModel extends ActivatableWithDelegate implements ViewModel { +class CreateOfferViewModel extends ActivatableWithDataModel implements ViewModel { private final BtcValidator btcValidator; private final BSFormatter formatter; @@ -94,19 +94,19 @@ class CreateOfferViewModel extends ActivatableWithDelegate @Inject - public CreateOfferViewModel(CreateOfferDataModel delegate, FiatValidator fiatValidator, BtcValidator btcValidator, + public CreateOfferViewModel(CreateOfferDataModel dataModel, FiatValidator fiatValidator, BtcValidator btcValidator, BSFormatter formatter) { - super(delegate); + super(dataModel); this.fiatValidator = fiatValidator; this.btcValidator = btcValidator; this.formatter = formatter; - paymentLabel.set(BSResources.get("createOffer.fundsBox.paymentLabel", delegate.getOfferId())); + paymentLabel.set(BSResources.get("createOffer.fundsBox.paymentLabel", dataModel.getOfferId())); - if (delegate.getAddressEntry() != null) { - addressAsString.set(delegate.getAddressEntry().getAddress().toString()); - address.set(delegate.getAddressEntry().getAddress()); + if (dataModel.getAddressEntry() != null) { + addressAsString.set(dataModel.getAddressEntry().getAddress().toString()); + address.set(dataModel.getAddressEntry().getAddress()); } setupBindings(); @@ -115,39 +115,39 @@ class CreateOfferViewModel extends ActivatableWithDelegate // setOfferBookFilter is a one time call void initWithData(Direction direction, Coin amount, Fiat price) { - delegate.setDirection(direction); - directionLabel.set(delegate.getDirection() == Direction.BUY ? BSResources.get("shared.buy") : BSResources.get + dataModel.setDirection(direction); + directionLabel.set(dataModel.getDirection() == Direction.BUY ? BSResources.get("shared.buy") : BSResources.get ("shared.sell")); // apply only if valid boolean amountValid = false; if (amount != null && isBtcInputValid(amount.toPlainString()) .isValid) { - delegate.amountAsCoin.set(amount); - delegate.minAmountAsCoin.set(amount); + dataModel.amountAsCoin.set(amount); + dataModel.minAmountAsCoin.set(amount); amountValid = true; } // apply only if valid boolean priceValid = false; if (price != null && isBtcInputValid(price.toPlainString()).isValid) { - delegate.priceAsFiat.set(formatter.parseToFiatWith2Decimals(price.toPlainString())); + dataModel.priceAsFiat.set(formatter.parseToFiatWith2Decimals(price.toPlainString())); priceValid = true; } if (amountValid && priceValid) - delegate.calculateTotalToPay(); + dataModel.calculateTotalToPay(); } void placeOffer() { - delegate.requestPlaceOfferErrorMessage.set(null); - delegate.requestPlaceOfferSuccess.set(false); + dataModel.requestPlaceOfferErrorMessage.set(null); + dataModel.requestPlaceOfferSuccess.set(false); isPlaceOfferButtonDisabled.set(true); isPlaceOfferSpinnerVisible.set(true); - delegate.placeOffer(); + dataModel.placeOffer(); } @@ -165,12 +165,12 @@ class CreateOfferViewModel extends ActivatableWithDelegate // only allow max 4 decimal places for btc values setAmountToModel(); // reformat input - amount.set(formatter.formatCoin(delegate.amountAsCoin.get())); + amount.set(formatter.formatCoin(dataModel.amountAsCoin.get())); calculateVolume(); // handle minAmount/amount relationship - if (!delegate.isMinAmountLessOrEqualAmount()) { + if (!dataModel.isMinAmountLessOrEqualAmount()) { amountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("createOffer.validation.amountSmallerThanMinAmount"))); } @@ -190,9 +190,9 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (result.isValid) { showWarningInvalidBtcDecimalPlaces.set(!formatter.hasBtcValidDecimals(userInput)); setMinAmountToModel(); - minAmount.set(formatter.formatCoin(delegate.minAmountAsCoin.get())); + minAmount.set(formatter.formatCoin(dataModel.minAmountAsCoin.get())); - if (!delegate.isMinAmountLessOrEqualAmount()) { + if (!dataModel.isMinAmountLessOrEqualAmount()) { minAmountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("createOffer.validation.minAmountLargerThanAmount"))); } @@ -213,7 +213,7 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (isValid) { showWarningInvalidFiatDecimalPlaces.set(!formatter.hasFiatValidDecimals(userInput)); setPriceToModel(); - price.set(formatter.formatFiat(delegate.priceAsFiat.get())); + price.set(formatter.formatFiat(dataModel.priceAsFiat.get())); calculateVolume(); } @@ -227,7 +227,7 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (result.isValid) { showWarningInvalidFiatDecimalPlaces.set(!formatter.hasFiatValidDecimals(userInput)); setVolumeToModel(); - volume.set(formatter.formatFiat(delegate.volumeAsFiat.get())); + volume.set(formatter.formatFiat(dataModel.volumeAsFiat.get())); calculateAmount(); @@ -241,12 +241,12 @@ class CreateOfferViewModel extends ActivatableWithDelegate } void securityDepositInfoDisplayed() { - delegate.securityDepositInfoDisplayed(); + dataModel.securityDepositInfoDisplayed(); } WalletService getWalletService() { - return delegate.getWalletService(); + return dataModel.getWalletService(); } BSFormatter getFormatter() { @@ -254,7 +254,7 @@ class CreateOfferViewModel extends ActivatableWithDelegate } Boolean displaySecurityDepositInfo() { - return delegate.displaySecurityDepositInfo(); + return dataModel.displaySecurityDepositInfo(); } private void setupListeners() { @@ -264,7 +264,7 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (isBtcInputValid(newValue).isValid) { setAmountToModel(); calculateVolume(); - delegate.calculateTotalToPay(); + dataModel.calculateTotalToPay(); } updateButtonDisableState(); }); @@ -278,7 +278,7 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (isFiatInputValid(newValue).isValid) { setPriceToModel(); calculateVolume(); - delegate.calculateTotalToPay(); + dataModel.calculateTotalToPay(); } updateButtonDisableState(); }); @@ -287,12 +287,12 @@ class CreateOfferViewModel extends ActivatableWithDelegate if (isFiatInputValid(newValue).isValid) { setVolumeToModel(); setPriceToModel(); - delegate.calculateAmount(); - delegate.calculateTotalToPay(); + dataModel.calculateAmount(); + dataModel.calculateTotalToPay(); } updateButtonDisableState(); }); - delegate.isWalletFunded.addListener((ov, oldValue, newValue) -> { + dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> { if (newValue) { updateButtonDisableState(); tabIsClosable.set(false); @@ -300,70 +300,70 @@ class CreateOfferViewModel extends ActivatableWithDelegate }); // Binding with Bindings.createObjectBinding does not work because of bi-directional binding - delegate.amountAsCoin.addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin(newValue))); - delegate.minAmountAsCoin.addListener((ov, oldValue, newValue) -> minAmount.set(formatter.formatCoin(newValue))); - delegate.priceAsFiat.addListener((ov, oldValue, newValue) -> price.set(formatter.formatFiat(newValue))); - delegate.volumeAsFiat.addListener((ov, oldValue, newValue) -> volume.set(formatter.formatFiat(newValue))); + dataModel.amountAsCoin.addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin(newValue))); + dataModel.minAmountAsCoin.addListener((ov, oldValue, newValue) -> minAmount.set(formatter.formatCoin(newValue))); + dataModel.priceAsFiat.addListener((ov, oldValue, newValue) -> price.set(formatter.formatFiat(newValue))); + dataModel.volumeAsFiat.addListener((ov, oldValue, newValue) -> volume.set(formatter.formatFiat(newValue))); - delegate.requestPlaceOfferErrorMessage.addListener((ov, oldValue, newValue) -> { + dataModel.requestPlaceOfferErrorMessage.addListener((ov, oldValue, newValue) -> { if (newValue != null) { isPlaceOfferButtonDisabled.set(false); isPlaceOfferSpinnerVisible.set(false); } }); - delegate.requestPlaceOfferSuccess.addListener((ov, oldValue, newValue) -> { + dataModel.requestPlaceOfferSuccess.addListener((ov, oldValue, newValue) -> { isPlaceOfferButtonVisible.set(!newValue); isPlaceOfferSpinnerVisible.set(false); }); // ObservableLists - delegate.acceptedCountries.addListener((Observable o) -> acceptedCountries.set(formatter - .countryLocalesToString(delegate.acceptedCountries))); - delegate.acceptedLanguages.addListener((Observable o) -> acceptedLanguages.set(formatter - .languageLocalesToString(delegate.acceptedLanguages))); - delegate.acceptedArbitrators.addListener((Observable o) -> acceptedArbitrators.set(formatter - .arbitratorsToString(delegate.acceptedArbitrators))); + dataModel.acceptedCountries.addListener((Observable o) -> acceptedCountries.set(formatter + .countryLocalesToString(dataModel.acceptedCountries))); + dataModel.acceptedLanguages.addListener((Observable o) -> acceptedLanguages.set(formatter + .languageLocalesToString(dataModel.acceptedLanguages))); + dataModel.acceptedArbitrators.addListener((Observable o) -> acceptedArbitrators.set(formatter + .arbitratorsToString(dataModel.acceptedArbitrators))); } private void setupBindings() { - totalToPay.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.totalToPayAsCoin.get()), - delegate.totalToPayAsCoin)); - securityDeposit.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.securityDepositAsCoin.get()), - delegate.securityDepositAsCoin)); + totalToPay.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.totalToPayAsCoin.get()), + dataModel.totalToPayAsCoin)); + securityDeposit.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.securityDepositAsCoin.get()), + dataModel.securityDepositAsCoin)); - totalToPayAsCoin.bind(delegate.totalToPayAsCoin); + totalToPayAsCoin.bind(dataModel.totalToPayAsCoin); - offerFee.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.offerFeeAsCoin.get()), - delegate.offerFeeAsCoin)); - networkFee.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.networkFeeAsCoin.get()), - delegate.offerFeeAsCoin)); + offerFee.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.offerFeeAsCoin.get()), + dataModel.offerFeeAsCoin)); + networkFee.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.networkFeeAsCoin.get()), + dataModel.offerFeeAsCoin)); - bankAccountType.bind(Bindings.createStringBinding(() -> BSResources.get(delegate.bankAccountType.get()), - delegate.bankAccountType)); - bankAccountCurrency.bind(delegate.bankAccountCurrency); - bankAccountCounty.bind(delegate.bankAccountCounty); + bankAccountType.bind(Bindings.createStringBinding(() -> BSResources.get(dataModel.bankAccountType.get()), + dataModel.bankAccountType)); + bankAccountCurrency.bind(dataModel.bankAccountCurrency); + bankAccountCounty.bind(dataModel.bankAccountCounty); - requestPlaceOfferErrorMessage.bind(delegate.requestPlaceOfferErrorMessage); - showTransactionPublishedScreen.bind(delegate.requestPlaceOfferSuccess); - transactionId.bind(delegate.transactionId); + requestPlaceOfferErrorMessage.bind(dataModel.requestPlaceOfferErrorMessage); + showTransactionPublishedScreen.bind(dataModel.requestPlaceOfferSuccess); + transactionId.bind(dataModel.transactionId); - btcCode.bind(delegate.btcCode); - fiatCode.bind(delegate.fiatCode); + btcCode.bind(dataModel.btcCode); + fiatCode.bind(dataModel.fiatCode); } private void calculateVolume() { setAmountToModel(); setPriceToModel(); - delegate.calculateVolume(); + dataModel.calculateVolume(); } private void calculateAmount() { setVolumeToModel(); setPriceToModel(); - delegate.calculateAmount(); + dataModel.calculateAmount(); // Amount calculation could lead to amount/minAmount invalidation - if (!delegate.isMinAmountLessOrEqualAmount()) { + if (!dataModel.isMinAmountLessOrEqualAmount()) { amountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("createOffer.validation.amountSmallerThanMinAmount"))); } @@ -376,19 +376,19 @@ class CreateOfferViewModel extends ActivatableWithDelegate } private void setAmountToModel() { - delegate.amountAsCoin.set(formatter.parseToCoinWith4Decimals(amount.get())); + dataModel.amountAsCoin.set(formatter.parseToCoinWith4Decimals(amount.get())); } private void setMinAmountToModel() { - delegate.minAmountAsCoin.set(formatter.parseToCoinWith4Decimals(minAmount.get())); + dataModel.minAmountAsCoin.set(formatter.parseToCoinWith4Decimals(minAmount.get())); } private void setPriceToModel() { - delegate.priceAsFiat.set(formatter.parseToFiatWith2Decimals(price.get())); + dataModel.priceAsFiat.set(formatter.parseToFiatWith2Decimals(price.get())); } private void setVolumeToModel() { - delegate.volumeAsFiat.set(formatter.parseToFiatWith2Decimals(volume.get())); + dataModel.volumeAsFiat.set(formatter.parseToFiatWith2Decimals(volume.get())); } private void updateButtonDisableState() { @@ -396,8 +396,8 @@ class CreateOfferViewModel extends ActivatableWithDelegate isBtcInputValid(minAmount.get()).isValid && isBtcInputValid(price.get()).isValid && isBtcInputValid(volume.get()).isValid && - delegate.isMinAmountLessOrEqualAmount() && - delegate.isWalletFunded.get()) + dataModel.isMinAmountLessOrEqualAmount() && + dataModel.isWalletFunded.get()) ); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java index 0041ba46ef..54c7ea4e41 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java @@ -26,6 +26,8 @@ import io.bitsquare.offer.Offer; import io.bitsquare.settings.Preferences; import io.bitsquare.trade.TradeManager; import io.bitsquare.user.User; +import io.bitsquare.util.task.FaultHandler; +import io.bitsquare.util.task.ResultHandler; import org.bitcoinj.core.Coin; import org.bitcoinj.utils.ExchangeRate; @@ -114,8 +116,8 @@ class OfferBookDataModel implements Activatable, DataModel { btcCode.unbind(); } - void removeOffer(Offer offer) { - tradeManager.removeOffer(offer); + void removeOffer(Offer offer, ResultHandler resultHandler, FaultHandler faultHandler) { + tradeManager.requestRemoveOffer(offer, resultHandler, faultHandler); } void calculateVolume() { diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookViewModel.java index a4fd4c16f8..87fb9d5c9d 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookViewModel.java @@ -17,6 +17,7 @@ package io.bitsquare.gui.main.trade.offerbook; +import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.validation.InputValidator; import io.bitsquare.gui.util.validation.OptionalBtcValidator; @@ -31,13 +32,17 @@ import org.bitcoinj.utils.Fiat; import com.google.inject.Inject; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.transformation.SortedList; -class OfferBookViewModel extends ActivatableWithDelegate implements ViewModel { +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class OfferBookViewModel extends ActivatableWithDataModel implements ViewModel { + private static final Logger log = LoggerFactory.getLogger(OfferBookViewModel.class); private final OptionalBtcValidator optionalBtcValidator; private final BSFormatter formatter; @@ -52,17 +57,17 @@ class OfferBookViewModel extends ActivatableWithDelegate imp @Inject - public OfferBookViewModel(OfferBookDataModel delegate, OptionalFiatValidator optionalFiatValidator, + public OfferBookViewModel(OfferBookDataModel dataModel, OptionalFiatValidator optionalFiatValidator, OptionalBtcValidator optionalBtcValidator, BSFormatter formatter) { - super(delegate); + super(dataModel); this.optionalFiatValidator = optionalFiatValidator; this.optionalBtcValidator = optionalBtcValidator; this.formatter = formatter; - btcCode.bind(delegate.btcCode); - fiatCode.bind(delegate.fiatCode); - restrictionsInfo.bind(delegate.restrictionsInfo); + btcCode.bind(dataModel.btcCode); + fiatCode.bind(dataModel.fiatCode); + restrictionsInfo.bind(dataModel.restrictionsInfo); // Bidirectional bindings are used for all input fields: amount, price and volume // We do volume/amount calculation during input, so user has immediate feedback @@ -70,7 +75,7 @@ class OfferBookViewModel extends ActivatableWithDelegate imp if (isBtcInputValid(newValue).isValid) { setAmountToModel(); setPriceToModel(); - delegate.calculateVolume(); + dataModel.calculateVolume(); } }); @@ -78,7 +83,7 @@ class OfferBookViewModel extends ActivatableWithDelegate imp if (isFiatInputValid(newValue).isValid) { setAmountToModel(); setPriceToModel(); - delegate.calculateVolume(); + dataModel.calculateVolume(); } }); @@ -86,42 +91,51 @@ class OfferBookViewModel extends ActivatableWithDelegate imp if (isFiatInputValid(newValue).isValid) { setPriceToModel(); setVolumeToModel(); - delegate.calculateAmount(); + dataModel.calculateAmount(); } }); // Binding with Bindings.createObjectBinding does not work because of bi-directional binding - delegate.amountAsCoinProperty().addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin + dataModel.amountAsCoinProperty().addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin (newValue))); - delegate.priceAsFiatProperty().addListener((ov, oldValue, newValue) -> price.set(formatter.formatFiat(newValue))); - delegate.volumeAsFiatProperty().addListener((ov, oldValue, newValue) -> volume.set(formatter.formatFiat + dataModel.priceAsFiatProperty().addListener((ov, oldValue, newValue) -> price.set(formatter.formatFiat(newValue))); + dataModel.volumeAsFiatProperty().addListener((ov, oldValue, newValue) -> volume.set(formatter.formatFiat (newValue))); } void removeOffer(Offer offer) { - delegate.removeOffer(offer); + dataModel.removeOffer(offer, + () -> { + // visual feedback? + log.debug("remove was successful"); + }, + (message, throwable) -> { + log.error(message); + Popups.openWarningPopup("Remove offer failed", message); + } + ); } boolean isTradable(Offer offer) { - return delegate.isTradable(offer); + return dataModel.isTradable(offer); } void setDirection(Direction direction) { - delegate.setDirection(direction); + dataModel.setDirection(direction); } SortedList getOfferList() { - return delegate.getOfferList(); + return dataModel.getOfferList(); } boolean isRegistered() { - return delegate.isRegistered(); + return dataModel.isRegistered(); } boolean isMyOffer(Offer offer) { - return delegate.isMyOffer(offer); + return dataModel.isMyOffer(offer); } String getAmount(OfferBookListItem item) { @@ -147,15 +161,15 @@ class OfferBookViewModel extends ActivatableWithDelegate imp } Direction getDirection() { - return delegate.getDirection(); + return dataModel.getDirection(); } Coin getAmountAsCoin() { - return delegate.getAmountAsCoin(); + return dataModel.getAmountAsCoin(); } Fiat getPriceAsCoin() { - return delegate.getPriceAsFiat(); + return dataModel.getPriceAsFiat(); } private InputValidator.ValidationResult isBtcInputValid(String input) { @@ -167,15 +181,15 @@ class OfferBookViewModel extends ActivatableWithDelegate imp } private void setAmountToModel() { - delegate.setAmount(formatter.parseToCoinWith4Decimals(amount.get())); + dataModel.setAmount(formatter.parseToCoinWith4Decimals(amount.get())); } private void setPriceToModel() { - delegate.setPrice(formatter.parseToFiatWith2Decimals(price.get())); + dataModel.setPrice(formatter.parseToFiatWith2Decimals(price.get())); } private void setVolumeToModel() { - delegate.setVolume(formatter.parseToFiatWith2Decimals(volume.get())); + dataModel.setVolume(formatter.parseToFiatWith2Decimals(volume.get())); } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferViewModel.java index 6e00298cc3..c57b8e9fc6 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/trade/takeoffer/TakeOfferViewModel.java @@ -31,7 +31,7 @@ import org.bitcoinj.core.Coin; import javax.inject.Inject; import viewfx.model.ViewModel; -import viewfx.model.support.ActivatableWithDelegate; +import viewfx.model.support.ActivatableWithDataModel; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; @@ -42,7 +42,7 @@ import javafx.beans.property.StringProperty; import static javafx.beans.binding.Bindings.createStringBinding; -class TakeOfferViewModel extends ActivatableWithDelegate implements ViewModel { +class TakeOfferViewModel extends ActivatableWithDataModel implements ViewModel { private String fiatCode; private String amountRange; @@ -92,14 +92,14 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp @Inject - public TakeOfferViewModel(TakeOfferDataModel delegate, BtcValidator btcValidator, BSFormatter formatter) { - super(delegate); + public TakeOfferViewModel(TakeOfferDataModel dataModel, BtcValidator btcValidator, BSFormatter formatter) { + super(dataModel); this.btcValidator = btcValidator; this.formatter = formatter; - this.offerFee = formatter.formatCoinWithCode(delegate.offerFeeAsCoin.get()); - this.networkFee = formatter.formatCoinWithCode(delegate.networkFeeAsCoin.get()); + this.offerFee = formatter.formatCoinWithCode(dataModel.offerFeeAsCoin.get()); + this.networkFee = formatter.formatCoinWithCode(dataModel.networkFeeAsCoin.get()); setupBindings(); setupListeners(); @@ -107,13 +107,13 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp // setOfferBookFilter is a one time call void initWithData(Direction direction, Coin amount, Offer offer) { - delegate.initWithData(amount, offer); + dataModel.initWithData(amount, offer); directionLabel = direction == Direction.BUY ? BSResources.get("shared.buy") : BSResources.get("shared.sell"); fiatCode = offer.getCurrency().getCurrencyCode(); - if (!delegate.isMinAmountLessOrEqualAmount()) { + if (!dataModel.isMinAmountLessOrEqualAmount()) { amountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("takeOffer.validation.amountSmallerThanMinAmount"))); } @@ -127,9 +127,9 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp price = formatter.formatFiatWithCode(offer.getPrice()); paymentLabel = BSResources.get("takeOffer.fundsBox.paymentLabel", offer.getId()); - if (delegate.getAddressEntry() != null) { - addressAsString = delegate.getAddressEntry().getAddress().toString(); - address.set(delegate.getAddressEntry().getAddress()); + if (dataModel.getAddressEntry() != null) { + addressAsString = dataModel.getAddressEntry().getAddress().toString(); + address.set(dataModel.getAddressEntry().getAddress()); } acceptedCountries = formatter.countryLocalesToString(offer.getAcceptedCountries()); @@ -141,17 +141,17 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp } void takeOffer() { - delegate.requestTakeOfferErrorMessage.set(null); - delegate.requestTakeOfferSuccess.set(false); + dataModel.requestTakeOfferErrorMessage.set(null); + dataModel.requestTakeOfferSuccess.set(false); isTakeOfferButtonDisabled.set(true); isTakeOfferSpinnerVisible.set(true); - delegate.takeOffer(); + dataModel.takeOffer(); } void securityDepositInfoDisplayed() { - delegate.securityDepositInfoDisplayed(); + dataModel.securityDepositInfoDisplayed(); } @@ -169,15 +169,15 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp // only allow max 4 decimal places for btc values setAmountToModel(); // reformat input - amount.set(formatter.formatCoin(delegate.amountAsCoin.get())); + amount.set(formatter.formatCoin(dataModel.amountAsCoin.get())); calculateVolume(); - if (!delegate.isMinAmountLessOrEqualAmount()) + if (!dataModel.isMinAmountLessOrEqualAmount()) amountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("takeOffer.validation.amountSmallerThanMinAmount"))); - if (delegate.isAmountLargerThanOfferAmount()) + if (dataModel.isAmountLargerThanOfferAmount()) amountValidationResult.set(new InputValidator.ValidationResult(false, BSResources.get("takeOffer.validation.amountLargerThanOfferAmount"))); } @@ -186,7 +186,7 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp WalletService getWalletService() { - return delegate.getWalletService(); + return dataModel.getWalletService(); } BSFormatter getFormatter() { @@ -206,7 +206,7 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp } String getAmount() { - return formatter.formatCoinWithCode(delegate.amountAsCoin.get()); + return formatter.formatCoinWithCode(dataModel.amountAsCoin.get()); } String getAmountRange() { @@ -254,7 +254,7 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp } Boolean displaySecurityDepositInfo() { - return delegate.displaySecurityDepositInfo(); + return dataModel.displaySecurityDepositInfo(); } @@ -265,12 +265,12 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp if (isBtcInputValid(newValue).isValid) { setAmountToModel(); calculateVolume(); - delegate.calculateTotalToPay(); + dataModel.calculateTotalToPay(); } updateButtonDisableState(); }); - delegate.isWalletFunded.addListener((ov, oldValue, newValue) -> { + dataModel.isWalletFunded.addListener((ov, oldValue, newValue) -> { if (newValue) { updateButtonDisableState(); tabIsClosable.set(false); @@ -278,53 +278,53 @@ class TakeOfferViewModel extends ActivatableWithDelegate imp }); // Binding with Bindings.createObjectBinding does not work because of bi-directional binding - delegate.amountAsCoin.addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin(newValue))); + dataModel.amountAsCoin.addListener((ov, oldValue, newValue) -> amount.set(formatter.formatCoin(newValue))); - delegate.requestTakeOfferErrorMessage.addListener((ov, oldValue, newValue) -> { + dataModel.requestTakeOfferErrorMessage.addListener((ov, oldValue, newValue) -> { if (newValue != null) { isTakeOfferButtonDisabled.set(false); isTakeOfferSpinnerVisible.set(false); } }); - delegate.requestTakeOfferSuccess.addListener((ov, oldValue, newValue) -> { + dataModel.requestTakeOfferSuccess.addListener((ov, oldValue, newValue) -> { isTakeOfferButtonVisible.set(!newValue); isTakeOfferSpinnerVisible.set(false); }); } private void setupBindings() { - volume.bind(createStringBinding(() -> formatter.formatFiatWithCode(delegate.volumeAsFiat.get()), - delegate.volumeAsFiat)); - totalToPay.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.totalToPayAsCoin.get()), - delegate.totalToPayAsCoin)); - securityDeposit.bind(createStringBinding(() -> formatter.formatCoinWithCode(delegate.securityDepositAsCoin + volume.bind(createStringBinding(() -> formatter.formatFiatWithCode(dataModel.volumeAsFiat.get()), + dataModel.volumeAsFiat)); + totalToPay.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.totalToPayAsCoin.get()), + dataModel.totalToPayAsCoin)); + securityDeposit.bind(createStringBinding(() -> formatter.formatCoinWithCode(dataModel.securityDepositAsCoin .get()), - delegate.securityDepositAsCoin)); + dataModel.securityDepositAsCoin)); - totalToPayAsCoin.bind(delegate.totalToPayAsCoin); + totalToPayAsCoin.bind(dataModel.totalToPayAsCoin); - requestTakeOfferErrorMessage.bind(delegate.requestTakeOfferErrorMessage); - showTransactionPublishedScreen.bind(delegate.requestTakeOfferSuccess); - transactionId.bind(delegate.transactionId); - offerIsAvailable.bind(delegate.offerIsAvailable); + requestTakeOfferErrorMessage.bind(dataModel.requestTakeOfferErrorMessage); + showTransactionPublishedScreen.bind(dataModel.requestTakeOfferSuccess); + transactionId.bind(dataModel.transactionId); + offerIsAvailable.bind(dataModel.offerIsAvailable); - btcCode.bind(delegate.btcCode); + btcCode.bind(dataModel.btcCode); } private void calculateVolume() { setAmountToModel(); - delegate.calculateVolume(); + dataModel.calculateVolume(); } private void setAmountToModel() { - delegate.amountAsCoin.set(formatter.parseToCoinWith4Decimals(amount.get())); + dataModel.amountAsCoin.set(formatter.parseToCoinWith4Decimals(amount.get())); } private void updateButtonDisableState() { isTakeOfferButtonDisabled.set(!(isBtcInputValid(amount.get()).isValid && - delegate.isMinAmountLessOrEqualAmount() && - !delegate.isAmountLargerThanOfferAmount() && - delegate.isWalletFunded.get()) + dataModel.isMinAmountLessOrEqualAmount() && + !dataModel.isAmountLargerThanOfferAmount() && + dataModel.isWalletFunded.get()) ); } diff --git a/gui/src/main/java/io/bitsquare/offer/Offer.java b/gui/src/main/java/io/bitsquare/offer/Offer.java index e439a78271..bf9336c11d 100644 --- a/gui/src/main/java/io/bitsquare/offer/Offer.java +++ b/gui/src/main/java/io/bitsquare/offer/Offer.java @@ -64,6 +64,7 @@ public class Offer implements Serializable { private final List acceptedLanguageLocales; private final String bankAccountUID; private final List arbitrators; + private String offerFeePaymentTxID; diff --git a/gui/src/main/java/io/bitsquare/offer/RemoteOfferBook.java b/gui/src/main/java/io/bitsquare/offer/RemoteOfferBook.java index a643cc34e1..fbcae74740 100644 --- a/gui/src/main/java/io/bitsquare/offer/RemoteOfferBook.java +++ b/gui/src/main/java/io/bitsquare/offer/RemoteOfferBook.java @@ -33,7 +33,7 @@ public interface RemoteOfferBook { void addOffer(Offer offer, ResultHandler resultHandler, FaultHandler faultHandler); - void removeOffer(Offer offer); + void removeOffer(Offer offer, ResultHandler resultHandler, FaultHandler faultHandler); void addListener(Listener listener); diff --git a/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBook.java b/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBook.java index 2ed6c7f756..29c579a6b0 100644 --- a/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBook.java +++ b/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferBook.java @@ -115,9 +115,7 @@ public class TomP2POfferBook implements RemoteOfferBook { } } - //TODO remove is failing, probably due Coin or Fiat class (was working before) - // objects are identical but returned object form network might have some problem with serialisation? - public void removeOffer(Offer offer) { + public void removeOffer(Offer offer, ResultHandler resultHandler, FaultHandler faultHandler) { Number160 locationKey = Number160.createHash(offer.getCurrency().getCurrencyCode()); try { final Data offerData = new Data(offer); @@ -130,20 +128,22 @@ public class TomP2POfferBook implements RemoteOfferBook { // We don't test futureRemove.isSuccess() as this API does not fit well to that operation, // it might change in future to something like foundAndRemoved and notFound // See discussion at: https://github.com/tomp2p/TomP2P/issues/57#issuecomment-62069840 - + log.trace("isRemoved? " + futureRemove.isRemoved()); executor.execute(() -> { + resultHandler.handleResult(); offerRepositoryListeners.stream().forEach(listener -> { try { Object offerDataObject = offerData.object(); if (offerDataObject instanceof Offer) { log.trace("Remove offer from DHT was successful. Removed data: [key: " + locationKey + ", " + - "offer: " + (Offer) offerDataObject + "]"); + "offer: " + offerDataObject + "]"); listener.onOfferRemoved((Offer) offerDataObject); } } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); log.error("Remove offer from DHT failed. Error: " + e.getMessage()); + faultHandler.handleFault("Remove offer from DHT failed. Error: " + e.getMessage(), e); } }); writeInvalidationTimestampToDHT(offer.getCurrency().getCurrencyCode()); @@ -153,11 +153,13 @@ public class TomP2POfferBook implements RemoteOfferBook { @Override public void exceptionCaught(Throwable t) throws Exception { log.error("Remove offer from DHT failed. Error: " + t.getMessage()); + faultHandler.handleFault("Remove offer from DHT failed. Error: " + t.getMessage(), t); } }); } catch (IOException e) { e.printStackTrace(); log.error("Remove offer from DHT failed. Error: " + e.getMessage()); + faultHandler.handleFault("Remove offer from DHT failed. Error: " + e.getMessage(), e); } } diff --git a/gui/src/main/java/io/bitsquare/trade/TradeManager.java b/gui/src/main/java/io/bitsquare/trade/TradeManager.java index 04ea0b0f73..b901fb1b50 100644 --- a/gui/src/main/java/io/bitsquare/trade/TradeManager.java +++ b/gui/src/main/java/io/bitsquare/trade/TradeManager.java @@ -31,7 +31,7 @@ import io.bitsquare.offer.Offer; import io.bitsquare.offer.RemoteOfferBook; import io.bitsquare.persistence.Persistence; import io.bitsquare.trade.handlers.TransactionResultHandler; -import io.bitsquare.trade.protocol.createoffer.CreateOfferProtocol; +import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol; import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.offerer.BuyerAcceptsOfferProtocol; import io.bitsquare.trade.protocol.trade.offerer.BuyerAcceptsOfferProtocolListener; @@ -49,6 +49,8 @@ import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage; import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage; import io.bitsquare.user.User; import io.bitsquare.util.task.ErrorMessageHandler; +import io.bitsquare.util.task.FaultHandler; +import io.bitsquare.util.task.ResultHandler; import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; @@ -172,41 +174,34 @@ public class TradeManager { accountSettings.getAcceptedCountries(), accountSettings.getAcceptedLanguageLocales()); - CreateOfferProtocol createOfferCoordinator = new CreateOfferProtocol( + PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol( offer, walletService, - (transactionId) -> { - try { - offer.setOfferFeePaymentTxID(transactionId.getHashAsString()); - addOffer(offer); - resultHandler.onResult(transactionId); - } catch (Exception e) { - errorMessageHandler.handleErrorMessage("Could not save offer. Reason: " + - (e.getCause() != null ? e.getCause().getMessage() : e.toString())); - } + remoteOfferBook, + (transaction) -> { + saveOffer(offer); + resultHandler.onResult(transaction); }, - (message, throwable) -> errorMessageHandler.handleErrorMessage(message), - remoteOfferBook); + (message, throwable) -> errorMessageHandler.handleErrorMessage(message) + ); - createOfferCoordinator.createOffer(); + placeOfferProtocol.placeOffer(); } - private void addOffer(Offer offer) { - if (offers.containsKey(offer.getId())) - log.error("An offer with the id " + offer.getId() + " already exists. "); - + private void saveOffer(Offer offer) { offers.put(offer.getId(), offer); persistOffers(); } - public void removeOffer(Offer offer) { - if (!offers.containsKey(offer.getId())) + public void requestRemoveOffer(Offer offer, ResultHandler resultHandler, FaultHandler faultHandler) { + if (offers.containsKey(offer.getId())) + offers.remove(offer.getId()); + else log.error("offers does not contain the offer with the ID " + offer.getId()); - offers.remove(offer.getId()); persistOffers(); - remoteOfferBook.removeOffer(offer); + remoteOfferBook.removeOffer(offer, resultHandler, faultHandler); } @@ -261,7 +256,7 @@ public class TradeManager { public void onOfferAccepted(Offer offer) { trade.setState(Trade.State.OFFERER_ACCEPTED); persistPendingTrades(); - removeOffer(offer); + requestRemoveOffer(offer); } @Override diff --git a/gui/src/main/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocol.java b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java similarity index 89% rename from gui/src/main/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocol.java rename to gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java index 3145def0d8..5ec17eea24 100644 --- a/gui/src/main/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocol.java +++ b/gui/src/main/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocol.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.createoffer; +package io.bitsquare.trade.protocol.placeoffer; import io.bitsquare.btc.WalletService; import io.bitsquare.offer.Offer; @@ -35,9 +35,9 @@ import org.slf4j.LoggerFactory; * Responsible for coordinating tasks involved in the create offer process. * Executed on UI thread (single threaded) */ -public class CreateOfferProtocol { +public class PlaceOfferProtocol { - private static final Logger log = LoggerFactory.getLogger(CreateOfferProtocol.class); + private static final Logger log = LoggerFactory.getLogger(PlaceOfferProtocol.class); private final Offer offer; private final WalletService walletService; @@ -46,8 +46,8 @@ public class CreateOfferProtocol { private final RemoteOfferBook remoteOfferBook; private int repeatAddOfferCallCounter = 0; - public CreateOfferProtocol(Offer offer, WalletService walletService, TransactionResultHandler resultHandler, - FaultHandler faultHandler, RemoteOfferBook remoteOfferBook) { + public PlaceOfferProtocol(Offer offer, WalletService walletService, RemoteOfferBook remoteOfferBook, TransactionResultHandler resultHandler, + FaultHandler faultHandler) { this.offer = offer; this.walletService = walletService; this.resultHandler = resultHandler; @@ -55,18 +55,16 @@ public class CreateOfferProtocol { this.remoteOfferBook = remoteOfferBook; } - public void createOffer() { + public void placeOffer() { try { validateOffer(); Transaction transaction = createOfferFeeTx(); - TransactionResultHandler resultHandler1 = transaction1 -> addOffer(transaction1); FaultHandler faultHandler1 = (message, throwable) -> faultHandler.handleFault(message, throwable); broadcastCreateOfferFeeTx(transaction, resultHandler1, faultHandler1); - } catch (Throwable t) { + // handled in specific methods } - } // 1. Validate offer data @@ -128,9 +126,11 @@ public class CreateOfferProtocol { // Async // In case of an error: Try again, afterwards give up. void addOffer(Transaction transaction) { + // need to write data before storage, otherwise hash is different when removing offer! + offer.setOfferFeePaymentTxID(transaction.getHashAsString()); + remoteOfferBook.addOffer(offer, () -> { - offer.setOfferFeePaymentTxID(transaction.getHashAsString()); resultHandler.onResult(transaction); }, (message, throwable) -> { diff --git a/gui/src/main/java/viewfx/model/support/ActivatableWithDelegate.java b/gui/src/main/java/viewfx/model/support/ActivatableWithDataModel.java similarity index 79% rename from gui/src/main/java/viewfx/model/support/ActivatableWithDelegate.java rename to gui/src/main/java/viewfx/model/support/ActivatableWithDataModel.java index 174b6b6d75..7178bdb0e1 100644 --- a/gui/src/main/java/viewfx/model/support/ActivatableWithDelegate.java +++ b/gui/src/main/java/viewfx/model/support/ActivatableWithDataModel.java @@ -19,15 +19,15 @@ package viewfx.model.support; import viewfx.model.Activatable; -public abstract class ActivatableWithDelegate extends WithDelegate implements Activatable { +public abstract class ActivatableWithDataModel extends WithDataModel implements Activatable { - public ActivatableWithDelegate(D delegate) { - super(delegate); + public ActivatableWithDataModel(D dataModel) { + super(dataModel); } @Override public final void activate() { - delegate.activate(); + dataModel.activate(); this.doActivate(); } @@ -36,7 +36,7 @@ public abstract class ActivatableWithDelegate extends Wit @Override public final void deactivate() { - delegate.deactivate(); + dataModel.deactivate(); this.doDeactivate(); } diff --git a/gui/src/main/java/viewfx/model/support/WithDelegate.java b/gui/src/main/java/viewfx/model/support/WithDataModel.java similarity index 79% rename from gui/src/main/java/viewfx/model/support/WithDelegate.java rename to gui/src/main/java/viewfx/model/support/WithDataModel.java index eb6842ace7..e1b1ee4059 100644 --- a/gui/src/main/java/viewfx/model/support/WithDelegate.java +++ b/gui/src/main/java/viewfx/model/support/WithDataModel.java @@ -19,11 +19,11 @@ package viewfx.model.support; import static com.google.common.base.Preconditions.checkNotNull; -public abstract class WithDelegate { +public abstract class WithDataModel { - protected final D delegate; + protected final D dataModel; - protected WithDelegate(D delegate) { - this.delegate = checkNotNull(delegate, "Delegate object must not be null"); + protected WithDataModel(D dataModel) { + this.dataModel = checkNotNull(dataModel, "Delegate object must not be null"); } } diff --git a/gui/src/main/java/viewfx/view/support/CachingViewLoader.java b/gui/src/main/java/viewfx/view/support/CachingViewLoader.java index 0020f4fb24..6bc3132ca0 100644 --- a/gui/src/main/java/viewfx/view/support/CachingViewLoader.java +++ b/gui/src/main/java/viewfx/view/support/CachingViewLoader.java @@ -27,11 +27,11 @@ import viewfx.view.ViewLoader; public class CachingViewLoader implements ViewLoader { private final HashMap cache = new HashMap<>(); - private final ViewLoader delegate; + private final ViewLoader viewLoader; @Inject - public CachingViewLoader(ViewLoader delegate) { - this.delegate = delegate; + public CachingViewLoader(ViewLoader viewLoader) { + this.viewLoader = viewLoader; } @Override @@ -39,7 +39,7 @@ public class CachingViewLoader implements ViewLoader { if (cache.containsKey(viewClass)) return cache.get(viewClass); - View view = delegate.load(viewClass); + View view = viewLoader.load(viewClass); cache.put(viewClass, view); return view; } diff --git a/gui/src/test/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocolTest.java b/gui/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java similarity index 88% rename from gui/src/test/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocolTest.java rename to gui/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java index 6fb09fb6e6..5b0d60d744 100644 --- a/gui/src/test/java/io/bitsquare/trade/protocol/createoffer/CreateOfferProtocolTest.java +++ b/gui/src/test/java/io/bitsquare/trade/protocol/placeoffer/PlaceOfferProtocolTest.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.trade.protocol.createoffer; +package io.bitsquare.trade.protocol.placeoffer; import io.bitsquare.arbitrator.Arbitrator; import io.bitsquare.bank.BankAccountType; @@ -76,8 +76,8 @@ import static org.junit.Assert.*; * 4. Start BootstrapNodeMain at localhost with program args: --node.name localhost */ @Ignore -public class CreateOfferProtocolTest { - private static final Logger log = LoggerFactory.getLogger(CreateOfferProtocolTest.class); +public class PlaceOfferProtocolTest { + private static final Logger log = LoggerFactory.getLogger(PlaceOfferProtocolTest.class); private WalletService walletService; private TomP2PMessageService messageService; @@ -201,9 +201,9 @@ public class CreateOfferProtocolTest { throwable.printStackTrace(); fail(throwable.getMessage()); }; - CreateOfferProtocol createOfferCoordinator = getCreateOfferCoordinator(offer); - Transaction transaction = createOfferCoordinator.createOfferFeeTx(); - createOfferCoordinator.broadcastCreateOfferFeeTx(transaction, resultHandler, faultHandler); + PlaceOfferProtocol placeOfferProtocol = getCreateOfferCoordinator(offer); + Transaction transaction = placeOfferProtocol.createOfferFeeTx(); + placeOfferProtocol.broadcastCreateOfferFeeTx(transaction, resultHandler, faultHandler); log.info("Balance post = " + walletService.getBalanceForAddress(address)); } catch (Exception e) { @@ -246,9 +246,9 @@ public class CreateOfferProtocolTest { countDownLatch.countDown(); countDownLatch.countDown(); }; - CreateOfferProtocol createOfferCoordinator = getCreateOfferCoordinator(offer, resultHandler, faultHandler); - Transaction transaction = createOfferCoordinator.createOfferFeeTx(); - createOfferCoordinator.addOffer(transaction); + PlaceOfferProtocol placeOfferProtocol = getPlaceOfferProtocol(offer, resultHandler, faultHandler); + Transaction transaction = placeOfferProtocol.createOfferFeeTx(); + placeOfferProtocol.addOffer(transaction); countDownLatch.await(); log.info("Finished"); } catch (Exception e) { @@ -260,7 +260,7 @@ public class CreateOfferProtocolTest { } @Test - public void createOfferTest() throws InterruptedException { + public void placeOfferTest() throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(1); TransactionResultHandler resultHandler = transaction -> { assertNotNull(transaction); @@ -273,29 +273,29 @@ public class CreateOfferProtocolTest { countDownLatch.countDown(); countDownLatch.countDown(); }; - CreateOfferProtocol createOfferCoordinator = getCreateOfferCoordinator(getOffer(), resultHandler, faultHandler); - createOfferCoordinator.createOffer(); + PlaceOfferProtocol placeOfferProtocol = getPlaceOfferProtocol(getOffer(), resultHandler, faultHandler); + placeOfferProtocol.placeOffer(); countDownLatch.await(); } - - private CreateOfferProtocol getCreateOfferCoordinator(Offer offer) throws InterruptedException { + + private PlaceOfferProtocol getCreateOfferCoordinator(Offer offer) throws InterruptedException { TransactionResultHandler resultHandler = transaction -> log.debug("result transaction=" + transaction.toString()); FaultHandler faultHandler = (message, throwable) -> { log.error(message); throwable.printStackTrace(); log.info("Balance = " + walletService.getBalanceForAddress(walletService.getAddressInfoByTradeID(OFFER_ID).getAddress())); }; - return getCreateOfferCoordinator(offer, resultHandler, faultHandler); + return getPlaceOfferProtocol(offer, resultHandler, faultHandler); } - private CreateOfferProtocol getCreateOfferCoordinator(Offer offer, TransactionResultHandler resultHandler, FaultHandler faultHandler) throws + private PlaceOfferProtocol getPlaceOfferProtocol(Offer offer, TransactionResultHandler resultHandler, FaultHandler faultHandler) throws InterruptedException { - return new CreateOfferProtocol(offer, + return new PlaceOfferProtocol(offer, walletService, + remoteOfferBook, resultHandler, - faultHandler, - remoteOfferBook); + faultHandler); } private Offer getOffer() {