blob: e4a59e56be84d06b31c7dd9beab181810e1775b0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.server.dns.messages;
import java.util.Map;
import org.apache.directory.api.util.Strings;
/**
* The answer, authority, and additional sections all share the same
* format: a variable number of resource records, where the number of
* records is specified in the corresponding count field in the header.
* Each resource record has the following format:
* 1 1 1 1 1 1
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | |
* / /
* / NAME /
* | |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | TYPE |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | CLASS |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | TTL |
* | |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
* | RDLENGTH |
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
* / RDATA /
* / /
* +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ResourceRecordImpl implements ResourceRecord
{
/**
* An owner name, i.e., the name of the node to which this
* resource record pertains.
*/
private String domainName;
/**
* Two octets containing one of the resource record TYPE codes.
*/
private RecordType recordType;
/**
* Two octets containing one of the resource record CLASS codes.
* For example, the CLASS field is IN for the Internet.
*/
private RecordClass recordClass;
/**
* A 32 bit signed integer that specifies the time interval
* that the resource record may be cached before the source
* of the information should again be consulted. Zero
* values are interpreted to mean that the resource record can only be
* used for the transaction in progress, and should not be
* cached. For example, SOA records are always distributed
* with a zero TTL to prohibit caching. Zero values can
* also be used for extremely volatile data.
*/
private int timeToLive;
/**
* A variable length string of octets that describes the
* resource. The format of this information varies
* according to the TYPE and CLASS of the resource record.
*/
private Map<String, Object> attributes;
/**
* Creates a new instance of ResourceRecordImpl.
*
* @param domainName
* @param recordType
* @param recordClass
* @param timeToLive
* @param attributes
*/
public ResourceRecordImpl( String domainName, RecordType recordType, RecordClass recordClass, int timeToLive,
Map<String, Object> attributes )
{
this.domainName = domainName;
this.recordType = recordType;
this.recordClass = recordClass;
this.timeToLive = timeToLive;
this.attributes = attributes;
}
/**
* @return Returns the domainName.
*/
public String getDomainName()
{
return domainName;
}
/**
* @return Returns the recordType.
*/
public RecordType getRecordType()
{
return recordType;
}
/**
* @return Returns the recordClass.
*/
public RecordClass getRecordClass()
{
return recordClass;
}
/**
* @return Returns the timeToLive.
*/
public int getTimeToLive()
{
return timeToLive;
}
/**
* @return Returns the value for the id.
*/
public String get( String id )
{
return ( String ) attributes.get( Strings.toLowerCase( id ) );
}
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( !( o instanceof ResourceRecord ) )
{
return false;
}
ResourceRecordImpl that = ( ResourceRecordImpl ) o;
return ( this.domainName.equalsIgnoreCase( that.domainName ) ) && ( this.recordType == that.recordType )
&& ( this.recordClass == that.recordClass );
}
/**
* Compute the instance hash code
* @return the instance's hash code
*/
public int hashCode()
{
return domainName.hashCode() + recordType.hashCode() + recordClass.hashCode();
}
public String toString()
{
return getClass().getName() + " [ " + domainName + " ( " + recordType + " " + recordClass + " " + timeToLive
+ " " + attributes + " ) ]";
}
}