/src/main/java/jp/ameba/mongo/protocol/MessageHeader.java

http://github.com/suguru/mongo-java-async-driver · Java · 120 lines · 66 code · 19 blank · 35 comment · 0 complexity · 4702cd25d6a720b3caba2c2913a96187 MD5 · raw file

  1. package jp.ameba.mongo.protocol;
  2. import java.util.concurrent.atomic.AtomicInteger;
  3. import org.bson.io.OutputBuffer;
  4. import org.jboss.netty.buffer.ChannelBuffer;
  5. /**
  6. * <p>
  7. * {@link MessageHeader} は、 Mongo Protocol における
  8. * 通信メッセージのヘッダ部分を定義します。
  9. * </p>
  10. * <p>
  11. * see also <a href="http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol">http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol</a>
  12. * </p>
  13. * @author suguru
  14. */
  15. public class MessageHeader {
  16. // ヘッダのバイト数
  17. public static final int HEADER_SIZE = 16;
  18. // リクエストID採番用
  19. private static final AtomicInteger REQUSET_ID = new AtomicInteger();
  20. // このヘッダが準備完了であるか(受信時に使われます)
  21. private boolean ready;
  22. // メッセージバイト数(ヘッダ含む)
  23. private int messageLength;
  24. // リクエスト識別ID
  25. private int requestId;
  26. // このメッセージのリクエストに使われた RequestID
  27. private int responseTo;
  28. // オペレーションコード
  29. private OperationCode opCode;
  30. /**
  31. *
  32. */
  33. public MessageHeader() {
  34. this.ready = false;
  35. }
  36. /**
  37. * データをクリアします
  38. */
  39. public void clean() {
  40. this.ready = false;
  41. this.messageLength = 0;
  42. this.requestId = 0;
  43. this.responseTo = 0;
  44. this.opCode = null;
  45. }
  46. public boolean isReady() {
  47. return ready;
  48. }
  49. /**
  50. * リクエストIDをアサインします。
  51. * @return
  52. */
  53. public int assignRequestId() {
  54. return requestId = REQUSET_ID.incrementAndGet();
  55. }
  56. /**
  57. * バッファから読み出します。
  58. * @param buffer
  59. */
  60. public void read(ChannelBuffer buffer) {
  61. messageLength = buffer.readInt();
  62. requestId = buffer.readInt();
  63. responseTo = buffer.readInt();
  64. opCode = OperationCode.getOpCode(buffer.readInt());
  65. ready = true;
  66. }
  67. /**
  68. * バッファへ書き出します。
  69. * @param buffer
  70. */
  71. public void encode(OutputBuffer buffer) {
  72. buffer.writeInt(messageLength);
  73. buffer.writeInt(requestId);
  74. buffer.writeInt(responseTo);
  75. buffer.writeInt(opCode.getOpCode());
  76. }
  77. public int getMessageLength() {
  78. return messageLength;
  79. }
  80. public int getRequestId() {
  81. return requestId;
  82. }
  83. public int getResponseTo() {
  84. return responseTo;
  85. }
  86. public OperationCode getOpCode() {
  87. return opCode;
  88. }
  89. public void setMessageLength(int messageLength) {
  90. this.messageLength = messageLength;
  91. }
  92. public void setRequestId(int requestId) {
  93. this.requestId = requestId;
  94. }
  95. public void setResponseTo(int responseTo) {
  96. this.responseTo = responseTo;
  97. }
  98. public void setOpCode(OperationCode opCode) {
  99. this.opCode = opCode;
  100. }
  101. }