package com.dgex.offspring.providers.dgex; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import com.dgex.offspring.dataprovider.service.HTTPDataProviderException; import com.dgex.offspring.providers.service.Currencies; import com.dgex.offspring.providers.service.ICurrencyPair; import com.dgex.offspring.providers.service.ISellOrder; import com.dgex.offspring.providers.service.ISellOrderSink; import com.dgex.offspring.providers.service.JSONStructureException; import com.dgex.offspring.providers.service.SellOrder; import com.dgex.offspring.providers.service.SellOrderProvider; import com.dgex.offspring.providers.utils.JSONUtils; public class DGEXSellOrderProvider extends SellOrderProvider { private static DGEXSellOrderProvider instance = null; public static DGEXSellOrderProvider getInstance() { if (instance == null) instance = new DGEXSellOrderProvider(); return instance; } private static Logger logger = Logger.getLogger(DGEXSellOrderProvider.class); private static final String url = "https://dgex.com/API/sell.json"; private static final String ASK = "ask"; private static final String ORDERNUMBER = "ordernumber"; private static final String TIMESTAMP = "timestamp"; private static final String UNITPRICE = "unitprice"; private static final String UNITS = "units"; private final List<ISellOrder> orders = new ArrayList<ISellOrder>(); private static final ICurrencyPair[] supportedPairs = { Currencies.NXT .getPair(Currencies.BTC) }; @Override public long getIntervalMilliseconds() { return 30 * 1000; // 30 seconds } @Override public String getLabel() { return "DGEX Sell Orders"; } @Override public ICurrencyPair[] getSupportedPairs() { return supportedPairs; } @Override public List<ISellOrder> doGetSellOrders(ICurrencyPair pair) { return orders; } @Override protected void doRun() { try { String data = get(new URL(url)); Object x = new JSONParser().parse(data); if (!(x instanceof JSONObject)) throw new JSONStructureException(); JSONArray ask = JSONUtils.getList((JSONObject) x, ASK); if (ask == null) throw new JSONStructureException(); orders.clear(); for (Object o : ask) { if (!(o instanceof JSONObject)) throw new JSONStructureException(); JSONObject map = (JSONObject) o; double price = JSONUtils.getDouble(map, UNITPRICE); double quantity = JSONUtils.getDouble(map, UNITS); long timestamp = JSONUtils.getLong(map, TIMESTAMP) * 1000; String id = JSONUtils.getString(map, ORDERNUMBER); ISellOrder order = new SellOrder(Currencies.NXT, Currencies.BTC, price, quantity, id); orders.add(order); // logger.info(" >> " + order); for (Object sink : sinks) { ((ISellOrderSink) sink).addSellOrder(order); } } } catch (MalformedURLException e) { logger.error("Mallformed URL " + url, e); } catch (HTTPDataProviderException e) { logger.error("HTTPDataProviderException " + url, e); } catch (IOException e) { logger.error("IOException " + url, e); } catch (ParseException e) { logger.error("ParseException " + url, e); } catch (JSONStructureException e) { logger.error("JSONStructureException " + url, e); } } }