From 4f6761a6d91b592f928dd2672cd264794ae07288 Mon Sep 17 00:00:00 2001
From: Manfred Karrer <mk@nucleo.io>
Date: Mon, 9 Mar 2015 13:56:28 +0100
Subject: [PATCH] Use lazy singleton instead of eager

---
 .../bitsquare/app/gui/BitsquareAppModule.java | 11 ++++----
 .../java/io/bitsquare/btc/BitcoinModule.java  |  9 ++++---
 .../io/bitsquare/crypto/CryptoModule.java     |  6 +++--
 .../main/java/io/bitsquare/gui/GuiModule.java | 26 +++++++++----------
 .../trade/offerbook/OfferBookDataModel.java   |  4 +--
 .../network/tomp2p/TomP2PNetworkModule.java   |  2 +-
 .../trade/offerbook => offer}/OfferBook.java  | 19 +++++++-------
 .../java/io/bitsquare/offer/OfferModule.java  |  8 ++++++
 .../offer/tomp2p/TomP2POfferModule.java       |  6 +++--
 .../bitsquare/trade/TradeMessageService.java  |  6 ++---
 .../java/io/bitsquare/trade/TradeModule.java  |  4 ++-
 .../listeners/ProcessNewMessageListener.java  | 25 ++++++++++++++++++
 .../tomp2p/TomP2PTradeMessageService.java     | 14 +++++-----
 13 files changed, 90 insertions(+), 50 deletions(-)
 rename gui/src/main/java/io/bitsquare/{gui/main/trade/offerbook => offer}/OfferBook.java (94%)
 create mode 100644 gui/src/main/java/io/bitsquare/trade/listeners/ProcessNewMessageListener.java

diff --git a/gui/src/main/java/io/bitsquare/app/gui/BitsquareAppModule.java b/gui/src/main/java/io/bitsquare/app/gui/BitsquareAppModule.java
index d043dd7ed5..91e1bbda60 100644
--- a/gui/src/main/java/io/bitsquare/app/gui/BitsquareAppModule.java
+++ b/gui/src/main/java/io/bitsquare/app/gui/BitsquareAppModule.java
@@ -36,6 +36,7 @@ import io.bitsquare.trade.tomp2p.TomP2PTradeMessageModule;
 import io.bitsquare.user.User;
 
 import com.google.inject.Injector;
+import com.google.inject.Singleton;
 
 import java.io.File;
 
