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