1 /*
2 * #%L
3 * Header.java - mongodb-async-driver - Allanbank Consulting, Inc.
4 * %%
5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc.
6 * %%
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * #L%
19 */
20 package com.allanbank.mongodb.client.message;
21
22 import java.io.IOException;
23
24 import com.allanbank.mongodb.bson.io.BsonInputStream;
25 import com.allanbank.mongodb.client.Operation;
26
27 /**
28 * The header of a message.
29 *
30 * <pre>
31 * <code>
32 * struct MsgHeader {
33 * int32 messageLength; // total message size, including this
34 * int32 requestID; // identifier for this message
35 * int32 responseTo; // requestID from the original request
36 * // (used in reponses from db)
37 * int32 opCode; // request type - see table below
38 * }
39 * </code>
40 * </pre>
41 *
42 * @api.no This class is <b>NOT</b> part of the drivers API. This class may be
43 * mutated in incompatible ways between any two releases of the driver.
44 * @copyright 2011-2013, Allanbank Consulting, Inc., All Rights Reserved
45 */
46 public class Header {
47
48 /** The size of a message header. */
49 public static final int SIZE = 16;
50
51 /**
52 * The length of the message in bytes. This includes the length of the
53 * header (16 bytes).
54 */
55 private final int myLength;
56
57 /** The operation for the message. */
58 private final Operation myOperation;
59
60 /** The request id for the message. */
61 private final int myRequestId;
62
63 /** The response id for the message. */
64 private final int myResponseId;
65
66 /**
67 * Creates a new header.
68 *
69 * @param in
70 * The stream to read the header from.
71 * @throws IOException
72 * On a failure reading the header.
73 */
74 public Header(final BsonInputStream in) throws IOException {
75 myLength = in.readInt();
76 myRequestId = in.readInt();
77 myResponseId = in.readInt();
78 myOperation = Operation.fromCode(in.readInt());
79 }
80
81 /**
82 * Creates a new header.
83 *
84 * @param length
85 * The length of the message in bytes.
86 * @param requestId
87 * The request id for the message.
88 * @param responseId
89 * The response id for the message.
90 * @param operation
91 * The operation for the message.
92 */
93 public Header(final int length, final int requestId, final int responseId,
94 final Operation operation) {
95 myLength = length;
96 myRequestId = requestId;
97 myResponseId = responseId;
98 myOperation = operation;
99 }
100
101 /**
102 * Determines if the passed object is of this same type as this object and
103 * if so that its fields are equal.
104 *
105 * @param object
106 * The object to compare to.
107 *
108 * @see java.lang.Object#equals(java.lang.Object)
109 */
110 @Override
111 public boolean equals(final Object object) {
112 boolean result = false;
113 if (this == object) {
114 result = true;
115 }
116 else if ((object != null) && (getClass() == object.getClass())) {
117 final Header other = (Header) object;
118
119 result = (myLength == other.myLength)
120 && (myOperation == other.myOperation)
121 && (myRequestId == other.myRequestId)
122 && (myResponseId == other.myResponseId);
123 }
124 return result;
125 }
126
127 /**
128 * Returns the length of the message in bytes. This includes the
129 * {@link #SIZE} of the header.
130 *
131 * @return The length of the message in bytes.
132 */
133 public int getLength() {
134 return myLength;
135 }
136
137 /**
138 * Returns the operation for the message.
139 *
140 * @return The operation for the message.
141 */
142 public Operation getOperation() {
143 return myOperation;
144 }
145
146 /**
147 * Returns the request id for the message.
148 *
149 * @return The request id for the message.
150 */
151 public int getRequestId() {
152 return myRequestId;
153 }
154
155 /**
156 * Returns the response id for the message.
157 *
158 * @return The response id for the message.
159 */
160 public int getResponseId() {
161 return myResponseId;
162 }
163
164 /**
165 * Computes a reasonable hash code.
166 *
167 * @return The hash code value.
168 */
169 @Override
170 public int hashCode() {
171 int result = 1;
172 result = (31 * result) + myLength;
173 result = (31 * result) + myRequestId;
174 result = (31 * result) + myResponseId;
175 result = (31 * result) + myOperation.hashCode();
176 return result;
177 }
178 }