From 8a4d1cb6db49d2abc5e27b67ba143597a3ff48d2 Mon Sep 17 00:00:00 2001 From: chimp1984 Date: Tue, 2 Nov 2021 15:21:19 +0100 Subject: [PATCH] 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 200aaee119..796347bd81 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.List; 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 abstract class ChartView 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 @@ public abstract class ChartView { 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 734aacf448..34ed7ba6ac 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.desktop.components.chart.ChartView; 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.DoubleProperty; 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 @@ public class PriceChartView extends ChartView { 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 9bcb4bf046..0a85c5e329 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.desktop.components.chart.ChartView; 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.LongProperty; 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 @@ public class VolumeChartView extends ChartView { 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 a55876df83..200777090f 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.desktop.components.chart.ChartView; 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.LongProperty; 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 @@ public class DaoChartView extends ChartView { 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); + })); } }