Restructure Guice modules

This commit is contained in:
Chris Beams 2014-10-30 20:33:34 +01:00
parent 00af59aa20
commit 835937e0e7
No known key found for this signature in database
GPG Key ID: 3D214F8F5BC5ED73
15 changed files with 357 additions and 144 deletions

View File

@ -0,0 +1,67 @@
/*
* 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.btc;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.RegTestParams;
import org.bitcoinj.params.TestNet3Params;
import com.google.inject.AbstractModule;
import java.util.Properties;
public class BitcoinModule extends AbstractModule {
private final Properties properties;
private final BitcoinNetwork defaultNetwork;
public BitcoinModule(Properties properties) {
this(properties, BitcoinNetwork.TESTNET);
}
public BitcoinModule(Properties properties, BitcoinNetwork defaultNetwork) {
this.properties = properties;
this.defaultNetwork = defaultNetwork;
}
@Override
protected void configure() {
bind(WalletFacade.class).asEagerSingleton();
bind(FeePolicy.class).asEagerSingleton();
bind(BlockChainFacade.class).asEagerSingleton();
bind(NetworkParameters.class).toInstance(network());
}
private NetworkParameters network() {
String networkName = properties.getProperty("networkType", defaultNetwork.name());
switch (BitcoinNetwork.valueOf(networkName.toUpperCase())) {
case MAINNET:
return MainNetParams.get();
case TESTNET:
return TestNet3Params.get();
case REGTEST:
return RegTestParams.get();
default:
throw new IllegalArgumentException("Unknown bitcoin network name: " + networkName);
}
}
}

View File

@ -0,0 +1,22 @@
/*
* 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.btc;
public enum BitcoinNetwork {
MAINNET, TESTNET, REGTEST;
}

View File

@ -92,9 +92,6 @@ import static org.bitcoinj.script.ScriptOpCodes.OP_RETURN;
public class WalletFacade { public class WalletFacade {
private static final Logger log = LoggerFactory.getLogger(WalletFacade.class); private static final Logger log = LoggerFactory.getLogger(WalletFacade.class);
public static final String MAIN_NET = "mainnet";
public static final String TEST_NET = "testnet";
public static final String REG_TEST_NET = "regtest";
public static final String WALLET_PREFIX = Bitsquare.getAppName(); public static final String WALLET_PREFIX = Bitsquare.getAppName();
private final ReentrantLock lock = Threading.lock("lock"); private final ReentrantLock lock = Threading.lock("lock");

View File

@ -0,0 +1,34 @@
/*
* 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.crypto;
import io.bitsquare.di.AbstractBitsquareModule;
import java.util.Properties;
public class CryptoModule extends AbstractBitsquareModule {
public CryptoModule(Properties properties) {
super(properties);
}
@Override
protected void configure() {
bind(CryptoFacade.class).asEagerSingleton();
}
}

View File

@ -0,0 +1,31 @@
/*
* 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.di;
import com.google.inject.AbstractModule;
import java.util.Properties;
public abstract class AbstractBitsquareModule extends AbstractModule {
protected final Properties properties;
public AbstractBitsquareModule(Properties properties) {
this.properties = properties;
}
}

View File

@ -17,53 +17,31 @@
package io.bitsquare.di; package io.bitsquare.di;
import io.bitsquare.Bitsquare; import io.bitsquare.Bitsquare;
import io.bitsquare.btc.BlockChainFacade; import io.bitsquare.btc.BitcoinModule;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.crypto.CryptoModule;
import io.bitsquare.btc.WalletFacade; import io.bitsquare.gui.GuiModule;
import io.bitsquare.crypto.CryptoFacade; import io.bitsquare.msg.DefaultMessageModule;
import io.bitsquare.gui.Navigation; import io.bitsquare.msg.MessageModule;
import io.bitsquare.gui.OverlayManager;
import io.bitsquare.gui.main.trade.offerbook.OfferBook;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.validation.BankAccountNumberValidator;
import io.bitsquare.gui.util.validation.BtcValidator;
import io.bitsquare.gui.util.validation.FiatValidator;
import io.bitsquare.gui.util.validation.InputValidator;
import io.bitsquare.gui.util.validation.PasswordValidator;
import io.bitsquare.msg.BootstrappedPeerFactory;
import io.bitsquare.msg.DHTSeedService;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.msg.P2PNode;
import io.bitsquare.msg.SeedNodeAddress;
import io.bitsquare.msg.TomP2PMessageFacade;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.trade.TradeManager; import io.bitsquare.trade.TradeModule;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import io.bitsquare.util.ConfigLoader; import io.bitsquare.util.ConfigLoader;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.RegTestParams;
import org.bitcoinj.params.TestNet3Params;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.name.Names;
import java.util.Properties; import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import akka.actor.ActorSystem; import akka.actor.ActorSystem;
public class BitsquareModule extends AbstractModule { public class BitsquareModule extends AbstractBitsquareModule {
private static final Logger log = LoggerFactory.getLogger(BitsquareModule.class);
static Properties properties; public BitsquareModule() {
this(ConfigLoader.loadConfig());
}
public BitsquareModule(Properties properties) {
super(properties);
}
@Override @Override
protected void configure() { protected void configure() {
@ -71,112 +49,33 @@ public class BitsquareModule extends AbstractModule {
bind(Persistence.class).asEagerSingleton(); bind(Persistence.class).asEagerSingleton();
bind(Settings.class).asEagerSingleton(); bind(Settings.class).asEagerSingleton();
bind(CryptoFacade.class).asEagerSingleton(); install(messageModule());
bind(WalletFacade.class).asEagerSingleton(); install(bitcoinModule());
bind(FeePolicy.class).asEagerSingleton(); install(cryptoModule());
install(tradeModule());
install(guiModule());
bind(BlockChainFacade.class).asEagerSingleton(); bind(ActorSystem.class).toInstance(ActorSystem.create(Bitsquare.getAppName()));
bind(MessageFacade.class).to(TomP2PMessageFacade.class).asEagerSingleton(); }
bind(P2PNode.class).asEagerSingleton();
bind(BootstrappedPeerFactory.class).asEagerSingleton();
bind(TradeManager.class).asEagerSingleton(); protected MessageModule messageModule() {
bind(OfferBook.class).asEagerSingleton(); return new DefaultMessageModule(properties);
bind(Navigation.class).asEagerSingleton(); }
bind(OverlayManager.class).asEagerSingleton();
bind(BSFormatter.class).asEagerSingleton();
bind(BankAccountNumberValidator.class).asEagerSingleton(); protected BitcoinModule bitcoinModule() {
bind(BtcValidator.class).asEagerSingleton(); return new BitcoinModule(properties);
bind(FiatValidator.class).asEagerSingleton(); }
bind(InputValidator.class).asEagerSingleton();
bind(PasswordValidator.class).asEagerSingleton();
bind(NetworkParameters.class).toProvider(NetworkParametersProvider.class).asEagerSingleton(); protected CryptoModule cryptoModule() {
return new CryptoModule(properties);
}
// we will probably later disc storage instead of memory storage for TomP2P protected TradeModule tradeModule() {
// bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(true); return new TradeModule(properties);
bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(false); }
bind(SeedNodeAddress.StaticSeedNodeAddresses.class).annotatedWith(Names.named("defaultSeedNode")) protected GuiModule guiModule() {
.toProvider(StaticSeedNodeAddressesProvider.class).asEagerSingleton(); return new GuiModule(properties);
// Actor Related Classes to Inject
bind(ActorSystem.class).toProvider(ActorSystemProvider.class).asEagerSingleton();
bind(DHTSeedService.class);
} }
} }
class StaticSeedNodeAddressesProvider implements Provider<SeedNodeAddress.StaticSeedNodeAddresses> {
private static final Logger log = LoggerFactory.getLogger(StaticSeedNodeAddressesProvider.class);
public SeedNodeAddress.StaticSeedNodeAddresses get() {
if (BitsquareModule.properties == null)
BitsquareModule.properties = ConfigLoader.loadConfig();
log.info("seedNode from config file: " + BitsquareModule.properties.getProperty("defaultSeedNode"));
String seedNodeFromConfig = BitsquareModule.properties.getProperty("defaultSeedNode");
// Set default
//SeedNodeAddress.StaticSeedNodeAddresses seedNode = SeedNodeAddress.StaticSeedNodeAddresses.LOCALHOST;
SeedNodeAddress.StaticSeedNodeAddresses seedNode = SeedNodeAddress.StaticSeedNodeAddresses.DIGITAL_OCEAN1;
// if defined in config we override the above
// if (seedNodeFromConfig != null)
// seedNode = seedNodeFromConfig.equals("localhost") ?
// SeedNodeAddress.StaticSeedNodeAddresses.LOCALHOST :
// SeedNodeAddress.StaticSeedNodeAddresses.DIGITAL_OCEAN;
return seedNode;
}
}
class NetworkParametersProvider implements Provider<NetworkParameters> {
private static final Logger log = LoggerFactory.getLogger(NetworkParametersProvider.class);
public NetworkParameters get() {
NetworkParameters result = null;
//If config is available we override the networkType defined in Guice with the one from the config file
if (BitsquareModule.properties == null)
BitsquareModule.properties = ConfigLoader.loadConfig();
log.info("networkType from config file: " + BitsquareModule.properties.getProperty("networkType"));
String networkTypeFromConfig = BitsquareModule.properties.getProperty("networkType");
// Set default
// String networkType= WalletFacade.MAIN_NET;
String networkType = WalletFacade.TEST_NET;
//String networkType = WalletFacade.REG_TEST_NET;
if (networkTypeFromConfig != null)
networkType = networkTypeFromConfig;
switch (networkType) {
case WalletFacade.MAIN_NET:
result = MainNetParams.get();
break;
case WalletFacade.TEST_NET:
result = TestNet3Params.get();
break;
case WalletFacade.REG_TEST_NET:
result = RegTestParams.get();
break;
}
return result;
}
}
class ActorSystemProvider implements Provider<ActorSystem> {
@Override
public ActorSystem get() {
ActorSystem system = ActorSystem.create(Bitsquare.getAppName());
// create top level actors
//system.actorOf(DHTManager.getProps(), DHTManager.SEED_NAME);
return system;
}
}

View File

@ -0,0 +1,50 @@
/*
* 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.gui;
import io.bitsquare.di.AbstractBitsquareModule;
import io.bitsquare.gui.main.trade.offerbook.OfferBook;
import io.bitsquare.gui.util.BSFormatter;
import io.bitsquare.gui.util.validation.BankAccountNumberValidator;
import io.bitsquare.gui.util.validation.BtcValidator;
import io.bitsquare.gui.util.validation.FiatValidator;
import io.bitsquare.gui.util.validation.InputValidator;
import io.bitsquare.gui.util.validation.PasswordValidator;
import java.util.Properties;
public class GuiModule extends AbstractBitsquareModule {
public GuiModule(Properties properties) {
super(properties);
}
@Override
protected void configure() {
bind(OfferBook.class).asEagerSingleton();
bind(Navigation.class).asEagerSingleton();
bind(OverlayManager.class).asEagerSingleton();
bind(BSFormatter.class).asEagerSingleton();
bind(BankAccountNumberValidator.class).asEagerSingleton();
bind(BtcValidator.class).asEagerSingleton();
bind(FiatValidator.class).asEagerSingleton();
bind(InputValidator.class).asEagerSingleton();
bind(PasswordValidator.class).asEagerSingleton();
}
}

View File

@ -15,7 +15,9 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.util; package io.bitsquare.msg;
import io.bitsquare.util.MessageHandler;
import javafx.concurrent.Service; import javafx.concurrent.Service;
import javafx.concurrent.Task; import javafx.concurrent.Task;

View File

@ -19,7 +19,6 @@ package io.bitsquare.msg;
import io.bitsquare.msg.actor.DHTManager; import io.bitsquare.msg.actor.DHTManager;
import io.bitsquare.msg.actor.command.InitializePeer; import io.bitsquare.msg.actor.command.InitializePeer;
import io.bitsquare.util.ActorService;
import com.google.inject.Inject; import com.google.inject.Inject;

View File

@ -0,0 +1,46 @@
/*
* 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.msg;
import io.bitsquare.di.AbstractBitsquareModule;
import com.google.inject.name.Names;
import java.util.Properties;
public class DefaultMessageModule extends AbstractBitsquareModule implements MessageModule {
public DefaultMessageModule(Properties properties) {
super(properties);
}
@Override
protected void configure() {
bind(MessageFacade.class).to(TomP2PMessageFacade.class).asEagerSingleton();
bind(P2PNode.class).asEagerSingleton();
bind(BootstrappedPeerFactory.class).asEagerSingleton();
bind(DHTSeedService.class);
// we will probably later use disk storage instead of memory storage for TomP2P
bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(false);
bind(SeedNodeAddress.StaticSeedNodeAddresses.class)
.annotatedWith(Names.named("defaultSeedNode"))
.toInstance(SeedNodeAddress.StaticSeedNodeAddresses.DIGITAL_OCEAN1);
}
}

View File

@ -0,0 +1,23 @@
/*
* 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.msg;
import com.google.inject.Module;
public interface MessageModule extends Module {
}

View File

@ -31,7 +31,6 @@ import io.bitsquare.trade.Offer;
import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.TradeMessage;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import java.io.IOException; import java.io.IOException;
@ -77,8 +76,8 @@ import org.slf4j.LoggerFactory;
* <p> * <p>
* TODO: improve callbacks that Platform.runLater is not necessary. We call usually that methods form teh UI thread. * TODO: improve callbacks that Platform.runLater is not necessary. We call usually that methods form teh UI thread.
*/ */
public class TomP2PMessageFacade implements MessageFacade { class TomP2PMessageFacade implements MessageFacade {
private static final Logger log = LoggerFactory.getLogger(MessageFacade.class); private static final Logger log = LoggerFactory.getLogger(TomP2PMessageFacade.class);
private static final String ARBITRATORS_ROOT = "ArbitratorsRoot"; private static final String ARBITRATORS_ROOT = "ArbitratorsRoot";
private final P2PNode p2pNode; private final P2PNode p2pNode;

View File

@ -17,5 +17,10 @@
package io.bitsquare.network; package io.bitsquare.network;
/**
* A peer on the Bitsquare network.
*
* @author Chris Beams
*/
public interface Peer { public interface Peer {
} }

View File

@ -23,6 +23,11 @@ import com.google.common.base.Objects;
import net.tomp2p.peers.PeerAddress; import net.tomp2p.peers.PeerAddress;
/**
* A {@link Peer} implementation that encapsulates a TomP2P {@link PeerAddress}.
*
* @author Chris Beams
*/
public class TomP2PPeer implements Peer { public class TomP2PPeer implements Peer {
private final PeerAddress peerAddress; private final PeerAddress peerAddress;

View File

@ -0,0 +1,34 @@
/*
* 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;
import io.bitsquare.di.AbstractBitsquareModule;
import java.util.Properties;
public class TradeModule extends AbstractBitsquareModule {
public TradeModule(Properties properties) {
super(properties);
}
@Override
protected void configure() {
bind(TradeManager.class).asEagerSingleton();
}
}