001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020
021 package org.apache.directory.server.dns.messages;
022
023
024 import java.util.List;
025
026 import org.apache.commons.lang.builder.EqualsBuilder;
027 import org.apache.commons.lang.builder.HashCodeBuilder;
028 import org.apache.commons.lang.builder.ToStringBuilder;
029
030
031 /**
032 * All communications inside of the domain protocol are carried in a single
033 * format called a message. The top level format of message is divided
034 * into 5 sections (some of which are empty in certain cases) shown below:
035 *
036 * +---------------------+
037 * | Header |
038 * +---------------------+
039 * | Question | the question for the name server
040 * +---------------------+
041 * | Answer | ResourceRecords answering the question
042 * +---------------------+
043 * | Authority | ResourceRecords pointing toward an authority
044 * +---------------------+
045 * | Additional | ResourceRecords holding additional information
046 * +---------------------+
047 *
048 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
049 * @version $Rev: 664295 $, $Date: 2008-06-07 10:48:16 +0300 (Sat, 07 Jun 2008) $
050 */
051 public class DnsMessage
052 {
053 /**
054 * The header section is always present. The header includes fields that
055 * specify which of the remaining sections are present, and also specify
056 * whether the message is a query or a response, a standard query or some
057 * other opcode, etc.
058 */
059 private int transactionId;
060 private MessageType messageType;
061 private OpCode opCode;
062 private boolean authoritativeAnswer;
063 private boolean truncated;
064 private boolean recursionDesired;
065 private boolean recursionAvailable;
066 private boolean reserved;
067 private boolean acceptNonAuthenticatedData;
068
069 private ResponseCode responseCode;
070
071 private List<QuestionRecord> questionRecords;
072 private List<ResourceRecord> answerRecords;
073 private List<ResourceRecord> authorityRecords;
074 private List<ResourceRecord> additionalRecords;
075
076
077 /**
078 * Creates a new instance of DnsMessage.
079 *
080 * @param transactionId
081 * @param messageType
082 * @param opCode
083 * @param authoritativeAnswer
084 * @param truncated
085 * @param recursionDesired
086 * @param recursionAvailable
087 * @param reserved
088 * @param acceptNonAuthenticatedData
089 * @param responseCode
090 * @param question
091 * @param answer
092 * @param authority
093 * @param additional
094 */
095 public DnsMessage( int transactionId, MessageType messageType, OpCode opCode, boolean authoritativeAnswer,
096 boolean truncated, boolean recursionDesired, boolean recursionAvailable, boolean reserved,
097 boolean acceptNonAuthenticatedData, ResponseCode responseCode, List<QuestionRecord> question,
098 List<ResourceRecord> answer, List<ResourceRecord> authority, List<ResourceRecord> additional )
099 {
100 this.transactionId = transactionId;
101 this.messageType = messageType;
102 this.opCode = opCode;
103 this.authoritativeAnswer = authoritativeAnswer;
104 this.truncated = truncated;
105 this.recursionDesired = recursionDesired;
106 this.recursionAvailable = recursionAvailable;
107 this.reserved = reserved;
108 this.acceptNonAuthenticatedData = acceptNonAuthenticatedData;
109 this.responseCode = responseCode;
110 this.questionRecords = question;
111 this.answerRecords = answer;
112 this.authorityRecords = authority;
113 this.additionalRecords = additional;
114 }
115
116
117 /**
118 * @return Returns the acceptNonAuthenticatedData.
119 */
120 public boolean isAcceptNonAuthenticatedData()
121 {
122 return acceptNonAuthenticatedData;
123 }
124
125
126 /**
127 * @return Returns the additional.
128 */
129 public List<ResourceRecord> getAdditionalRecords()
130 {
131 return additionalRecords;
132 }
133
134
135 /**
136 * @return Returns the answers.
137 */
138 public List<ResourceRecord> getAnswerRecords()
139 {
140 return answerRecords;
141 }
142
143
144 /**
145 * @return Returns the authoritativeAnswer.
146 */
147 public boolean isAuthoritativeAnswer()
148 {
149 return authoritativeAnswer;
150 }
151
152
153 /**
154 * @return Returns the authority.
155 */
156 public List<ResourceRecord> getAuthorityRecords()
157 {
158 return authorityRecords;
159 }
160
161
162 /**
163 * @return Returns the messageType.
164 */
165 public MessageType getMessageType()
166 {
167 return messageType;
168 }
169
170
171 /**
172 * @return Returns the opCode.
173 */
174 public OpCode getOpCode()
175 {
176 return opCode;
177 }
178
179
180 /**
181 * @return Returns the question.
182 */
183 public List<QuestionRecord> getQuestionRecords()
184 {
185 return questionRecords;
186 }
187
188
189 /**
190 * @return Returns the recursionAvailable.
191 */
192 public boolean isRecursionAvailable()
193 {
194 return recursionAvailable;
195 }
196
197
198 /**
199 * @return Returns the recursionDesired.
200 */
201 public boolean isRecursionDesired()
202 {
203 return recursionDesired;
204 }
205
206
207 /**
208 * @return Returns the reserved.
209 */
210 public boolean isReserved()
211 {
212 return reserved;
213 }
214
215
216 /**
217 * @return Returns the responseCode.
218 */
219 public ResponseCode getResponseCode()
220 {
221 return responseCode;
222 }
223
224
225 /**
226 * @return Returns the transactionId.
227 */
228 public int getTransactionId()
229 {
230 return transactionId;
231 }
232
233
234 /**
235 * @return Returns the truncated.
236 */
237 public boolean isTruncated()
238 {
239 return truncated;
240 }
241
242
243 /**
244 * @see java.lang.Object#equals(Object)
245 */
246 public boolean equals( Object object )
247 {
248 if ( object == this )
249 {
250 return true;
251 }
252 if ( !( object instanceof DnsMessage ) )
253 {
254 return false;
255 }
256 DnsMessage rhs = ( DnsMessage ) object;
257 return new EqualsBuilder().append( this.transactionId, rhs.transactionId ).append( this.answerRecords,
258 rhs.answerRecords ).append( this.opCode, rhs.opCode ).append( this.recursionAvailable,
259 rhs.recursionAvailable ).append( this.messageType, rhs.messageType ).append( this.additionalRecords,
260 rhs.additionalRecords ).append( this.truncated, rhs.truncated ).append( this.recursionDesired,
261 rhs.recursionDesired ).append( this.responseCode, rhs.responseCode ).append( this.authorityRecords,
262 rhs.authorityRecords ).append( this.authoritativeAnswer, rhs.authoritativeAnswer ).append( this.reserved,
263 rhs.reserved ).append( this.acceptNonAuthenticatedData, rhs.acceptNonAuthenticatedData ).append(
264 this.questionRecords, rhs.questionRecords ).isEquals();
265 }
266
267
268 /**
269 * @see java.lang.Object#hashCode()
270 * @return the instance's hash code
271 */
272 public int hashCode()
273 {
274 return new HashCodeBuilder( -1805208585, -276770303 ).append( this.transactionId ).append( this.answerRecords )
275 .append( this.opCode ).append( this.recursionAvailable ).append( this.messageType ).append(
276 this.additionalRecords ).append( this.truncated ).append( this.recursionDesired ).append(
277 this.responseCode ).append( this.authorityRecords ).append( this.authoritativeAnswer ).append(
278 this.reserved ).append( this.acceptNonAuthenticatedData ).append( this.questionRecords ).toHashCode();
279 }
280
281
282 /**
283 * @see java.lang.Object#toString()
284 */
285 public String toString()
286 {
287 return new ToStringBuilder( this ).appendSuper( super.toString() ).append( "transactionId", this.transactionId )
288 .append( "opCode", this.opCode ).append( "truncated", this.truncated ).append( "messageType",
289 this.messageType ).append( "recursionDesired", this.recursionDesired ).append( "additionalRecords",
290 this.additionalRecords ).append( "responseCode", this.responseCode ).append( "authorityRecords",
291 this.authorityRecords ).append( "acceptNonAuthenticatedData", this.acceptNonAuthenticatedData ).append(
292 "recursionAvailable", this.recursionAvailable ).append( "answerRecords", this.answerRecords ).append(
293 "questionRecords", this.questionRecords ).append( "authoritativeAnswer", this.authoritativeAnswer )
294 .append( "reserved", this.reserved ).toString();
295 }
296 }