1// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2 3package org.xbill.DNS; 4 5import java.util.*; 6 7/** 8 * The Response from a query to Cache.lookupRecords() or Zone.findRecords() 9 * @see Cache 10 * @see Zone 11 * 12 * @author Brian Wellington 13 */ 14 15public class SetResponse { 16 17/** 18 * The Cache contains no information about the requested name/type 19 */ 20static final int UNKNOWN = 0; 21 22/** 23 * The Zone does not contain the requested name, or the Cache has 24 * determined that the name does not exist. 25 */ 26static final int NXDOMAIN = 1; 27 28/** 29 * The Zone contains the name, but no data of the requested type, 30 * or the Cache has determined that the name exists and has no data 31 * of the requested type. 32 */ 33static final int NXRRSET = 2; 34 35/** 36 * A delegation enclosing the requested name was found. 37 */ 38static final int DELEGATION = 3; 39 40/** 41 * The Cache/Zone found a CNAME when looking for the name. 42 * @see CNAMERecord 43 */ 44static final int CNAME = 4; 45 46/** 47 * The Cache/Zone found a DNAME when looking for the name. 48 * @see DNAMERecord 49 */ 50static final int DNAME = 5; 51 52/** 53 * The Cache/Zone has successfully answered the question for the 54 * requested name/type/class. 55 */ 56static final int SUCCESSFUL = 6; 57 58private static final SetResponse unknown = new SetResponse(UNKNOWN); 59private static final SetResponse nxdomain = new SetResponse(NXDOMAIN); 60private static final SetResponse nxrrset = new SetResponse(NXRRSET); 61 62private int type; 63private Object data; 64 65private 66SetResponse() {} 67 68SetResponse(int type, RRset rrset) { 69 if (type < 0 || type > 6) 70 throw new IllegalArgumentException("invalid type"); 71 this.type = type; 72 this.data = rrset; 73} 74 75SetResponse(int type) { 76 if (type < 0 || type > 6) 77 throw new IllegalArgumentException("invalid type"); 78 this.type = type; 79 this.data = null; 80} 81 82static SetResponse 83ofType(int type) { 84 switch (type) { 85 case UNKNOWN: 86 return unknown; 87 case NXDOMAIN: 88 return nxdomain; 89 case NXRRSET: 90 return nxrrset; 91 case DELEGATION: 92 case CNAME: 93 case DNAME: 94 case SUCCESSFUL: 95 SetResponse sr = new SetResponse(); 96 sr.type = type; 97 sr.data = null; 98 return sr; 99 default: 100 throw new IllegalArgumentException("invalid type"); 101 } 102} 103 104void 105addRRset(RRset rrset) { 106 if (data == null) 107 data = new ArrayList(); 108 List l = (List) data; 109 l.add(rrset); 110} 111 112/** Is the answer to the query unknown? */ 113public boolean 114isUnknown() { 115 return (type == UNKNOWN); 116} 117 118/** Is the answer to the query that the name does not exist? */ 119public boolean 120isNXDOMAIN() { 121 return (type == NXDOMAIN); 122} 123 124/** Is the answer to the query that the name exists, but the type does not? */ 125public boolean 126isNXRRSET() { 127 return (type == NXRRSET); 128} 129 130/** Is the result of the lookup that the name is below a delegation? */ 131public boolean 132isDelegation() { 133 return (type == DELEGATION); 134} 135 136/** Is the result of the lookup a CNAME? */ 137public boolean 138isCNAME() { 139 return (type == CNAME); 140} 141 142/** Is the result of the lookup a DNAME? */ 143public boolean 144isDNAME() { 145 return (type == DNAME); 146} 147 148/** Was the query successful? */ 149public boolean 150isSuccessful() { 151 return (type == SUCCESSFUL); 152} 153 154/** If the query was successful, return the answers */ 155public RRset [] 156answers() { 157 if (type != SUCCESSFUL) 158 return null; 159 List l = (List) data; 160 return (RRset []) l.toArray(new RRset[l.size()]); 161} 162 163/** 164 * If the query encountered a CNAME, return it. 165 */ 166public CNAMERecord 167getCNAME() { 168 return (CNAMERecord)((RRset)data).first(); 169} 170 171/** 172 * If the query encountered a DNAME, return it. 173 */ 174public DNAMERecord 175getDNAME() { 176 return (DNAMERecord)((RRset)data).first(); 177} 178 179/** 180 * If the query hit a delegation point, return the NS set. 181 */ 182public RRset 183getNS() { 184 return (RRset)data; 185} 186 187/** Prints the value of the SetResponse */ 188public String 189toString() { 190 switch (type) { 191 case UNKNOWN: return "unknown"; 192 case NXDOMAIN: return "NXDOMAIN"; 193 case NXRRSET: return "NXRRSET"; 194 case DELEGATION: return "delegation: " + data; 195 case CNAME: return "CNAME: " + data; 196 case DNAME: return "DNAME: " + data; 197 case SUCCESSFUL: return "successful"; 198 default: throw new IllegalStateException(); 199 } 200} 201 202} 203