synchronize access to pending trades data model

Co-authored-by: XMRZombie <monerozombie@proton.me>
This commit is contained in:
woodser 2025-02-12 07:34:32 -05:00
parent cd71bcdde7
commit b72159fcf8
2 changed files with 38 additions and 26 deletions

View file

@ -332,15 +332,17 @@ public class PendingTradesDataModel extends ActivatableDataModel {
} }
// add shown trades to list // add shown trades to list
list.clear(); synchronized (list) {
list.addAll(tradeManager.getObservableList().stream() list.clear();
.filter(trade -> isTradeShown(trade)) list.addAll(tradeManager.getObservableList().stream()
.map(trade -> new PendingTradesListItem(trade, btcFormatter)) .filter(trade -> isTradeShown(trade))
.collect(Collectors.toList())); .map(trade -> new PendingTradesListItem(trade, btcFormatter))
} .collect(Collectors.toList()));
// we sort by date, earliest first // we sort by date, earliest first
list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate())); list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate()));
}
}
selectBestItem(); selectBestItem();
} }
@ -350,17 +352,21 @@ public class PendingTradesDataModel extends ActivatableDataModel {
} }
private void selectBestItem() { private void selectBestItem() {
if (list.size() == 1) synchronized (list) {
doSelectItem(list.get(0)); if (list.size() == 1)
else if (list.size() > 1 && (selectedItemProperty.get() == null || !list.contains(selectedItemProperty.get()))) doSelectItem(list.get(0));
doSelectItem(list.get(0)); else if (list.size() > 1 && (selectedItemProperty.get() == null || !list.contains(selectedItemProperty.get())))
else if (list.size() == 0) doSelectItem(list.get(0));
doSelectItem(null); else if (list.size() == 0)
doSelectItem(null);
}
} }
private void selectItemByTradeId(String tradeId) { private void selectItemByTradeId(String tradeId) {
if (activated) { if (activated) {
list.stream().filter(e -> e.getTrade().getId().equals(tradeId)).findAny().ifPresent(this::doSelectItem); synchronized (list) {
list.stream().filter(e -> e.getTrade().getId().equals(tradeId)).findAny().ifPresent(this::doSelectItem);
}
} }
} }

View file

@ -363,7 +363,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
} }
private void updateMoveTradeToFailedColumnState() { private void updateMoveTradeToFailedColumnState() {
UserThread.execute(() -> moveTradeToFailedColumn.setVisible(model.dataModel.list.stream().anyMatch(item -> isMaybeInvalidTrade(item.getTrade())))); UserThread.execute(() -> {
synchronized (model.dataModel.list) {
moveTradeToFailedColumn.setVisible(model.dataModel.list.stream().anyMatch(item -> isMaybeInvalidTrade(item.getTrade())));
}
});
} }
private boolean isMaybeInvalidTrade(Trade trade) { private boolean isMaybeInvalidTrade(Trade trade) {
@ -420,16 +424,18 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void updateNewChatMessagesByTradeMap() { private void updateNewChatMessagesByTradeMap() {
model.dataModel.list.forEach(t -> { synchronized (model.dataModel.list) {
Trade trade = t.getTrade(); model.dataModel.list.forEach(t -> {
synchronized (trade.getChatMessages()) { Trade trade = t.getTrade();
newChatMessagesByTradeMap.put(trade.getId(), synchronized (trade.getChatMessages()) {
trade.getChatMessages().stream() newChatMessagesByTradeMap.put(trade.getId(),
.filter(m -> !m.isWasDisplayed()) trade.getChatMessages().stream()
.filter(m -> !m.isSystemMessage()) .filter(m -> !m.isWasDisplayed())
.count()); .filter(m -> !m.isSystemMessage())
} .count());
}); }
});
}
} }
private void openChat(Trade trade) { private void openChat(Trade trade) {