private static void dumpRespTypeNum(OMMMsg msg, PrintStream ps) {
   if (msg.getMsgType() == OMMMsg.MsgType.REFRESH_RESP) {
     ps.println(" (" + OMMMsg.RespType.toString(msg.getRespTypeNum()) + ")");
   } else
   // msg.getMsgType() == OMMMsg.OMMMsg.MsgType.UPDATE_RESP
   {
     if ((msg.getMsgModelType() >= RDMMsgTypes.MARKET_PRICE)
         && (msg.getMsgModelType() <= RDMMsgTypes.HISTORY)) {
       ps.println(" (" + RDMInstrument.Update.toString(msg.getRespTypeNum()) + ")");
     }
   }
 }
  static final void parseMsg(OMMMsg msg, PrintStream ps, int tabLevel) {
    msg.getMsgType();
    dumpIndent(ps, tabLevel);
    ps.println("MESSAGE");
    dumpIndent(ps, tabLevel + 1);
    ps.println("Msg Type: " + OMMMsg.MsgType.toString(msg.getMsgType()));
    dumpIndent(ps, tabLevel + 1);
    ps.println("Msg Model Type: " + RDMMsgTypes.toString(msg.getMsgModelType()));
    dumpIndent(ps, tabLevel + 1);
    ps.println("Indication Flags: " + OMMMsg.Indication.indicationString(msg));

    dumpIndent(ps, tabLevel + 1);
    ps.println("Hint Flags: " + hintString(msg));

    if ((msg.getDataType() == OMMTypes.ANSI_PAGE) && msg.isSet(OMMMsg.Indication.CLEAR_CACHE)) {
      CURRENT_PAGE = null;
    }

    if (msg.has(OMMMsg.HAS_STATE)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("State: " + msg.getState());
    }
    if (msg.has(OMMMsg.HAS_PRIORITY)) {
      dumpIndent(ps, tabLevel + 1);
      OMMPriority p = msg.getPriority();
      if (p != null) ps.println("Priority: " + p.getPriorityClass() + "," + p.getCount());
      else ps.println("Priority: Error flag recieved but there is not priority present");
    }
    if (msg.has(OMMMsg.HAS_QOS)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("Qos: " + msg.getQos());
    }
    if (msg.has(OMMMsg.HAS_QOS_REQ)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("QosReq: " + msg.getQosReq());
    }
    if (msg.has(OMMMsg.HAS_ITEM_GROUP)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("Group: " + msg.getItemGroup());
    }
    if (msg.has(OMMMsg.HAS_PERMISSION_DATA)) {
      byte[] permdata = msg.getPermissionData();

      dumpIndent(ps, tabLevel + 1);
      ps.print("PermissionData: " + HexDump.toHexString(permdata, false));
      ps.println(" ( " + HexDump.formatHexString(permdata) + " ) ");
    }
    if (msg.has(OMMMsg.HAS_SEQ_NUM)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("SeqNum: " + msg.getSeqNum());
    }

    if (msg.has(OMMMsg.HAS_CONFLATION_INFO)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("Conflation Count: " + msg.getConflationCount());
      dumpIndent(ps, tabLevel + 1);
      ps.println("Conflation Time: " + msg.getConflationTime());
    }

    if (msg.has(OMMMsg.HAS_RESP_TYPE_NUM)) {
      dumpIndent(ps, tabLevel + 1);
      ps.print("RespTypeNum: " + msg.getRespTypeNum());
      dumpRespTypeNum(msg, ps);
    }

    if (msg.has(OMMMsg.HAS_ID)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("Id: " + msg.getId());
    }

    if ((msg.has(OMMMsg.HAS_PUBLISHER_INFO)) || (msg.getMsgType() == OMMMsg.MsgType.POST)) {
      PublisherPrincipalIdentity pi = (PublisherPrincipalIdentity) msg.getPrincipalIdentity();
      if (pi != null) {
        dumpIndent(ps, tabLevel + 1);
        ps.println("Publisher Address: 0x" + Long.toHexString(pi.getPublisherAddress()));
        dumpIndent(ps, tabLevel + 1);
        ps.println("Publisher Id: " + pi.getPublisherId());
      }
    }

    if (msg.has(OMMMsg.HAS_USER_RIGHTS)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println(
          "User Rights Mask: " + OMMMsg.UserRights.userRightsString(msg.getUserRightsMask()));
    }

    if (msg.has(OMMMsg.HAS_ATTRIB_INFO)) {
      dumpIndent(ps, tabLevel + 1);
      ps.println("AttribInfo");
      OMMAttribInfo ai = msg.getAttribInfo();
      if (ai.has(OMMAttribInfo.HAS_SERVICE_NAME)) {
        dumpIndent(ps, tabLevel + 2);
        ps.println("ServiceName: " + ai.getServiceName());
      }
      if (ai.has(OMMAttribInfo.HAS_SERVICE_ID)) {
        dumpIndent(ps, tabLevel + 2);
        ps.println("ServiceId: " + ai.getServiceID());
      }
      if (ai.has(OMMAttribInfo.HAS_NAME)) {
        dumpIndent(ps, tabLevel + 2);
        ps.println("Name: " + ai.getName());
      }
      if (ai.has(OMMAttribInfo.HAS_NAME_TYPE)) {
        dumpIndent(ps, tabLevel + 2);
        ps.print("NameType: " + ai.getNameType());
        if (msg.getMsgModelType() == RDMMsgTypes.LOGIN) {
          ps.println(" (" + RDMUser.NameType.toString(ai.getNameType()) + ")");
        } else if (RDMInstrument.isInstrumentMsgModelType(msg.getMsgModelType())) {

          ps.println(" (" + RDMInstrument.NameType.toString(ai.getNameType()) + ")");
        } else {
          ps.println();
        }
      }
      if (ai.has(OMMAttribInfo.HAS_FILTER)) {
        dumpIndent(ps, tabLevel + 2);
        ps.print("Filter: " + ai.getFilter());
        if (msg.getMsgModelType() == RDMMsgTypes.DIRECTORY) {
          ps.println(" (" + RDMService.Filter.toString(ai.getFilter()) + ")");
        } else if (msg.getMsgModelType() == RDMMsgTypes.DICTIONARY) {
          ps.println(" (" + RDMDictionary.Filter.toString(ai.getFilter()) + ")");
        } else {
          ps.println();
        }
      }
      if (ai.has(OMMAttribInfo.HAS_ID)) {
        dumpIndent(ps, tabLevel + 2);
        ps.println("ID: " + ai.getId());
      }
      if (ai.has(OMMAttribInfo.HAS_ATTRIB)) {
        dumpIndent(ps, tabLevel + 2);
        ps.println("Attrib");
        parseData(ai.getAttrib(), ps, tabLevel + 2);
      }
    }

    dumpIndent(ps, tabLevel + 1);
    ps.print("Payload: ");
    if (msg.getDataType() != OMMTypes.NO_DATA) {
      ps.println(msg.getPayload().getEncodedLength() + " bytes");
      parseData(msg.getPayload(), ps, tabLevel + 1);
    } else {
      ps.println("None");
    }
  }