protected void onJson()

in java/connectors/bitmex/src/main/java/com/epam/deltix/data/connectors/bitmex/BitmexFeed.java [66:117]


    protected void onJson(final CharSequence data, final boolean last, final JsonWriter jsonWriter) {
        jsonParser.parse(data);

        if (!last) {
            return;
        }

        JsonValue jsonValue = jsonParser.eoj();
        JsonObject object = jsonValue.asObject();
        if (object == null) {
            return;
        }

        String type = object.getString("table");
        if ("orderBookL2".equalsIgnoreCase(type)) {
            String action = object.getString("action");
            JsonArray bookData = object.getArray("data");
            if (bookData != null && bookData.size() > 0) {
                JsonObject firstObject = bookData.getObject(0);
                String instrument = firstObject.getString("symbol");
                LongToLongHashMap idToPrice = getPriceLevels(instrument);
                if ("partial".equalsIgnoreCase(action)) {
                    QuoteSequenceProcessor quotesListener = processor().onBookSnapshot(instrument, getTimestamp(bookData));
                    processSnapshot(instrument, quotesListener, idToPrice, bookData);
                    quotesListener.onFinish();
                } else {
                    QuoteSequenceProcessor quotesListener = processor().onBookUpdate(instrument, getTimestamp(bookData));
                    processChanges(instrument, quotesListener, idToPrice, action, bookData);
                    quotesListener.onFinish();
                }
            }
        } else if ("trade".equalsIgnoreCase(type)) {
            String action = object.getString("action");
            if ("insert".equalsIgnoreCase(action)) {
                JsonArray tradeData = object.getArray("data");
                if (tradeData != null) {
                    for (int i = 0; i < tradeData.size(); ++i) {
                        JsonObject trade = tradeData.getObject(i);
                        long price = trade.getDecimal64Required("price");
                        long size = trade.getDecimal64Required("size");
                        String symbol = trade.getStringRequired("symbol");
                        long timestamp = dtParser.set(trade.getStringRequired("timestamp")).millis();

                        String tradeDirection = trade.getString("side");
                        AggressorSide side = "buy".equalsIgnoreCase(tradeDirection) ? AggressorSide.BUY : AggressorSide.SELL;

                        processor().onTrade(symbol, timestamp, price, size, side);
                    }
                }
            }
        }
    }