package org.knowm.xchange.utils.jackson; import java.io.IOException; import org.knowm.xchange.currency.Currency; import org.knowm.xchange.currency.CurrencyPair; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; public class CurrencyPairDeserializer extends JsonDeserializer<CurrencyPair> { @Override public CurrencyPair deserialize(JsonParser jsonParser, final DeserializationContext ctxt) throws IOException, JsonProcessingException { final ObjectCodec oc = jsonParser.getCodec(); final JsonNode node = oc.readTree(jsonParser); final String currencyPairString = node.asText(); return getCurrencyPairFromString(currencyPairString); } public static CurrencyPair getCurrencyPairFromString(String currencyPairString) { if (currencyPairString == null || currencyPairString.isEmpty()) { return null; } /* * Preserve case if exchange is sending mixed-case, otherwise toUpperCase() */ final boolean isMixedCase = currencyPairString.matches(".*[a-z]+.*") && currencyPairString.matches(".*[A-Z]+.*"); if (!isMixedCase) { currencyPairString = currencyPairString.toUpperCase(); } /* * Assume all symbols are alphanumeric; anything else is a separator */ final String symbols[] = currencyPairString.split("[^a-zA-Z0-9]"); if (symbols.length == 2) { return new CurrencyPair(symbols[0], symbols[1]); } /* * The common case of two 3-character symbols (eg: "BTCUSD") */ if (currencyPairString.length() == 6) { final String tradeCurrency = currencyPairString.substring(0, 3); final String priceCurrency = currencyPairString.substring(3); return new CurrencyPair(tradeCurrency, priceCurrency); } /* * Last-ditch effort to obtain the correct CurrencyPair (eg: "DOGEBTC", "BCBTC", or even "USDEUSD") */ int bestGuess = currencyPairString.length() / 2; int bestLength = 0; for (int i = 1; i < currencyPairString.length() - 1; ++i) { final Currency tradeCurrency = Currency.getInstanceNoCreate(currencyPairString.substring(0, i)); final Currency priceCurrency = Currency.getInstanceNoCreate(currencyPairString.substring(i)); if (tradeCurrency != null) { if (priceCurrency != null) { return new CurrencyPair(tradeCurrency, priceCurrency); } else if (i > bestLength) { bestLength = i; bestGuess = i; } } else if (priceCurrency != null && currencyPairString.length() - i > bestLength) { bestLength = currencyPairString.length() - i; bestGuess = i; } } final String tradeCurrency = currencyPairString.substring(0, bestGuess); final String priceCurrency = currencyPairString.substring(bestGuess); return new CurrencyPair(tradeCurrency, priceCurrency); } }