From 6b89bf0da9286af5380e8e77668994a79cae798f Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 02:54:53 +0100 Subject: [PATCH 1/8] Use async methods with CompletableFuture in viewmodel to avoid that slow operations in data model are running on UI thread --- .../dashboard/price/PriceChartView.java | 46 +++++++++++++++---- .../dashboard/price/PriceChartViewModel.java | 22 +++++---- .../dashboard/volume/VolumeChartView.java | 34 +++++++++++--- .../volume/VolumeChartViewModel.java | 17 +++---- 4 files changed, 86 insertions(+), 33 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java index 0245b028a01..d5130c31991 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.UserThread; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -124,14 +126,13 @@ protected void defineAndAddActiveSeries() { @Override protected void activateSeries(XYChart.Series series) { super.activateSeries(series); - String seriesId = getSeriesId(series); if (seriesId.equals(getSeriesId(seriesBsqUsdPrice))) { - seriesBsqUsdPrice.getData().setAll(model.getBsqUsdPriceChartData()); + applyBsqUsdPriceChartDataAsync(); } else if (seriesId.equals(getSeriesId(seriesBsqBtcPrice))) { - seriesBsqBtcPrice.getData().setAll(model.getBsqBtcPriceChartData()); + applyBsqBtcPriceChartData(); } else if (seriesId.equals(getSeriesId(seriesBtcUsdPrice))) { - seriesBtcUsdPrice.getData().setAll(model.getBtcUsdPriceChartData()); + applyBtcUsdPriceChartData(); } } @@ -143,16 +144,43 @@ protected void activateSeries(XYChart.Series series) { @Override protected void applyData() { if (activeSeries.contains(seriesBsqUsdPrice)) { - seriesBsqUsdPrice.getData().setAll(model.getBsqUsdPriceChartData()); + applyBsqUsdPriceChartDataAsync(); } if (activeSeries.contains(seriesBsqBtcPrice)) { - seriesBsqBtcPrice.getData().setAll(model.getBsqBtcPriceChartData()); + applyBsqBtcPriceChartData(); } if (activeSeries.contains(seriesBtcUsdPrice)) { - seriesBtcUsdPrice.getData().setAll(model.getBtcUsdPriceChartData()); + applyBtcUsdPriceChartData(); } - averageBsqBtcPriceProperty.set(model.averageBsqBtcPrice()); - averageBsqUsdPriceProperty.set(model.averageBsqUsdPrice()); + model.averageBsqBtcPrice() + .whenComplete((data, t) -> + UserThread.execute(() -> + averageBsqBtcPriceProperty.set(data))); + model.averageBsqUsdPrice() + .whenComplete((data, t) -> + UserThread.execute(() -> + averageBsqUsdPriceProperty.set(data))); + } + + private void applyBsqUsdPriceChartDataAsync() { + model.getBsqUsdPriceChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesBsqUsdPrice.getData().setAll(data))); + } + + private void applyBtcUsdPriceChartData() { + model.getBtcUsdPriceChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesBtcUsdPrice.getData().setAll(data))); + } + + private void applyBsqBtcPriceChartData() { + model.getBsqBtcPriceChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesBsqBtcPrice.getData().setAll(data))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartViewModel.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartViewModel.java index 6074a279d30..42d8996b6bf 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartViewModel.java @@ -32,6 +32,7 @@ import java.text.DecimalFormat; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import lombok.extern.slf4j.Slf4j; @@ -53,12 +54,12 @@ public PriceChartViewModel(PriceChartDataModel dataModel) { // Average price from timeline selection /////////////////////////////////////////////////////////////////////////////////////////// - double averageBsqUsdPrice() { - return dataModel.averageBsqUsdPrice(); + CompletableFuture averageBsqUsdPrice() { + return CompletableFuture.supplyAsync(() -> dataModel.averageBsqUsdPrice()); } - double averageBsqBtcPrice() { - return dataModel.averageBsqBtcPrice(); + CompletableFuture averageBsqBtcPrice() { + return CompletableFuture.supplyAsync(() -> dataModel.averageBsqBtcPrice()); } @@ -66,16 +67,17 @@ public PriceChartViewModel(PriceChartDataModel dataModel) { // Chart data /////////////////////////////////////////////////////////////////////////////////////////// - List> getBsqUsdPriceChartData() { - return toChartDoubleData(dataModel.getBsqUsdPriceByInterval()); + + CompletableFuture>> getBsqUsdPriceChartData() { + return CompletableFuture.supplyAsync(() -> toChartDoubleData(dataModel.getBsqUsdPriceByInterval())); } - List> getBsqBtcPriceChartData() { - return toChartDoubleData(dataModel.getBsqBtcPriceByInterval()); + CompletableFuture>> getBsqBtcPriceChartData() { + return CompletableFuture.supplyAsync(() -> toChartDoubleData(dataModel.getBsqBtcPriceByInterval())); } - List> getBtcUsdPriceChartData() { - return toChartDoubleData(dataModel.getBtcUsdPriceByInterval()); + CompletableFuture>> getBtcUsdPriceChartData() { + return CompletableFuture.supplyAsync(() -> toChartDoubleData(dataModel.getBtcUsdPriceByInterval())); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java index 2dff0a73ea4..7b190413d90 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.UserThread; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -122,9 +124,9 @@ protected void activateSeries(XYChart.Series series) { super.activateSeries(series); if (getSeriesId(series).equals(getSeriesId(seriesUsdVolume))) { - seriesUsdVolume.getData().setAll(model.getUsdVolumeChartData()); + applyUsdVolumeChartData(); } else if (getSeriesId(series).equals(getSeriesId(seriesBtcVolume))) { - seriesBtcVolume.getData().setAll(model.getBtcVolumeChartData()); + applyBtcVolumeChartData(); } } @@ -136,13 +138,33 @@ protected void activateSeries(XYChart.Series series) { @Override protected void applyData() { if (activeSeries.contains(seriesUsdVolume)) { - seriesUsdVolume.getData().setAll(model.getUsdVolumeChartData()); + applyUsdVolumeChartData(); } if (activeSeries.contains(seriesBtcVolume)) { - seriesBtcVolume.getData().setAll(model.getBtcVolumeChartData()); + applyBtcVolumeChartData(); } - usdVolumeProperty.set(model.getUsdVolume()); - btcVolumeProperty.set(model.getBtcVolume()); + model.getUsdVolume() + .whenComplete((data, t) -> + UserThread.execute(() -> + usdVolumeProperty.set(data))); + model.getBtcVolume() + .whenComplete((data, t) -> + UserThread.execute(() -> + btcVolumeProperty.set(data))); + } + + private void applyBtcVolumeChartData() { + model.getBtcVolumeChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesBtcVolume.getData().setAll(data))); + } + + private void applyUsdVolumeChartData() { + model.getUsdVolumeChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesUsdVolume.getData().setAll(data))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartViewModel.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartViewModel.java index 142d2f3912d..55c8a2e4708 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartViewModel.java @@ -32,6 +32,7 @@ import java.text.DecimalFormat; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import lombok.extern.slf4j.Slf4j; @@ -54,12 +55,12 @@ public VolumeChartViewModel(VolumeChartDataModel dataModel) { // Total amounts /////////////////////////////////////////////////////////////////////////////////////////// - long getUsdVolume() { - return dataModel.getUsdVolume(); + CompletableFuture getUsdVolume() { + return CompletableFuture.supplyAsync(dataModel::getUsdVolume); } - long getBtcVolume() { - return dataModel.getBtcVolume(); + CompletableFuture getBtcVolume() { + return CompletableFuture.supplyAsync(dataModel::getBtcVolume); } @@ -67,12 +68,12 @@ long getBtcVolume() { // Chart data /////////////////////////////////////////////////////////////////////////////////////////// - List> getUsdVolumeChartData() { - return toChartLongData(dataModel.getUsdVolumeByInterval()); + CompletableFuture>> getUsdVolumeChartData() { + return CompletableFuture.supplyAsync(() -> toChartLongData(dataModel.getUsdVolumeByInterval())); } - List> getBtcVolumeChartData() { - return toChartLongData(dataModel.getBtcVolumeByInterval()); + CompletableFuture>> getBtcVolumeChartData() { + return CompletableFuture.supplyAsync(() -> toChartLongData(dataModel.getBtcVolumeByInterval())); } From a4b106cd4a2df205d70bbf6f60d34ccc3dcfceeb Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 03:02:29 +0100 Subject: [PATCH 2/8] Apply async handling to DaoChartView as well --- .../dao/economy/supply/dao/DaoChartView.java | 52 +++++++++++++++---- .../economy/supply/dao/DaoChartViewModel.java | 41 ++++++++------- 2 files changed, 63 insertions(+), 30 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java index 8cf2e7cc88a..752f7491a19 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.UserThread; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -179,33 +181,63 @@ protected void applyData() { applyProofOfBurn(); } - compensationAmountProperty.set(model.getCompensationAmount()); - reimbursementAmountProperty.set(model.getReimbursementAmount()); - bsqTradeFeeAmountProperty.set(model.getBsqTradeFeeAmount()); - proofOfBurnAmountProperty.set(model.getProofOfBurnAmount()); + model.getCompensationAmount() + .whenComplete((data, t) -> + UserThread.execute(() -> + compensationAmountProperty.set(data))); + model.getReimbursementAmount() + .whenComplete((data, t) -> + UserThread.execute(() -> + reimbursementAmountProperty.set(data))); + model.getBsqTradeFeeAmount() + .whenComplete((data, t) -> + UserThread.execute(() -> + bsqTradeFeeAmountProperty.set(data))); + model.getProofOfBurnAmount() + .whenComplete((data, t) -> + UserThread.execute(() -> + proofOfBurnAmountProperty.set(data))); } private void applyTotalIssued() { - seriesTotalIssued.getData().setAll(model.getTotalIssuedChartData()); + model.getTotalIssuedChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesTotalIssued.getData().setAll(data))); } private void applyCompensation() { - seriesCompensation.getData().setAll(model.getCompensationChartData()); + model.getCompensationChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesCompensation.getData().setAll(data))); } private void applyReimbursement() { - seriesReimbursement.getData().setAll(model.getReimbursementChartData()); + model.getReimbursementChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesReimbursement.getData().setAll(data))); } private void applyTotalBurned() { - seriesTotalBurned.getData().setAll(model.getTotalBurnedChartData()); + model.getTotalBurnedChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesTotalBurned.getData().setAll(data))); } private void applyBsqTradeFee() { - seriesBsqTradeFee.getData().setAll(model.getBsqTradeFeeChartData()); + model.getBsqTradeFeeChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesBsqTradeFee.getData().setAll(data))); } private void applyProofOfBurn() { - seriesProofOfBurn.getData().setAll(model.getProofOfBurnChartData()); + model.getProofOfBurnChartData() + .whenComplete((data, t) -> + UserThread.execute(() -> + seriesProofOfBurn.getData().setAll(data))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartViewModel.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartViewModel.java index 6acca876a18..70429d33e25 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartViewModel.java @@ -31,6 +31,7 @@ import java.text.DecimalFormat; import java.util.List; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; @@ -53,28 +54,28 @@ public DaoChartViewModel(DaoChartDataModel dataModel, BsqFormatter bsqFormatter) // Chart data /////////////////////////////////////////////////////////////////////////////////////////// - List> getTotalIssuedChartData() { - return toChartData(dataModel.getTotalIssuedByInterval()); + CompletableFuture>> getTotalIssuedChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getTotalIssuedByInterval())); } - List> getCompensationChartData() { - return toChartData(dataModel.getCompensationByInterval()); + CompletableFuture>> getCompensationChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getCompensationByInterval())); } - List> getReimbursementChartData() { - return toChartData(dataModel.getReimbursementByInterval()); + CompletableFuture>> getReimbursementChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getReimbursementByInterval())); } - List> getTotalBurnedChartData() { - return toChartData(dataModel.getTotalBurnedByInterval()); + CompletableFuture>> getTotalBurnedChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getTotalBurnedByInterval())); } - List> getBsqTradeFeeChartData() { - return toChartData(dataModel.getBsqTradeFeeByInterval()); + CompletableFuture>> getBsqTradeFeeChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getBsqTradeFeeByInterval())); } - List> getProofOfBurnChartData() { - return toChartData(dataModel.getProofOfBurnByInterval()); + CompletableFuture>> getProofOfBurnChartData() { + return CompletableFuture.supplyAsync(() -> toChartData(dataModel.getProofOfBurnByInterval())); } @@ -107,19 +108,19 @@ protected String getTooltipValueConverter(Number value) { // DaoChartDataModel delegates /////////////////////////////////////////////////////////////////////////////////////////// - long getCompensationAmount() { - return dataModel.getCompensationAmount(); + CompletableFuture getCompensationAmount() { + return CompletableFuture.supplyAsync(dataModel::getCompensationAmount); } - long getReimbursementAmount() { - return dataModel.getReimbursementAmount(); + CompletableFuture getReimbursementAmount() { + return CompletableFuture.supplyAsync(dataModel::getReimbursementAmount); } - long getBsqTradeFeeAmount() { - return dataModel.getBsqTradeFeeAmount(); + CompletableFuture getBsqTradeFeeAmount() { + return CompletableFuture.supplyAsync(dataModel::getBsqTradeFeeAmount); } - long getProofOfBurnAmount() { - return dataModel.getProofOfBurnAmount(); + CompletableFuture getProofOfBurnAmount() { + return CompletableFuture.supplyAsync(dataModel::getProofOfBurnAmount); } } From b61d64e1ea8bbc38b645a89a39702f5fe4cfb0df Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 03:29:49 +0100 Subject: [PATCH 3/8] Add mapToUserThread method to ChartView For initial rendering we need to delay a bit and wait until async calls are completed. --- .../desktop/components/chart/ChartView.java | 30 +++++++++++++++---- .../dashboard/price/PriceChartView.java | 16 +++++----- .../dashboard/volume/VolumeChartView.java | 14 ++++----- .../dao/economy/supply/dao/DaoChartView.java | 30 +++++++++---------- 4 files changed, 51 insertions(+), 39 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java index da278463d0e..200aaee1196 100644 --- a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java +++ b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java @@ -107,8 +107,9 @@ public abstract class ChartView yAxisWidthListener; private EventHandler dividerMouseDraggedEventHandler; - private StringProperty fromProperty = new SimpleStringProperty(); - private StringProperty toProperty = new SimpleStringProperty(); + private final StringProperty fromProperty = new SimpleStringProperty(); + private final StringProperty toProperty = new SimpleStringProperty(); + private boolean dataApplied; /////////////////////////////////////////////////////////////////////////////////////////// @@ -219,18 +220,16 @@ public void initialize() { @Override public void activate() { timelineNavigation.setDividerPositions(model.getDividerPositions()[0], model.getDividerPositions()[1]); - UserThread.execute(this::applyTimeLineNavigationLabels); - UserThread.execute(this::onTimelineChanged); TemporalAdjuster temporalAdjuster = model.getTemporalAdjuster(); applyTemporalAdjuster(temporalAdjuster); findTimeIntervalToggleByTemporalAdjuster(temporalAdjuster).ifPresent(timeIntervalToggleGroup::selectToggle); defineAndAddActiveSeries(); - applyData(); + applyData(); //todo initBoundsForTimelineNavigation(); - updateChartAfterDataChange(); + updateChartAfterDataChange(); //todo // Apply listeners and handlers root.widthProperty().addListener(widthListener); @@ -771,4 +770,23 @@ private Optional findTimeIntervalToggleByTemporalAdjuster(TemporalAdjust protected String getSeriesId(XYChart.Series series) { return series.getName(); } + + protected void mapToUserThread(Runnable command) { + UserThread.execute(() -> { + command.run(); + onDataApplied(); + }); + } + + // For the async handling we need to wait until we get the data applied and then still delay a bit otherwise + // the UI does not get rendered at first start + protected void onDataApplied() { + if (!dataApplied) { + dataApplied = true; + UserThread.execute(() -> { + applyTimeLineNavigationLabels(); + onTimelineChanged(); + }); + } + } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java index d5130c31991..734aacf448f 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java @@ -21,8 +21,6 @@ import bisq.core.locale.Res; -import bisq.common.UserThread; - import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -39,8 +37,8 @@ @Slf4j public class PriceChartView extends ChartView { private XYChart.Series seriesBsqUsdPrice, seriesBsqBtcPrice, seriesBtcUsdPrice; - private DoubleProperty averageBsqUsdPriceProperty = new SimpleDoubleProperty(); - private DoubleProperty averageBsqBtcPriceProperty = new SimpleDoubleProperty(); + private final DoubleProperty averageBsqUsdPriceProperty = new SimpleDoubleProperty(); + private final DoubleProperty averageBsqBtcPriceProperty = new SimpleDoubleProperty(); @Inject public PriceChartView(PriceChartViewModel model) { @@ -155,32 +153,32 @@ protected void applyData() { model.averageBsqBtcPrice() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> averageBsqBtcPriceProperty.set(data))); model.averageBsqUsdPrice() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> averageBsqUsdPriceProperty.set(data))); } private void applyBsqUsdPriceChartDataAsync() { model.getBsqUsdPriceChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesBsqUsdPrice.getData().setAll(data))); } private void applyBtcUsdPriceChartData() { model.getBtcUsdPriceChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesBtcUsdPrice.getData().setAll(data))); } private void applyBsqBtcPriceChartData() { model.getBsqBtcPriceChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesBsqBtcPrice.getData().setAll(data))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java index 7b190413d90..9bcb4bf0461 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java @@ -21,8 +21,6 @@ import bisq.core.locale.Res; -import bisq.common.UserThread; - import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -40,8 +38,8 @@ public class VolumeChartView extends ChartView { private XYChart.Series seriesUsdVolume, seriesBtcVolume; - private LongProperty usdVolumeProperty = new SimpleLongProperty(); - private LongProperty btcVolumeProperty = new SimpleLongProperty(); + private final LongProperty usdVolumeProperty = new SimpleLongProperty(); + private final LongProperty btcVolumeProperty = new SimpleLongProperty(); @Inject public VolumeChartView(VolumeChartViewModel model) { @@ -146,25 +144,25 @@ protected void applyData() { model.getUsdVolume() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> usdVolumeProperty.set(data))); model.getBtcVolume() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> btcVolumeProperty.set(data))); } private void applyBtcVolumeChartData() { model.getBtcVolumeChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesBtcVolume.getData().setAll(data))); } private void applyUsdVolumeChartData() { model.getUsdVolumeChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesUsdVolume.getData().setAll(data))); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java index 752f7491a19..a55876df836 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java @@ -21,8 +21,6 @@ import bisq.core.locale.Res; -import bisq.common.UserThread; - import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -38,10 +36,10 @@ @Slf4j public class DaoChartView extends ChartView { - private LongProperty compensationAmountProperty = new SimpleLongProperty(); - private LongProperty reimbursementAmountProperty = new SimpleLongProperty(); - private LongProperty bsqTradeFeeAmountProperty = new SimpleLongProperty(); - private LongProperty proofOfBurnAmountProperty = new SimpleLongProperty(); + private final LongProperty compensationAmountProperty = new SimpleLongProperty(); + private final LongProperty reimbursementAmountProperty = new SimpleLongProperty(); + private final LongProperty bsqTradeFeeAmountProperty = new SimpleLongProperty(); + private final LongProperty proofOfBurnAmountProperty = new SimpleLongProperty(); private XYChart.Series seriesBsqTradeFee, seriesProofOfBurn, seriesCompensation, seriesReimbursement, seriesTotalIssued, seriesTotalBurned; @@ -183,61 +181,61 @@ protected void applyData() { model.getCompensationAmount() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> compensationAmountProperty.set(data))); model.getReimbursementAmount() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> reimbursementAmountProperty.set(data))); model.getBsqTradeFeeAmount() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> bsqTradeFeeAmountProperty.set(data))); model.getProofOfBurnAmount() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> proofOfBurnAmountProperty.set(data))); } private void applyTotalIssued() { model.getTotalIssuedChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesTotalIssued.getData().setAll(data))); } private void applyCompensation() { model.getCompensationChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesCompensation.getData().setAll(data))); } private void applyReimbursement() { model.getReimbursementChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesReimbursement.getData().setAll(data))); } private void applyTotalBurned() { model.getTotalBurnedChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesTotalBurned.getData().setAll(data))); } private void applyBsqTradeFee() { model.getBsqTradeFeeChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesBsqTradeFee.getData().setAll(data))); } private void applyProofOfBurn() { model.getProofOfBurnChartData() .whenComplete((data, t) -> - UserThread.execute(() -> + mapToUserThread(() -> seriesProofOfBurn.getData().setAll(data))); } } From cf9e49134addf677c4935f02d982c26087557920 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 12:58:19 +0100 Subject: [PATCH 4/8] Add shutDown method to ClockWatcher and shut it down at shutdown --- common/src/main/java/bisq/common/ClockWatcher.java | 2 +- core/src/main/java/bisq/core/app/BisqExecutable.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/bisq/common/ClockWatcher.java b/common/src/main/java/bisq/common/ClockWatcher.java index 1b673535fad..36c54cbc0b0 100644 --- a/common/src/main/java/bisq/common/ClockWatcher.java +++ b/common/src/main/java/bisq/common/ClockWatcher.java @@ -79,7 +79,7 @@ public void start() { } } - public void stop() { + public void shutDown() { timer.stop(); timer = null; counter = 0; diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 9e14df37f9e..0ab2895819f 100644 --- a/core/src/main/java/bisq/core/app/BisqExecutable.java +++ b/core/src/main/java/bisq/core/app/BisqExecutable.java @@ -33,6 +33,7 @@ import bisq.network.p2p.P2PService; +import bisq.common.ClockWatcher; import bisq.common.UserThread; import bisq.common.app.AppModule; import bisq.common.config.BisqHelpFormatter; @@ -228,6 +229,7 @@ public void gracefulShutDown(ResultHandler resultHandler) { } try { + injector.getInstance(ClockWatcher.class).shutDown(); injector.getInstance(OpenBsqSwapOfferService.class).shutDown(); injector.getInstance(PriceFeedService.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown(); From 67741f0d0ec14b1e814039e345cc8d89d2ce3998 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 14:18:00 +0100 Subject: [PATCH 5/8] Add DEFAULT_LOG_LEVEL field --- common/src/main/java/bisq/common/app/Log.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/bisq/common/app/Log.java b/common/src/main/java/bisq/common/app/Log.java index a594292289c..efef9ec0e3e 100644 --- a/common/src/main/java/bisq/common/app/Log.java +++ b/common/src/main/java/bisq/common/app/Log.java @@ -31,6 +31,7 @@ public class Log { private static Logger logbackLogger; + public static final Level DEFAULT_LOG_LEVEL = Level.INFO; public static void setLevel(Level logLevel) { logbackLogger.setLevel(logLevel); @@ -67,23 +68,7 @@ public static void setup(String fileName) { logbackLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); logbackLogger.addAppender(appender); - logbackLogger.setLevel(Level.INFO); - - // log errors in separate file - // not working as expected still.... damn logback... - /* FileAppender errorAppender = new FileAppender(); - errorAppender.setEncoder(encoder); - errorAppender.setName("Error"); - errorAppender.setContext(loggerContext); - errorAppender.setFile(fileName + "_error.log"); - LevelFilter levelFilter = new LevelFilter(); - levelFilter.setLevel(Level.ERROR); - levelFilter.setOnMatch(FilterReply.ACCEPT); - levelFilter.setOnMismatch(FilterReply.DENY); - levelFilter.start(); - errorAppender.addFilter(levelFilter); - errorAppender.start(); - logbackLogger.addAppender(errorAppender);*/ + logbackLogger.setLevel(DEFAULT_LOG_LEVEL); } public static void setCustomLogLevel(String pattern, Level logLevel) { From a00667bbc248096d76a57458d46a0c45954d72e8 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 15:20:45 +0100 Subject: [PATCH 6/8] Clean up log --- .../bisq/network/p2p/storage/P2PDataStorage.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java index 4cd72787c5d..00e26d4912c 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java @@ -1064,20 +1064,18 @@ private boolean hasSequenceNrIncreased(int newSequenceNumber, ByteArray hashOfDa + newSequenceNumber + " / storedSequenceNumber=" + storedSequenceNumber + " / hashOfData=" + hashOfData.toString());*/ return true; } else if (newSequenceNumber == storedSequenceNumber) { - String msg; if (newSequenceNumber == 0) { - msg = "Sequence number is equal to the stored one and both are 0." + - "That is expected for network_messages which never got updated (mailbox msg)."; + log.debug("Sequence number is equal to the stored one and both are 0." + + "That is expected for network_messages which never got updated (mailbox msg)."); } else { - msg = "Sequence number is equal to the stored one. sequenceNumber = " - + newSequenceNumber + " / storedSequenceNumber=" + storedSequenceNumber; + log.debug("Sequence number is equal to the stored one. sequenceNumber = {} / storedSequenceNumber={}", + newSequenceNumber, storedSequenceNumber); } - log.debug(msg); return false; } else { - log.debug("Sequence number is invalid. sequenceNumber = " - + newSequenceNumber + " / storedSequenceNumber=" + storedSequenceNumber + "\n" + - "That can happen if the data owner gets an old delayed data storage message."); + log.debug("Sequence number is invalid. sequenceNumber = {} / storedSequenceNumber={} " + + "That can happen if the data owner gets an old delayed data storage message.", + newSequenceNumber, storedSequenceNumber); return false; } } else { From 8a4d1cb6db49d2abc5e27b67ba143597a3ff48d2 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 15:21:19 +0100 Subject: [PATCH 7/8] Return CompletableFuture once applyData is completed with all calls. --- .../desktop/components/chart/ChartView.java | 32 +++-- .../dashboard/price/PriceChartView.java | 82 +++++++---- .../dashboard/volume/VolumeChartView.java | 61 ++++---- .../dao/economy/supply/dao/DaoChartView.java | 135 +++++++++++------- 4 files changed, 190 insertions(+), 120 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java index 200aaee1196..796347bd81d 100644 --- a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java +++ b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java @@ -73,6 +73,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import lombok.Setter; @@ -226,11 +227,8 @@ public void activate() { findTimeIntervalToggleByTemporalAdjuster(temporalAdjuster).ifPresent(timeIntervalToggleGroup::selectToggle); defineAndAddActiveSeries(); - applyData(); //todo initBoundsForTimelineNavigation(); - updateChartAfterDataChange(); //todo - // Apply listeners and handlers root.widthProperty().addListener(widthListener); xAxis.getChildrenUnmodifiable().addListener(nodeListChangeListener); @@ -554,7 +552,7 @@ protected void activateSeries(XYChart.Series series) { chart.getData().add(series); activeSeries.add(series); legendToggleBySeriesName.get(getSeriesId(series)).setSelected(true); - updateChartAfterDataChange(); + applyDataAndUpdate(); } @@ -562,7 +560,17 @@ protected void activateSeries(XYChart.Series series) { // Data /////////////////////////////////////////////////////////////////////////////////////////// - protected abstract void applyData(); + protected abstract CompletableFuture applyData(); + + private void applyDataAndUpdate() { + long ts = System.currentTimeMillis(); + applyData().whenComplete((r, t) -> { + log.debug("applyData took {}", System.currentTimeMillis() - ts); + long ts2 = System.currentTimeMillis(); + updateChartAfterDataChange(); + log.debug("updateChartAfterDataChange took {}", System.currentTimeMillis() - ts2); + }); + } /** * Implementations define which series will be used for setBoundsForTimelineNavigation @@ -588,16 +596,14 @@ private void onTimeIntervalChanged(Toggle newValue) { TemporalAdjusterModel.Interval interval = (TemporalAdjusterModel.Interval) newValue.getUserData(); applyTemporalAdjuster(interval.getAdjuster()); model.invalidateCache(); - applyData(); - updateChartAfterDataChange(); + applyDataAndUpdate(); } private void onTimelineChanged() { updateTimeLinePositions(); model.invalidateCache(); - applyData(); - updateChartAfterDataChange(); + applyDataAndUpdate();//3 } private void updateTimeLinePositions() { @@ -635,8 +641,7 @@ private void onSelectLegendToggle(XYChart.Series series) { if (isSelected) { chart.getData().add(series); activeSeries.add(series); - //model.invalidateCache(); - applyData(); + applyDataAndUpdate(); if (isRadioButtonBehaviour) { // We support different y-axis formats only if isRadioButtonBehaviour is set, otherwise we would get @@ -646,9 +651,8 @@ private void onSelectLegendToggle(XYChart.Series series) { } else if (!isRadioButtonBehaviour) { // if isRadioButtonBehaviour we have removed it already via the code above chart.getData().remove(series); activeSeries.remove(series); - + updateChartAfterDataChange(); } - updateChartAfterDataChange(); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -785,7 +789,7 @@ protected void onDataApplied() { dataApplied = true; UserThread.execute(() -> { applyTimeLineNavigationLabels(); - onTimelineChanged(); + updateTimeLinePositions(); }); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java index 734aacf448f..34ed7ba6ac3 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/price/PriceChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.util.CompletableFutureUtils; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -29,8 +31,12 @@ import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.SimpleDoubleProperty; +import javafx.collections.ObservableList; + +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; @@ -121,64 +127,80 @@ protected void defineAndAddActiveSeries() { onSetYAxisFormatter(seriesBsqUsdPrice); } - @Override - protected void activateSeries(XYChart.Series series) { - super.activateSeries(series); - String seriesId = getSeriesId(series); - if (seriesId.equals(getSeriesId(seriesBsqUsdPrice))) { - applyBsqUsdPriceChartDataAsync(); - } else if (seriesId.equals(getSeriesId(seriesBsqBtcPrice))) { - applyBsqBtcPriceChartData(); - } else if (seriesId.equals(getSeriesId(seriesBtcUsdPrice))) { - applyBtcUsdPriceChartData(); - } - } - /////////////////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////////////////// @Override - protected void applyData() { + protected CompletableFuture applyData() { + List> allFutures = new ArrayList<>(); + if (activeSeries.contains(seriesBsqUsdPrice)) { - applyBsqUsdPriceChartDataAsync(); + CompletableFuture task1Done = new CompletableFuture<>(); + allFutures.add(task1Done); + applyBsqUsdPriceChartDataAsync(task1Done); } if (activeSeries.contains(seriesBsqBtcPrice)) { - applyBsqBtcPriceChartData(); + CompletableFuture task2Done = new CompletableFuture<>(); + allFutures.add(task2Done); + applyBsqBtcPriceChartData(task2Done); } if (activeSeries.contains(seriesBtcUsdPrice)) { - applyBtcUsdPriceChartData(); + CompletableFuture task3Done = new CompletableFuture<>(); + allFutures.add(task3Done); + applyBtcUsdPriceChartData(task3Done); } + CompletableFuture task4Done = new CompletableFuture<>(); + allFutures.add(task4Done); model.averageBsqBtcPrice() .whenComplete((data, t) -> - mapToUserThread(() -> - averageBsqBtcPriceProperty.set(data))); + mapToUserThread(() -> { + averageBsqBtcPriceProperty.set(data); + task4Done.complete(true); + })); + + CompletableFuture task5Done = new CompletableFuture<>(); + allFutures.add(task5Done); model.averageBsqUsdPrice() .whenComplete((data, t) -> - mapToUserThread(() -> - averageBsqUsdPriceProperty.set(data))); + mapToUserThread(() -> { + averageBsqUsdPriceProperty.set(data); + task5Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> { + return true; + }); } - private void applyBsqUsdPriceChartDataAsync() { + private void applyBsqUsdPriceChartDataAsync(CompletableFuture completeFuture) { model.getBsqUsdPriceChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesBsqUsdPrice.getData().setAll(data))); + mapToUserThread(() -> { + ObservableList> data1 = seriesBsqUsdPrice.getData(); + data1.setAll(data); + completeFuture.complete(true); + }) + ); } - private void applyBtcUsdPriceChartData() { + private void applyBtcUsdPriceChartData(CompletableFuture completeFuture) { model.getBtcUsdPriceChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesBtcUsdPrice.getData().setAll(data))); + mapToUserThread(() -> { + seriesBtcUsdPrice.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyBsqBtcPriceChartData() { + private void applyBsqBtcPriceChartData(CompletableFuture completeFuture) { model.getBsqBtcPriceChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesBsqBtcPrice.getData().setAll(data))); + mapToUserThread(() -> { + seriesBsqBtcPrice.getData().setAll(data); + completeFuture.complete(true); + })); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java index 9bcb4bf0461..0a85c5e3296 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/dashboard/volume/VolumeChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.util.CompletableFutureUtils; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -29,8 +31,10 @@ import javafx.beans.property.ReadOnlyLongProperty; import javafx.beans.property.SimpleLongProperty; +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; @@ -117,52 +121,61 @@ protected void defineAndAddActiveSeries() { onSetYAxisFormatter(seriesUsdVolume); } - @Override - protected void activateSeries(XYChart.Series series) { - super.activateSeries(series); - - if (getSeriesId(series).equals(getSeriesId(seriesUsdVolume))) { - applyUsdVolumeChartData(); - } else if (getSeriesId(series).equals(getSeriesId(seriesBtcVolume))) { - applyBtcVolumeChartData(); - } - } - /////////////////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////////////////// @Override - protected void applyData() { + protected CompletableFuture applyData() { + List> allFutures = new ArrayList<>(); if (activeSeries.contains(seriesUsdVolume)) { - applyUsdVolumeChartData(); + CompletableFuture task1Done = new CompletableFuture<>(); + allFutures.add(task1Done); + applyUsdVolumeChartData(task1Done); } if (activeSeries.contains(seriesBtcVolume)) { - applyBtcVolumeChartData(); + CompletableFuture task2Done = new CompletableFuture<>(); + allFutures.add(task2Done); + applyBtcVolumeChartData(task2Done); } + CompletableFuture task3Done = new CompletableFuture<>(); + allFutures.add(task3Done); model.getUsdVolume() .whenComplete((data, t) -> - mapToUserThread(() -> - usdVolumeProperty.set(data))); + mapToUserThread(() -> { + usdVolumeProperty.set(data); + task3Done.complete(true); + })); + + CompletableFuture task4Done = new CompletableFuture<>(); + allFutures.add(task4Done); model.getBtcVolume() .whenComplete((data, t) -> - mapToUserThread(() -> - btcVolumeProperty.set(data))); + mapToUserThread(() -> { + btcVolumeProperty.set(data); + task4Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> true); } - private void applyBtcVolumeChartData() { + private void applyBtcVolumeChartData(CompletableFuture completeFuture) { model.getBtcVolumeChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesBtcVolume.getData().setAll(data))); + mapToUserThread(() -> { + seriesBtcVolume.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyUsdVolumeChartData() { + private void applyUsdVolumeChartData(CompletableFuture completeFuture) { model.getUsdVolumeChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesUsdVolume.getData().setAll(data))); + mapToUserThread(() -> { + seriesUsdVolume.getData().setAll(data); + completeFuture.complete(true); + })); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java index a55876df836..200777090f9 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/dao/DaoChartView.java @@ -21,6 +21,8 @@ import bisq.core.locale.Res; +import bisq.common.util.CompletableFutureUtils; + import javax.inject.Inject; import javafx.scene.chart.XYChart; @@ -29,8 +31,10 @@ import javafx.beans.property.ReadOnlyLongProperty; import javafx.beans.property.SimpleLongProperty; +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; @@ -134,108 +138,135 @@ protected void defineAndAddActiveSeries() { activateSeries(seriesTotalBurned); } - @Override - protected void activateSeries(XYChart.Series series) { - super.activateSeries(series); - - if (getSeriesId(series).equals(getSeriesId(seriesTotalIssued))) { - applyTotalIssued(); - } else if (getSeriesId(series).equals(getSeriesId(seriesCompensation))) { - applyCompensation(); - } else if (getSeriesId(series).equals(getSeriesId(seriesReimbursement))) { - applyReimbursement(); - } else if (getSeriesId(series).equals(getSeriesId(seriesTotalBurned))) { - applyTotalBurned(); - } else if (getSeriesId(series).equals(getSeriesId(seriesBsqTradeFee))) { - applyBsqTradeFee(); - } else if (getSeriesId(series).equals(getSeriesId(seriesProofOfBurn))) { - applyProofOfBurn(); - } - } - /////////////////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////////////////// @Override - protected void applyData() { + protected CompletableFuture applyData() { + List> allFutures = new ArrayList<>(); if (activeSeries.contains(seriesTotalIssued)) { - applyTotalIssued(); + CompletableFuture task1Done = new CompletableFuture<>(); + allFutures.add(task1Done); + applyTotalIssued(task1Done); } if (activeSeries.contains(seriesCompensation)) { - applyCompensation(); + CompletableFuture task2Done = new CompletableFuture<>(); + allFutures.add(task2Done); + applyCompensation(task2Done); } if (activeSeries.contains(seriesReimbursement)) { - applyReimbursement(); + CompletableFuture task3Done = new CompletableFuture<>(); + allFutures.add(task3Done); + applyReimbursement(task3Done); } if (activeSeries.contains(seriesTotalBurned)) { - applyTotalBurned(); + CompletableFuture task4Done = new CompletableFuture<>(); + allFutures.add(task4Done); + applyTotalBurned(task4Done); } if (activeSeries.contains(seriesBsqTradeFee)) { - applyBsqTradeFee(); + CompletableFuture task5Done = new CompletableFuture<>(); + allFutures.add(task5Done); + applyBsqTradeFee(task5Done); } if (activeSeries.contains(seriesProofOfBurn)) { - applyProofOfBurn(); + CompletableFuture task6Done = new CompletableFuture<>(); + allFutures.add(task6Done); + applyProofOfBurn(task6Done); } + CompletableFuture task7Done = new CompletableFuture<>(); + allFutures.add(task7Done); model.getCompensationAmount() .whenComplete((data, t) -> - mapToUserThread(() -> - compensationAmountProperty.set(data))); + mapToUserThread(() -> { + compensationAmountProperty.set(data); + task7Done.complete(true); + })); + + CompletableFuture task8Done = new CompletableFuture<>(); + allFutures.add(task8Done); model.getReimbursementAmount() .whenComplete((data, t) -> - mapToUserThread(() -> - reimbursementAmountProperty.set(data))); + mapToUserThread(() -> { + reimbursementAmountProperty.set(data); + task8Done.complete(true); + })); + + CompletableFuture task9Done = new CompletableFuture<>(); + allFutures.add(task9Done); model.getBsqTradeFeeAmount() .whenComplete((data, t) -> - mapToUserThread(() -> - bsqTradeFeeAmountProperty.set(data))); + mapToUserThread(() -> { + bsqTradeFeeAmountProperty.set(data); + task9Done.complete(true); + })); + + CompletableFuture task10Done = new CompletableFuture<>(); + allFutures.add(task10Done); model.getProofOfBurnAmount() .whenComplete((data, t) -> - mapToUserThread(() -> - proofOfBurnAmountProperty.set(data))); + mapToUserThread(() -> { + proofOfBurnAmountProperty.set(data); + task10Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> true); } - private void applyTotalIssued() { + private void applyTotalIssued(CompletableFuture completeFuture) { model.getTotalIssuedChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesTotalIssued.getData().setAll(data))); + mapToUserThread(() -> { + seriesTotalIssued.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyCompensation() { + private void applyCompensation(CompletableFuture completeFuture) { model.getCompensationChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesCompensation.getData().setAll(data))); + mapToUserThread(() -> { + seriesCompensation.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyReimbursement() { + private void applyReimbursement(CompletableFuture completeFuture) { model.getReimbursementChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesReimbursement.getData().setAll(data))); + mapToUserThread(() -> { + seriesReimbursement.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyTotalBurned() { + private void applyTotalBurned(CompletableFuture completeFuture) { model.getTotalBurnedChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesTotalBurned.getData().setAll(data))); + mapToUserThread(() -> { + seriesTotalBurned.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyBsqTradeFee() { + private void applyBsqTradeFee(CompletableFuture completeFuture) { model.getBsqTradeFeeChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesBsqTradeFee.getData().setAll(data))); + mapToUserThread(() -> { + seriesBsqTradeFee.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyProofOfBurn() { + private void applyProofOfBurn(CompletableFuture completeFuture) { model.getProofOfBurnChartData() .whenComplete((data, t) -> - mapToUserThread(() -> - seriesProofOfBurn.getData().setAll(data))); + mapToUserThread(() -> { + seriesProofOfBurn.getData().setAll(data); + completeFuture.complete(true); + })); } } From 2eae94e22a70c13a0d1ccbdf52861e9f10910be8 Mon Sep 17 00:00:00 2001 From: Christoph Atteneder Date: Tue, 9 Nov 2021 20:30:14 +0100 Subject: [PATCH 8/8] Add missing space --- .../src/main/java/bisq/desktop/components/chart/ChartView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java index 796347bd81d..98018b0fedf 100644 --- a/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java +++ b/desktop/src/main/java/bisq/desktop/components/chart/ChartView.java @@ -603,7 +603,7 @@ private void onTimelineChanged() { updateTimeLinePositions(); model.invalidateCache(); - applyDataAndUpdate();//3 + applyDataAndUpdate(); //3 } private void updateTimeLinePositions() {