package com.dgex.offspring.application.addon; import it.sauronsoftware.junique.JUnique; import java.lang.reflect.InvocationTargetException; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import nxt.Nxt; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.ProgressProvider; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import com.dgex.offspring.application.dialogs.StartupDialog; import com.dgex.offspring.config.Config; import com.dgex.offspring.dataprovider.service.IDataProviderPool; import com.dgex.offspring.nxtCore.service.INxtService; import com.dgex.offspring.providers.bitcoinaverage.PerHourMonthlyCNY; import com.dgex.offspring.providers.bitcoinaverage.PerHourMonthlyEUR; import com.dgex.offspring.providers.bitcoinaverage.PerHourMonthlyUSD; import com.dgex.offspring.providers.bitcoinaverage.PerMinute24HSliding; import com.dgex.offspring.providers.bitcoinaverage.TickerAllProvider; import com.dgex.offspring.providers.dgex.DGEX3HMovingAvarage; import com.dgex.offspring.providers.dgex.DGEXBuyOrderProvider; import com.dgex.offspring.providers.dgex.DGEXCurrentRateProvider; import com.dgex.offspring.providers.dgex.DGEXSellOrderProvider; import com.dgex.offspring.providers.dgex.DGEXTradeProvider; import com.dgex.offspring.trader.api.IAssetExchange; import com.dgex.offspring.user.service.IUserService; import com.dgex.offspring.wallet.INXTWalletAccount; import com.dgex.offspring.wallet.IWallet; import com.dgex.offspring.wallet.IWallet.WalletNotInitializedException; import com.dgex.offspring.wallet.IWalletAccount; public class StartHandlerAddon { static String STATUS_BAR_ID = "com.dgex.offspring.application.toolcontrol.statusstatistics"; static String MAINWINDOW_ID = "com.dgex.offspring.application.mainwindow"; private final Logger logger = Logger.getLogger(StartHandlerAddon.class); @Inject private IEventBroker broker; @Inject private EModelService modelService; @Inject private UISynchronize sync; private IUserService userService; private IWallet wallet; private IDataProviderPool pool; private MApplication application; private INxtService nxt; private IAssetExchange exchange; private final IRunnableWithProgress startup = new IRunnableWithProgress() { volatile boolean DONE = false; @Override public void run(final IProgressMonitor monitor) { Thread cancelThread = new Thread(new Runnable() { @Override public void run() { while (!DONE) { try { Thread.sleep(500); if (monitor.isCanceled()) { System.exit(-1); return; } } catch (InterruptedException e) { return; } } } }); cancelThread.start(); /* Initialize the user service */ monitor.beginTask("Adding Users", IProgressMonitor.UNKNOWN); userService.initialize(broker, nxt); try { for (IWalletAccount account : wallet.getAccounts()) { if (account instanceof INXTWalletAccount) { userService.createUser(account.getLabel(), ((INXTWalletAccount) account).getPrivateKey(), ((INXTWalletAccount) account).getAccountNumber()); } } } catch (WalletNotInitializedException e) { logger.error("Wallet", e); } /* Set the active user */ monitor.setTaskName("Set Active User"); if (userService.getUsers().size() > 0) userService.setActiveUser(userService.getUsers().get(0)); /* Kick off NXT startup */ monitor.beginTask("Initializing NXT " + Nxt.VERSION + " (might take several minutes)", IProgressMonitor.UNKNOWN); nxt.initialize(broker, sync); /* Immediately register for shutdown */ Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { nxt.shutdown(); String appId = "com.dgex.offspring.application.lifecycle.LifeCycleManager"; JUnique.releaseLock(appId); } })); monitor.setTaskName("Initializing Services"); sync.syncExec(new Runnable() { @Override public void run() { MWindow window = (MWindow) modelService.find(MAINWINDOW_ID, application); window.setLabel(Config.getWindowTitle(nxt.getSoftwareVersion())); } }); exchange.initialize(broker); monitor.setTaskName("Start Dataprovider Service"); pool.addProvider(DGEXCurrentRateProvider.getInstance()); pool.addProvider(DGEX3HMovingAvarage.getInstance()); pool.addProvider(DGEXTradeProvider.getInstance()); pool.addProvider(DGEXBuyOrderProvider.getInstance()); pool.addProvider(DGEXSellOrderProvider.getInstance()); pool.addProvider(TickerAllProvider.getInstance()); pool.addProvider(PerMinute24HSliding.getInstance()); pool.addProvider(PerHourMonthlyUSD.getInstance()); pool.addProvider(PerHourMonthlyEUR.getInstance()); pool.addProvider(PerHourMonthlyCNY.getInstance()); DONE = true; monitor.done(); } }; private final EventHandler eventHandler = new EventHandler() { @Override public void handleEvent(final Event inEvent) { /* Update window title */ final MWindow window = (MWindow) modelService.find(MAINWINDOW_ID, application); window.setLabel(Config.getWindowTitle("-")); Shell shell = Display.getCurrent().getActiveShell(); final StartupDialog dialog = new StartupDialog(shell, sync); dialog.setBlockOnOpen(false); dialog.create(); dialog.open(); Job startupJob = new Job("Startup Job") { @Override protected IStatus run(IProgressMonitor monitor) { try { startup.run(monitor); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return Status.OK_STATUS; } }; Job.getJobManager().setProgressProvider(new ProgressProvider() { @Override public IProgressMonitor createMonitor(Job job) { return dialog.getProgressMonitor(); } }); startupJob.schedule(); } }; @PostConstruct void hookListeners(MApplication application, IUserService userService, IWallet wallet, IDataProviderPool pool, INxtService nxt, IAssetExchange exchange) { this.application = application; this.userService = userService; this.wallet = wallet; this.pool = pool; this.nxt = nxt; this.exchange = exchange; broker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, eventHandler); } @PreDestroy void unhookListeners() { broker.unsubscribe(eventHandler); } }