All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tigerbrokers.stock.openapi.client.socket.ApiCallbackDecoder4Stomp Maven / Gradle / Ivy

package com.tigerbrokers.stock.openapi.client.socket;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.tigerbrokers.stock.openapi.client.struct.SubscribedSymbol;
import com.tigerbrokers.stock.openapi.client.struct.enums.QuoteSubject;
import com.tigerbrokers.stock.openapi.client.util.ApiLogger;
import com.tigerbrokers.stock.openapi.client.util.StringUtils;
import com.tigerbrokers.stock.openapi.client.util.TradeTickUtil;
import io.netty.handler.codec.stomp.StompFrame;
import io.netty.handler.codec.stomp.StompHeaders;

import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.ERROR_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.GET_CANCEL_SUBSCRIBE_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.GET_QUOTE_CHANGE_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.GET_SUBSCRIBE_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.GET_SUB_SYMBOLS_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.GET_TRADING_TICK_END;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.ID_HEADER;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.RET_HEADER;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.SUBSCRIBE_ASSET;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.SUBSCRIBE_ORDER_STATUS;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.SUBSCRIBE_ORDER_TRANSACTION;
import static com.tigerbrokers.stock.openapi.client.constant.RspProtocolType.SUBSCRIBE_POSITION;
import static com.tigerbrokers.stock.openapi.client.constant.TigerApiConstants.HEART_BEAT;
import static io.netty.handler.codec.http.HttpConstants.DEFAULT_CHARSET;

/**
 * Description:
 * Created by lijiawen on 2018/05/23.
 */
public class ApiCallbackDecoder4Stomp extends ApiCallbackDecoder {

  private ApiComposeCallback4Stomp callback;
  private StompFrame stompFrame;
  private int retType;
  private String id;

  public ApiCallbackDecoder4Stomp(ApiComposeCallback4Stomp callback) {
    super(callback);
    this.callback = callback;
  }

  public synchronized void handle(StompFrame stompFrame) {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    if (!StringUtils.isEmpty(content) && HEART_BEAT.equals(content)) {
      processHeartBeat(content);
      return;
    }
    init(stompFrame);

    switch (retType) {
      case SUBSCRIBE_POSITION:
        processPosition();
        break;
      case SUBSCRIBE_ASSET:
        processAsset();
        break;
      case SUBSCRIBE_ORDER_STATUS:
        processOrderStatus();
        break;
      case SUBSCRIBE_ORDER_TRANSACTION:
        processOrderTransaction();
        break;
      case GET_QUOTE_CHANGE_END:
        processSubscribeQuoteChange();
        break;
      case GET_TRADING_TICK_END:
        processSubscribeQuoteChange();
        break;
      case GET_SUB_SYMBOLS_END:
        processGetSubscribedSymbols();
        break;
      case GET_SUBSCRIBE_END:
        processSubscribeEnd();
        break;
      case GET_CANCEL_SUBSCRIBE_END:
        processCancelSubscribeEnd();
        break;
      case ERROR_END:
        processErrorEnd();
        break;
      default:
        processDefault();
        break;
    }
  }

  private void init(StompFrame stompFrame) {
    this.stompFrame = stompFrame;
    this.retType = stompFrame.headers().getInt(RET_HEADER);
    this.id = stompFrame.headers().getAsString(ID_HEADER);
  }

  public ApiComposeCallback getCallback() {
    return callback;
  }

  private void processPosition() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.positionChange(JSON.parseObject(content));
  }

  private void processAsset() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.assetChange(JSONObject.parseObject(content));
  }

  private void processOrderStatus() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.orderStatusChange(JSONObject.parseObject(content));
  }

  private void processOrderTransaction() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.orderTransactionChange(JSONObject.parseObject(content));
  }

  private void processSubscribeQuoteChange() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    if (content == null) {
      return;
    }
    JSONObject jsonObject = JSONObject.parseObject(content);
    if (jsonObject == null) {
      return;
    }
    String type = jsonObject.getString("type");
    if (type == null) {
      return;
    }
    QuoteSubject subject = QuoteSubject.valueOf(type);
    if (type == null) {
      return;
    }
    switch (subject) {
      case Quote:
        callback.quoteChange(jsonObject);
        break;
      case Option:
        callback.optionChange(jsonObject);
        break;
      case TradeTick:
        callback.tradeTickChange(TradeTickUtil.decodeData(jsonObject));
        break;
      case Future:
        callback.futureChange(jsonObject);
        break;
      case QuoteDepth:
        callback.depthQuoteChange(jsonObject);
        break;
      default:
        callback.quoteChange(jsonObject);
    }
  }

  private void processGetSubscribedSymbols() {
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.getSubscribedSymbolEnd(JSONObject.parseObject(content, SubscribedSymbol.class));
  }

  private void processSubscribeEnd() {
    String subject = stompFrame.headers().getAsString(StompHeaders.SUBSCRIPTION);
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.subscribeEnd(StringUtils.toInt(id, 0), subject, content);
  }

  private void processCancelSubscribeEnd() {
    String subject = stompFrame.headers().getAsString(StompHeaders.SUBSCRIPTION);
    String content = stompFrame.content().toString(DEFAULT_CHARSET);
    callback.cancelSubscribeEnd(StringUtils.toInt(id, 0), subject, content);
  }

  private void processErrorEnd() {
    if (stompFrame != null && stompFrame.content() != null) {
      String content = stompFrame.content().toString(DEFAULT_CHARSET);
      callback.error(content);
    } else if (stompFrame != null) {
      callback.error(JSONObject.toJSONString(stompFrame, SerializerFeature.WriteEnumUsingToString));
    } else {
      callback.error("unknown error");
    }
  }

  private void processDefault() {
    ApiLogger.info("ret-type:{} cannot be processed.", retType);
  }

  public void processHeartBeat(final String content) {
    callback.hearBeat(content);
  }

  public void serverHeartBeatTimeOut(String channelId) {
    callback.serverHeartBeatTimeOut(channelId);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy