package org.knowm.xchange.kraken.service; import java.io.IOException; import java.util.Arrays; import java.util.Set; import org.knowm.xchange.Exchange; import org.knowm.xchange.currency.Currency; import org.knowm.xchange.currency.CurrencyPair; import org.knowm.xchange.dto.Order.IOrderFlags; import org.knowm.xchange.exceptions.ExchangeException; import org.knowm.xchange.exceptions.FrequencyLimitExceededException; import org.knowm.xchange.exceptions.NonceException; import org.knowm.xchange.kraken.KrakenAuthenticated; import org.knowm.xchange.kraken.KrakenUtils; import org.knowm.xchange.kraken.dto.KrakenResult; import org.knowm.xchange.kraken.dto.marketdata.KrakenAssets; import org.knowm.xchange.kraken.dto.marketdata.KrakenServerTime; import org.knowm.xchange.kraken.dto.marketdata.results.KrakenAssetsResult; import org.knowm.xchange.kraken.dto.marketdata.results.KrakenServerTimeResult; import org.knowm.xchange.kraken.dto.trade.KrakenOrderFlags; import org.knowm.xchange.service.BaseExchangeService; import org.knowm.xchange.service.BaseService; import si.mazi.rescu.ParamsDigest; import si.mazi.rescu.RestProxyFactory; public class KrakenBaseService extends BaseExchangeService implements BaseService { protected KrakenAuthenticated kraken; protected ParamsDigest signatureCreator; /** * Constructor * * @param exchange */ public KrakenBaseService(Exchange exchange) { super(exchange); kraken = RestProxyFactory.createProxy(KrakenAuthenticated.class, exchange.getExchangeSpecification().getSslUri()); signatureCreator = KrakenDigest.createInstance(exchange.getExchangeSpecification().getSecretKey()); } public KrakenServerTime getServerTime() throws IOException { KrakenServerTimeResult timeResult = kraken.getServerTime(); return checkResult(timeResult); } public KrakenAssets getKrakenAssets(Currency... assets) throws IOException { KrakenAssetsResult assetPairsResult = kraken.getAssets(null, delimitAssets(assets)); return new KrakenAssets(checkResult(assetPairsResult)); } protected <R> R checkResult(KrakenResult<R> krakenResult) { if (!krakenResult.isSuccess()) { String[] errors = krakenResult.getError(); if (errors.length == 0) { throw new ExchangeException("Missing error message"); } String error = errors[0]; if ("EAPI:Invalid nonce".equals(error)) { throw new NonceException(error); } else if ("EGeneral:Temporary lockout".equals(error)) { throw new FrequencyLimitExceededException(error); } throw new ExchangeException(Arrays.toString(errors)); } return krakenResult.getResult(); } protected String createDelimitedString(String[] items) { StringBuilder commaDelimitedString = null; if (items != null) { for (String item : items) { if (commaDelimitedString == null) { commaDelimitedString = new StringBuilder(item); } else { commaDelimitedString.append(",").append(item); } } } return (commaDelimitedString == null) ? null : commaDelimitedString.toString(); } protected String delimitAssets(Currency[] assets) throws IOException { StringBuilder commaDelimitedAssets = new StringBuilder(); if (assets != null && assets.length > 0) { boolean started = false; for (Currency asset : assets) { commaDelimitedAssets.append((started) ? "," : "").append(KrakenUtils.getKrakenCurrencyCode(asset)); started = true; } return commaDelimitedAssets.toString(); } return null; } protected String delimitAssetPairs(CurrencyPair[] currencyPairs) throws IOException { String assetPairsString = null; if (currencyPairs != null && currencyPairs.length > 0) { StringBuilder delimitStringBuilder = null; for (CurrencyPair currencyPair : currencyPairs) { String krakenAssetPair = KrakenUtils.createKrakenCurrencyPair(currencyPair); if (delimitStringBuilder == null) { delimitStringBuilder = new StringBuilder(krakenAssetPair); } else { delimitStringBuilder.append(",").append(krakenAssetPair); } } assetPairsString = delimitStringBuilder.toString(); } return assetPairsString; } protected String delimitSet(Set<IOrderFlags> items) { String delimitedSetString = null; if (items != null && !items.isEmpty()) { StringBuilder delimitStringBuilder = null; for (Object item : items) { if (item instanceof KrakenOrderFlags) { if (delimitStringBuilder == null) { delimitStringBuilder = new StringBuilder(item.toString()); } else { delimitStringBuilder.append(",").append(item.toString()); } } } if (delimitStringBuilder != null) { delimitedSetString = delimitStringBuilder.toString(); } } return delimitedSetString; } }