Introduce #close hook

This commit is contained in:
Chris Beams 2014-11-03 14:42:03 +01:00
parent c71d9a0fb8
commit e4a50bbcea
No known key found for this signature in database
GPG key ID: 3D214F8F5BC5ED73
4 changed files with 54 additions and 17 deletions

View file

@ -17,14 +17,12 @@
package io.bitsquare; package io.bitsquare;
import io.bitsquare.btc.WalletFacade;
import io.bitsquare.di.BitsquareModule; import io.bitsquare.di.BitsquareModule;
import io.bitsquare.gui.AWTSystemTray; import io.bitsquare.gui.AWTSystemTray;
import io.bitsquare.gui.Navigation; import io.bitsquare.gui.Navigation;
import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.components.Popups;
import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.ImageUtil;
import io.bitsquare.gui.util.Profiler; import io.bitsquare.gui.util.Profiler;
import io.bitsquare.msg.MessageFacade;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.settings.Settings; import io.bitsquare.settings.Settings;
import io.bitsquare.user.User; import io.bitsquare.user.User;
@ -53,11 +51,13 @@ public class BitsquareUI extends Application {
private static final Logger log = LoggerFactory.getLogger(BitsquareUI.class); private static final Logger log = LoggerFactory.getLogger(BitsquareUI.class);
private static Stage primaryStage; private static Stage primaryStage;
private WalletFacade walletFacade;
private MessageFacade messageFacade;
public void BitsquareUI() { private final BitsquareModule bitsquareModule;
Profiler.init(); private final Injector injector;
public BitsquareUI() {
this.bitsquareModule = new BitsquareModule();
this.injector = Guice.createInjector(bitsquareModule);
} }
public static Stage getPrimaryStage() { public static Stage getPrimaryStage() {
@ -78,15 +78,10 @@ public class BitsquareUI extends Application {
log.error(e.getMessage()); log.error(e.getMessage());
} }
final Injector injector = Guice.createInjector(new BitsquareModule());
// currently there is not SystemTray support for java fx (planned for version 3) so we use the old AWT // currently there is not SystemTray support for java fx (planned for version 3) so we use the old AWT
AWTSystemTray.createSystemTray(primaryStage, injector.getInstance(ActorSystem.class), this); AWTSystemTray.createSystemTray(primaryStage, injector.getInstance(ActorSystem.class), this);
walletFacade = injector.getInstance(WalletFacade.class);
messageFacade = injector.getInstance(MessageFacade.class);
Profiler.printMsgWithTime("Bitsquare: messageFacade, walletFacade created");
// apply stored data // apply stored data
final User user = injector.getInstance(User.class); final User user = injector.getInstance(User.class);
final Settings settings = injector.getInstance(Settings.class); final Settings settings = injector.getInstance(Settings.class);
@ -149,11 +144,8 @@ public class BitsquareUI extends Application {
} }
@Override @Override
public void stop() throws Exception { public void stop() {
walletFacade.shutDown(); bitsquareModule.close(injector);
messageFacade.shutDown();
super.stop();
System.exit(0); System.exit(0);
} }
} }

View file

@ -24,7 +24,7 @@ import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.RegTestParams;
import org.bitcoinj.params.TestNet3Params; import org.bitcoinj.params.TestNet3Params;
import com.google.inject.AbstractModule; import com.google.inject.Injector;
import java.util.Properties; import java.util.Properties;
@ -49,6 +49,11 @@ public class BitcoinModule extends AbstractBitsquareModule {
bind(NetworkParameters.class).toInstance(network()); bind(NetworkParameters.class).toInstance(network());
} }
@Override
public void doClose(Injector injector) {
injector.getInstance(WalletFacade.class).shutDown();
}
private NetworkParameters network() { private NetworkParameters network() {
String networkName = properties.getProperty("networkType", defaultNetwork.name()); String networkName = properties.getProperty("networkType", defaultNetwork.name());

View file

@ -17,15 +17,49 @@
package io.bitsquare.di; package io.bitsquare.di;
import com.google.common.collect.Sets;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import java.util.Properties; import java.util.Properties;
import java.util.Set;
public abstract class AbstractBitsquareModule extends AbstractModule { public abstract class AbstractBitsquareModule extends AbstractModule {
protected final Properties properties; protected final Properties properties;
private final Set<AbstractBitsquareModule> modules = Sets.newHashSet();
public AbstractBitsquareModule(Properties properties) { public AbstractBitsquareModule(Properties properties) {
this.properties = properties; this.properties = properties;
} }
protected void install(AbstractBitsquareModule module) {
super.install(module);
modules.add(module);
}
/**
* Close any instances this module is responsible for and recursively close any
* sub-modules installed via {@link #install(AbstractBitsquareModule)}. This method
* must be called manually, e.g. at the end of a main() method or in the stop() method
* of a JavaFX Application; alternatively it may be registered as a JVM shutdown hook.
*
* @param injector the Injector originally initialized with this module
* @see #doClose(com.google.inject.Injector)
*/
public final void close(Injector injector) {
modules.forEach(module -> module.close(injector));
doClose(injector);
}
/**
* Actually perform closing of any instances this module is responsible for. Called by
* {@link #close(Injector)}.
*
* @param injector the Injector originally initialized with this module
*/
protected void doClose(Injector injector) {
}
} }

View file

@ -19,6 +19,7 @@ package io.bitsquare.msg;
import io.bitsquare.di.AbstractBitsquareModule; import io.bitsquare.di.AbstractBitsquareModule;
import com.google.inject.Injector;
import com.google.inject.name.Names; import com.google.inject.name.Names;
import java.util.Properties; import java.util.Properties;
@ -43,4 +44,9 @@ public class DefaultMessageModule extends AbstractBitsquareModule implements Mes
.annotatedWith(Names.named("defaultSeedNode")) .annotatedWith(Names.named("defaultSeedNode"))
.toInstance(SeedNodeAddress.StaticSeedNodeAddresses.DIGITAL_OCEAN1); .toInstance(SeedNodeAddress.StaticSeedNodeAddresses.DIGITAL_OCEAN1);
} }
@Override
public void doClose(Injector injector) {
injector.getInstance(MessageFacade.class).shutDown();
}
} }