From 322201948027bc25c06b68f12c3b5329c48a9e08 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 20 Dec 2015 23:05:42 +0100 Subject: [PATCH] Fix bug with not rePublished offers. Update offerbook when offer gets removed. Add pref. language and currency to preferences --- .../java/io/bitsquare/locale/CountryUtil.java | 3 +- .../io/bitsquare/locale/CurrencyUtil.java | 4 +- .../trade/offer/OfferBookService.java | 15 ++++- .../trade/offer/OpenOfferManager.java | 4 +- .../java/io/bitsquare/user/Preferences.java | 42 +++++++++++++- .../src/main/java/io/bitsquare/user/User.java | 7 ++- .../gui/main/market/MarketViewModel.java | 2 +- .../bitsquare/gui/main/offer/OfferView.java | 2 +- .../offer/offerbook/OfferBookViewModel.java | 2 +- .../settings/application/PreferencesView.java | 55 ++++++++++++++++--- .../application/PreferencesViewModel.java | 31 ++++++++++- .../java/io/bitsquare/p2p/P2PService.java | 21 +++++-- .../ProtectedExpirableDataStorage.java | 32 ++++++++--- 13 files changed, 184 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/io/bitsquare/locale/CountryUtil.java b/core/src/main/java/io/bitsquare/locale/CountryUtil.java index d77357414f..7d67230c60 100644 --- a/core/src/main/java/io/bitsquare/locale/CountryUtil.java +++ b/core/src/main/java/io/bitsquare/locale/CountryUtil.java @@ -119,7 +119,7 @@ public class CountryUtil { } public static Country getDefaultCountry() { - final Locale locale = new Locale(LanguageUtil.getDefaultLanguage(), getDefaultCountryCode()); + final Locale locale = Preferences.getDefaultLocale(); String regionCode = getRegionCode(locale.getCountry()); final Region region = new Region(regionCode, getRegionName(regionCode)); return new Country(locale.getCountry(), locale.getDisplayCountry(), region); @@ -205,7 +205,6 @@ public class CountryUtil { } } - public static String getDefaultCountryCode() { // might be set later in pref or config, so not use Preferences.getDefaultLocale() anywhere in the code return Preferences.getDefaultLocale().getCountry(); diff --git a/core/src/main/java/io/bitsquare/locale/CurrencyUtil.java b/core/src/main/java/io/bitsquare/locale/CurrencyUtil.java index ca45cdd8a1..18707ba438 100644 --- a/core/src/main/java/io/bitsquare/locale/CurrencyUtil.java +++ b/core/src/main/java/io/bitsquare/locale/CurrencyUtil.java @@ -205,8 +205,8 @@ public class CurrencyUtil { } } - public static FiatCurrency getDefaultFiatCurrency() { - return new FiatCurrency(getCurrencyByCountryCode(CountryUtil.getDefaultCountryCode()).getCurrency()); + public static TradeCurrency getDefaultTradeCurrency() { + return Preferences.getDefaultTradeCurrency(); } } diff --git a/core/src/main/java/io/bitsquare/trade/offer/OfferBookService.java b/core/src/main/java/io/bitsquare/trade/offer/OfferBookService.java index d4d6211c76..c2d6abb497 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/OfferBookService.java +++ b/core/src/main/java/io/bitsquare/trade/offer/OfferBookService.java @@ -52,7 +52,20 @@ public class OfferBookService { } public void addOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { - boolean result = p2PService.addData(offer); + doAddOffer(offer, resultHandler, errorMessageHandler, false); + } + + public void republishOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + doAddOffer(offer, resultHandler, errorMessageHandler, true); + } + + private void doAddOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler, boolean rePublish) { + boolean result; + if (rePublish) + result = p2PService.republishData(offer); + else + result = p2PService.addData(offer); + if (result) { log.trace("Add offer to network was successful. Offer = " + offer); resultHandler.handleResult(); diff --git a/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java b/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java index 58c5393e2c..e562b24e07 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java +++ b/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java @@ -146,7 +146,7 @@ public class OpenOfferManager { if (p2PNetworkReadyListener != null) p2PService.removeP2PServiceListener(p2PNetworkReadyListener); - long period = (long) (Offer.TTL * 0.8); + long period = (long) (Offer.TTL * 0.8); // republish sufficiently before offer would expires TimerTask timerTask = new TimerTask() { @Override public void run() { @@ -165,7 +165,7 @@ public class OpenOfferManager { private void rePublishOffers() { if (!openOffers.isEmpty()) log.trace("rePublishOffers"); for (OpenOffer openOffer : openOffers) { - offerBookService.addOffer(openOffer.getOffer(), + offerBookService.republishOffer(openOffer.getOffer(), () -> log.debug("Successful added offer to P2P network"), errorMessage -> log.error("Add offer to P2P network failed. " + errorMessage)); //setupDepositPublishedListener(openOffer); diff --git a/core/src/main/java/io/bitsquare/user/Preferences.java b/core/src/main/java/io/bitsquare/user/Preferences.java index f4234fd998..8af27ca236 100644 --- a/core/src/main/java/io/bitsquare/user/Preferences.java +++ b/core/src/main/java/io/bitsquare/user/Preferences.java @@ -20,6 +20,7 @@ package io.bitsquare.user; import io.bitsquare.app.BitsquareEnvironment; import io.bitsquare.app.Version; import io.bitsquare.btc.BitcoinNetwork; +import io.bitsquare.locale.CountryUtil; import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.TradeCurrency; import io.bitsquare.storage.Storage; @@ -67,9 +68,16 @@ public class Preferences implements Serializable { return BTC_DENOMINATIONS; } + private transient static Locale defaultLocale = Locale.getDefault(); + public static Locale getDefaultLocale() { - //return new Locale("EN", "US"); - return Locale.getDefault(); + return defaultLocale; + } + + private transient static TradeCurrency defaultTradeCurrency = new TradeCurrency(CurrencyUtil.getCurrencyByCountryCode(CountryUtil.getDefaultCountryCode()).getCurrency().getCurrencyCode()); + + public static TradeCurrency getDefaultTradeCurrency() { + return defaultTradeCurrency; } transient private final Storage storage; @@ -92,6 +100,8 @@ public class Preferences implements Serializable { private boolean autoSelectArbitrators = true; private Map showAgainMap; private boolean tacAccepted; + private Locale preferredLocale; + private TradeCurrency preferredTradeCurrency; // Observable wrappers transient private final StringProperty btcDenominationProperty = new SimpleStringProperty(btcDenomination); @@ -134,6 +144,11 @@ public class Preferences implements Serializable { autoSelectArbitrators = persisted.getAutoSelectArbitrators(); showAgainMap = persisted.getShowAgainMap(); tacAccepted = persisted.getTacAccepted(); + + preferredLocale = persisted.getPreferredLocale(); + defaultLocale = preferredLocale; + preferredTradeCurrency = persisted.getPreferredTradeCurrency(); + defaultTradeCurrency = preferredTradeCurrency; } else { setTradeCurrencies(CurrencyUtil.getAllSortedCurrencies()); tradeCurrencies = new ArrayList<>(tradeCurrenciesAsObservable); @@ -148,6 +163,8 @@ public class Preferences implements Serializable { showAgainMap.put(PopupId.PAYMENT_SENT, true); showAgainMap.put(PopupId.PAYMENT_RECEIVED, true); + preferredLocale = getDefaultLocale(); + preferredTradeCurrency = getDefaultTradeCurrency(); storage.queueUpForSave(); } @@ -250,6 +267,19 @@ public class Preferences implements Serializable { storage.queueUpForSave(); } + public void setPreferredLocale(Locale preferredLocale) { + this.preferredLocale = preferredLocale; + defaultLocale = preferredLocale; + storage.queueUpForSave(); + } + + public void setPreferredTradeCurrency(TradeCurrency preferredTradeCurrency) { + this.preferredTradeCurrency = preferredTradeCurrency; + defaultTradeCurrency = preferredTradeCurrency; + storage.queueUpForSave(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Getter /////////////////////////////////////////////////////////////////////////////////////////// @@ -360,4 +390,12 @@ public class Preferences implements Serializable { public boolean getTacAccepted() { return tacAccepted; } + + public Locale getPreferredLocale() { + return preferredLocale; + } + + public TradeCurrency getPreferredTradeCurrency() { + return preferredTradeCurrency; + } } diff --git a/core/src/main/java/io/bitsquare/user/User.java b/core/src/main/java/io/bitsquare/user/User.java index 1e415d9718..e65ff345c2 100644 --- a/core/src/main/java/io/bitsquare/user/User.java +++ b/core/src/main/java/io/bitsquare/user/User.java @@ -102,8 +102,11 @@ public class User implements Serializable { } else { accountID = String.valueOf(Math.abs(keyRing.getPubKeyRing().hashCode())); - acceptedLanguageLocaleCodes = new ArrayList<>(Arrays.asList(LanguageUtil.getDefaultLanguageLocaleAsCode(), - LanguageUtil.getEnglishLanguageLocaleCode())); + acceptedLanguageLocaleCodes.add(LanguageUtil.getDefaultLanguageLocaleAsCode()); + String english = LanguageUtil.getEnglishLanguageLocaleCode(); + if (!acceptedLanguageLocaleCodes.contains(english)) + acceptedLanguageLocaleCodes.add(english); + acceptedArbitrators = new ArrayList<>(); } storage.queueUpForSave(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/market/MarketViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/market/MarketViewModel.java index 7e428ac21f..41ff6a4581 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/market/MarketViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/market/MarketViewModel.java @@ -42,7 +42,7 @@ class MarketViewModel extends ActivatableViewModel { private final OfferBook offerBook; private final Preferences preferences; - final ObjectProperty tradeCurrency = new SimpleObjectProperty<>(CurrencyUtil.getDefaultFiatCurrency()); + final ObjectProperty tradeCurrency = new SimpleObjectProperty<>(CurrencyUtil.getDefaultTradeCurrency()); private final List buyData = new ArrayList(); private final List sellData = new ArrayList(); private final ObservableList offerBookListItems; diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/OfferView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/OfferView.java index 8516c1a071..883369edf8 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/OfferView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/OfferView.java @@ -89,7 +89,7 @@ public abstract class OfferView extends ActivatableView { } }); - tradeCurrency = CurrencyUtil.getDefaultFiatCurrency(); + tradeCurrency = CurrencyUtil.getDefaultTradeCurrency(); navigation.addListener(listener); navigation.navigateTo(MainView.class, this.getClass(), OfferBookView.class); diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java index 3f9985581c..2b16db99c3 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java @@ -88,7 +88,7 @@ class OfferBookViewModel extends ActivatableViewModel { this.filteredItems = new FilteredList<>(offerBookListItems); this.sortedItems = new SortedList<>(filteredItems); - tradeCurrency = CurrencyUtil.getDefaultFiatCurrency(); + tradeCurrency = CurrencyUtil.getDefaultTradeCurrency(); tradeCurrencyCode.set(tradeCurrency.getCode()); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesView.java b/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesView.java index ebf7db7f90..37f1a58c36 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesView.java @@ -20,6 +20,8 @@ package io.bitsquare.gui.main.settings.application; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; import io.bitsquare.gui.util.Layout; +import io.bitsquare.locale.LanguageUtil; +import io.bitsquare.locale.TradeCurrency; import io.bitsquare.user.BlockChainExplorer; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; @@ -33,8 +35,11 @@ import static io.bitsquare.gui.util.FormBuilder.*; @FxmlView public class PreferencesView extends ActivatableViewAndModel { - private ComboBox btcDenominationComboBox; + // not supported yet + //private ComboBox btcDenominationComboBox; private ComboBox blockExplorerComboBox; + private ComboBox languageComboBox; + private ComboBox tradeCurrencyComboBox; private CheckBox useAnimationsCheckBox, useEffectsCheckBox, showPlaceOfferConfirmationCheckBox, showTakeOfferConfirmationCheckBox, autoSelectArbitratorsCheckBox; @@ -47,9 +52,11 @@ public class PreferencesView extends ActivatableViewAndModel model.onSelectBtcDenomination(btcDenominationComboBox.getSelectionModel().getSelectedItem())); + btcDenominationComboBox.setOnAction(e -> model.onSelectBtcDenomination(btcDenominationComboBox.getSelectionModel().getSelectedItem()));*/ + tradeCurrencyComboBox.setItems(model.tradeCurrencies); + tradeCurrencyComboBox.getSelectionModel().select(model.getTradeCurrency()); + tradeCurrencyComboBox.setConverter(new StringConverter() { + @Override + public String toString(TradeCurrency tradeCurrency) { + return tradeCurrency.getCodeAndName(); + } + + @Override + public TradeCurrency fromString(String string) { + return null; + } + }); + tradeCurrencyComboBox.setOnAction(e -> model.onSelectTradeCurrency(tradeCurrencyComboBox.getSelectionModel().getSelectedItem())); + + languageComboBox.setItems(model.languageCodes); + languageComboBox.getSelectionModel().select(model.getLanguageCode()); + languageComboBox.setConverter(new StringConverter() { + @Override + public String toString(String code) { + return LanguageUtil.getDisplayName(code); + } + + @Override + public String fromString(String string) { + return null; + } + }); + languageComboBox.setOnAction(e -> model.onSelectLanguageCode(languageComboBox.getSelectionModel().getSelectedItem())); + + blockExplorerComboBox.setItems(model.blockExplorers); blockExplorerComboBox.getSelectionModel().select(model.getBlockExplorer()); blockExplorerComboBox.setConverter(new StringConverter() { @@ -80,6 +118,7 @@ public class PreferencesView extends ActivatableViewAndModel model.onSelectBlockExplorer(blockExplorerComboBox.getSelectionModel().getSelectedItem())); + useAnimationsCheckBox.setSelected(model.getUseAnimations()); useAnimationsCheckBox.setOnAction(e -> model.onSelectUseAnimations(useAnimationsCheckBox.isSelected())); @@ -94,12 +133,14 @@ public class PreferencesView extends ActivatableViewAndModel model.onSelectAutoSelectArbitratorsCheckBox(autoSelectArbitratorsCheckBox.isSelected())); - } @Override protected void deactivate() { - btcDenominationComboBox.setOnAction(null); + //btcDenominationComboBox.setOnAction(null); + languageComboBox.setOnAction(null); + tradeCurrencyComboBox.setOnAction(null); + blockExplorerComboBox.setOnAction(null); useAnimationsCheckBox.setOnAction(null); useEffectsCheckBox.setOnAction(null); showPlaceOfferConfirmationCheckBox.setOnAction(null); diff --git a/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesViewModel.java index 619d497f9f..2e19ab2c2c 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/settings/application/PreferencesViewModel.java @@ -19,17 +19,23 @@ package io.bitsquare.gui.main.settings.application; import com.google.inject.Inject; import io.bitsquare.gui.common.model.ActivatableViewModel; +import io.bitsquare.locale.LanguageUtil; +import io.bitsquare.locale.TradeCurrency; import io.bitsquare.user.BlockChainExplorer; import io.bitsquare.user.Preferences; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import java.util.Locale; + class PreferencesViewModel extends ActivatableViewModel { private final Preferences preferences; final ObservableList btcDenominations = FXCollections.observableArrayList(Preferences.getBtcDenominations()); final ObservableList blockExplorers; - + final ObservableList tradeCurrencies; + final ObservableList languageCodes; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, initialisation @@ -38,7 +44,10 @@ class PreferencesViewModel extends ActivatableViewModel { @Inject public PreferencesViewModel(Preferences preferences) { this.preferences = preferences; + blockExplorers = FXCollections.observableArrayList(preferences.getBlockChainExplorers()); + tradeCurrencies = preferences.getTradeCurrenciesAsObservable(); + languageCodes = FXCollections.observableArrayList(LanguageUtil.getAllLanguageCodes()); } @Override @@ -78,6 +87,18 @@ class PreferencesViewModel extends ActivatableViewModel { preferences.setAutoSelectArbitrators(selected); } + public void onSelectBlockExplorer(BlockChainExplorer selectedItem) { + preferences.setBlockChainExplorer(selectedItem); + } + + public void onSelectTradeCurrency(TradeCurrency selectedItem) { + preferences.setPreferredTradeCurrency(selectedItem); + } + + public void onSelectLanguageCode(String code) { + preferences.setPreferredLocale(new Locale(code, preferences.getPreferredLocale().getCountry())); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Getters @@ -111,7 +132,11 @@ class PreferencesViewModel extends ActivatableViewModel { return preferences.getBlockChainExplorer(); } - public void onSelectBlockExplorer(BlockChainExplorer selectedItem) { - preferences.setBlockChainExplorer(selectedItem); + public String getLanguageCode() { + return preferences.getPreferredLocale().getLanguage(); + } + + public TradeCurrency getTradeCurrency() { + return preferences.getPreferredTradeCurrency(); } } diff --git a/network/src/main/java/io/bitsquare/p2p/P2PService.java b/network/src/main/java/io/bitsquare/p2p/P2PService.java index 8b16f01acd..755d44bc63 100644 --- a/network/src/main/java/io/bitsquare/p2p/P2PService.java +++ b/network/src/main/java/io/bitsquare/p2p/P2PService.java @@ -53,6 +53,7 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis private final boolean useLocalhost; @Nullable private final EncryptionService encryptionService; + @Nullable private final KeyRing keyRing; // set in init @@ -91,15 +92,14 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis @Named(ProgramArguments.NETWORK_ID) int networkId, @Named("storage.dir") File storageDir, @Nullable EncryptionService encryptionService, - @Nullable KeyRing keyRing - ) { - Log.traceCall(); + @Nullable KeyRing keyRing) { this.seedNodesRepository = seedNodesRepository; this.port = port; this.torDir = torDir; this.useLocalhost = useLocalhost; this.encryptionService = encryptionService; this.keyRing = keyRing; + dbStorage = new Storage<>(storageDir); init(networkId, storageDir); @@ -568,12 +568,25 @@ public class P2PService implements SetupListener, MessageListener, ConnectionLis /////////////////////////////////////////////////////////////////////////////////////////// public boolean addData(ExpirablePayload expirablePayload) { + Log.traceCall(); + return doAddData(expirablePayload, false); + } + + public boolean republishData(ExpirablePayload expirablePayload) { + Log.traceCall(); + return doAddData(expirablePayload, true); + } + + private boolean doAddData(ExpirablePayload expirablePayload, boolean rePublish) { Log.traceCall(); checkAuthentication(); try { ProtectedData protectedData = dataStorage.getDataWithSignedSeqNr(expirablePayload, keyRing.getSignatureKeyPair()); - return dataStorage.add(protectedData, networkNode.getAddress()); + if (rePublish) + return dataStorage.rePublish(protectedData, networkNode.getAddress()); + else + return dataStorage.add(protectedData, networkNode.getAddress()); } catch (CryptoException e) { log.error("Signing at getDataWithSignedSeqNr failed. That should never happen."); return false; diff --git a/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java b/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java index 49a4f7c34d..da18020c03 100644 --- a/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java +++ b/network/src/main/java/io/bitsquare/p2p/storage/ProtectedExpirableDataStorage.java @@ -28,10 +28,7 @@ import javax.annotation.Nullable; import java.io.File; import java.security.KeyPair; import java.security.PublicKey; -import java.util.HashMap; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; // Run in UserThread @@ -90,15 +87,25 @@ public class ProtectedExpirableDataStorage implements MessageListener { private void removeExpiredEntries() { Log.traceCall(); - // The moment when an object becomes expired will not be synchrone in the network and we could + // The moment when an object becomes expired will not be synchronous in the network and we could // get add messages after the object has expired. To avoid repeated additions of already expired // object when we get it sent from new peers, we don’t remove the sequence number from the map. - // That way a add message for an already expired data will fail because the sequence number + // That way an ADD message for an already expired data will fail because the sequence number // is equal and not larger. Map temp = new HashMap<>(map); + Set protectedDataToRemoveSet = new HashSet<>(); temp.entrySet().stream() .filter(entry -> entry.getValue().isExpired()) - .forEach(entry -> map.remove(entry.getKey())); + .forEach(entry -> { + ByteArray hashOfPayload = entry.getKey(); + ProtectedData protectedDataToRemove = map.get(hashOfPayload); + protectedDataToRemoveSet.add(protectedDataToRemove); + map.remove(hashOfPayload); + }); + + protectedDataToRemoveSet.stream().forEach( + protectedDataToRemove -> hashMapChangedListeners.stream().forEach( + listener -> listener.onRemoved(protectedDataToRemove))); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -142,6 +149,14 @@ public class ProtectedExpirableDataStorage implements MessageListener { } public boolean add(ProtectedData protectedData, @Nullable Address sender) { + return doAdd(protectedData, sender, false); + } + + public boolean rePublish(ProtectedData protectedData, @Nullable Address sender) { + return doAdd(protectedData, sender, true); + } + + private boolean doAdd(ProtectedData protectedData, @Nullable Address sender, boolean rePublish) { Log.traceCall(); ByteArray hashOfPayload = getHashAsByteArray(protectedData.expirablePayload); boolean result = checkPublicKeys(protectedData, true) @@ -162,7 +177,7 @@ public class ProtectedExpirableDataStorage implements MessageListener { sb.append("\n------------------------------------------------------------\n"); log.info(sb.toString()); - if (!containsKey) + if (rePublish || !containsKey) broadcast(new AddDataMessage(protectedData), sender); storage.queueUpForSave(); @@ -273,6 +288,7 @@ public class ProtectedExpirableDataStorage implements MessageListener { Log.traceCall(); map.remove(hashOfPayload); log.trace("Data removed from our map. We broadcast the message to our peers."); + storage.queueUpForSave(); hashMapChangedListeners.stream().forEach(e -> e.onRemoved(protectedData)); StringBuilder sb = new StringBuilder("\n\n------------------------------------------------------------\n" +