in orderbook-core/src/main/java/com/epam/deltix/orderbook/core/impl/L3SingleExchangeQuoteProcessor.java [145:182]
public boolean handleReplace(final PackageHeaderInfo pck, final L3EntryUpdateInfo msg) {
final QuoteSide side = msg.getSide();
final CharSequence quoteId = msg.getQuoteId();
final L3MarketSide<Quote> newSide = getMarketSide(side);
final EntryValidationCode errorCode = newSide.isInvalidInsert(InsertType.ADD_BACK, quoteId, msg.getPrice(), msg.getSize(), side);
if (errorCode != null) {
return failUpdate(pck, errorCode);
}
final Quote quote = newSide.remove(quoteId);
if (quote != null) { // replace didn't change side
quote.copyFrom(pck, msg);
newSide.add(quote);
return true;
}
final L3MarketSide<Quote> prevSide = getMarketSide(side == ASK ? BID : ASK);
final Quote removed = prevSide.remove(quoteId);
if (removed != null) { // replace changed side
Quote newQuote = removed;
if (newSide.isFull()) {
pool.release(removed);
final Quote worstQuote = newSide.getWorstQuote();
if (side == ASK && Decimal64Utils.isGreater(worstQuote.getPrice(), msg.getPrice()) ||
side == BID && Decimal64Utils.isGreater(msg.getPrice(), worstQuote.getPrice())) {
newQuote = newSide.remove(worstQuote.getQuoteId());
} else {
return true;
}
}
newQuote.copyFrom(pck, msg);
newSide.add(newQuote);
return true;
}
return failUpdate(pck, EntryValidationCode.UNKNOWN_QUOTE_ID);
}