Add OpenOffer

This commit is contained in:
Manfred Karrer 2015-03-09 14:26:17 +01:00
parent 4f6761a6d9
commit 9c8ae1bc10
12 changed files with 160 additions and 110 deletions

View file

@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.offer;
import io.bitsquare.offer.Direction; import io.bitsquare.offer.Direction;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.offer.OpenOffer;
import io.bitsquare.trade.TradeManager; import io.bitsquare.trade.TradeManager;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import io.bitsquare.util.handlers.ErrorMessageHandler; import io.bitsquare.util.handlers.ErrorMessageHandler;
@ -44,8 +45,8 @@ class OffersDataModel implements Activatable, DataModel {
private final TradeManager tradeManager; private final TradeManager tradeManager;
private final User user; private final User user;
private final ObservableList<OfferListItem> list = FXCollections.observableArrayList(); private final ObservableList<OpenOfferListItem> list = FXCollections.observableArrayList();
private final MapChangeListener<String, Offer> offerMapChangeListener; private final MapChangeListener<String, OpenOffer> offerMapChangeListener;
@Inject @Inject
@ -55,19 +56,19 @@ class OffersDataModel implements Activatable, DataModel {
this.offerMapChangeListener = change -> { this.offerMapChangeListener = change -> {
if (change.wasAdded()) if (change.wasAdded())
list.add(new OfferListItem(change.getValueAdded())); list.add(new OpenOfferListItem(change.getValueAdded()));
else if (change.wasRemoved()) else if (change.wasRemoved())
list.removeIf(e -> e.getOffer().getId().equals(change.getValueRemoved().getId())); list.removeIf(e -> e.getOpenOffer().getId().equals(change.getValueRemoved().getId()));
}; };
} }
@Override @Override
public void activate() { public void activate() {
list.clear(); list.clear();
list.addAll(tradeManager.getOpenOffers().values().stream().map(OfferListItem::new).collect(Collectors.toList())); list.addAll(tradeManager.getOpenOffers().values().stream().map(OpenOfferListItem::new).collect(Collectors.toList()));
// we sort by date, earliest first // we sort by date, earliest first
list.sort((o1, o2) -> o2.getOffer().getCreationDate().compareTo(o1.getOffer().getCreationDate())); list.sort((o1, o2) -> o2.getOpenOffer().getOffer().getCreationDate().compareTo(o1.getOpenOffer().getOffer().getCreationDate()));
tradeManager.getOpenOffers().addListener(offerMapChangeListener); tradeManager.getOpenOffers().addListener(offerMapChangeListener);
} }
@ -77,16 +78,17 @@ class OffersDataModel implements Activatable, DataModel {
tradeManager.getOpenOffers().removeListener(offerMapChangeListener); tradeManager.getOpenOffers().removeListener(offerMapChangeListener);
} }
void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { void removeOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
tradeManager.requestRemoveOffer(offer, resultHandler, errorMessageHandler); tradeManager.requestRemoveOpenOffer(offerId, resultHandler, errorMessageHandler);
} }
public ObservableList<OfferListItem> getList() { public ObservableList<OpenOfferListItem> getList() {
return list; return list;
} }
public Direction getDirection(Offer offer) { public Direction getDirection(OpenOffer openOffer) {
Offer offer = openOffer.getOffer();
return offer.getMessagePublicKey().equals(user.getMessagePublicKey()) ? return offer.getMessagePublicKey().equals(user.getMessagePublicKey()) ?
offer.getDirection() : offer.getMirroredDirection(); offer.getDirection() : offer.getMirroredDirection();
} }

View file

