1 // Copyright (c) 1999-2004 Brian Wellington (bwelling (at) xbill.org) 2 3 package org.xbill.DNS; 4 5 import 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 15 public class SetResponse { 16 17 /** 18 * The Cache contains no information about the requested name/type 19 */ 20 static 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 */ 26 static 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 */ 33 static final int NXRRSET = 2; 34 35 /** 36 * A delegation enclosing the requested name was found. 37 */ 38 static final int DELEGATION = 3; 39 40 /** 41 * The Cache/Zone found a CNAME when looking for the name. 42 * @see CNAMERecord 43 */ 44 static final int CNAME = 4; 45 46 /** 47 * The Cache/Zone found a DNAME when looking for the name. 48 * @see DNAMERecord 49 */ 50 static final int DNAME = 5; 51 52 /** 53 * The Cache/Zone has successfully answered the question for the 54 * requested name/type/class. 55 */ 56 static final int SUCCESSFUL = 6; 57 58 private static final SetResponse unknown = new SetResponse(UNKNOWN); 59 private static final SetResponse nxdomain = new SetResponse(NXDOMAIN); 60 private static final SetResponse nxrrset = new SetResponse(NXRRSET); 61 62 private int type; 63 private Object data; 64 65 private 66 SetResponse() {} 67 68 SetResponse(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 75 SetResponse(int type) { 76 if (type < 0 || type > 6) 77 throw new IllegalArgumentException("invalid type"); 78 this.type = type; 79 this.data = null; 80 } 81 82 static SetResponse 83 ofType(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 104 void 105 addRRset(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? */ 113 public boolean 114 isUnknown() { 115 return (type == UNKNOWN); 116 } 117 118 /** Is the answer to the query that the name does not exist? */ 119 public boolean 120 isNXDOMAIN() { 121 return (type == NXDOMAIN); 122 } 123 124 /** Is the answer to the query that the name exists, but the type does not? */ 125 public boolean 126 isNXRRSET() { 127 return (type == NXRRSET); 128 } 129 130 /** Is the result of the lookup that the name is below a delegation? */ 131 public boolean 132 isDelegation() { 133 return (type == DELEGATION); 134 } 135 136 /** Is the result of the lookup a CNAME? */ 137 public boolean 138 isCNAME() { 139 return (type == CNAME); 140 } 141 142 /** Is the result of the lookup a DNAME? */ 143 public boolean 144 isDNAME() { 145 return (type == DNAME); 146 } 147 148 /** Was the query successful? */ 149 public boolean 150 isSuccessful() { 151 return (type == SUCCESSFUL); 152 } 153 154 /** If the query was successful, return the answers */ 155 public RRset [] 156 answers() { 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 */ 166 public CNAMERecord 167 getCNAME() { 168 return (CNAMERecord)((RRset)data).first(); 169 } 170 171 /** 172 * If the query encountered a DNAME, return it. 173 */ 174 public DNAMERecord 175 getDNAME() { 176 return (DNAMERecord)((RRset)data).first(); 177 } 178 179 /** 180 * If the query hit a delegation point, return the NS set. 181 */ 182 public RRset 183 getNS() { 184 return (RRset)data; 185 } 186 187 /** Prints the value of the SetResponse */ 188 public String 189 toString() { 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