@@ -56,17 +57,17 @@ class BitsquareAppModule extends BitsquareModule {
 
     @Override
     protected void configure() {
-        bind(User.class).asEagerSingleton();
-        bind(Preferences.class).asEagerSingleton();
-        bind(AccountSettings.class).asEagerSingleton();
+        bind(User.class).in(Singleton.class);
+        bind(Preferences.class).in(Singleton.class);
+        bind(AccountSettings.class).in(Singleton.class);
 
         File persistenceDir = new File(env.getRequiredProperty(Persistence.DIR_KEY));
         bind(File.class).annotatedWith(named(Persistence.DIR_KEY)).toInstance(persistenceDir);
         bindConstant().annotatedWith(named(Persistence.PREFIX_KEY)).to(env.getRequiredProperty(Persistence.PREFIX_KEY));
-        bind(Persistence.class).asEagerSingleton();
+        bind(Persistence.class).in(Singleton.class);
 
         bind(Environment.class).toInstance(env);
-        bind(UpdateProcess.class).asEagerSingleton();
+        bind(UpdateProcess.class).in(Singleton.class);
 
         install(networkModule());
         install(bitcoinModule());
diff --git a/gui/src/main/java/io/bitsquare/btc/BitcoinModule.java b/gui/src/main/java/io/bitsquare/btc/BitcoinModule.java
index 08c6a2b4c5..fe2af83c32 100644
--- a/gui/src/main/java/io/bitsquare/btc/BitcoinModule.java
+++ b/gui/src/main/java/io/bitsquare/btc/BitcoinModule.java
@@ -20,6 +20,7 @@ package io.bitsquare.btc;
 import io.bitsquare.BitsquareModule;
 
 import com.google.inject.Injector;
+import com.google.inject.Singleton;
 
 import java.io.File;
 
@@ -38,19 +39,19 @@ public class BitcoinModule extends BitsquareModule {
     protected void configure() {
         bind(BitcoinNetwork.class).toInstance(
                 env.getProperty(BitcoinNetwork.KEY, BitcoinNetwork.class, BitcoinNetwork.DEFAULT));
-        bind(FeePolicy.class).asEagerSingleton();
+        bind(FeePolicy.class).in(Singleton.class);
 
         bindConstant().annotatedWith(named(UserAgent.NAME_KEY)).to(env.getRequiredProperty(UserAgent.NAME_KEY));
         bindConstant().annotatedWith(named(UserAgent.VERSION_KEY)).to(env.getRequiredProperty(UserAgent.VERSION_KEY));
-        bind(UserAgent.class).asEagerSingleton();
+        bind(UserAgent.class).in(Singleton.class);
 
         File walletDir = new File(env.getRequiredProperty(WalletService.DIR_KEY));
         bind(File.class).annotatedWith(named(WalletService.DIR_KEY)).toInstance(walletDir);
         bindConstant().annotatedWith(named(WalletService.PREFIX_KEY)).to(
                 env.getRequiredProperty(WalletService.PREFIX_KEY));
-        bind(WalletService.class).asEagerSingleton();
+        bind(WalletService.class).in(Singleton.class);
 
-        bind(BlockChainService.class).asEagerSingleton();
+        bind(BlockChainService.class).in(Singleton.class);
     }
 
     @Override
diff --git a/gui/src/main/java/io/bitsquare/crypto/CryptoModule.java b/gui/src/main/java/io/bitsquare/crypto/CryptoModule.java
index 7d47530dde..81c0d9902c 100644
--- a/gui/src/main/java/io/bitsquare/crypto/CryptoModule.java
+++ b/gui/src/main/java/io/bitsquare/crypto/CryptoModule.java
@@ -19,6 +19,8 @@ package io.bitsquare.crypto;
 
 import io.bitsquare.BitsquareModule;
 
+import com.google.inject.Singleton;
+
 import org.springframework.core.env.Environment;
 
 public class CryptoModule extends BitsquareModule {
@@ -29,7 +31,7 @@ public class CryptoModule extends BitsquareModule {
 
     @Override
     protected void configure() {
-        bind(SignatureService.class).asEagerSingleton();
-        bind(HashService.class).asEagerSingleton();
+        bind(SignatureService.class).in(Singleton.class);
+        bind(HashService.class).in(Singleton.class);
     }
 }
diff --git a/gui/src/main/java/io/bitsquare/gui/GuiModule.java b/gui/src/main/java/io/bitsquare/gui/GuiModule.java
index c66258cc90..c1a2ba651e 100644
--- a/gui/src/main/java/io/bitsquare/gui/GuiModule.java
+++ b/gui/src/main/java/io/bitsquare/gui/GuiModule.java
@@ -20,7 +20,7 @@ package io.bitsquare.gui;
 import io.bitsquare.BitsquareModule;
 import io.bitsquare.gui.components.Popups;
 import io.bitsquare.gui.main.MainView;
-import io.bitsquare.gui.main.trade.offerbook.OfferBook;
+import io.bitsquare.offer.OfferBook;
 import io.bitsquare.gui.util.BSFormatter;
 import io.bitsquare.gui.util.Transitions;
 import io.bitsquare.gui.util.validation.BankAccountNumberValidator;
@@ -60,20 +60,20 @@ public class GuiModule extends BitsquareModule {
         bind(ViewFactory.class).to(InjectorViewFactory.class);
 
         bind(ResourceBundle.class).toInstance(BSResources.getResourceBundle());
-        bind(ViewLoader.class).to(FxmlViewLoader.class).asEagerSingleton();
-        bind(CachingViewLoader.class).asEagerSingleton();
+        bind(ViewLoader.class).to(FxmlViewLoader.class).in(Singleton.class);
+        bind(CachingViewLoader.class).in(Singleton.class);
 
-        bind(OfferBook.class).asEagerSingleton();
-        bind(Navigation.class).asEagerSingleton();
-        bind(OverlayManager.class).asEagerSingleton();
-        bind(BSFormatter.class).asEagerSingleton();
+        bind(OfferBook.class).in(Singleton.class);
+        bind(Navigation.class).in(Singleton.class);
+        bind(OverlayManager.class).in(Singleton.class);
+        bind(BSFormatter.class).in(Singleton.class);
 
-        bind(BankAccountNumberValidator.class).asEagerSingleton();
-        bind(BtcValidator.class).asEagerSingleton();
-        bind(FiatValidator.class).asEagerSingleton();
-        bind(InputValidator.class).asEagerSingleton();
-        bind(PasswordValidator.class).asEagerSingleton();
-        bind(Transitions.class).asEagerSingleton();
+        bind(BankAccountNumberValidator.class).in(Singleton.class);
+        bind(BtcValidator.class).in(Singleton.class);
+        bind(FiatValidator.class).in(Singleton.class);
+        bind(InputValidator.class).in(Singleton.class);
+        bind(PasswordValidator.class).in(Singleton.class);
+        bind(Transitions.class).in(Singleton.class);
 
         bind(Stage.class).toInstance(primaryStage);
         Popups.primaryStage = primaryStage;
diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java
index 3c02429490..1710ca811f 100644
--- a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java
+++ b/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBookDataModel.java
@@ -23,6 +23,7 @@ import io.bitsquare.locale.Country;
 import io.bitsquare.locale.CurrencyUtil;
 import io.bitsquare.offer.Direction;
 import io.bitsquare.offer.Offer;
+import io.bitsquare.offer.OfferBook;
 import io.bitsquare.settings.Preferences;
 import io.bitsquare.trade.TradeManager;
 import io.bitsquare.user.User;
@@ -35,8 +36,6 @@ import org.bitcoinj.utils.Fiat;
 
 import com.google.inject.Inject;
 
-import java.util.Comparator;
-
 import viewfx.model.Activatable;
 import viewfx.model.DataModel;
 
@@ -77,7 +76,6 @@ class OfferBookDataModel implements Activatable, DataModel {
     final StringProperty fiatCode = new SimpleStringProperty();
     final StringProperty btcCode = new SimpleStringProperty();
     final ObjectProperty<Country> bankAccountCountry = new SimpleObjectProperty<>();
-    final ObjectProperty<Comparator<OfferBookListItem>> comparator = new SimpleObjectProperty<>();
     private Direction direction;
 
 
diff --git a/gui/src/main/java/io/bitsquare/network/tomp2p/TomP2PNetworkModule.java b/gui/src/main/java/io/bitsquare/network/tomp2p/TomP2PNetworkModule.java
index 9c613e107d..1e3b77820b 100644
--- a/gui/src/main/java/io/bitsquare/network/tomp2p/TomP2PNetworkModule.java
+++ b/gui/src/main/java/io/bitsquare/network/tomp2p/TomP2PNetworkModule.java
@@ -57,7 +57,7 @@ public class TomP2PNetworkModule extends NetworkModule {
                 )
         );
         bindConstant().annotatedWith(Names.named(NETWORK_INTERFACE_KEY)).to(env.getProperty(NETWORK_INTERFACE_KEY, NETWORK_INTERFACE_UNSPECIFIED));
-        bind(BootstrappedPeerBuilder.class).asEagerSingleton();
+        bind(BootstrappedPeerBuilder.class).in(Singleton.class);
     }
 
     @Override
diff --git a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBook.java b/gui/src/main/java/io/bitsquare/offer/OfferBook.java
similarity index 94%
rename from gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBook.java
rename to gui/src/main/java/io/bitsquare/offer/OfferBook.java
index d5c363d281..f039f4f6cc 100644
--- a/gui/src/main/java/io/bitsquare/gui/main/trade/offerbook/OfferBook.java
+++ b/gui/src/main/java/io/bitsquare/offer/OfferBook.java
@@ -15,13 +15,12 @@
  * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
  */
 
-package io.bitsquare.gui.main.trade.offerbook;
+package io.bitsquare.offer;
 
 import io.bitsquare.bank.BankAccount;
+import io.bitsquare.gui.main.trade.offerbook.OfferBookListItem;
 import io.bitsquare.locale.Country;
 import io.bitsquare.locale.CurrencyUtil;
-import io.bitsquare.offer.Offer;
-import io.bitsquare.offer.OfferBookService;
 import io.bitsquare.trade.TradeManager;
 import io.bitsquare.user.User;
 import io.bitsquare.util.Utilities;
@@ -93,10 +92,10 @@ public class OfferBook {
             public void onOfferRemoved(Offer offer) {
                 // Update state in case that that offer is used in the take offer screen, so it gets updated correctly
                 offer.setState(Offer.State.OFFER_REMOVED);
-                
+
                 // clean up possible references in tradeManager 
                 tradeManager.handleRemovedOffer(offer);
-                
+
                 offerBookListItems.removeIf(item -> item.getOffer().getId().equals(offer.getId()));
             }
         };
@@ -107,13 +106,13 @@ public class OfferBook {
     // Package scope
     ///////////////////////////////////////////////////////////////////////////////////////////
 
-    void addClient() {
+    public void addClient() {
         numClients++;
         if (numClients == 1)
             startPolling();
     }
 
-    void removeClient() {
+    public void removeClient() {
         numClients--;
         checkArgument(numClients >= 0);
         if (numClients == 0)
@@ -125,7 +124,7 @@ public class OfferBook {
     // Getter
     ///////////////////////////////////////////////////////////////////////////////////////////
 
-    ObservableList<OfferBookListItem> getOfferBookListItems() {
+    public ObservableList<OfferBookListItem> getOfferBookListItems() {
         return offerBookListItems;
     }
 
@@ -139,7 +138,9 @@ public class OfferBook {
         if (bankAccount != null) {
             country = bankAccount.getCountry();
             fiatCode = bankAccount.getCurrency().getCurrencyCode();
-            offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country));
+
+            // TODO check why that was used
+            //offerBookListItems.stream().forEach(e -> e.setBankAccountCountry(country));
         }
         else {
             fiatCode = CurrencyUtil.getDefaultCurrency().getCurrencyCode();
diff --git a/gui/src/main/java/io/bitsquare/offer/OfferModule.java b/gui/src/main/java/io/bitsquare/offer/OfferModule.java
index dc3be4bbab..3bedc697e9 100644
--- a/gui/src/main/java/io/bitsquare/offer/OfferModule.java
+++ b/gui/src/main/java/io/bitsquare/offer/OfferModule.java
@@ -19,6 +19,8 @@ package io.bitsquare.offer;
 
 import io.bitsquare.BitsquareModule;
 
+import com.google.inject.Singleton;
+
 import org.springframework.core.env.Environment;
 
 public abstract class OfferModule extends BitsquareModule {
@@ -27,4 +29,10 @@ public abstract class OfferModule extends BitsquareModule {
         super(env);
     }
 
+    @Override
+    protected void configure() {
+        bind(OfferBook.class).in(Singleton.class);
+        bind(OfferBook.class).in(Singleton.class);
+
+    }
 }
diff --git a/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferModule.java b/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferModule.java
index d3b0b45dba..37d83b52e4 100644
--- a/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferModule.java
+++ b/gui/src/main/java/io/bitsquare/offer/tomp2p/TomP2POfferModule.java
@@ -18,10 +18,11 @@
 package io.bitsquare.offer.tomp2p;
 
 import io.bitsquare.network.tomp2p.TomP2PNode;
-import io.bitsquare.offer.OfferModule;
 import io.bitsquare.offer.OfferBookService;
+import io.bitsquare.offer.OfferModule;
 
 import com.google.inject.Provider;
+import com.google.inject.Singleton;
 
 import javax.inject.Inject;
 
@@ -37,7 +38,8 @@ public class TomP2POfferModule extends OfferModule {
 
     @Override
     protected void configure() {
-        bind(OfferBookService.class).toProvider(OfferBookServiceProvider.class).asEagerSingleton();
+        super.configure();
+        bind(OfferBookService.class).toProvider(OfferBookServiceProvider.class).in(Singleton.class);
     }
 }
 
diff --git a/gui/src/main/java/io/bitsquare/trade/TradeMessageService.java b/gui/src/main/java/io/bitsquare/trade/TradeMessageService.java
index 9255065573..c4e70997a3 100644
--- a/gui/src/main/java/io/bitsquare/trade/TradeMessageService.java
+++ b/gui/src/main/java/io/bitsquare/trade/TradeMessageService.java
@@ -21,7 +21,7 @@ import io.bitsquare.network.Message;
 import io.bitsquare.network.MessageBroker;
 import io.bitsquare.network.Peer;
 import io.bitsquare.trade.listeners.GetPeerAddressListener;
-import io.bitsquare.trade.listeners.HandleNewMessageListener;
+import io.bitsquare.trade.listeners.ProcessNewMessageListener;
 import io.bitsquare.trade.listeners.SendMessageListener;
 
 import java.security.PublicKey;
@@ -34,9 +34,9 @@ public interface TradeMessageService extends MessageBroker {
 
     void sendMessage(Peer peer, Message message, SendMessageListener listener);
 
-    void addHandleNewMessageListener(HandleNewMessageListener listener);
+    void addHandleNewMessageListener(ProcessNewMessageListener listener);
 
-    void removeHandleNewMessageListener(HandleNewMessageListener listener);
+    void removeHandleNewMessageListener(ProcessNewMessageListener listener);
 
     void getPeerAddress(PublicKey messagePublicKey, GetPeerAddressListener getPeerAddressListener);
 }
diff --git a/gui/src/main/java/io/bitsquare/trade/TradeModule.java b/gui/src/main/java/io/bitsquare/trade/TradeModule.java
index 30242578f7..acab0b98ca 100644
--- a/gui/src/main/java/io/bitsquare/trade/TradeModule.java
+++ b/gui/src/main/java/io/bitsquare/trade/TradeModule.java
@@ -19,6 +19,8 @@ package io.bitsquare.trade;
 
 import io.bitsquare.BitsquareModule;
 
+import com.google.inject.Singleton;
+
 import org.springframework.core.env.Environment;
 
 public class TradeModule extends BitsquareModule {
@@ -29,6 +31,6 @@ public class TradeModule extends BitsquareModule {
 
     @Override
     protected void configure() {
-        bind(TradeManager.class).asEagerSingleton();
+        bind(TradeManager.class).in(Singleton.class);
     }
 }
diff --git a/gui/src/main/java/io/bitsquare/trade/listeners/ProcessNewMessageListener.java b/gui/src/main/java/io/bitsquare/trade/listeners/ProcessNewMessageListener.java
new file mode 100644
index 0000000000..51c3a7bb22
--- /dev/null
+++ b/gui/src/main/java/io/bitsquare/trade/listeners/ProcessNewMessageListener.java
@@ -0,0 +1,25 @@
+/*
+ * This file is part of Bitsquare.
+ *
+ * Bitsquare is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Bitsquare is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package io.bitsquare.trade.listeners;
+
+import io.bitsquare.network.Message;
+import io.bitsquare.network.Peer;
+
+public interface ProcessNewMessageListener {
+    void handleMessage(Message message, Peer sender);
+}
diff --git a/gui/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java b/gui/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java
index f6f990c992..6235c93d3d 100644
--- a/gui/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java
+++ b/gui/src/main/java/io/bitsquare/trade/tomp2p/TomP2PTradeMessageService.java
@@ -23,7 +23,7 @@ import io.bitsquare.network.tomp2p.TomP2PNode;
 import io.bitsquare.network.tomp2p.TomP2PPeer;
 import io.bitsquare.trade.TradeMessageService;
 import io.bitsquare.trade.listeners.GetPeerAddressListener;
-import io.bitsquare.trade.listeners.HandleNewMessageListener;
+import io.bitsquare.trade.listeners.ProcessNewMessageListener;
 import io.bitsquare.trade.listeners.SendMessageListener;
 import io.bitsquare.user.User;
 
@@ -58,7 +58,7 @@ public class TomP2PTradeMessageService implements TradeMessageService {
 
     private final TomP2PNode tomP2PNode;
     private final User user;
-    private final List<HandleNewMessageListener> handleNewMessageListeners = new ArrayList<>();
+    private final List<ProcessNewMessageListener> processNewMessageListeners = new ArrayList<>();
     private Executor executor;
 
 
@@ -133,12 +133,12 @@ public class TomP2PTradeMessageService implements TradeMessageService {
     // Event Listeners
     ///////////////////////////////////////////////////////////////////////////////////////////
 
-    public void addHandleNewMessageListener(HandleNewMessageListener listener) {
-        handleNewMessageListeners.add(listener);
+    public void addHandleNewMessageListener(ProcessNewMessageListener listener) {
+        processNewMessageListeners.add(listener);
     }
 
-    public void removeHandleNewMessageListener(HandleNewMessageListener listener) {
-        handleNewMessageListeners.remove(listener);
+    public void removeHandleNewMessageListener(ProcessNewMessageListener listener) {
+        processNewMessageListeners.remove(listener);
     }
 
 
@@ -149,7 +149,7 @@ public class TomP2PTradeMessageService implements TradeMessageService {
     @Override
     public void handleMessage(Object message, Peer sender) {
         if (message instanceof Message && sender instanceof TomP2PPeer) {
-            executor.execute(() -> handleNewMessageListeners.stream().forEach(e ->
+            executor.execute(() -> processNewMessageListeners.stream().forEach(e ->
                     e.handleMessage((Message) message, sender)));
         }
     }