From dd3f318b7952ef408785988bfd5160492ee9bc36 Mon Sep 17 00:00:00 2001 From: langerhans Date: Fri, 29 Jan 2016 22:18:50 +0100 Subject: [PATCH 1/4] Replace Cryptsy (finally) --- pom.xml | 48 +--- src/main/java/org/multibit/MultiBit.java | 9 + .../multibit/exchange/CurrencyConverter.java | 6 - .../multibit/exchange/TickerTimerTask.java | 243 ++++++----------- .../multibit/model/exchange/ExchangeData.java | 49 +--- .../model/exchange/ExchangeModel.java | 1 - .../PreferencesDataProvider.java | 5 - .../action/ShowPreferencesSubmitAction.java | 18 +- .../view/panels/ShowPreferencesPanel.java | 255 +----------------- 9 files changed, 110 insertions(+), 524 deletions(-) diff --git a/pom.xml b/pom.xml index 4178c0638..fc58e9fba 100644 --- a/pom.xml +++ b/pom.xml @@ -685,52 +685,10 @@ xchange-core ${xchange.version} - + com.xeiam.xchange - xchange-mtgox - ${xchange.version} - - - - com.xeiam.xchange - xchange-cavirtex - ${xchange.version} - - - - com.xeiam.xchange - xchange-openexchangerates - ${xchange.version} - - - - com.xeiam.xchange - xchange-btce - ${xchange.version} - - - - com.xeiam.xchange - xchange-bitstamp - ${xchange.version} - - - - com.xeiam.xchange - xchange-campbx - ${xchange.version} - - - - com.xeiam.xchange - xchange-btcchina - ${xchange.version} - - - - com.xeiam.xchange - xchange-kraken + xchange-poloniex ${xchange.version} @@ -819,7 +777,7 @@ 0.10.3-MB-ALICE - 2.0.0-SNAPSHOT + 3.1.0 1.47.0.2 diff --git a/src/main/java/org/multibit/MultiBit.java b/src/main/java/org/multibit/MultiBit.java index d97453dbc..130de1429 100644 --- a/src/main/java/org/multibit/MultiBit.java +++ b/src/main/java/org/multibit/MultiBit.java @@ -31,6 +31,7 @@ import org.multibit.model.bitcoin.WalletData; import org.multibit.model.core.CoreModel; import org.multibit.model.exchange.ConnectHttps; +import org.multibit.model.exchange.ExchangeData; import org.multibit.model.exchange.ExchangeModel; import org.multibit.network.*; import org.multibit.platform.GenericApplication; @@ -611,6 +612,14 @@ public void run() { // Just sync the blockchain without a replay task being involved. ReplayManager.INSTANCE.downloadBlockChain(); } + + // Upgrade path from cryptsy + if (bitcoinController.getModel().getUserPreference(ExchangeModel.TICKER_FIRST_ROW_EXCHANGE).equals(ExchangeData.CRYPTS_EXCHANGE_NAME)) { + bitcoinController.getModel().setUserPreference(ExchangeModel.TICKER_FIRST_ROW_EXCHANGE, ExchangeData.POLONIEX_EXCHANGE_NAME); + } + if (bitcoinController.getModel().getUserPreference(ExchangeModel.TICKER_SECOND_ROW_EXCHANGE).equals(ExchangeData.CRYPTS_EXCHANGE_NAME)) { + bitcoinController.getModel().setUserPreference(ExchangeModel.TICKER_SECOND_ROW_EXCHANGE, ExchangeData.POLONIEX_EXCHANGE_NAME); + } } catch (Exception e) { // An odd unrecoverable error occurred. e.printStackTrace(); diff --git a/src/main/java/org/multibit/exchange/CurrencyConverter.java b/src/main/java/org/multibit/exchange/CurrencyConverter.java index b5cad0202..0b0dbe9c0 100644 --- a/src/main/java/org/multibit/exchange/CurrencyConverter.java +++ b/src/main/java/org/multibit/exchange/CurrencyConverter.java @@ -88,12 +88,6 @@ public void initialise(Controller controller) { String currencyCode = controller.getModel().getUserPreference(ExchangeModel.TICKER_FIRST_ROW_CURRENCY); String exchange = controller.getModel().getUserPreference(ExchangeModel.TICKER_FIRST_ROW_EXCHANGE); String newCurrencyCode = currencyCode; - if (ExchangeData.BITCOIN_CHARTS_EXCHANGE_NAME.equals(exchange)) { - // Use only the last three characters - the currency code. - if (currencyCode.length() >= 3) { - newCurrencyCode = currencyCode.substring(currencyCode.length() - 3); - } - } initialise(controller, newCurrencyCode); } diff --git a/src/main/java/org/multibit/exchange/TickerTimerTask.java b/src/main/java/org/multibit/exchange/TickerTimerTask.java index 3f119e340..bb2aa678e 100644 --- a/src/main/java/org/multibit/exchange/TickerTimerTask.java +++ b/src/main/java/org/multibit/exchange/TickerTimerTask.java @@ -15,13 +15,16 @@ */ package org.multibit.exchange; +import java.io.IOException; import java.math.BigDecimal; -import java.math.RoundingMode; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.TimerTask; -import com.xeiam.xchange.bitcoinaverage.service.BitcoinaverageBaseService; +import com.xeiam.xchange.exceptions.ExchangeException; +import com.xeiam.xchange.poloniex.PoloniexExchange; +import com.xeiam.xchange.service.polling.marketdata.PollingMarketDataService; import org.joda.money.BigMoney; import org.joda.money.CurrencyUnit; @@ -37,11 +40,8 @@ import com.xeiam.xchange.Exchange; import com.xeiam.xchange.ExchangeFactory; -import com.xeiam.xchange.ExchangeSpecification; -import com.xeiam.xchange.currency.Currencies; import com.xeiam.xchange.currency.CurrencyPair; import com.xeiam.xchange.dto.marketdata.Ticker; -import com.xeiam.xchange.service.polling.PollingMarketDataService; /** * TimerTask to poll currency exchanges for ticker data process @@ -67,7 +67,8 @@ public class TickerTimerTask extends TimerTask { private String shortExchangeName; private String currency; private Exchange exchange; - private PollingMarketDataService marketDataService; + private PollingMarketDataService marketDataServiceBTC; + private PollingMarketDataService marketDataServiceDOGE; private List exchangeSymbols; /** @@ -122,7 +123,7 @@ public void run() { } } - if (marketDataService != null) { + if (marketDataServiceBTC != null && marketDataServiceDOGE != null) { if (exchangeSymbols != null) { // Only get data from server if ticker is being shown if // currency conversion is switched on. @@ -139,141 +140,86 @@ public void run() { // of currency units per BTC boolean invertedRates = false; - // Is the currency pair the other way round ie - // base currency = other, counter currency = BTC - boolean reverseRates = ExchangeData.doesExchangeUseReverseRates(shortExchangeName); CurrencyPair currencyPairToUse = null; for (CurrencyPair loopSymbolPair : exchangeSymbols) { - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equals(shortExchangeName)) { - if (loopSymbolPair.baseSymbol.equals(currency)) { - getItFromTheServer = true; - invertedRates = true; - currencyPairToUse = loopSymbolPair; - break; - } - } else { - if ("BTC".equals(loopSymbolPair.baseSymbol) && loopSymbolPair.counterSymbol.equals(currency)) { - getItFromTheServer = true; - currencyPairToUse = loopSymbolPair; - break; - } - if ("BTC".equals(loopSymbolPair.baseSymbol) && loopSymbolPair.counterSymbol.equals(currency)) { - getItFromTheServer = true; - invertedRates = true; - currencyPairToUse = loopSymbolPair; - break; - } + if ("BTC".equals(loopSymbolPair.baseSymbol) && loopSymbolPair.counterSymbol.equals(currency)) { + getItFromTheServer = true; + currencyPairToUse = loopSymbolPair; + break; + } + if ("BTC".equals(loopSymbolPair.counterSymbol) && loopSymbolPair.baseSymbol.equals(currency)) { + getItFromTheServer = true; + invertedRates = true; + currencyPairToUse = loopSymbolPair; + break; } } if (getItFromTheServer) { - BigMoney last = null; - BigMoney bid = null; - BigMoney ask = null; - - Ticker loopTicker; - - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equals(shortExchangeName)) { - log.debug("Getting loopTicker for " + currency + " USD"); - loopTicker = marketDataService.getTicker(new CurrencyPair(currency, Currencies.USD)); - System.out.println("loopTicker = " + loopTicker); - Ticker btcUsdTicker = null; - log.debug("Getting btcUsdTicker for BTC/USD"); - btcUsdTicker = marketDataService.getTicker(new CurrencyPair(Currencies.BTC, Currencies.USD)); - System.out.println("btcUsdTicker = " + btcUsdTicker); - - BigMoney usdBtcRateMoney = BigMoney.of(CurrencyUnit.USD, btcUsdTicker.getLast()); - BigDecimal usdBtcRate = null; - if (usdBtcRateMoney != null) { - usdBtcRate = usdBtcRateMoney.getAmount(); - if (loopTicker.getLast() != null) { - last = BigMoney.of(CurrencyUnit.USD,loopTicker.getLast()).dividedBy(usdBtcRate, RoundingMode.HALF_EVEN); - } - if (loopTicker.getBid() != null) { - bid = BigMoney.of(CurrencyUnit.USD,loopTicker.getBid()).dividedBy(usdBtcRate, RoundingMode.HALF_EVEN); - } - if (loopTicker.getAsk() != null) { - ask = BigMoney.of(CurrencyUnit.USD,loopTicker.getAsk()).dividedBy(usdBtcRate, RoundingMode.HALF_EVEN); - } + BigMoney lastBTC, bidBTC, askBTC, lastDOGE, bidDOGE, askDOGE; + Ticker tickerBTC, tickerDOGE; + + log.debug("Getting ticker for " + currencyPairToUse.baseSymbol + " " + + currencyPairToUse.counterSymbol); + tickerBTC = marketDataServiceBTC.getTicker(currencyPairToUse); + tickerDOGE = marketDataServiceDOGE.getTicker(CurrencyPair.DOGE_BTC); + + log.debug("Got ticker for " + currencyPairToUse.baseSymbol + " " + + currencyPairToUse.counterSymbol); + lastBTC = BigMoney.of(CurrencyUnit.USD,tickerBTC.getLast()); + bidBTC = BigMoney.of(CurrencyUnit.USD,tickerBTC.getBid()); + askBTC = BigMoney.of(CurrencyUnit.USD,tickerBTC.getAsk()); + lastDOGE = BigMoney.of(CurrencyUnit.USD,tickerDOGE.getLast()); + bidDOGE = BigMoney.of(CurrencyUnit.USD,tickerDOGE.getBid()); + askDOGE = BigMoney.of(CurrencyUnit.USD,tickerDOGE.getAsk()); + + if (invertedRates) { + if (!lastBTC.getAmount().equals(BigDecimal.ZERO)) { + lastBTC = BigMoney.of(lastBTC.getCurrencyUnit(), BigDecimal.ONE.divide(lastBTC.getAmount(), + NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); + } else { + lastBTC = null; } - } else { - log.debug("Getting ticker for " + currencyPairToUse.baseSymbol + " " - + currencyPairToUse.counterSymbol); - loopTicker = marketDataService.getTicker(currencyPairToUse); - - log.debug("Got ticker for " + currencyPairToUse.baseSymbol + " " - + currencyPairToUse.counterSymbol); - last = BigMoney.of(CurrencyUnit.USD,loopTicker.getLast()); - bid = BigMoney.of(CurrencyUnit.USD,loopTicker.getBid()); - ask = BigMoney.of(CurrencyUnit.USD,loopTicker.getAsk()); - - if (invertedRates && !reverseRates) { - if (last != null && last.getAmount() != BigDecimal.ZERO) { - last = BigMoney.of(last.getCurrencyUnit(), BigDecimal.ONE.divide(last.getAmount(), - NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); - } else { - last = null; - } - if (bid != null && bid.getAmount() != BigDecimal.ZERO) { - bid = BigMoney.of(bid.getCurrencyUnit(), BigDecimal.ONE.divide(bid.getAmount(), - NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); - } else { - bid = null; - } - - if (ask != null && ask.getAmount() != BigDecimal.ZERO) { - ask = BigMoney.of(ask.getCurrencyUnit(), BigDecimal.ONE.divide(ask.getAmount(), - NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); - } else { - ask = null; - } + if (!bidBTC.getAmount().equals(BigDecimal.ZERO)) { + bidBTC = BigMoney.of(bidBTC.getCurrencyUnit(), BigDecimal.ONE.divide(bidBTC.getAmount(), + NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); + } else { + bidBTC = null; } - if (invertedRates) { - if (reverseRates) { - // USD/ BTC, reciprocal rate - currency = currencyPairToUse.baseSymbol; - } else { - // BTC/ USD, reciprocal rate - currency = currencyPairToUse.counterSymbol; - } + if (!askBTC.getAmount().equals(BigDecimal.ZERO)) { + askBTC = BigMoney.of(askBTC.getCurrencyUnit(), BigDecimal.ONE.divide(askBTC.getAmount(), + NUMBER_OF_SIGNIFICANT_DIGITS, BigDecimal.ROUND_HALF_EVEN)); } else { - if (reverseRates) { - // USD/ BTC, normal rate - currency = currencyPairToUse.baseSymbol; - } else { - // BTC/ USD, normal rate - currency = currencyPairToUse.counterSymbol; - } + askBTC = null; } } - log.debug("Getting DOGE conversion"); - float dogeRate = DogeUtils.requestDogeBtcConversion(); - if (dogeRate == 0f) - { - log.debug("Problem getting DOGE conversion"); - return; + if (invertedRates) { + // BTC/ USD, reciprocal rate + currency = currencyPairToUse.counterSymbol; + } else { + // BTC/ USD, normal rate + currency = currencyPairToUse.counterSymbol; } - this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastPrice(currency, last.multipliedBy(dogeRate)); - this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastBid(currency, bid.multipliedBy(dogeRate)); - this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastAsk(currency, ask.multipliedBy(dogeRate)); + if (lastBTC != null) { + this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastPrice(currency, lastBTC.multipliedBy(lastDOGE.getAmount())); + } + if (bidBTC != null) { + this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastBid(currency, bidBTC.multipliedBy(bidDOGE.getAmount())); + } + if (askBTC != null) { + this.exchangeController.getModel().getExchangeData(shortExchangeName).setLastAsk(currency, askBTC.multipliedBy(askDOGE.getAmount())); + } log.debug("Exchange = " + shortExchangeName); // Put the exchange rate into the currency converter. - if (isFirstExchange) { + if (isFirstExchange && lastBTC != null) { String newCurrencyCode = currency; - if (ExchangeData.BITCOIN_CHARTS_EXCHANGE_NAME.equals(shortExchangeName)) { - // Use only the last three characters - the - // currency code. - if (currency.length() >= 3) { - newCurrencyCode = currency.substring(currency.length() - 3); - } - } CurrencyConverter.INSTANCE.setCurrencyUnit(CurrencyUnit.of(newCurrencyCode)); - CurrencyConverter.INSTANCE.setRate(last.getAmount().multiply(BigDecimal.valueOf(dogeRate))); + CurrencyConverter.INSTANCE.setRate(lastBTC.getAmount().multiply(lastDOGE.getAmount())); } } } @@ -293,14 +239,24 @@ public void run() { public void createExchangeObjects(String newExchangeName) { exchange = createExchange(newExchangeName); + Exchange exchangeDOGE = ExchangeFactory.INSTANCE.createExchange(PoloniexExchange.class.getName()); if (exchange != null) { + try { + exchange.remoteInit(); + exchangeDOGE.remoteInit(); + } catch (IOException e) { + log.error("Could not contact exchanges for init!"); + return; + } + // Interested in the public market data feed (no authentication). - marketDataService = exchange.getPollingMarketDataService(); - log.debug("marketDataService = " + marketDataService); + marketDataServiceBTC = exchange.getPollingMarketDataService(); + marketDataServiceDOGE = exchangeDOGE.getPollingMarketDataService(); + log.debug("marketDataServiceBTC = " + marketDataServiceBTC); // Get the list of available currencies. - exchangeSymbols = BitcoinaverageBaseService.CURRENCY_PAIRS; // TODO: When XChange fixes that shit, refactor this shit... + exchangeSymbols = new ArrayList(exchange.getMetaData().getMarketMetaDataMap().keySet()); log.debug("exchangeSymbols = " + exchangeSymbols); if (exchangeSymbols != null) { @@ -310,26 +266,11 @@ public void createExchangeObjects(String newExchangeName) { String baseCurrency = exchangeSymbols.get(i).baseSymbol; String counterCurrency = exchangeSymbols.get(i).counterSymbol; - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equals(newExchangeName)) { - if ("USD".equalsIgnoreCase(baseCurrency) && !"BTC".equalsIgnoreCase(counterCurrency)) { - if (!"EEK".equalsIgnoreCase(counterCurrency) && !"CLF".equalsIgnoreCase(counterCurrency) - && !"JEP".equalsIgnoreCase(counterCurrency) && ! "SVC".equalsIgnoreCase(counterCurrency)) { - availableCurrencies.add(counterCurrency); - } - } - if ("USD".equalsIgnoreCase(counterCurrency) && !"BTC".equalsIgnoreCase(baseCurrency)) { - if (!"EEK".equalsIgnoreCase(baseCurrency) && !"CLF".equalsIgnoreCase(baseCurrency) - && !"JEP".equalsIgnoreCase(baseCurrency) && ! "SVC".equalsIgnoreCase(baseCurrency)) { - availableCurrencies.add(baseCurrency); - } - } - } else { - if ("BTC".equalsIgnoreCase(baseCurrency)) { - availableCurrencies.add(counterCurrency); - } - if ("BTC".equalsIgnoreCase(counterCurrency)) { - availableCurrencies.add(baseCurrency); - } + if ("BTC".equalsIgnoreCase(baseCurrency)) { + availableCurrencies.add(counterCurrency); + } + if ("BTC".equalsIgnoreCase(counterCurrency)) { + availableCurrencies.add(baseCurrency); } } ExchangeData.setAvailableCurrenciesForExchange(newExchangeName, availableCurrencies); @@ -341,7 +282,7 @@ public void createExchangeObjects(String newExchangeName) { * Create the exchange specified by the exchange class name specified e.g. * BitcoinChartsExchange.class.getName(); * - * @param exchangeClassName + * @param exchangeShortname */ private Exchange createExchange(String exchangeShortname) { log.debug("creating exchange from exchangeShortname = " + exchangeShortname); @@ -359,15 +300,7 @@ private Exchange createExchange(String exchangeShortname) { } Exchange exchangeToReturn; - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeShortname)) { - ExchangeSpecification exchangeSpecification = new ExchangeSpecification(exchangeClassname); - exchangeSpecification.setPlainTextUri("http://openexchangerates.org"); - exchangeSpecification - .setApiKey(controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE)); - exchangeToReturn = ExchangeFactory.INSTANCE.createExchange(exchangeSpecification); - } else { - exchangeToReturn = ExchangeFactory.INSTANCE.createExchange(exchangeClassname); - } + exchangeToReturn = ExchangeFactory.INSTANCE.createExchange(exchangeClassname); if (this.exchangeController.getModel().getExchangeData(shortExchangeName) == null) { ExchangeData exchangeData = new ExchangeData(); @@ -376,7 +309,7 @@ private Exchange createExchange(String exchangeShortname) { } return exchangeToReturn; - } catch (com.xeiam.xchange.ExchangeException e) { + } catch (ExchangeException e) { // Probably xchange is not on classpath - ticker will not run // but error should not spread out from here to rest of MultiBit. log.error(e.getClass().getName() + " " + e.getMessage()); diff --git a/src/main/java/org/multibit/model/exchange/ExchangeData.java b/src/main/java/org/multibit/model/exchange/ExchangeData.java index 60db50408..8a2c15506 100644 --- a/src/main/java/org/multibit/model/exchange/ExchangeData.java +++ b/src/main/java/org/multibit/model/exchange/ExchangeData.java @@ -16,11 +16,6 @@ package org.multibit.model.exchange; import com.xeiam.xchange.bitcoinaverage.BitcoinAverageExchange; -import com.xeiam.xchange.bitstamp.BitstampExchange; -import com.xeiam.xchange.btce.v3.BTCEExchange; -import com.xeiam.xchange.campbx.CampBXExchange; -import com.xeiam.xchange.oer.OERExchange; -import com.xeiam.xchange.virtex.VirtExExchange; import org.joda.money.BigMoney; import java.util.ArrayList; @@ -28,8 +23,6 @@ import java.util.HashMap; import java.util.Map; -//import com.xeiam.xchange.btcchina.BTCChinaExchange; - /** * * @author timmolter @@ -39,17 +32,11 @@ public class ExchangeData { public static final String EXCHANGE_NOT_SET = "NoExchangeSetYet"; - public static final String BITCOIN_CHARTS_EXCHANGE_NAME = "BitcoinCharts"; - public static final String BITSTAMP_EXCHANGE_NAME = "Bitstamp"; - public static final String BTCE_EXCHANGE_NAME = "BTC-E"; - public static final String CAMPBX_EXCHANGE_NAME = "CampBX"; - public static final String OPEN_EXCHANGE_RATES_EXCHANGE_NAME = "OpenExchangeRates"; - public static final String MT_GOX_EXCHANGE_NAME = "MtGox"; - public static final String VIRTEX_EXCHANGE_NAME = "VirtEx"; - public static final String CRYPTSY_EXCHANGE_NAME = "Cryptsy"; + public static final String CRYPTS_EXCHANGE_NAME = "Cryptsy"; // Legacy public static final String BITCOINAVERAGE_EXCHANGE_NAME = "BitcoinAverage"; + public static final String POLONIEX_EXCHANGE_NAME = "Poloniex"; - public static final String DEFAULT_EXCHANGE = CRYPTSY_EXCHANGE_NAME; + public static final String DEFAULT_EXCHANGE = POLONIEX_EXCHANGE_NAME; public static final String DEFAULT_CURRENCY = "USD"; @@ -61,7 +48,7 @@ public class ExchangeData { } public static final BigMoney DO_NOT_KNOW = null; - + private String shortExchangeName; private Map currencyToLastPriceMap; private Map currencyToAskMap; @@ -125,7 +112,7 @@ public static boolean doesExchangeUseReverseRates(String shortExchangeName) { if (shortExchangeName == null) { throw new IllegalArgumentException("Exchange name cannot be null"); } - return BITCOIN_CHARTS_EXCHANGE_NAME.equals(shortExchangeName); + return false; } /** @@ -133,13 +120,7 @@ public static boolean doesExchangeUseReverseRates(String shortExchangeName) { * BTCChina not in the list as it does not seem reliable enough - drops connections (when used in UK) */ public static String[] getAvailableExchanges() { -/* return new String[] { MT_GOX_EXCHANGE_NAME, - BITSTAMP_EXCHANGE_NAME, - BTCE_EXCHANGE_NAME, - CAMPBX_EXCHANGE_NAME, - OPEN_EXCHANGE_RATES_EXCHANGE_NAME, - VIRTEX_EXCHANGE_NAME};*/ - return new String[] {CRYPTSY_EXCHANGE_NAME}; + return new String[] {POLONIEX_EXCHANGE_NAME}; } public static Collection getAvailableCurrenciesForExchange(String shortExchangeName) { @@ -160,23 +141,7 @@ public static void setAvailableCurrenciesForExchange(String exchangeName, Collec * Convert an exchange short name into a classname that can be used to create an Exchange. */ public static String convertExchangeShortNameToClassname(String shortExchangeName) { - if (MT_GOX_EXCHANGE_NAME.equals(shortExchangeName)) { - return "com.xeiam.xchange.mtgox.v2.MtGoxExchange"; - } else if (BITSTAMP_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - return BitstampExchange.class.getName(); - } else if (BTCE_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - return BTCEExchange.class.getName(); - //} else if (BTCCHINA_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - // return BTCChinaExchange.class.getName(); - //} else if (KRAKEN_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - // return KrakenExchange.class.getName(); - } else if (CAMPBX_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - return CampBXExchange.class.getName(); - } else if (OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - return OERExchange.class.getName(); - } else if (VIRTEX_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName)) { - return VirtExExchange.class.getName(); - } else if (BITCOINAVERAGE_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName) || CRYPTSY_EXCHANGE_NAME.equals(shortExchangeName)) { + if (BITCOINAVERAGE_EXCHANGE_NAME.equalsIgnoreCase(shortExchangeName) || POLONIEX_EXCHANGE_NAME.equals(shortExchangeName)) { return BitcoinAverageExchange.class.getName(); } else { // Unidentified exchange. diff --git a/src/main/java/org/multibit/model/exchange/ExchangeModel.java b/src/main/java/org/multibit/model/exchange/ExchangeModel.java index a417cda2c..85e2b9979 100644 --- a/src/main/java/org/multibit/model/exchange/ExchangeModel.java +++ b/src/main/java/org/multibit/model/exchange/ExchangeModel.java @@ -48,7 +48,6 @@ public class ExchangeModel extends AbstractModel { // Currency support. public static final String SHOW_BITCOIN_CONVERTED_TO_FIAT = "showBitcoinConvertedToFiat"; // boolean - public static final String OPEN_EXCHANGE_RATES_API_CODE = "openExchangeRatesApiCode"; private Map shortExchangeNameToExchangeMap; diff --git a/src/main/java/org/multibit/viewsystem/dataproviders/PreferencesDataProvider.java b/src/main/java/org/multibit/viewsystem/dataproviders/PreferencesDataProvider.java index 5afbe2678..4e6f5dbb2 100644 --- a/src/main/java/org/multibit/viewsystem/dataproviders/PreferencesDataProvider.java +++ b/src/main/java/org/multibit/viewsystem/dataproviders/PreferencesDataProvider.java @@ -133,10 +133,5 @@ public interface PreferencesDataProvider extends DataProvider { boolean getPreviousShowBitcoinConvertedToFiat(); - String getNewOpenExchangeRatesApiCode(); - - - String getPreviousOpenExchangeRatesApiCode(); - boolean getNewMinimizeToTray(); } diff --git a/src/main/java/org/multibit/viewsystem/swing/action/ShowPreferencesSubmitAction.java b/src/main/java/org/multibit/viewsystem/swing/action/ShowPreferencesSubmitAction.java index a391dcb5a..5e6793478 100644 --- a/src/main/java/org/multibit/viewsystem/swing/action/ShowPreferencesSubmitAction.java +++ b/src/main/java/org/multibit/viewsystem/swing/action/ShowPreferencesSubmitAction.java @@ -311,15 +311,8 @@ public void actionPerformed(ActionEvent event) { String newCurrency1 = dataProvider.getNewCurrency1(); if (newCurrency1 != null && !newCurrency1.equals(previousCurrency1)) { controller.getModel().setUserPreference(ExchangeModel.TICKER_FIRST_ROW_CURRENCY, newCurrency1); - String newCurrencyCode = newCurrency1; - if (ExchangeData.BITCOIN_CHARTS_EXCHANGE_NAME.equals(newExchange1)) { - // Use only the last three characters - the currency code. - if (newCurrency1.length() >= 3) { - newCurrencyCode = newCurrency1.substring(newCurrency1.length() - 3); - } - } try { - CurrencyConverter.INSTANCE.setCurrencyUnit(CurrencyUnit.of(newCurrencyCode)); + CurrencyConverter.INSTANCE.setCurrencyUnit(CurrencyUnit.of(newCurrency1)); } catch ( org.joda.money.IllegalCurrencyException e) { e.printStackTrace(); } @@ -354,15 +347,6 @@ public void actionPerformed(ActionEvent event) { wantToFireDataStructureChanged = true; restartTickerTimer = true; } - - String previousOerApicode = dataProvider.getPreviousOpenExchangeRatesApiCode(); - String newOerApiCode = dataProvider.getNewOpenExchangeRatesApiCode(); - if (newOerApiCode != null && !newOerApiCode.equals(previousOerApicode)) { - wantToFireDataStructureChanged = true; - restartTickerTimer = true; - - controller.getModel().setUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE, newOerApiCode); - } // Can undo. controller.getModel().setUserPreference(CoreModel.CAN_UNDO_PREFERENCES_CHANGES, "true"); diff --git a/src/main/java/org/multibit/viewsystem/swing/view/panels/ShowPreferencesPanel.java b/src/main/java/org/multibit/viewsystem/swing/view/panels/ShowPreferencesPanel.java index db1235a70..c1f1f8718 100644 --- a/src/main/java/org/multibit/viewsystem/swing/view/panels/ShowPreferencesPanel.java +++ b/src/main/java/org/multibit/viewsystem/swing/view/panels/ShowPreferencesPanel.java @@ -76,9 +76,6 @@ public class ShowPreferencesPanel extends JPanel implements Viewable, Preference private static final int EXCHANGE_COMBO_HEIGHT_DELTA = 15; private static final int COMBO_WIDTH_DELTA = 150; - private static final int API_CODE_FIELD_HEIGHT = 30; - private static final int API_CODE_FIELD_WIDTH = 200; - private final Controller controller; private final BitcoinController bitcoinController; private final ExchangeController exchangeController; @@ -146,16 +143,6 @@ public class ShowPreferencesPanel extends JPanel implements Viewable, Preference private JComboBox lookAndFeelComboBox; private String localisedSystemLookAndFeelName; - private JPanel oerStent; - private MultiBitTextField oerApiCodeTextField; - private String haveShownErrorMessageForApiCode; - private MultiBitButton getOerAppIdButton; - private MultiBitLabel oerApiCodeLabel; - private MultiBitLabel oerMessageLabel1, oerMessageLabel2; - private String originalOERApiCode; - public static final String OPEN_EXCHANGE_RATES_SIGN_UP_URI = "https://openexchangerates.org/signup/free?r=multibit"; - public static final int LENGTH_OF_OPEN_EXCHANGE_RATE_APP_ID = 32; - private Font selectedFont; private static final int STENT_DELTA = 0; @@ -171,7 +158,6 @@ public ShowPreferencesPanel(BitcoinController bitcoinController, ExchangeControl this.mainFrame = mainFrame; localisedSystemLookAndFeelName = controller.getLocaliser().getString("showPreferencesPanel.systemLookAndFeel"); - originalOERApiCode = controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE); initUI(); applyComponentOrientation(ComponentOrientation.getOrientation(controller.getLocaliser().getLocale())); @@ -256,9 +242,6 @@ public void displayView(DisplayHint displayHint) { } else { undoChangesButton.setEnabled(false); } - - originalOERApiCode = controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE); - oerApiCodeTextField.setText(originalOERApiCode); invalidate(); validate(); @@ -280,7 +263,7 @@ private void initUI() { String[] keys = new String[] { "fontChooser.fontName", "fontChooser.fontStyle", "fontChooser.fontSize", "showPreferencesPanel.ticker.exchange", "showPreferencesPanel.ticker.currency", - "showPreferencesPanel.lookAndFeel", "showPreferencesPanel.oerLabel.text" }; + "showPreferencesPanel.lookAndFeel"}; int stentWidth = MultiBitTitledPanel.calculateStentWidthForKeys(controller.getLocaliser(), keys, this) + STENT_DELTA; GridBagConstraints constraints = new GridBagConstraints(); @@ -918,8 +901,7 @@ public void itemStateChanged(ItemEvent e) { exchangeComboBox1.setOpaque(false); FontMetrics fontMetrics = getFontMetrics(FontSizer.INSTANCE.getAdjustedDefaultFont()); - int textWidth = Math.max(fontMetrics.stringWidth(ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME), fontMetrics.stringWidth("USD")) - + COMBO_WIDTH_DELTA; + int textWidth = fontMetrics.stringWidth("USD") + COMBO_WIDTH_DELTA; Dimension preferredSize = new Dimension(textWidth + TICKER_COMBO_WIDTH_DELTA, fontMetrics.getHeight() + EXCHANGE_COMBO_HEIGHT_DELTA); exchangeComboBox1.setPreferredSize(preferredSize); @@ -943,20 +925,6 @@ public void itemStateChanged(ItemEvent e) { constraints.anchor = GridBagConstraints.LINE_START; tickerPanel.add(exchangeComboBox1, constraints); - oerMessageLabel1 = new MultiBitLabel(" " + controller.getLocaliser().getString("showPreferencesPanel.getAppId.label")); - oerMessageLabel1.setForeground(Color.GREEN.darker().darker()); - boolean showMessageLabel1 = isBrowserSupported() && ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeToUse1) - && (originalOERApiCode == null || originalOERApiCode.trim().length() == 0); - oerMessageLabel1.setVisible(showMessageLabel1); - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 5; - constraints.gridy = 15; - constraints.weightx = 0.8; - constraints.weighty = 0.6; - constraints.gridwidth = 1; - constraints.anchor = GridBagConstraints.LINE_START; - tickerPanel.add(oerMessageLabel1, constraints); - MultiBitLabel currencyLabel1 = new MultiBitLabel(controller.getLocaliser() .getString("showPreferencesPanel.ticker.currency")); currencyLabel1.setHorizontalAlignment(JLabel.TRAILING); @@ -1026,18 +994,6 @@ public void itemStateChanged(ItemEvent event) { } } } - - // Enable the OpenExchangeRates App ID if required. - boolean showOER = ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeShortName) || - ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase((String) exchangeComboBox2.getSelectedItem()); - oerStent.setVisible(showOER); - oerApiCodeLabel.setVisible(showOER); - oerApiCodeTextField.setVisible(showOER); - getOerAppIdButton.setVisible(showOER); - - boolean showMessageLabel = isBrowserSupported() && ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeShortName) - && (oerApiCodeTextField.getText() == null || oerApiCodeTextField.getText().trim().length() == 0); - oerMessageLabel1.setVisible(showMessageLabel); } } }); @@ -1142,18 +1098,6 @@ public void itemStateChanged(ItemEvent event) { } } } - - // Enable the OpenExchangeRates App ID if required. - boolean showOER = ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeShortName) || - ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase((String) exchangeComboBox1.getSelectedItem()); - oerStent.setVisible(showOER); - oerApiCodeLabel.setVisible(showOER); - oerApiCodeTextField.setVisible(showOER); - getOerAppIdButton.setVisible(showOER); - - boolean showMessageLabel = isBrowserSupported() && ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeShortName) - && (oerApiCodeTextField.getText() == null || oerApiCodeTextField.getText().trim().length() == 0); - oerMessageLabel2.setVisible(showMessageLabel); } } }); @@ -1167,21 +1111,6 @@ public void itemStateChanged(ItemEvent event) { constraints.anchor = GridBagConstraints.LINE_START; tickerPanel.add(exchangeComboBox2, constraints); - oerMessageLabel2 = new MultiBitLabel(" " + controller.getLocaliser().getString("showPreferencesPanel.getAppId.label")); - oerMessageLabel2.setForeground(Color.GREEN.darker().darker()); - boolean showMessageLabel2 = isBrowserSupported() && ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeToUse2) - && (originalOERApiCode == null || originalOERApiCode.trim().length() == 0); - oerMessageLabel2.setVisible(showMessageLabel2); - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 5; - constraints.gridy = 22; - constraints.weightx = 0.8; - constraints.weighty = 0.6; - constraints.gridwidth = 1; - constraints.anchor = GridBagConstraints.LINE_START; - tickerPanel.add(oerMessageLabel2, constraints); - - currencyLabel2 = new MultiBitLabel(controller.getLocaliser().getString("showPreferencesPanel.ticker.currency")); currencyLabel2.setHorizontalAlignment(JLabel.TRAILING); constraints.fill = GridBagConstraints.HORIZONTAL; @@ -1254,178 +1183,9 @@ public void itemStateChanged(ItemEvent event) { constraints.gridwidth = 1; constraints.anchor = GridBagConstraints.LINE_END; tickerPanel.add(fill1, constraints); - - boolean showOerSignup = ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeToUse1) || - ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equalsIgnoreCase(exchangeToUse2); - - oerStent = MultiBitTitledPanel.createStent(12, 12); - constraints.fill = GridBagConstraints.BOTH; - constraints.gridx = 1; - constraints.gridy = 26; - constraints.weightx = 0.3; - constraints.weighty = 0.3; - constraints.gridwidth = 1; - constraints.anchor = GridBagConstraints.LINE_START; - oerStent.setVisible(showOerSignup); - tickerPanel.add(oerStent, constraints); - - oerApiCodeLabel = new MultiBitLabel(controller.getLocaliser().getString("showPreferencesPanel.oerLabel.text")); - oerApiCodeLabel.setToolTipText(HelpContentsPanel.createTooltipText(controller.getLocaliser().getString("showPreferencesPanel.oerLabel.tooltip"))); - oerApiCodeLabel.setVisible(showOerSignup); - - oerApiCodeTextField = new MultiBitTextField("", 25, controller); - oerApiCodeTextField.setHorizontalAlignment(JLabel.LEADING); - oerApiCodeTextField.setMinimumSize(new Dimension(API_CODE_FIELD_WIDTH, API_CODE_FIELD_HEIGHT)); - oerApiCodeTextField.setPreferredSize(new Dimension(API_CODE_FIELD_WIDTH, API_CODE_FIELD_HEIGHT)); - oerApiCodeTextField.setMaximumSize(new Dimension(API_CODE_FIELD_WIDTH, API_CODE_FIELD_HEIGHT)); - oerApiCodeTextField.setVisible(showOerSignup); - oerApiCodeTextField.setText(originalOERApiCode); - oerApiCodeTextField.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent arg0) { - } - - @Override - public void focusLost(FocusEvent arg0) { - String apiCode = oerApiCodeTextField.getText(); - if (apiCode != null && !(WhitespaceTrimmer.trim(apiCode).length() == 0) - && !apiCode.equals(controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE))) { - // New API code. - // Check its length - if (!(apiCode.trim().length() == LENGTH_OF_OPEN_EXCHANGE_RATE_APP_ID) - && !apiCode.equals(haveShownErrorMessageForApiCode)) { - haveShownErrorMessageForApiCode = apiCode; - // Give user a message that App ID is not in the correct format. - JOptionPane.showMessageDialog(null, new String[] {controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text1"), " ", - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text2"), - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text3")}, - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.title"), - JOptionPane.ERROR_MESSAGE, ImageLoader.createImageIcon(ImageLoader.EXCLAMATION_MARK_ICON_FILE)); - return; - } - } - updateApiCode(); - }}); - oerApiCodeTextField.addActionListener(new ActionListener(){ - @Override - public void actionPerformed(ActionEvent arg0) { - String apiCode = oerApiCodeTextField.getText(); - if (apiCode != null && !(WhitespaceTrimmer.trim(apiCode).length() == 0) && !apiCode.equals(controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE))) { - // New API code. - // Check its length - if (!(apiCode.trim().length() == LENGTH_OF_OPEN_EXCHANGE_RATE_APP_ID) - && !apiCode.equals(haveShownErrorMessageForApiCode)) { - haveShownErrorMessageForApiCode = apiCode; - // Give user a message that App ID is not in the correct format. - JOptionPane.showMessageDialog(null, new String[] {controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text1"), - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text2"), - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.text3")}, - controller.getLocaliser().getString("showPreferencesPanel.oerValidationError.title"), - JOptionPane.ERROR_MESSAGE, ImageLoader.createImageIcon(ImageLoader.EXCLAMATION_MARK_ICON_FILE)); - return; - } - } - updateApiCode(); - }}); - - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 1; - constraints.gridy = 27; - constraints.weightx = 0.3; - constraints.weighty = 0.3; - constraints.gridwidth = 1; - constraints.anchor = GridBagConstraints.LINE_END; - tickerPanel.add(oerApiCodeLabel, constraints); - - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 4; - constraints.gridy = 27; - constraints.weightx = 0.3; - constraints.weighty = 0.3; - constraints.gridwidth = 2; - constraints.anchor = GridBagConstraints.LINE_START; - tickerPanel.add(oerApiCodeTextField, constraints); - - if (isBrowserSupported()) { - getOerAppIdButton = new MultiBitButton(controller.getLocaliser().getString("showPreferencesPanel.getAppId.text")); - getOerAppIdButton.setToolTipText(controller.getLocaliser().getString("showPreferencesPanel.getAppId.tooltip")); - getOerAppIdButton.setVisible(showOerSignup); - - getOerAppIdButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - try { - openURI(new URI(OPEN_EXCHANGE_RATES_SIGN_UP_URI)); - } catch (URISyntaxException e) { - log.debug(e.getMessage()); - } - }}); - - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 4; - constraints.gridy = 28; - constraints.weightx = 1; - constraints.weighty = 1; - constraints.gridwidth = 1; - constraints.anchor = GridBagConstraints.LINE_START; - tickerPanel.add(getOerAppIdButton, constraints); - } return tickerPanel; } - - private void updateApiCode() { - String apiCode = oerApiCodeTextField.getText(); - if (apiCode != null && !(WhitespaceTrimmer.trim(apiCode).length() == 0) && !apiCode.equals(controller.getModel().getUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE))) { - // New API code. - apiCode = WhitespaceTrimmer.trim(apiCode); - oerApiCodeTextField.setText(apiCode); - - controller.getModel().setUserPreference(ExchangeModel.OPEN_EXCHANGE_RATES_API_CODE, apiCode); - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equals((String)exchangeComboBox1.getSelectedItem())) { - if (mainFrame != null && mainFrame.getTickerTimerTask1() != null) { - TickerTimerTask tickerTimerTask = mainFrame.getTickerTimerTask1(); - synchronized (tickerTimerTask) { - tickerTimerTask.createExchangeObjects(ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME); - currencyComboBox1.removeAllItems(); - Collection currenciesToUse = ExchangeData.getAvailableCurrenciesForExchange(ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME); - if (currenciesToUse != null) { - for (String currency : currenciesToUse) { - String loopItem = currency; - String description = CurrencyConverter.INSTANCE.getCurrencyCodeToDescriptionMap().get(currency); - if (description != null && description.trim().length() > 0) { - loopItem = loopItem + " (" + description + ")"; - } - currencyComboBox1.addItem(loopItem); - } - } - } - } - oerMessageLabel1.setVisible(false); - } - if (ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME.equals((String)exchangeComboBox2.getSelectedItem())) { - if (mainFrame != null && mainFrame.getTickerTimerTask2() != null) { - TickerTimerTask tickerTimerTask = mainFrame.getTickerTimerTask2(); - synchronized (tickerTimerTask) { - tickerTimerTask.createExchangeObjects(ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME); - currencyComboBox2.removeAllItems(); - Collection currenciesToUse = ExchangeData.getAvailableCurrenciesForExchange(ExchangeData.OPEN_EXCHANGE_RATES_EXCHANGE_NAME); - if (currenciesToUse != null) { - for (String currency : currenciesToUse) { - String loopItem = currency; - String description = CurrencyConverter.INSTANCE.getCurrencyCodeToDescriptionMap().get(currency); - if (description != null && description.trim().length() > 0) { - loopItem = loopItem + " (" + description + ")"; - } - currencyComboBox2.addItem(loopItem); - } - } - } - } - oerMessageLabel2.setVisible(false); - } - } - } private JPanel createBrowserIntegrationPanel(int stentWidth) { MultiBitTitledPanel browserIntegrationPanel = new MultiBitTitledPanel(controller.getLocaliser().getString( @@ -1595,7 +1355,6 @@ private void enableTickerSecondRow(boolean enableTickerSecondRow) { exchangeComboBox2.setEnabled(enableTickerSecondRow); currencyLabel2.setEnabled(enableTickerSecondRow); currencyComboBox2.setEnabled(enableTickerSecondRow); - oerMessageLabel2.setEnabled(enableTickerSecondRow); } private ImageIcon createImageIcon(String text) { @@ -1756,21 +1515,11 @@ public View getViewId() { public String getPreviousUndoChangesText() { return controller.getLocaliser().getString("undoPreferencesChangesSubmitAction.text"); } - - @Override - public String getPreviousOpenExchangeRatesApiCode() { - return originalOERApiCode; - } @Override public boolean getNewMinimizeToTray() { return minimizeToTrayCheckBox.isSelected(); } - - @Override - public String getNewOpenExchangeRatesApiCode() { - return oerApiCodeTextField.getText(); - } @Override From 526401f7c51cfd82c6117058a241fa6364ad9c05 Mon Sep 17 00:00:00 2001 From: langerhans Date: Fri, 29 Jan 2016 22:24:02 +0100 Subject: [PATCH 2/4] 0.1.7 prep --- pom.xml | 2 +- release_notes.txt | 7 +++++-- release_notes_full.txt | 5 +++++ src/main/resources/multidoge.checkpoints | Bin 357525 -> 415509 bytes 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index fc58e9fba..9903caf14 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 4.0.0 org.multibit multidoge - 0.1.6 + 0.1.7 MultiDoge A Java Swing client for Dogecoin https://multidoge.org diff --git a/release_notes.txt b/release_notes.txt index 03aeae71c..04bc4a463 100644 --- a/release_notes.txt +++ b/release_notes.txt @@ -1,4 +1,7 @@ MultiDoge release notes: -14 Oct 2015: 0.1.6 -+ Fix syncing issue preventing to sync further than Oct 12 +29 Jan 2016: 0.1.7 ++ Update XChange to 3.1.0 ++ Replace Cryptsy with Poloniex as source for the DOGE/BTC exchange rate ++ BTC/Fiat exchange rates are provided by BitcoinAverage ++ Updated checkpoints \ No newline at end of file diff --git a/release_notes_full.txt b/release_notes_full.txt index e64c6ce75..843f8d533 100644 --- a/release_notes_full.txt +++ b/release_notes_full.txt @@ -1,4 +1,9 @@ MultiDoge release notes: +29 Jan 2016: 0.1.7 ++ Update XChange to 3.1.0 ++ Replace Cryptsy with Poloniex as source for the DOGE/BTC exchange rate ++ BTC/Fiat exchange rates are provided by BitcoinAverage ++ Updated checkpoints 14 Oct 2015: 0.1.6 + Fix syncing issue preventing to sync further than Oct 12 diff --git a/src/main/resources/multidoge.checkpoints b/src/main/resources/multidoge.checkpoints index ff04bc3890a5581a0be5c4b0d6932a281678e8b5..de3d10316930280fd228734a9270095cfa07f5b5 100644 GIT binary patch delta 58488 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 Sll3^M*&mce0mc*lFW^5vqV~uD delta 47 zcmbQbPIBr?QBh|PS7+}4e^0-VU Date: Fri, 29 Jan 2016 22:26:56 +0100 Subject: [PATCH 3/4] Remove unused class --- .../multibit/exchange/TickerTimerTask.java | 1 - .../java/org/multibit/utils/DogeUtils.java | 96 ------------------- 2 files changed, 97 deletions(-) delete mode 100644 src/main/java/org/multibit/utils/DogeUtils.java diff --git a/src/main/java/org/multibit/exchange/TickerTimerTask.java b/src/main/java/org/multibit/exchange/TickerTimerTask.java index bb2aa678e..491b5e3d8 100644 --- a/src/main/java/org/multibit/exchange/TickerTimerTask.java +++ b/src/main/java/org/multibit/exchange/TickerTimerTask.java @@ -32,7 +32,6 @@ import org.multibit.controller.exchange.ExchangeController; import org.multibit.model.exchange.ExchangeData; import org.multibit.model.exchange.ExchangeModel; -import org.multibit.utils.DogeUtils; import org.multibit.viewsystem.swing.MultiBitFrame; import org.slf4j.Logger; diff --git a/src/main/java/org/multibit/utils/DogeUtils.java b/src/main/java/org/multibit/utils/DogeUtils.java deleted file mode 100644 index ae494f33b..000000000 --- a/src/main/java/org/multibit/utils/DogeUtils.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.multibit.utils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -/** - * Created by Max on 06.02.14. - */ -public class DogeUtils { - - private static Logger log = LoggerFactory.getLogger(DogeUtils.class); - - private static final URL DOGEPOOL_URL; - private static final URL CRYPTSY_URL; - private static final URL VIRCUREX_URL; - - static - { - try - { - DOGEPOOL_URL = new URL("http://dogepool.com/lastdoge"); - CRYPTSY_URL = new URL("http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=132"); - VIRCUREX_URL = new URL("https://vircurex.com/api/get_last_trade.json?base=DOGE&alt=BTC"); - } - catch (final MalformedURLException x) - { - throw new RuntimeException(x); // cannot happen - } - } - - public static float requestDogeBtcConversion() { - HttpURLConnection connection = null; - Reader reader = null; - - try - { - connection = (HttpURLConnection) DOGEPOOL_URL.openConnection(); - connection.setConnectTimeout(Constants.HTTP_TIMEOUT_MS); - connection.setReadTimeout(Constants.HTTP_TIMEOUT_MS); - connection.connect(); - - final int responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) - { - reader = new InputStreamReader(new BufferedInputStream(connection.getInputStream(), 1024), Constants.UTF_8); - final StringBuilder content = new StringBuilder(); - Io.copy(reader, content); - - try - { - return Float.parseFloat(content.toString()); - } catch (NumberFormatException e) - { - log.debug("Hm, looks like dogepool changed their API..."); - return -1; - } - - } - else - { - log.debug("http status " + responseCode + " when fetching " + DOGEPOOL_URL); - } - } - catch (final Exception x) - { - log.debug("problem reading exchange rates", x); - } - finally - { - if (reader != null) - { - try - { - reader.close(); - } - catch (final IOException x) - { - // swallow - } - } - - if (connection != null) - connection.disconnect(); - } - - return -1; - } -} From 5e6cbab14849b983e53d75ae7bdaef6eae28b77a Mon Sep 17 00:00:00 2001 From: langerhans Date: Fri, 29 Jan 2016 22:38:58 +0100 Subject: [PATCH 4/4] 0.1.7 hashes --- multidoge-0.1.6-bins.md5 | 6 +++--- multidoge-0.1.7-bins.md5 | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 multidoge-0.1.7-bins.md5 diff --git a/multidoge-0.1.6-bins.md5 b/multidoge-0.1.6-bins.md5 index 396e6f391..1ea31ef49 100644 --- a/multidoge-0.1.6-bins.md5 +++ b/multidoge-0.1.6-bins.md5 @@ -1,3 +1,3 @@ -956C8F38EB9004F17FEE5B42DCC9FA48 multidoge-0.1.5.dmg -E92E3364D34F35876CF14D631D90C32C multidoge-0.1.5-linux.jar -989ACDE5C65B29357C8F3935AD4B896C multidoge-0.1.5-windows-setup.exe +956C8F38EB9004F17FEE5B42DCC9FA48 multidoge-0.1.6.dmg +E92E3364D34F35876CF14D631D90C32C multidoge-0.1.6-linux.jar +989ACDE5C65B29357C8F3935AD4B896C multidoge-0.1.6-windows-setup.exe diff --git a/multidoge-0.1.7-bins.md5 b/multidoge-0.1.7-bins.md5 new file mode 100644 index 000000000..6a4c3fba1 --- /dev/null +++ b/multidoge-0.1.7-bins.md5 @@ -0,0 +1,3 @@ +6277491E0889942F5C0213A8CA6BA1DA multidoge-0.1.7.dmg +E69A81B1E86C7AA72D3B36D0D5FB4218 multidoge-0.1.7-linux.jar +6AF7401318F4E3858933CD841074C3B6 multidoge-0.1.7-windows-setup.exe