// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
package org.xbill.DNS;
import java.util.*;
/**
* The Response from a query to Cache.lookupRecords() or Zone.findRecords()
* @see Cache
* @see Zone
*
* @author Brian Wellington
*/
public class SetResponse {
/**
* The Cache contains no information about the requested name/type
*/
static final int UNKNOWN = 0;
/**
* The Zone does not contain the requested name, or the Cache has
* determined that the name does not exist.
*/
static final int NXDOMAIN = 1;
/**
* The Zone contains the name, but no data of the requested type,
* or the Cache has determined that the name exists and has no data
* of the requested type.
*/
static final int NXRRSET = 2;
/**
* A delegation enclosing the requested name was found.
*/
static final int DELEGATION = 3;
/**
* The Cache/Zone found a CNAME when looking for the name.
* @see CNAMERecord
*/
static final int CNAME = 4;
/**
* The Cache/Zone found a DNAME when looking for the name.
* @see DNAMERecord
*/
static final int DNAME = 5;
/**
* The Cache/Zone has successfully answered the question for the
* requested name/type/class.
*/
static final int SUCCESSFUL = 6;
private static final SetResponse unknown = new SetResponse(UNKNOWN);
private static final SetResponse nxdomain = new SetResponse(NXDOMAIN);
private static final SetResponse nxrrset = new SetResponse(NXRRSET);
private int type;
private Object data;
private
SetResponse() {}
SetResponse(int type, RRset rrset) {
if (type < 0 || type > 6)
throw new IllegalArgumentException("invalid type");
this.type = type;
this.data = rrset;
}
SetResponse(int type) {
if (type < 0 || type > 6)
throw new IllegalArgumentException("invalid type");
this.type = type;
this.data = null;
}
static SetResponse
ofType(int type) {
switch (type) {
case UNKNOWN:
return unknown;
case NXDOMAIN:
return nxdomain;
case NXRRSET:
return nxrrset;
case DELEGATION:
case CNAME:
case DNAME:
case SUCCESSFUL:
SetResponse sr = new SetResponse();
sr.type = type;
sr.data = null;
return sr;
default:
throw new IllegalArgumentException("invalid type");
}
}
void
addRRset(RRset rrset) {
if (data == null)
data = new ArrayList();
List l = (List) data;
l.add(rrset);
}
/** Is the answer to the query unknown? */
public boolean
isUnknown() {
return (type == UNKNOWN);
}
/** Is the answer to the query that the name does not exist? */
public boolean
isNXDOMAIN() {
return (type == NXDOMAIN);
}
/** Is the answer to the query that the name exists, but the type does not? */
public boolean
isNXRRSET() {
return (type == NXRRSET);
}
/** Is the result of the lookup that the name is below a delegation? */
public boolean
isDelegation() {
return (type == DELEGATION);
}
/** Is the result of the lookup a CNAME? */
public boolean
isCNAME() {
return (type == CNAME);
}
/** Is the result of the lookup a DNAME? */
public boolean
isDNAME() {
return (type == DNAME);
}
/** Was the query successful? */
public boolean
isSuccessful() {
return (type == SUCCESSFUL);
}
/** If the query was successful, return the answers */
public RRset []
answers() {
if (type != SUCCESSFUL)
return null;
List l = (List) data;
return (RRset []) l.toArray(new RRset[l.size()]);
}
/**
* If the query encountered a CNAME, return it.
*/
public CNAMERecord
getCNAME() {
return (CNAMERecord)((RRset)data).first();
}
/**
* If the query encountered a DNAME, return it.
*/
public DNAMERecord
getDNAME() {
return (DNAMERecord)((RRset)data).first();
}
/**
* If the query hit a delegation point, return the NS set.
*/
public RRset
getNS() {
return (RRset)data;
}
/** Prints the value of the SetResponse */
public String
toString() {
switch (type) {
case UNKNOWN: return "unknown";
case NXDOMAIN: return "NXDOMAIN";
case NXRRSET: return "NXRRSET";
case DELEGATION: return "delegation: " + data;
case CNAME: return "CNAME: " + data;
case DNAME: return "DNAME: " + data;
case SUCCESSFUL: return "successful";
default: throw new IllegalStateException();
}
}
}