1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20
21 package org.apache.directory.server.dns.messages;
22
23
24 import java.util.Map;
25
26
27 /**
28 * The answer, authority, and additional sections all share the same
29 * format: a variable number of resource records, where the number of
30 * records is specified in the corresponding count field in the header.
31 * Each resource record has the following format:
32 * 1 1 1 1 1 1
33 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
34 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
35 * | |
36 * / /
37 * / NAME /
38 * | |
39 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
40 * | TYPE |
41 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
42 * | CLASS |
43 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
44 * | TTL |
45 * | |
46 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
47 * | RDLENGTH |
48 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
49 * / RDATA /
50 * / /
51 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
52 *
53 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
54 * @version $Rev: 664295 $, $Date: 2008-06-07 09:48:16 +0200 (Sa, 07 Jun 2008) $
55 */
56 public class ResourceRecordImpl implements ResourceRecord
57 {
58 /**
59 * An owner name, i.e., the name of the node to which this
60 * resource record pertains.
61 */
62 private String domainName;
63
64 /**
65 * Two octets containing one of the resource record TYPE codes.
66 */
67 private RecordType recordType;
68
69 /**
70 * Two octets containing one of the resource record CLASS codes.
71 * For example, the CLASS field is IN for the Internet.
72 */
73 private RecordClass recordClass;
74
75 /**
76 * A 32 bit signed integer that specifies the time interval
77 * that the resource record may be cached before the source
78 * of the information should again be consulted. Zero
79 * values are interpreted to mean that the resource record can only be
80 * used for the transaction in progress, and should not be
81 * cached. For example, SOA records are always distributed
82 * with a zero TTL to prohibit caching. Zero values can
83 * also be used for extremely volatile data.
84 */
85 private int timeToLive;
86
87 /**
88 * A variable length string of octets that describes the
89 * resource. The format of this information varies
90 * according to the TYPE and CLASS of the resource record.
91 */
92 private Map<String, Object> attributes;
93
94
95 /**
96 * Creates a new instance of ResourceRecordImpl.
97 *
98 * @param domainName
99 * @param recordType
100 * @param recordClass
101 * @param timeToLive
102 * @param attributes
103 */
104 public ResourceRecordImpl( String domainName, RecordType recordType, RecordClass recordClass, int timeToLive,
105 Map<String, Object> attributes )
106 {
107 this.domainName = domainName;
108 this.recordType = recordType;
109 this.recordClass = recordClass;
110 this.timeToLive = timeToLive;
111 this.attributes = attributes;
112 }
113
114
115 /**
116 * @return Returns the domainName.
117 */
118 public String getDomainName()
119 {
120 return domainName;
121 }
122
123
124 /**
125 * @return Returns the recordType.
126 */
127 public RecordType getRecordType()
128 {
129 return recordType;
130 }
131
132
133 /**
134 * @return Returns the recordClass.
135 */
136 public RecordClass getRecordClass()
137 {
138 return recordClass;
139 }
140
141
142 /**
143 * @return Returns the timeToLive.
144 */
145 public int getTimeToLive()
146 {
147 return timeToLive;
148 }
149
150
151 /**
152 * @return Returns the value for the id.
153 */
154 public String get( String id )
155 {
156 return ( String ) attributes.get( id.toLowerCase() );
157 }
158
159
160 public boolean equals( Object o )
161 {
162 if ( this == o )
163 {
164 return true;
165 }
166
167 if ( !( o instanceof ResourceRecord ) )
168 {
169 return false;
170 }
171
172 ResourceRecordImpl that = ( ResourceRecordImpl ) o;
173
174 return ( this.domainName.equalsIgnoreCase( that.domainName ) ) && ( this.recordType == that.recordType )
175 && ( this.recordClass == that.recordClass );
176 }
177
178
179 /**
180 * Compute the instance hash code
181 * @return the instance's hash code
182 */
183 public int hashCode()
184 {
185 return domainName.hashCode() + recordType.hashCode() + recordClass.hashCode();
186 }
187
188
189 public String toString()
190 {
191 return getClass().getName() + " [ " + domainName + " ( " + recordType + " " + recordClass + " " + timeToLive
192 + " " + attributes + " ) ]";
193 }
194 }