@ -35,8 +35,8 @@ import javafx.util.Callback;
@FxmlView @FxmlView
public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewModel> { public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewModel> {
@FXML TableView<OfferListItem> table; @FXML TableView<OpenOfferListItem> table;
@FXML TableColumn<OfferListItem, OfferListItem> priceColumn, amountColumn, volumeColumn, @FXML TableColumn<OpenOfferListItem, OpenOfferListItem> priceColumn, amountColumn, volumeColumn,
directionColumn, dateColumn, offerIdColumn, removeItemColumn; directionColumn, dateColumn, offerIdColumn, removeItemColumn;
@Inject @Inject
@ -63,14 +63,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
table.setItems(model.getList()); table.setItems(model.getList());
} }
private void removeOffer(OfferListItem item) { private void removeOpenOffer(String offerId) {
model.removeOffer(item); model.removeOpenOffer(offerId);
} }
private void openOfferDetails(OfferListItem item) { private void openOfferDetails(OpenOfferListItem item) {
// TODO Open popup with details view // TODO Open popup with details view
log.debug("openOfferDetails " + item); log.debug("openOfferDetails " + item);
Utilities.copyToClipboard(item.getOffer().getId()); Utilities.copyToClipboard(item.getOpenOffer().getId());
Popups.openWarningPopup("Under construction", Popups.openWarningPopup("Under construction",
"The offer ID was copied to the clipboard. " + "The offer ID was copied to the clipboard. " +
"Use that to identify your trading peer in the IRC chat room \n\n" + "Use that to identify your trading peer in the IRC chat room \n\n" +
@ -80,16 +80,16 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setOfferIdColumnCellFactory() { private void setOfferIdColumnCellFactory() {
offerIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue())); offerIdColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
offerIdColumn.setCellFactory( offerIdColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, OfferListItem>>() { new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem, OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call(TableColumn<OfferListItem, public TableCell<OpenOfferListItem, OpenOfferListItem> call(TableColumn<OpenOfferListItem,
OfferListItem> column) { OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
private Hyperlink hyperlink; private Hyperlink hyperlink;
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null && !empty) { if (item != null && !empty) {
@ -112,14 +112,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setDateColumnCellFactory() { private void setDateColumnCellFactory() {
dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); dateColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
dateColumn.setCellFactory( dateColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
OfferListItem>>() { OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call( public TableCell<OpenOfferListItem, OpenOfferListItem> call(
TableColumn<OfferListItem, OfferListItem> column) { TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null) if (item != null)
setText(model.getDate(item)); setText(model.getDate(item));
@ -134,14 +134,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setAmountColumnCellFactory() { private void setAmountColumnCellFactory() {
amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
amountColumn.setCellFactory( amountColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
OfferListItem>>() { OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call( public TableCell<OpenOfferListItem, OpenOfferListItem> call(
TableColumn<OfferListItem, OfferListItem> column) { TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
setText(model.getAmount(item)); setText(model.getAmount(item));
} }
@ -153,14 +153,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setPriceColumnCellFactory() { private void setPriceColumnCellFactory() {
priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); priceColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
priceColumn.setCellFactory( priceColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
OfferListItem>>() { OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call( public TableCell<OpenOfferListItem, OpenOfferListItem> call(
TableColumn<OfferListItem, OfferListItem> column) { TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
setText(model.getPrice(item)); setText(model.getPrice(item));
} }
@ -172,14 +172,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setVolumeColumnCellFactory() { private void setVolumeColumnCellFactory() {
volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); volumeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
volumeColumn.setCellFactory( volumeColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
OfferListItem>>() { OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call( public TableCell<OpenOfferListItem, OpenOfferListItem> call(
TableColumn<OfferListItem, OfferListItem> column) { TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null) if (item != null)
setText(model.getVolume(item)); setText(model.getVolume(item));
@ -194,14 +194,14 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setDirectionColumnCellFactory() { private void setDirectionColumnCellFactory() {
directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); directionColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
directionColumn.setCellFactory( directionColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem,
OfferListItem>>() { OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call( public TableCell<OpenOfferListItem, OpenOfferListItem> call(
TableColumn<OfferListItem, OfferListItem> column) { TableColumn<OpenOfferListItem, OpenOfferListItem> column) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
setText(model.getDirectionLabel(item)); setText(model.getDirectionLabel(item));
} }
@ -213,11 +213,11 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
private void setRemoveColumnCellFactory() { private void setRemoveColumnCellFactory() {
removeItemColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue())); removeItemColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue()));
removeItemColumn.setCellFactory( removeItemColumn.setCellFactory(
new Callback<TableColumn<OfferListItem, OfferListItem>, TableCell<OfferListItem, OfferListItem>>() { new Callback<TableColumn<OpenOfferListItem, OpenOfferListItem>, TableCell<OpenOfferListItem, OpenOfferListItem>>() {
@Override @Override
public TableCell<OfferListItem, OfferListItem> call(TableColumn<OfferListItem, public TableCell<OpenOfferListItem, OpenOfferListItem> call(TableColumn<OpenOfferListItem,
OfferListItem> directionColumn) { OpenOfferListItem> directionColumn) {
return new TableCell<OfferListItem, OfferListItem>() { return new TableCell<OpenOfferListItem, OpenOfferListItem>() {
final ImageView iconView = new ImageView(); final ImageView iconView = new ImageView();
final Button button = new Button(); final Button button = new Button();
@ -229,11 +229,11 @@ public class OffersView extends ActivatableViewAndModel<GridPane, OffersViewMode
} }
@Override @Override
public void updateItem(final OfferListItem item, boolean empty) { public void updateItem(final OpenOfferListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null) { if (item != null) {
button.setOnAction(event -> removeOffer(item)); button.setOnAction(event -> removeOpenOffer(item.getOpenOffer().getId()));
setGraphic(button); setGraphic(button);
} }
else { else {

View file

@ -44,8 +44,8 @@ class OffersViewModel extends ActivatableWithDataModel<OffersDataModel> implemen
} }
void removeOffer(OfferListItem item) { void removeOpenOffer(String offerId) {
dataModel.removeOffer(item.getOffer(), dataModel.removeOpenOffer(offerId,
() -> { () -> {
// visual feedback? // visual feedback?
log.debug("Remove offer was successful"); log.debug("Remove offer was successful");
@ -56,32 +56,32 @@ class OffersViewModel extends ActivatableWithDataModel<OffersDataModel> implemen
}); });
} }
public ObservableList<OfferListItem> getList() { public ObservableList<OpenOfferListItem> getList() {
return dataModel.getList(); return dataModel.getList();
} }
String getTradeId(OfferListItem item) { String getTradeId(OpenOfferListItem item) {
return item.getOffer().getId(); return item.getOpenOffer().getId();
} }
String getAmount(OfferListItem item) { String getAmount(OpenOfferListItem item) {
return (item != null) ? formatter.formatAmountWithMinAmount(item.getOffer()) : ""; return (item != null) ? formatter.formatAmountWithMinAmount(item.getOpenOffer().getOffer()) : "";
} }
String getPrice(OfferListItem item) { String getPrice(OpenOfferListItem item) {
return (item != null) ? formatter.formatFiat(item.getOffer().getPrice()) : ""; return (item != null) ? formatter.formatFiat(item.getOpenOffer().getOffer().getPrice()) : "";
} }
String getVolume(OfferListItem item) { String getVolume(OpenOfferListItem item) {
return (item != null) ? formatter.formatVolumeWithMinVolume(item.getOffer()) : ""; return (item != null) ? formatter.formatVolumeWithMinVolume(item.getOpenOffer().getOffer()) : "";
} }
String getDirectionLabel(OfferListItem item) { String getDirectionLabel(OpenOfferListItem item) {
return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getOffer())) : ""; return (item != null) ? formatter.formatDirection(dataModel.getDirection(item.getOpenOffer())) : "";
} }
String getDate(OfferListItem item) { String getDate(OpenOfferListItem item) {
return formatter.formatDateTime(item.getOffer().getCreationDate()); return formatter.formatDateTime(item.getOpenOffer().getOffer().getCreationDate());
} }
} }

View file

@ -17,20 +17,20 @@
package io.bitsquare.gui.main.portfolio.offer; package io.bitsquare.gui.main.portfolio.offer;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.OpenOffer;
/** /**
* We could remove that wrapper if it is not needed for additional UI only fields. * We could remove that wrapper if it is not needed for additional UI only fields.
*/ */
class OfferListItem { class OpenOfferListItem {
private final Offer offer; private final OpenOffer openOffer;
public OfferListItem(Offer offer) { public OpenOfferListItem(OpenOffer openOffer) {
this.offer = offer; this.openOffer = openOffer;
} }
public Offer getOffer() { public OpenOffer getOpenOffer() {
return offer; return openOffer;
} }
} }

View file

@ -114,8 +114,8 @@ class OfferBookDataModel implements Activatable, DataModel {
btcCode.unbind(); btcCode.unbind();
} }
void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { void removeOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
tradeManager.requestRemoveOffer(offer, resultHandler, errorMessageHandler); tradeManager.requestRemoveOpenOffer(offerId, resultHandler, errorMessageHandler);
} }
void calculateVolume() { void calculateVolume() {

View file

@ -468,8 +468,8 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
if (model.isMyOffer(offer)) { if (model.isMyOffer(offer)) {
iconView.setId("image-remove"); iconView.setId("image-remove");
title = "Remove"; title = "Remove";
button.setOnAction(event -> model.removeOffer(item button.setOnAction(event -> model.removeOpenOffer(item
.getOffer())); .getOffer().getId()));
} }
else { else {
if (offer.getDirection() == Direction.SELL) if (offer.getDirection() == Direction.SELL)

View file

@ -103,8 +103,8 @@ class OfferBookViewModel extends ActivatableWithDataModel<OfferBookDataModel> im
(newValue))); (newValue)));
} }
void removeOffer(Offer offer) { void removeOpenOffer(String offerId) {
dataModel.removeOffer(offer, dataModel.removeOpenOffer(offerId,
() -> { () -> {
// visual feedback? // visual feedback?
log.debug("Remove offer was successful"); log.debug("Remove offer was successful");

View file

@ -76,9 +76,13 @@ public class Offer implements Serializable {
private final String bankAccountUID; private final String bankAccountUID;
private final List<Arbitrator> arbitrators; private final List<Arbitrator> arbitrators;
// Mutable property. Has to be set before offer is save in DHT as it changes the objects hash!
private String offerFeePaymentTxID; private String offerFeePaymentTxID;
private State state = State.UNKNOWN;
private transient ObjectProperty<State> stateProperty; // don't access directly, use getStateProperty() // Those state properties are transient and only used at runtime!
private transient State state = State.UNKNOWN;
// don't access directly as it might be null; use getStateProperty() which creates an object if not instantiated
private transient ObjectProperty<State> stateProperty;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////

View file

@ -139,7 +139,7 @@ public class OfferBook {
country = bankAccount.getCountry(); country = bankAccount.getCountry();
fiatCode = bankAccount.getCurrency().getCurrencyCode(); fiatCode = bankAccount.getCurrency().getCurrencyCode();
// TODO check why that was used // TODO check why that was used (probably just for update triggering, if so refactor that)
//offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country)); //offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country));
} }
else { else {

View file

@ -0,0 +1,43 @@
/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.offer;
import java.io.Serializable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OpenOffer implements Serializable {
private static final long serialVersionUID = -7523483764145982933L;
private static final Logger log = LoggerFactory.getLogger(OpenOffer.class);
private final Offer offer;
public OpenOffer( Offer offer) {
this.offer = offer;
}
public Offer getOffer() {
return offer;
}
public String getId() {
return offer.getId();
}
}

View file

@ -27,6 +27,7 @@ import io.bitsquare.network.Peer;
import io.bitsquare.offer.Direction; import io.bitsquare.offer.Direction;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.offer.OfferBookService; import io.bitsquare.offer.OfferBookService;
import io.bitsquare.offer.OpenOffer;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.trade.handlers.TransactionResultHandler; import io.bitsquare.trade.handlers.TransactionResultHandler;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol; import io.bitsquare.trade.protocol.placeoffer.PlaceOfferProtocol;
@ -94,7 +95,7 @@ public class TradeManager {
private final Map<String, BuyerAcceptsOfferProtocol> offererAsBuyerProtocolMap = new HashMap<>(); private final Map<String, BuyerAcceptsOfferProtocol> offererAsBuyerProtocolMap = new HashMap<>();
private final Map<String, RequestIsOfferAvailableProtocol> requestIsOfferAvailableProtocolMap = new HashMap<>(); private final Map<String, RequestIsOfferAvailableProtocol> requestIsOfferAvailableProtocolMap = new HashMap<>();
private final ObservableMap<String, Offer> openOffers = FXCollections.observableHashMap(); private final ObservableMap<String, OpenOffer> openOffers = FXCollections.observableHashMap();
private final ObservableMap<String, Trade> pendingTrades = FXCollections.observableHashMap(); private final ObservableMap<String, Trade> pendingTrades = FXCollections.observableHashMap();
private final ObservableMap<String, Trade> closedTrades = FXCollections.observableHashMap(); private final ObservableMap<String, Trade> closedTrades = FXCollections.observableHashMap();
@ -121,9 +122,9 @@ public class TradeManager {
this.signatureService = signatureService; this.signatureService = signatureService;
this.offerBookService = offerBookService; this.offerBookService = offerBookService;
Object offersObject = persistence.read(this, "offers"); Object openOffersObject = persistence.read(this, "openOffers");
if (offersObject instanceof Map) { if (openOffersObject instanceof Map) {
openOffers.putAll((Map<String, Offer>) offersObject); openOffers.putAll((Map<String, OpenOffer>) openOffersObject);
} }
Object pendingTradesObject = persistence.read(this, "pendingTrades"); Object pendingTradesObject = persistence.read(this, "pendingTrades");
@ -177,12 +178,13 @@ public class TradeManager {
accountSettings.getAcceptedCountries(), accountSettings.getAcceptedCountries(),
accountSettings.getAcceptedLanguageLocales()); accountSettings.getAcceptedLanguageLocales());
PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol( PlaceOfferProtocol placeOfferProtocol = new PlaceOfferProtocol(
offer, offer,
walletService, walletService,
offerBookService, offerBookService,
(transaction) -> { (transaction) -> {
saveOffer(offer); saveOpenOffer(new OpenOffer(offer));
resultHandler.handleResult(transaction); resultHandler.handleResult(transaction);
}, },
(message, throwable) -> errorMessageHandler.handleErrorMessage(message) (message, throwable) -> errorMessageHandler.handleErrorMessage(message)
@ -191,22 +193,22 @@ public class TradeManager {
placeOfferProtocol.placeOffer(); placeOfferProtocol.placeOffer();
} }
private void saveOffer(Offer offer) { private void saveOpenOffer(OpenOffer openOffer) {
openOffers.put(offer.getId(), offer); openOffers.put(openOffer.getId(), openOffer);
persistOffers(); persistOpenOffers();
} }
public void requestRemoveOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { public void requestRemoveOpenOffer(String offerId, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
offerBookService.removeOffer(offer, offerBookService.removeOffer(openOffers.get(offerId).getOffer(),
() -> { () -> {
if (openOffers.containsKey(offer.getId())) { if (openOffers.containsKey(offerId)) {
openOffers.remove(offer.getId()); openOffers.remove(offerId);
persistOffers(); persistOpenOffers();
resultHandler.handleResult(); resultHandler.handleResult();
} }
else { else {
log.error("Locally stored offers does not contain the offer with the ID " + offer.getId()); log.error("Locally stored offers does not contain the offer with the ID " + offerId);
errorMessageHandler.handleErrorMessage("Locally stored offers does not contain the offer with the ID " + offer.getId()); errorMessageHandler.handleErrorMessage("Locally stored offers does not contain the offer with the ID " + offerId);
} }
}, },
(message, throwable) -> errorMessageHandler.handleErrorMessage(message)); (message, throwable) -> errorMessageHandler.handleErrorMessage(message));
@ -247,8 +249,7 @@ public class TradeManager {
private void createOffererAsBuyerProtocol(String offerId, Peer sender) { private void createOffererAsBuyerProtocol(String offerId, Peer sender) {
log.trace("createOffererAsBuyerProtocol offerId = " + offerId); log.trace("createOffererAsBuyerProtocol offerId = " + offerId);
if (openOffers.containsKey(offerId)) { if (openOffers.containsKey(offerId)) {
Offer offer = openOffers.get(offerId); Offer offer = openOffers.get(offerId).getOffer();
Trade trade = createTrade(offer); Trade trade = createTrade(offer);
currentPendingTrade = trade; currentPendingTrade = trade;
@ -264,7 +265,7 @@ public class TradeManager {
public void onOfferAccepted(Offer offer) { public void onOfferAccepted(Offer offer) {
trade.setState(Trade.State.OFFERER_ACCEPTED); trade.setState(Trade.State.OFFERER_ACCEPTED);
persistPendingTrades(); persistPendingTrades();
requestRemoveOffer(offer, requestRemoveOpenOffer(offer.getId(),
() -> log.debug("remove was successful"), () -> log.debug("remove was successful"),
(message) -> log.error(message)); (message) -> log.error(message));
} }
@ -535,7 +536,7 @@ public class TradeManager {
// Getters // Getters
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public ObservableMap<String, Offer> getOpenOffers() { public ObservableMap<String, OpenOffer> getOpenOffers() {
return openOffers; return openOffers;
} }
@ -563,8 +564,8 @@ public class TradeManager {
// Private // Private
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void persistOffers() { private void persistOpenOffers() {
persistence.write(this, "offers", (Map<String, Offer>) new HashMap<>(openOffers)); persistence.write(this, "openOffers", (Map<String, OpenOffer>) new HashMap<>(openOffers));
} }
private void persistPendingTrades() { private void persistPendingTrades() {