public boolean processL2Snapshot()

in orderbook-core/src/main/java/com/epam/deltix/orderbook/core/impl/L2SingleExchangeQuoteProcessor.java [152:241]


    public boolean processL2Snapshot(final PackageHeaderInfo pck) {
        if (!isSnapshotAllowed(pck)) {
            return false;
        }

        final ObjectList<BaseEntryInfo> entries = pck.getEntries();

        final int prevAsksDepth = asks.depth();
        final int prevBidsDepth = bids.depth();

        int askCnt = 0;
        int bidCnt = 0;
        for (int i = 0; i < entries.size(); i++) {
            final BaseEntryInfo e = entries.get(i);
            if (e instanceof L2EntryNewInterface) {
                final L2EntryNewInterface entry = (L2EntryNewInterface) e;

//              //We expect that all entries are sorted by side and level
//              if (entry == null || entry.getSide() == null ||
//                      (entry.getSide() == ASK && askCnt != entry.getLevel()) ||
//                      (entry.getSide() == BID && bidCnt != entry.getLevel())) {
//                  clear();
//                  eventHandler.onBroken();
//                  return false;
//              }

                final int level = entry.getLevel();
                final QuoteSide side = entry.getSide();
                @Alphanumeric final long exchangeId = entry.getExchangeId();

                // We expect that exchangeId is valid and all entries have the same exchangeId
                final Option<MutableExchange<Quote, L2Processor<Quote>>> exchange = getOrCreateExchange(exchangeId);
                if (!exchange.hasValue()) {
                    clear();
                    eventHandler.onBroken();
                    return false;
                }

                final L2MarketSide<Quote> marketSide = exchange.get().getProcessor().getMarketSide(side);

                // Both side have the same max depth
                final int maxDepth = marketSide.getMaxDepth();
                if ((side == ASK && askCnt == maxDepth) || (side == BID && bidCnt == maxDepth)) {
                    continue;
                }

                if (marketSide.hasLevel(level)) {
                    final Quote quote = marketSide.getQuote(level);
                    quote.copyFrom(pck, entry);
                } else {
                    final Quote quote = pool.borrow();
                    quote.copyFrom(pck, entry);
                    marketSide.add(level, quote);
                }

                if (side == ASK) {
                    askCnt++;
                } else {
                    bidCnt++;
                }

                if (askCnt == maxDepth && bidCnt == maxDepth) {
                    break;
                }
            }
        }

        //Remove all worst quotes after snapshot.
        //We're doing this because we don't release quotes during snapshot processing.
        for (int i = askCnt; i < prevAsksDepth; i++) {
            final Quote quote = asks.removeWorstQuote();
            pool.release(quote);
        }

        for (int i = bidCnt; i < prevBidsDepth; i++) {
            final Quote quote = bids.removeWorstQuote();
            pool.release(quote);
        }

        //Validate state after snapshot
        //We believe that snapshot is valid, but...
        if (!asks.validateState() || !bids.validateState()) {
            clear();
            eventHandler.onBroken();
            return false;
        }

        eventHandler.onSnapshot();
        return true;
    }