From 603e86f14cda20cf200ac20fd3ebd236fe08685f Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 1 Aug 2014 16:45:42 +0200 Subject: [PATCH] refactoring: bank account, user, persistence --- src/main/java/io/bitsquare/BitSquare.java | 14 +- .../java/io/bitsquare/bank/BankAccount.java | 50 ++----- .../io/bitsquare/bank/BankAccountType.java | 5 - .../java/io/bitsquare/btc/WalletFacade.java | 19 +-- .../java/io/bitsquare/di/BitSquareModule.java | 4 +- .../java/io/bitsquare/gui/MainController.java | 12 +- .../ArbitratorOverviewController.java | 10 +- .../profile/ArbitratorProfileController.java | 12 +- .../ArbitratorRegistrationController.java | 16 +- .../gui/components/LazyLoadingTabPane.java | 15 +- .../bitsquare/gui/funds/FundsController.java | 10 +- .../market/orderbook/OrderBookController.java | 10 +- .../gui/orders/OrdersController.java | 12 +- .../gui/settings/SettingsController.java | 22 +-- .../java/io/bitsquare/msg/MessageFacade.java | 10 +- .../java/io/bitsquare/settings/Settings.java | 14 +- .../{Storage.java => Persistence.java} | 11 +- src/main/java/io/bitsquare/trade/Trading.java | 18 +-- .../java/io/bitsquare/user/Arbitrator.java | 32 ++-- src/main/java/io/bitsquare/user/User.java | 139 +++++++----------- .../java/io/bitsquare/util/DSAKeyUtil.java | 5 +- 21 files changed, 197 insertions(+), 243 deletions(-) rename src/main/java/io/bitsquare/storage/{Storage.java => Persistence.java} (97%) diff --git a/src/main/java/io/bitsquare/BitSquare.java b/src/main/java/io/bitsquare/BitSquare.java index 710f8d6f23..60e214b72f 100644 --- a/src/main/java/io/bitsquare/BitSquare.java +++ b/src/main/java/io/bitsquare/BitSquare.java @@ -11,7 +11,7 @@ import io.bitsquare.gui.popups.Popups; import io.bitsquare.locale.Localisation; import io.bitsquare.msg.MessageFacade; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.user.User; import io.bitsquare.util.AWTSystemTray; import io.bitsquare.util.FileUtil; @@ -90,10 +90,14 @@ public class BitSquare extends Application // apply stored data final User user = injector.getInstance(User.class); final Settings settings = injector.getInstance(Settings.class); - final Storage storage = injector.getInstance(Storage.class); - storage.init(); - user.updateFromStorage((User) storage.read(user.getClass().getName())); - settings.updateFromStorage((Settings) storage.read(settings.getClass().getName())); + final Persistence persistence = injector.getInstance(Persistence.class); + persistence.init(); + + User persistedUser = (User) persistence.read(user); + user.applyPersistedUser(persistedUser); + persistence.write(user); + + settings.applyPersistedSettings((Settings) persistence.read(settings.getClass().getName())); primaryStage.setTitle("BitSquare (" + getUID() + ")"); diff --git a/src/main/java/io/bitsquare/bank/BankAccount.java b/src/main/java/io/bitsquare/bank/BankAccount.java index 428ee3184e..1eb9a929a6 100644 --- a/src/main/java/io/bitsquare/bank/BankAccount.java +++ b/src/main/java/io/bitsquare/bank/BankAccount.java @@ -4,26 +4,21 @@ import io.bitsquare.locale.Country; import java.io.Serializable; import java.util.Currency; import java.util.Objects; +import javax.annotation.concurrent.Immutable; +@Immutable public class BankAccount implements Serializable { private static final long serialVersionUID = 1792577576443221268L; - private final BankAccountType bankAccountType; - - private final String accountPrimaryID; - - private final String accountSecondaryID; - + private final String accountPrimaryID; // like IBAN + private final String accountSecondaryID; // like BIC private final String accountHolderName; - - private final Country country; - + private final Country country; // where bank is registered + // The main currency if account support multiple currencies. + // The user can create multiple bank accounts with same bank account but other currency if his bank account support that. private final Currency currency; - - private final String uid; - private final String accountTitle; public BankAccount(BankAccountType bankAccountType, Currency currency, Country country, String accountTitle, String accountHolderName, String accountPrimaryID, String accountSecondaryID) @@ -35,28 +30,20 @@ public class BankAccount implements Serializable this.accountHolderName = accountHolderName; this.accountPrimaryID = accountPrimaryID; this.accountSecondaryID = accountSecondaryID; - - uid = accountTitle; } public int hashCode() { - return Objects.hashCode(uid); + return Objects.hashCode(accountTitle); } public boolean equals(Object obj) { - if (!(obj instanceof BankAccount)) - { - return false; - } - if (obj == this) - { - return true; - } + if (!(obj instanceof BankAccount)) return false; + if (obj == this) return true; final BankAccount other = (BankAccount) obj; - return uid.equals(other.getUid()); + return accountTitle.equals(other.getUid()); } @@ -65,49 +52,42 @@ public class BankAccount implements Serializable return accountPrimaryID; } - public String getAccountSecondaryID() { return accountSecondaryID; } - public String getAccountHolderName() { return accountHolderName; } - public BankAccountType getBankAccountType() { return bankAccountType; } - public Currency getCurrency() { return currency; } - public Country getCountry() { return country; } - + // we use the accountTitle as unique id public String getUid() { - return uid; + return accountTitle; } - public String getAccountTitle() { return accountTitle; } - @Override public String toString() { @@ -116,11 +96,9 @@ public class BankAccount implements Serializable ", accountPrimaryID='" + accountPrimaryID + '\'' + ", accountSecondaryID='" + accountSecondaryID + '\'' + ", accountHolderName='" + accountHolderName + '\'' + - ", countryLocale=" + country + + ", country=" + country + ", currency=" + currency + - ", uid='" + uid + '\'' + ", accountTitle='" + accountTitle + '\'' + '}'; } - } diff --git a/src/main/java/io/bitsquare/bank/BankAccountType.java b/src/main/java/io/bitsquare/bank/BankAccountType.java index 4df67a36a2..59b5927529 100644 --- a/src/main/java/io/bitsquare/bank/BankAccountType.java +++ b/src/main/java/io/bitsquare/bank/BankAccountType.java @@ -13,9 +13,7 @@ public enum BankAccountType PERFECT_MONEY("primary ID", "secondary ID"), OTHER("primary ID", "secondary ID"); - private final String primaryId; - private final String secondaryId; BankAccountType(String primaryId, String secondaryId) @@ -24,19 +22,16 @@ public enum BankAccountType this.secondaryId = secondaryId; } - public static ArrayList getAllBankAccountTypes() { return new ArrayList<>(Arrays.asList(BankAccountType.values())); } - public String getPrimaryId() { return primaryId; } - public String getSecondaryId() { return secondaryId; diff --git a/src/main/java/io/bitsquare/btc/WalletFacade.java b/src/main/java/io/bitsquare/btc/WalletFacade.java index f331d9ad84..aa7a4e22ae 100644 --- a/src/main/java/io/bitsquare/btc/WalletFacade.java +++ b/src/main/java/io/bitsquare/btc/WalletFacade.java @@ -17,7 +17,7 @@ import io.bitsquare.BitSquare; import io.bitsquare.btc.listeners.BalanceListener; import io.bitsquare.btc.listeners.ConfidenceListener; import io.bitsquare.crypto.CryptoFacade; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import java.io.Serializable; import java.math.BigInteger; import java.util.*; @@ -48,12 +48,11 @@ public class WalletFacade private final ReentrantLock lock = Threading.lock("lock"); - private final String saveAddressEntryListId; private final NetworkParameters params; private final BitSquareWalletAppKit walletAppKit; private final FeePolicy feePolicy; private final CryptoFacade cryptoFacade; - private final Storage storage; + private final Persistence persistence; private final List downloadListeners = new ArrayList<>(); private final List confidenceListeners = new ArrayList<>(); private final List balanceListeners = new ArrayList<>(); @@ -68,15 +67,13 @@ public class WalletFacade /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public WalletFacade(NetworkParameters params, BitSquareWalletAppKit walletAppKit, FeePolicy feePolicy, CryptoFacade cryptoFacade, Storage storage) + public WalletFacade(NetworkParameters params, BitSquareWalletAppKit walletAppKit, FeePolicy feePolicy, CryptoFacade cryptoFacade, Persistence persistence) { this.params = params; this.walletAppKit = walletAppKit; this.feePolicy = feePolicy; this.cryptoFacade = cryptoFacade; - this.storage = storage; - - saveAddressEntryListId = this.getClass().getName() + ".addressEntryList"; + this.persistence = persistence; } @@ -173,11 +170,11 @@ public class WalletFacade }; wallet.addEventListener(walletEventListener); - Serializable serializable = storage.read(saveAddressEntryListId); - List savedAddressEntryList = (List) serializable; + Serializable serializable = persistence.read(this, "addressEntryList"); + List persistedAddressEntryList = (List) serializable; if (serializable instanceof List) { - addressEntryList = savedAddressEntryList; + addressEntryList = persistedAddressEntryList; } else { @@ -1120,7 +1117,7 @@ public class WalletFacade lock.lock(); try { - storage.write(saveAddressEntryListId, addressEntryList); + persistence.write(this, "addressEntryList", addressEntryList); } finally { lock.unlock(); diff --git a/src/main/java/io/bitsquare/di/BitSquareModule.java b/src/main/java/io/bitsquare/di/BitSquareModule.java index ac28e5fbf4..f483256050 100644 --- a/src/main/java/io/bitsquare/di/BitSquareModule.java +++ b/src/main/java/io/bitsquare/di/BitSquareModule.java @@ -17,7 +17,7 @@ import io.bitsquare.crypto.CryptoFacade; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.SeedNodeAddress; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.trade.Trading; import io.bitsquare.trade.orderbook.OrderBook; import io.bitsquare.trade.orderbook.OrderBookFilter; @@ -33,7 +33,7 @@ public class BitSquareModule extends AbstractModule { bind(User.class).asEagerSingleton(); bind(OrderBook.class).asEagerSingleton(); - bind(Storage.class).asEagerSingleton(); + bind(Persistence.class).asEagerSingleton(); bind(Settings.class).asEagerSingleton(); bind(OrderBookFilter.class).asEagerSingleton(); diff --git a/src/main/java/io/bitsquare/gui/MainController.java b/src/main/java/io/bitsquare/gui/MainController.java index d1cf7a388f..ea72e1a858 100644 --- a/src/main/java/io/bitsquare/gui/MainController.java +++ b/src/main/java/io/bitsquare/gui/MainController.java @@ -13,7 +13,7 @@ import io.bitsquare.gui.util.Transitions; import io.bitsquare.locale.Localisation; import io.bitsquare.msg.BootstrapListener; import io.bitsquare.msg.MessageFacade; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.trade.Direction; import io.bitsquare.trade.Trading; import io.bitsquare.user.User; @@ -50,7 +50,7 @@ public class MainController implements Initializable, NavigationController private final WalletFacade walletFacade; private final MessageFacade messageFacade; private final Trading trading; - private final Storage storage; + private final Persistence persistence; private final ToggleGroup toggleGroup = new ToggleGroup(); @@ -79,13 +79,13 @@ public class MainController implements Initializable, NavigationController /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private MainController(User user, WalletFacade walletFacade, MessageFacade messageFacade, Trading trading, Storage storage) + private MainController(User user, WalletFacade walletFacade, MessageFacade messageFacade, Trading trading, Persistence persistence) { this.user = user; this.walletFacade = walletFacade; this.messageFacade = messageFacade; this.trading = trading; - this.storage = storage; + this.persistence = persistence; MainController.INSTANCE = this; } @@ -224,7 +224,7 @@ public class MainController implements Initializable, NavigationController Transitions.fadeIn(rightNavPane); Transitions.fadeIn(contentPane); - NavigationItem selectedNavigationItem = (NavigationItem) storage.read(this, "selectedNavigationItem"); + NavigationItem selectedNavigationItem = (NavigationItem) persistence.read(this, "selectedNavigationItem"); if (selectedNavigationItem == null) { selectedNavigationItem = NavigationItem.HOME; @@ -297,7 +297,7 @@ public class MainController implements Initializable, NavigationController ((MarketController) childController).setDirection(navigationItem == NavigationItem.BUY ? Direction.BUY : Direction.SELL); } - storage.write(this, "selectedNavigationItem", navigationItem); + persistence.write(this, "selectedNavigationItem", navigationItem); prevToggleButton = toggleButton; }); diff --git a/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java b/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java index 7013f98054..1561a5b098 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/overview/ArbitratorOverviewController.java @@ -10,7 +10,7 @@ import io.bitsquare.locale.Localisation; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.listeners.ArbitratorListener; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.user.Arbitrator; import java.io.IOException; import java.net.URL; @@ -38,7 +38,7 @@ import net.tomp2p.storage.Data; public class ArbitratorOverviewController implements Initializable, ChildController, NavigationController, ArbitratorListener { private final Settings settings; - private final Storage storage; + private final Persistence persistence; private final MessageFacade messageFacade; private final List allArbitrators = new ArrayList<>(); @@ -59,11 +59,11 @@ public class ArbitratorOverviewController implements Initializable, ChildControl /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public ArbitratorOverviewController(Settings settings, Storage storage, MessageFacade messageFacade) + public ArbitratorOverviewController(Settings settings, Persistence persistence, MessageFacade messageFacade) { this.settings = settings; - this.storage = storage; + this.persistence = persistence; this.messageFacade = messageFacade; messageFacade.addArbitratorListener(this); @@ -214,7 +214,7 @@ public class ArbitratorOverviewController implements Initializable, ChildControl public void onSelect() { settings.addAcceptedArbitrator(currentArbitrator); - storage.write(settings.getClass().getName(), settings); + persistence.write(settings); } @FXML diff --git a/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java b/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java index 161d47dea8..e36fbcdd41 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/profile/ArbitratorProfileController.java @@ -4,7 +4,7 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.util.BitSquareFormatter; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.user.Arbitrator; import java.net.URL; import java.util.ResourceBundle; @@ -21,7 +21,7 @@ public class ArbitratorProfileController implements Initializable, ChildControll private final Settings settings; - private final Storage storage; + private final Persistence persistence; private Arbitrator arbitrator; private NavigationController navigationController; @@ -39,13 +39,13 @@ public class ArbitratorProfileController implements Initializable, ChildControll /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public ArbitratorProfileController(Settings settings, Storage storage) + public ArbitratorProfileController(Settings settings, Persistence persistence) { this.settings = settings; - this.storage = storage; + this.persistence = persistence; - // Settings savedSettings = (Settings) storage.read(settings.getClass().getName()); - // settings.updateFromStorage(savedSettings); + // Settings persistedSettings = (Settings) storage.read(settings.getClass().getName()); + // settings.applyPersistedSettings(persistedSettings); } diff --git a/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java b/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java index 769349cf8e..26393b8a0f 100644 --- a/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java +++ b/src/main/java/io/bitsquare/gui/arbitrators/registration/ArbitratorRegistrationController.java @@ -19,7 +19,7 @@ import io.bitsquare.gui.util.ConfidenceDisplay; import io.bitsquare.locale.LanguageUtil; import io.bitsquare.locale.Localisation; import io.bitsquare.msg.MessageFacade; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.user.Arbitrator; import io.bitsquare.user.Reputation; import io.bitsquare.user.User; @@ -45,7 +45,7 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon { private static final Logger log = LoggerFactory.getLogger(ArbitratorRegistrationController.class); - private final Storage storage; + private final Persistence persistence; private final WalletFacade walletFacade; private final MessageFacade messageFacade; private User user; @@ -93,9 +93,9 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private ArbitratorRegistrationController(Storage storage, WalletFacade walletFacade, MessageFacade messageFacade, User user) + private ArbitratorRegistrationController(Persistence persistence, WalletFacade walletFacade, MessageFacade messageFacade, User user) { - this.storage = storage; + this.persistence = persistence; this.walletFacade = walletFacade; this.messageFacade = messageFacade; this.user = user; @@ -128,10 +128,10 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon { accordion.setExpandedPane(profileTitledPane); - Arbitrator savedArbitrator = (Arbitrator) storage.read(arbitrator.getClass().getName()); - if (savedArbitrator != null) + Arbitrator persistedArbitrator = (Arbitrator) persistence.read(arbitrator); + if (persistedArbitrator != null) { - arbitrator.updateFromStorage(savedArbitrator); + arbitrator.applyPersistedArbitrator(persistedArbitrator); applyArbitrator(); } else @@ -327,7 +327,7 @@ public class ArbitratorRegistrationController implements Initializable, ChildCon arbitrator = getEditedArbitrator(); if (arbitrator != null) { - storage.write(arbitrator.getClass().getName(), arbitrator); + persistence.write(arbitrator); if (isEditMode) { diff --git a/src/main/java/io/bitsquare/gui/components/LazyLoadingTabPane.java b/src/main/java/io/bitsquare/gui/components/LazyLoadingTabPane.java index 56afa1cca3..12f9377262 100644 --- a/src/main/java/io/bitsquare/gui/components/LazyLoadingTabPane.java +++ b/src/main/java/io/bitsquare/gui/components/LazyLoadingTabPane.java @@ -5,7 +5,7 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.Hibernate; import io.bitsquare.gui.NavigationController; import io.bitsquare.locale.Localisation; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -22,10 +22,9 @@ public class LazyLoadingTabPane extends TabPane private final Map views = new HashMap<>(); private final Map controllers = new HashMap<>(); private SingleSelectionModel selectionModel; - private String storageId; private NavigationController navigationController; private String[] tabContentFXMLUrls; - private Storage storage; + private Persistence persistence; private ChildController childController; private int selectedTabIndex = -1; @@ -39,7 +38,7 @@ public class LazyLoadingTabPane extends TabPane super(); } - public void initialize(NavigationController navigationController, Storage storage, String... tabContentFXMLUrls) + public void initialize(NavigationController navigationController, Persistence persistence, String... tabContentFXMLUrls) { if (tabContentFXMLUrls.length == 0) { @@ -49,16 +48,14 @@ public class LazyLoadingTabPane extends TabPane this.tabContentFXMLUrls = tabContentFXMLUrls; this.navigationController = navigationController; this.tabContentFXMLUrls = tabContentFXMLUrls; - this.storage = storage; - - storageId = navigationController.getClass().getName() + ".selectedTabIndex"; + this.persistence = persistence; selectionModel = getSelectionModel(); selectionModel.selectedItemProperty().addListener((observableValue, oldTab, newTab) -> onTabSelectedIndexChanged()); if (selectedTabIndex == -1) { - Object indexObject = storage.read(storageId); + Object indexObject = persistence.read(this, "selectedTabIndex"); log.trace("saved index" + indexObject); if (indexObject != null) { @@ -138,7 +135,7 @@ public class LazyLoadingTabPane extends TabPane childController.setNavigationController(navigationController); ((Hibernate) childController).awake(); } - storage.write(storageId, index); + persistence.write(this, "selectedTabIndex", index); } } diff --git a/src/main/java/io/bitsquare/gui/funds/FundsController.java b/src/main/java/io/bitsquare/gui/funds/FundsController.java index 0946496ee7..a2a5c5f4a6 100644 --- a/src/main/java/io/bitsquare/gui/funds/FundsController.java +++ b/src/main/java/io/bitsquare/gui/funds/FundsController.java @@ -4,7 +4,7 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.components.LazyLoadingTabPane; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; @@ -16,7 +16,7 @@ import org.slf4j.LoggerFactory; public class FundsController implements Initializable, ChildController, NavigationController { private static final Logger log = LoggerFactory.getLogger(FundsController.class); - private final Storage storage; + private final Persistence persistence; @FXML private LazyLoadingTabPane tabPane; @@ -27,9 +27,9 @@ public class FundsController implements Initializable, ChildController, Navigati /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private FundsController(Storage storage) + private FundsController(Persistence persistence) { - this.storage = storage; + this.persistence = persistence; } @@ -40,7 +40,7 @@ public class FundsController implements Initializable, ChildController, Navigati @Override public void initialize(URL url, ResourceBundle rb) { - tabPane.initialize(this, storage, NavigationItem.DEPOSIT.getFxmlUrl(), NavigationItem.WITHDRAWAL.getFxmlUrl(), NavigationItem.TRANSACTIONS.getFxmlUrl()); + tabPane.initialize(this, persistence, NavigationItem.DEPOSIT.getFxmlUrl(), NavigationItem.WITHDRAWAL.getFxmlUrl(), NavigationItem.TRANSACTIONS.getFxmlUrl()); } diff --git a/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java b/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java index d754b86c77..1cdf31d261 100644 --- a/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java +++ b/src/main/java/io/bitsquare/gui/market/orderbook/OrderBookController.java @@ -22,7 +22,7 @@ import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.Localisation; import io.bitsquare.msg.MessageFacade; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.trade.Direction; import io.bitsquare.trade.Offer; import io.bitsquare.trade.orderbook.OrderBook; @@ -65,7 +65,7 @@ public class OrderBookController implements Initializable, ChildController private final MessageFacade messageFacade; private final WalletFacade walletFacade; private final Settings settings; - private final Storage storage; + private final Persistence persistence; private final Image buyIcon = Icons.getIconImage(Icons.BUY); private final Image sellIcon = Icons.getIconImage(Icons.SELL); @FXML @@ -93,7 +93,7 @@ public class OrderBookController implements Initializable, ChildController /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private OrderBookController(OrderBook orderBook, OrderBookFilter orderBookFilter, User user, MessageFacade messageFacade, WalletFacade walletFacade, Settings settings, Storage storage) + private OrderBookController(OrderBook orderBook, OrderBookFilter orderBookFilter, User user, MessageFacade messageFacade, WalletFacade walletFacade, Settings settings, Persistence persistence) { this.orderBook = orderBook; this.orderBookFilter = orderBookFilter; @@ -101,7 +101,7 @@ public class OrderBookController implements Initializable, ChildController this.messageFacade = messageFacade; this.walletFacade = walletFacade; this.settings = settings; - this.storage = storage; + this.persistence = persistence; } @@ -304,7 +304,7 @@ public class OrderBookController implements Initializable, ChildController user.setAccountID(walletFacade.getRegistrationAddressInfo().toString()); } - storage.write(user.getClass().getName(), user); + persistence.write(user.getClass().getName(), user); } catch (InsufficientMoneyException e1) { Popups.openInsufficientMoneyPopup(); diff --git a/src/main/java/io/bitsquare/gui/orders/OrdersController.java b/src/main/java/io/bitsquare/gui/orders/OrdersController.java index ff3d670289..a66d1ad3e8 100644 --- a/src/main/java/io/bitsquare/gui/orders/OrdersController.java +++ b/src/main/java/io/bitsquare/gui/orders/OrdersController.java @@ -4,7 +4,7 @@ import io.bitsquare.gui.ChildController; import io.bitsquare.gui.NavigationController; import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.components.LazyLoadingTabPane; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; @@ -18,14 +18,14 @@ public class OrdersController implements Initializable, ChildController, Navigat private static final Logger log = LoggerFactory.getLogger(OrdersController.class); private static int SELECTED_TAB_INDEX = -1; private static OrdersController INSTANCE; - private final Storage storage; + private final Persistence persistence; @FXML private LazyLoadingTabPane tabPane; @Inject - private OrdersController(Storage storage) + private OrdersController(Persistence persistence) { - this.storage = storage; + this.persistence = persistence; INSTANCE = this; } @@ -47,7 +47,7 @@ public class OrdersController implements Initializable, ChildController, Navigat { log.trace("setSelectedTabIndex " + index); tabPane.setSelectedTabIndex(index); - storage.write(this.getClass().getName() + ".selectedTabIndex", index); + persistence.write(this, "selectedTabIndex", index); } @@ -59,7 +59,7 @@ public class OrdersController implements Initializable, ChildController, Navigat public void initialize(URL url, ResourceBundle rb) { log.trace("initialize "); - tabPane.initialize(this, storage, NavigationItem.OFFER.getFxmlUrl(), NavigationItem.PENDING_TRADE.getFxmlUrl(), NavigationItem.CLOSED_TRADE.getFxmlUrl()); + tabPane.initialize(this, persistence, NavigationItem.OFFER.getFxmlUrl(), NavigationItem.PENDING_TRADE.getFxmlUrl(), NavigationItem.CLOSED_TRADE.getFxmlUrl()); } diff --git a/src/main/java/io/bitsquare/gui/settings/SettingsController.java b/src/main/java/io/bitsquare/gui/settings/SettingsController.java index e759807cf6..073d903da0 100644 --- a/src/main/java/io/bitsquare/gui/settings/SettingsController.java +++ b/src/main/java/io/bitsquare/gui/settings/SettingsController.java @@ -14,7 +14,7 @@ import io.bitsquare.gui.util.Icons; import io.bitsquare.locale.*; import io.bitsquare.msg.MessageFacade; import io.bitsquare.settings.Settings; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.user.Arbitrator; import io.bitsquare.user.Reputation; import io.bitsquare.user.User; @@ -46,7 +46,7 @@ public class SettingsController implements Initializable, ChildController, Navig private final Settings settings; - private final Storage storage; + private final Persistence persistence; private final MessageFacade messageFacade; private final ObservableList languageList; private final ObservableList countryList; @@ -83,17 +83,17 @@ public class SettingsController implements Initializable, ChildController, Navig /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public SettingsController(User user, Settings settings, Storage storage, MessageFacade messageFacade) + public SettingsController(User user, Settings settings, Persistence persistence, MessageFacade messageFacade) { this.user = user; this.settings = settings; - this.storage = storage; + this.persistence = persistence; this.messageFacade = messageFacade; - Settings savedSettings = (Settings) storage.read(settings.getClass().getName()); - if (savedSettings != null) + Settings persistedSettings = (Settings) persistence.read(settings); + if (persistedSettings != null) { - settings.updateFromStorage(savedSettings); + settings.applyPersistedSettings(persistedSettings); languageList = FXCollections.observableArrayList(settings.getAcceptedLanguageLocales()); countryList = FXCollections.observableArrayList(settings.getAcceptedCountries()); arbitratorList = FXCollections.observableArrayList(settings.getAcceptedArbitrators()); @@ -166,7 +166,7 @@ public class SettingsController implements Initializable, ChildController, Navig arbitratorList.add(arbitrator); settings.addAcceptedArbitrator(arbitrator); - storage.write(settings.getClass().getName(), settings); + persistence.write(settings); messageFacade.addArbitrator(arbitrator); } @@ -284,7 +284,7 @@ public class SettingsController implements Initializable, ChildController, Navig if (bankAccount != null && bankAccount != user.getCurrentBankAccount()) { user.setCurrentBankAccount(bankAccount); - storage.write(user.getClass().getName(), user); + persistence.write(user); initBankAccountScreen(); } } @@ -595,12 +595,12 @@ public class SettingsController implements Initializable, ChildController, Navig private void saveSettings() { - storage.write(settings.getClass().getName(), settings); + persistence.write(settings); } private void saveUser() { - storage.write(user.getClass().getName(), user); + persistence.write(user); } /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/io/bitsquare/msg/MessageFacade.java b/src/main/java/io/bitsquare/msg/MessageFacade.java index 07a6de46ac..60f1cbc091 100644 --- a/src/main/java/io/bitsquare/msg/MessageFacade.java +++ b/src/main/java/io/bitsquare/msg/MessageFacade.java @@ -46,11 +46,14 @@ public class MessageFacade implements MessageBroker private static final Logger log = LoggerFactory.getLogger(MessageFacade.class); private static final String ARBITRATORS_ROOT = "ArbitratorsRoot"; - private final P2PNode p2pNode; + private P2PNode p2pNode; private final List orderBookListeners = new ArrayList<>(); private final List arbitratorListeners = new ArrayList<>(); private final List incomingTradeMessageListeners = new ArrayList<>(); + private User user; + private Boolean useDiskStorage; + private SeedNodeAddress.StaticSeedNodeAddresses defaultStaticSeedNodeAddresses; /////////////////////////////////////////////////////////////////////////////////////////// @@ -60,7 +63,9 @@ public class MessageFacade implements MessageBroker @Inject public MessageFacade(User user, @Named("useDiskStorage") Boolean useDiskStorage, @Named("defaultSeedNode") SeedNodeAddress.StaticSeedNodeAddresses defaultStaticSeedNodeAddresses) { - this.p2pNode = new P2PNode(user.getMessageKeyPair(), useDiskStorage, defaultStaticSeedNodeAddresses, this); + this.user = user; + this.useDiskStorage = useDiskStorage; + this.defaultStaticSeedNodeAddresses = defaultStaticSeedNodeAddresses; } @@ -70,6 +75,7 @@ public class MessageFacade implements MessageBroker public void init(BootstrapListener bootstrapListener) { + p2pNode = new P2PNode(user.getMessageKeyPair(), useDiskStorage, defaultStaticSeedNodeAddresses, this); p2pNode.start(new FutureCallback() { @Override diff --git a/src/main/java/io/bitsquare/settings/Settings.java b/src/main/java/io/bitsquare/settings/Settings.java index c788f57658..0f50e16337 100644 --- a/src/main/java/io/bitsquare/settings/Settings.java +++ b/src/main/java/io/bitsquare/settings/Settings.java @@ -36,15 +36,15 @@ public class Settings implements Serializable // Public API /////////////////////////////////////////////////////////////////////////////////////////// - public void updateFromStorage(Settings savedSettings) + public void applyPersistedSettings(Settings persistedSettings) { - if (savedSettings != null) + if (persistedSettings != null) { - acceptedLanguageLocales = savedSettings.getAcceptedLanguageLocales(); - acceptedCountryLocales = savedSettings.getAcceptedCountries(); - acceptedArbitrators = savedSettings.getAcceptedArbitrators(); - maxCollateral = savedSettings.getMaxCollateral(); - minCollateral = savedSettings.getMinCollateral(); + acceptedLanguageLocales = persistedSettings.getAcceptedLanguageLocales(); + acceptedCountryLocales = persistedSettings.getAcceptedCountries(); + acceptedArbitrators = persistedSettings.getAcceptedArbitrators(); + maxCollateral = persistedSettings.getMaxCollateral(); + minCollateral = persistedSettings.getMinCollateral(); } } diff --git a/src/main/java/io/bitsquare/storage/Storage.java b/src/main/java/io/bitsquare/storage/Persistence.java similarity index 97% rename from src/main/java/io/bitsquare/storage/Storage.java rename to src/main/java/io/bitsquare/storage/Persistence.java index 0a3b00e95a..ac6cbc1042 100644 --- a/src/main/java/io/bitsquare/storage/Storage.java +++ b/src/main/java/io/bitsquare/storage/Persistence.java @@ -16,9 +16,9 @@ import org.slf4j.LoggerFactory; /** * Simple storage solution for serialized data */ -public class Storage +public class Persistence { - private static final Logger log = LoggerFactory.getLogger(Storage.class); + private static final Logger log = LoggerFactory.getLogger(Persistence.class); private static final ReentrantLock lock = Threading.lock("Storage"); private final String prefix = BitSquare.getAppName() + "_pref"; @@ -33,7 +33,7 @@ public class Storage /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public Storage() + public Persistence() { } @@ -112,6 +112,11 @@ public class Storage write(classInstance.getClass().getName(), value); } + public void write(Serializable classInstance) + { + write(classInstance.getClass().getName(), classInstance); + } + public void write(String key, Serializable value) { // log.trace("Write object with key = " + key + " / value = " + value); diff --git a/src/main/java/io/bitsquare/trade/Trading.java b/src/main/java/io/bitsquare/trade/Trading.java index caa8cffd85..680f8a3cb8 100644 --- a/src/main/java/io/bitsquare/trade/Trading.java +++ b/src/main/java/io/bitsquare/trade/Trading.java @@ -9,7 +9,7 @@ import io.bitsquare.crypto.CryptoFacade; import io.bitsquare.gui.popups.Popups; import io.bitsquare.msg.MessageFacade; import io.bitsquare.msg.listeners.TakeOfferRequestListener; -import io.bitsquare.storage.Storage; +import io.bitsquare.storage.Persistence; import io.bitsquare.trade.protocol.TradeMessage; import io.bitsquare.trade.protocol.offerer.*; import io.bitsquare.trade.protocol.taker.*; @@ -32,10 +32,8 @@ public class Trading { private static final Logger log = LoggerFactory.getLogger(Trading.class); - private final String storageKey = this.getClass().getName(); - private final User user; - private final Storage storage; + private final Persistence persistence; private final MessageFacade messageFacade; private final BlockChainFacade blockChainFacade; private final WalletFacade walletFacade; @@ -60,16 +58,16 @@ public class Trading /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public Trading(User user, Storage storage, MessageFacade messageFacade, BlockChainFacade blockChainFacade, WalletFacade walletFacade, CryptoFacade cryptoFacade) + public Trading(User user, Persistence persistence, MessageFacade messageFacade, BlockChainFacade blockChainFacade, WalletFacade walletFacade, CryptoFacade cryptoFacade) { this.user = user; - this.storage = storage; + this.persistence = persistence; this.messageFacade = messageFacade; this.blockChainFacade = blockChainFacade; this.walletFacade = walletFacade; this.cryptoFacade = cryptoFacade; - Object offersObject = storage.read(storageKey + ".offers"); + Object offersObject = persistence.read(this, "offers"); if (offersObject instanceof HashMap) { offers = (Map) offersObject; @@ -79,7 +77,7 @@ public class Trading offers = new HashMap<>(); } - Object tradesObject = storage.read(storageKey + ".trades"); + Object tradesObject = persistence.read(this, "trades"); if (tradesObject instanceof HashMap) { trades = (Map) tradesObject; @@ -405,12 +403,12 @@ public class Trading private void saveOffers() { - storage.write(storageKey + ".offers", offers); + persistence.write(this, "offers", offers); } private void saveTrades() { - storage.write(storageKey + ".trades", trades); + persistence.write(this, "trades", trades); } @Nullable diff --git a/src/main/java/io/bitsquare/user/Arbitrator.java b/src/main/java/io/bitsquare/user/Arbitrator.java index 56effa061f..02f0d0637b 100644 --- a/src/main/java/io/bitsquare/user/Arbitrator.java +++ b/src/main/java/io/bitsquare/user/Arbitrator.java @@ -68,23 +68,23 @@ public class Arbitrator implements Serializable id = name; } - public void updateFromStorage(Arbitrator savedArbitrator) + public void applyPersistedArbitrator(Arbitrator persistedArbitrator) { - this.pubKeyAsHex = savedArbitrator.getPubKeyAsHex(); - this.messagePubKeyAsHex = savedArbitrator.getPubKeyAsHex(); - this.name = savedArbitrator.getName(); - this.idType = savedArbitrator.getIdType(); - this.languages = savedArbitrator.getLanguages(); - this.reputation = savedArbitrator.getReputation(); - this.maxTradeVolume = savedArbitrator.getMaxTradeVolume(); - this.passiveServiceFee = savedArbitrator.getPassiveServiceFee(); - this.minPassiveServiceFee = savedArbitrator.getMinPassiveServiceFee(); - this.arbitrationFee = savedArbitrator.getArbitrationFee(); - this.minArbitrationFee = savedArbitrator.getMinArbitrationFee(); - this.arbitrationMethods = savedArbitrator.getArbitrationMethods(); - this.idVerifications = savedArbitrator.getIdVerifications(); - this.webUrl = savedArbitrator.getWebUrl(); - this.description = savedArbitrator.getDescription(); + this.pubKeyAsHex = persistedArbitrator.getPubKeyAsHex(); + this.messagePubKeyAsHex = persistedArbitrator.getPubKeyAsHex(); + this.name = persistedArbitrator.getName(); + this.idType = persistedArbitrator.getIdType(); + this.languages = persistedArbitrator.getLanguages(); + this.reputation = persistedArbitrator.getReputation(); + this.maxTradeVolume = persistedArbitrator.getMaxTradeVolume(); + this.passiveServiceFee = persistedArbitrator.getPassiveServiceFee(); + this.minPassiveServiceFee = persistedArbitrator.getMinPassiveServiceFee(); + this.arbitrationFee = persistedArbitrator.getArbitrationFee(); + this.minArbitrationFee = persistedArbitrator.getMinArbitrationFee(); + this.arbitrationMethods = persistedArbitrator.getArbitrationMethods(); + this.idVerifications = persistedArbitrator.getIdVerifications(); + this.webUrl = persistedArbitrator.getWebUrl(); + this.description = persistedArbitrator.getDescription(); //TODO for mock arbitrator id = name; diff --git a/src/main/java/io/bitsquare/user/User.java b/src/main/java/io/bitsquare/user/User.java index 4ede94402e..4511002056 100644 --- a/src/main/java/io/bitsquare/user/User.java +++ b/src/main/java/io/bitsquare/user/User.java @@ -8,23 +8,26 @@ import java.security.PublicKey; import java.util.ArrayList; import java.util.List; import javafx.beans.property.SimpleBooleanProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +/** + * The User is stored locally it is never transmitted over the wire. + */ public class User implements Serializable { + private static final Logger log = LoggerFactory.getLogger(User.class); private static final long serialVersionUID = 7409078808248518638L; transient private final SimpleBooleanProperty bankAccountChangedProperty = new SimpleBooleanProperty(); - transient private KeyPair messageKeyPair = DSAKeyUtil.getKeyPair(); - private PublicKey messagePublicKey; + private KeyPair messageKeyPair; private String accountID; - private boolean isOnline; - private List bankAccounts = new ArrayList<>(); - private BankAccount currentBankAccount = null; + private List bankAccounts; + private BankAccount currentBankAccount; public User() { - messagePublicKey = messageKeyPair.getPublic(); } @@ -32,46 +35,36 @@ public class User implements Serializable // Public Methods /////////////////////////////////////////////////////////////////////////////////////////// - public void updateFromStorage(User savedUser) + public void applyPersistedUser(User persistedUser) { - if (savedUser != null) + if (persistedUser != null) { - accountID = savedUser.getAccountId(); - // TODO handled by DSAKeyUtil -> change that storage check is only done here - // messagePublicKey = savedUser.getMessagePublicKey(); - isOnline = savedUser.getIsOnline(); - bankAccounts = savedUser.getBankAccounts(); - currentBankAccount = savedUser.getCurrentBankAccount(); + accountID = persistedUser.getAccountId(); + bankAccounts = persistedUser.getBankAccounts(); + setCurrentBankAccount(persistedUser.getCurrentBankAccount()); + messageKeyPair = persistedUser.getMessageKeyPair(); + } + else + { + // First time + bankAccounts = new ArrayList<>(); + messageKeyPair = DSAKeyUtil.getKeyPair(); // DSAKeyUtil.getKeyPair() runs in same thread now } - - messagePublicKey = messageKeyPair.getPublic(); } public void addBankAccount(BankAccount bankAccount) { - if (!bankAccounts.contains(bankAccount)) - { - bankAccounts.add(bankAccount); - } + if (!bankAccounts.contains(bankAccount)) bankAccounts.add(bankAccount); - currentBankAccount = bankAccount; + setCurrentBankAccount(bankAccount); } public void removeCurrentBankAccount() { - if (currentBankAccount != null) - { - bankAccounts.remove(currentBankAccount); - } + if (currentBankAccount != null) bankAccounts.remove(currentBankAccount); - if (bankAccounts.isEmpty()) - { - currentBankAccount = null; - } - else - { - currentBankAccount = bankAccounts.get(0); - } + if (bankAccounts.isEmpty()) currentBankAccount = null; + else setCurrentBankAccount(bankAccounts.get(0)); } @@ -79,6 +72,22 @@ public class User implements Serializable // Setters /////////////////////////////////////////////////////////////////////////////////////////// + // Will be written after registration. + // Public key from the input for the registration payment tx (or address) will be used + public void setAccountID(String accountID) + { + this.accountID = accountID; + } + + public void setCurrentBankAccount(BankAccount bankAccount) + { + this.currentBankAccount = bankAccount; + bankAccountChangedProperty.set(!bankAccountChangedProperty.get()); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Getters + /////////////////////////////////////////////////////////////////////////////////////////// public String getStringifiedBankAccounts() { @@ -97,46 +106,21 @@ public class User implements Serializable return bankAccountUIDs; } - public String getAccountId() { return accountID; } - public void setAccountID(String accountID) - { - this.accountID = accountID; - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Getters - /////////////////////////////////////////////////////////////////////////////////////////// - - public List getBankAccounts() { return bankAccounts; } - public void setBankAccounts(List bankAccounts) - { - this.bankAccounts = bankAccounts; - } - - public BankAccount getCurrentBankAccount() { return currentBankAccount; } - public void setCurrentBankAccount(BankAccount bankAccount) - { - this.currentBankAccount = bankAccount; - bankAccountChangedProperty.set(!bankAccountChangedProperty.get()); - } - - public BankAccount getBankAccount(String bankAccountId) { for (final BankAccount bankAccount : bankAccounts) @@ -149,36 +133,11 @@ public class User implements Serializable return null; } - boolean getIsOnline() - { - return isOnline; - } - - public void setIsOnline(boolean isOnline) - { - this.isOnline = isOnline; - } - - public SimpleBooleanProperty getBankAccountChangedProperty() { return bankAccountChangedProperty; } - @Override - public String toString() - { - return "User{" + - "bankAccountChangedProperty=" + bankAccountChangedProperty + - ", messageKeyPair=" + messageKeyPair + - ", messagePublicKey=" + messagePublicKey + - ", accountID='" + accountID + '\'' + - ", isOnline=" + isOnline + - ", bankAccounts=" + bankAccounts + - ", currentBankAccount=" + currentBankAccount + - '}'; - } - public KeyPair getMessageKeyPair() { return messageKeyPair; @@ -186,6 +145,18 @@ public class User implements Serializable public PublicKey getMessagePublicKey() { - return messagePublicKey; + return messageKeyPair.getPublic(); + } + + @Override + public String toString() + { + return "User{" + + "bankAccountChangedProperty=" + bankAccountChangedProperty + + ", messageKeyPair=" + messageKeyPair + + ", accountID='" + accountID + '\'' + + ", bankAccounts=" + bankAccounts + + ", currentBankAccount=" + currentBankAccount + + '}'; } } diff --git a/src/main/java/io/bitsquare/util/DSAKeyUtil.java b/src/main/java/io/bitsquare/util/DSAKeyUtil.java index 04e1f396a3..169922a7a1 100755 --- a/src/main/java/io/bitsquare/util/DSAKeyUtil.java +++ b/src/main/java/io/bitsquare/util/DSAKeyUtil.java @@ -12,6 +12,10 @@ import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Runs in JavaFX Application Thread now but might be sent to a background thread. + * We need to handle threading issues in the client classes if we change. + */ public class DSAKeyUtil { private static final Logger log = LoggerFactory.getLogger(DSAKeyUtil.class); @@ -177,7 +181,6 @@ public class DSAKeyUtil //noinspection ResultOfMethodCallIgnored privKeyFileInputStream.read(encodedPrivKey); final PrivateKey privKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedPrivKey)); - return new KeyPair(pubKey, privKey); } finally {