diff --git a/common/src/main/java/bisq/common/ClockWatcher.java b/common/src/main/java/bisq/common/ClockWatcher.java index 1b673535fa..36c54cbc0b 100644 --- a/common/src/main/java/bisq/common/ClockWatcher.java +++ b/common/src/main/java/bisq/common/ClockWatcher.java @@ -79,7 +79,7 @@ public class ClockWatcher { } } - public void stop() { + public void shutDown() { timer.stop(); timer = null; counter = 0; diff --git a/common/src/main/java/bisq/common/app/Log.java b/common/src/main/java/bisq/common/app/Log.java index a594292289..efef9ec0e3 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 @@ import ch.qos.logback.core.util.FileSize; 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 class Log { 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) { diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 9e14df37f9..0ab2895819 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.core.trade.txproof.xmr.XmrTxProofService; 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 abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet } try { + injector.getInstance(ClockWatcher.class).shutDown(); injector.getInstance(OpenBsqSwapOfferService.class).shutDown(); injector.getInstance(PriceFeedService.class).shutDown(); injector.getInstance(ArbitratorManager.class).shutDown(); 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 da278463d0..98018b0fed 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; @@ -107,8 +108,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,19 +221,14 @@ 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 @@ -589,16 +596,14 @@ public abstract class ChartView 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(); + 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 0245b028a0..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,16 +31,20 @@ 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; @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) { @@ -121,38 +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))) { - seriesBsqUsdPrice.getData().setAll(model.getBsqUsdPriceChartData()); - } else if (seriesId.equals(getSeriesId(seriesBsqBtcPrice))) { - seriesBsqBtcPrice.getData().setAll(model.getBsqBtcPriceChartData()); - } else if (seriesId.equals(getSeriesId(seriesBtcUsdPrice))) { - seriesBtcUsdPrice.getData().setAll(model.getBtcUsdPriceChartData()); - } - } - /////////////////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////////////////// @Override - protected void applyData() { + protected CompletableFuture applyData() { + List> allFutures = new ArrayList<>(); + if (activeSeries.contains(seriesBsqUsdPrice)) { - seriesBsqUsdPrice.getData().setAll(model.getBsqUsdPriceChartData()); + CompletableFuture task1Done = new CompletableFuture<>(); + allFutures.add(task1Done); + applyBsqUsdPriceChartDataAsync(task1Done); } if (activeSeries.contains(seriesBsqBtcPrice)) { - seriesBsqBtcPrice.getData().setAll(model.getBsqBtcPriceChartData()); + CompletableFuture task2Done = new CompletableFuture<>(); + allFutures.add(task2Done); + applyBsqBtcPriceChartData(task2Done); } if (activeSeries.contains(seriesBtcUsdPrice)) { - seriesBtcUsdPrice.getData().setAll(model.getBtcUsdPriceChartData()); + CompletableFuture task3Done = new CompletableFuture<>(); + allFutures.add(task3Done); + applyBtcUsdPriceChartData(task3Done); } - averageBsqBtcPriceProperty.set(model.averageBsqBtcPrice()); - averageBsqUsdPriceProperty.set(model.averageBsqUsdPrice()); + CompletableFuture task4Done = new CompletableFuture<>(); + allFutures.add(task4Done); + model.averageBsqBtcPrice() + .whenComplete((data, t) -> + mapToUserThread(() -> { + averageBsqBtcPriceProperty.set(data); + task4Done.complete(true); + })); + + CompletableFuture task5Done = new CompletableFuture<>(); + allFutures.add(task5Done); + model.averageBsqUsdPrice() + .whenComplete((data, t) -> + mapToUserThread(() -> { + averageBsqUsdPriceProperty.set(data); + task5Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> { + return true; + }); + } + + private void applyBsqUsdPriceChartDataAsync(CompletableFuture completeFuture) { + model.getBsqUsdPriceChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + ObservableList> data1 = seriesBsqUsdPrice.getData(); + data1.setAll(data); + completeFuture.complete(true); + }) + ); + } + + private void applyBtcUsdPriceChartData(CompletableFuture completeFuture) { + model.getBtcUsdPriceChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesBtcUsdPrice.getData().setAll(data); + completeFuture.complete(true); + })); + } + + private void applyBsqBtcPriceChartData(CompletableFuture completeFuture) { + model.getBsqBtcPriceChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesBsqBtcPrice.getData().setAll(data); + completeFuture.complete(true); + })); } } 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 6074a279d3..42d8996b6b 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 javafx.util.StringConverter; 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 class PriceChartViewModel extends ChartViewModel { // 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 class PriceChartViewModel extends ChartViewModel { // 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 2dff0a73ea..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; @@ -38,8 +42,8 @@ import lombok.extern.slf4j.Slf4j; 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) { @@ -117,32 +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))) { - seriesUsdVolume.getData().setAll(model.getUsdVolumeChartData()); - } else if (getSeriesId(series).equals(getSeriesId(seriesBtcVolume))) { - seriesBtcVolume.getData().setAll(model.getBtcVolumeChartData()); - } - } - /////////////////////////////////////////////////////////////////////////////////////////// // Data /////////////////////////////////////////////////////////////////////////////////////////// @Override - protected void applyData() { + protected CompletableFuture applyData() { + List> allFutures = new ArrayList<>(); if (activeSeries.contains(seriesUsdVolume)) { - seriesUsdVolume.getData().setAll(model.getUsdVolumeChartData()); + CompletableFuture task1Done = new CompletableFuture<>(); + allFutures.add(task1Done); + applyUsdVolumeChartData(task1Done); } if (activeSeries.contains(seriesBtcVolume)) { - seriesBtcVolume.getData().setAll(model.getBtcVolumeChartData()); + CompletableFuture task2Done = new CompletableFuture<>(); + allFutures.add(task2Done); + applyBtcVolumeChartData(task2Done); } - usdVolumeProperty.set(model.getUsdVolume()); - btcVolumeProperty.set(model.getBtcVolume()); + CompletableFuture task3Done = new CompletableFuture<>(); + allFutures.add(task3Done); + model.getUsdVolume() + .whenComplete((data, t) -> + mapToUserThread(() -> { + usdVolumeProperty.set(data); + task3Done.complete(true); + })); + + CompletableFuture task4Done = new CompletableFuture<>(); + allFutures.add(task4Done); + model.getBtcVolume() + .whenComplete((data, t) -> + mapToUserThread(() -> { + btcVolumeProperty.set(data); + task4Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> true); + } + + private void applyBtcVolumeChartData(CompletableFuture completeFuture) { + model.getBtcVolumeChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesBtcVolume.getData().setAll(data); + completeFuture.complete(true); + })); + } + + private void applyUsdVolumeChartData(CompletableFuture completeFuture) { + model.getUsdVolumeChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesUsdVolume.getData().setAll(data); + completeFuture.complete(true); + })); } } 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 142d2f3912..55c8a2e470 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 javafx.util.StringConverter; 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 class VolumeChartViewModel extends ChartViewModel { // 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 @@ public class VolumeChartViewModel extends ChartViewModel { // 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())); } 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 8cf2e7cc88..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,17 +31,19 @@ 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; @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; @@ -134,78 +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); } - compensationAmountProperty.set(model.getCompensationAmount()); - reimbursementAmountProperty.set(model.getReimbursementAmount()); - bsqTradeFeeAmountProperty.set(model.getBsqTradeFeeAmount()); - proofOfBurnAmountProperty.set(model.getProofOfBurnAmount()); + CompletableFuture task7Done = new CompletableFuture<>(); + allFutures.add(task7Done); + model.getCompensationAmount() + .whenComplete((data, t) -> + mapToUserThread(() -> { + compensationAmountProperty.set(data); + task7Done.complete(true); + })); + + CompletableFuture task8Done = new CompletableFuture<>(); + allFutures.add(task8Done); + model.getReimbursementAmount() + .whenComplete((data, t) -> + mapToUserThread(() -> { + reimbursementAmountProperty.set(data); + task8Done.complete(true); + })); + + CompletableFuture task9Done = new CompletableFuture<>(); + allFutures.add(task9Done); + model.getBsqTradeFeeAmount() + .whenComplete((data, t) -> + mapToUserThread(() -> { + bsqTradeFeeAmountProperty.set(data); + task9Done.complete(true); + })); + + CompletableFuture task10Done = new CompletableFuture<>(); + allFutures.add(task10Done); + model.getProofOfBurnAmount() + .whenComplete((data, t) -> + mapToUserThread(() -> { + proofOfBurnAmountProperty.set(data); + task10Done.complete(true); + })); + + return CompletableFutureUtils.allOf(allFutures).thenApply(e -> true); } - private void applyTotalIssued() { - seriesTotalIssued.getData().setAll(model.getTotalIssuedChartData()); + private void applyTotalIssued(CompletableFuture completeFuture) { + model.getTotalIssuedChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesTotalIssued.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyCompensation() { - seriesCompensation.getData().setAll(model.getCompensationChartData()); + private void applyCompensation(CompletableFuture completeFuture) { + model.getCompensationChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesCompensation.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyReimbursement() { - seriesReimbursement.getData().setAll(model.getReimbursementChartData()); + private void applyReimbursement(CompletableFuture completeFuture) { + model.getReimbursementChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesReimbursement.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyTotalBurned() { - seriesTotalBurned.getData().setAll(model.getTotalBurnedChartData()); + private void applyTotalBurned(CompletableFuture completeFuture) { + model.getTotalBurnedChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesTotalBurned.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyBsqTradeFee() { - seriesBsqTradeFee.getData().setAll(model.getBsqTradeFeeChartData()); + private void applyBsqTradeFee(CompletableFuture completeFuture) { + model.getBsqTradeFeeChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesBsqTradeFee.getData().setAll(data); + completeFuture.complete(true); + })); } - private void applyProofOfBurn() { - seriesProofOfBurn.getData().setAll(model.getProofOfBurnChartData()); + private void applyProofOfBurn(CompletableFuture completeFuture) { + model.getProofOfBurnChartData() + .whenComplete((data, t) -> + mapToUserThread(() -> { + seriesProofOfBurn.getData().setAll(data); + completeFuture.complete(true); + })); } } 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 6acca876a1..70429d33e2 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 javafx.util.StringConverter; import java.text.DecimalFormat; import java.util.List; +import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; @@ -53,28 +54,28 @@ public class DaoChartViewModel extends ChartViewModel { // 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 @@ public class DaoChartViewModel extends ChartViewModel { // 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); } } 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 4cd72787c5..00e26d4912 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 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers + 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 {